diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java index 2dbabc854924bd90dd1cdd2d7884b41ebf2c966d..116656af94fcac5bebc5efb6a57768985b8ad135 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java @@ -35,8 +35,10 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; import jakarta.transaction.Transactional; + import java.util.Collection; import java.util.List; +import java.util.Optional; /** * @author Vitaliy Fedoriv @@ -160,4 +162,20 @@ public class OwnerRestController implements OwnersApi { return new ResponseEntity<>(visitDto, headers, HttpStatus.CREATED); } + + @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") + @Override + public ResponseEntity<PetDto> getOwnersPet(Integer ownerId, Integer petId) { + Owner owner = this.clinicService.findOwnerById(ownerId); + Pet pet = this.clinicService.findPetById(petId); + if (owner == null || pet == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } else { + if (!pet.getOwner().equals(owner)) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } else { + return new ResponseEntity<>(petMapper.toPetDto(pet), HttpStatus.OK); + } + } + } } diff --git a/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java index 6f0bcff39a2f350364174342e885f526153c4328..07bb8cb9be6f9d10dfb918b051fb143e8d0078e3 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java @@ -26,8 +26,10 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.samples.petclinic.mapper.OwnerMapper; +import org.springframework.samples.petclinic.mapper.PetMapper; import org.springframework.samples.petclinic.mapper.VisitMapper; import org.springframework.samples.petclinic.model.Owner; +import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.rest.advice.ExceptionControllerAdvice; import org.springframework.samples.petclinic.rest.dto.OwnerDto; import org.springframework.samples.petclinic.rest.dto.PetDto; @@ -68,6 +70,9 @@ class OwnerRestControllerTests { @Autowired private OwnerMapper ownerMapper; + @Autowired + private PetMapper petMapper; + @Autowired private VisitMapper visitMapper; @@ -377,7 +382,7 @@ class OwnerRestControllerTests { } @Test - @WithMockUser(roles="OWNER_ADMIN") + @WithMockUser(roles = "OWNER_ADMIN") void testCreateVisitSuccess() throws Exception { VisitDto newVisit = visits.get(0); newVisit.setId(999); @@ -391,4 +396,32 @@ class OwnerRestControllerTests { .andExpect(status().isCreated()); } + @Test + @WithMockUser(roles = "OWNER_ADMIN") + void testGetOwnerPetSuccess() throws Exception { + owners.remove(0); + owners.remove(1); + given(this.clinicService.findAllOwners()).willReturn(ownerMapper.toOwners(owners)); + var owner = ownerMapper.toOwner(owners.get(0)); + given(this.clinicService.findOwnerById(2)).willReturn(owner); + var pet = petMapper.toPet(pets.get(0)); + pet.setOwner(owner); + given(this.clinicService.findPetById(1)).willReturn(pet); + this.mockMvc.perform(get("/api/owners/2/pets/1") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType("application/json")); + } + + @Test + @WithMockUser(roles = "OWNER_ADMIN") + void testGetOwnersPetsNotFound() throws Exception { + owners.clear(); + given(this.clinicService.findAllOwners()).willReturn(ownerMapper.toOwners(owners)); + this.mockMvc.perform(get("/api/owners/1/pets/1") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + + }