diff --git a/src/main/java/org/springframework/samples/petclinic/controller/PetController.java b/src/main/java/org/springframework/samples/petclinic/controller/PetController.java index 56989396d..d0d8ca9d7 100644 --- a/src/main/java/org/springframework/samples/petclinic/controller/PetController.java +++ b/src/main/java/org/springframework/samples/petclinic/controller/PetController.java @@ -110,7 +110,7 @@ class PetController { @PostMapping(CommonEndPoint.PETS_ID_EDIT) public String processUpdateForm(@ModelAttribute(CommonAttribute.PET) @Valid PetDTO pet, BindingResult result, - OwnerDTO owner, ModelMap model) { + @ModelAttribute(CommonAttribute.OWNER) OwnerDTO owner, ModelMap model) { if (result.hasErrors()) { pet.setOwner(owner); model.put(CommonAttribute.PET, pet); diff --git a/src/main/java/org/springframework/samples/petclinic/controller/VisitController.java b/src/main/java/org/springframework/samples/petclinic/controller/VisitController.java index a3e67a073..3fb9bfb4c 100644 --- a/src/main/java/org/springframework/samples/petclinic/controller/VisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/controller/VisitController.java @@ -80,7 +80,7 @@ class VisitController { // Spring MVC calls method loadPetWithVisit(...) before initNewVisitForm is called @GetMapping(CommonEndPoint.VISITS_NEW) public String initNewVisitForm(@PathVariable("petId") int petId, Map model) { - return CommonView.PET_CREATE_OR_UPDATE; + return CommonView.VISIT_CREATE_OR_UPDATE; } // Spring MVC calls method loadPetWithVisit(...) before processNewVisitForm is called diff --git a/src/main/java/org/springframework/samples/petclinic/dto/OwnerDTO.java b/src/main/java/org/springframework/samples/petclinic/dto/OwnerDTO.java index 4da660d16..938e095c9 100644 --- a/src/main/java/org/springframework/samples/petclinic/dto/OwnerDTO.java +++ b/src/main/java/org/springframework/samples/petclinic/dto/OwnerDTO.java @@ -86,7 +86,7 @@ public class OwnerDTO extends PersonDTO { public void addPet(PetDTO pet) { - if (!this.getPets().contains(pet)) { + if (pet.isNew() || this.getPets() == null || !this.getPets().contains(pet)) { getPetsInternal().add(pet); } pet.setOwner(this); diff --git a/src/main/java/org/springframework/samples/petclinic/dto/PetDTO.java b/src/main/java/org/springframework/samples/petclinic/dto/PetDTO.java index c5b0315cd..c51587db9 100644 --- a/src/main/java/org/springframework/samples/petclinic/dto/PetDTO.java +++ b/src/main/java/org/springframework/samples/petclinic/dto/PetDTO.java @@ -90,6 +90,8 @@ public class PetDTO extends NamedDTO { return true; if (!(o instanceof PetDTO)) return false; + if (!super.equals(o)) + return false; PetDTO petDTO = (PetDTO) o; @@ -97,7 +99,7 @@ public class PetDTO extends NamedDTO { return false; if (!getType().equals(petDTO.getType())) return false; - if (!getOwner().getId().equals(petDTO.getOwner().getId())) + if (getOwner() != null ? !getOwner().getId().equals(petDTO.getOwner().getId()) : petDTO.getOwner() != null) return false; return getVisits() != null ? getVisits().equals(petDTO.getVisits()) : petDTO.getVisits() == null; } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java index fa90093f3..1d52108c9 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java @@ -15,7 +15,6 @@ */ package org.springframework.samples.petclinic.repository; -import java.util.Collection; import java.util.List; import org.springframework.data.jpa.repository.Query; @@ -53,6 +52,13 @@ public interface PetRepository extends Repository { */ Pet findById(Integer id); + /** + * Retrieve all {@link Pet}d from the data store by owner id. + * @param id the id of owner to search for + * @return a Collection of {@link Pet}s + */ + List findByOwnerId(Integer id); + /** * Retrieve all {@link Pet}s from the data store * @return a Collection of {@link Pet}s (or an empty Collection if none diff --git a/src/main/java/org/springframework/samples/petclinic/service/PetService.java b/src/main/java/org/springframework/samples/petclinic/service/PetService.java index 563f6b48b..20c74b15d 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/PetService.java +++ b/src/main/java/org/springframework/samples/petclinic/service/PetService.java @@ -50,7 +50,7 @@ public class PetService implements BaseService { dto.getVisits().forEach(visitDTO -> pet.addVisit(visitService.dtoToEntity(visitDTO))); dto.getOwner().getPets().forEach(petDTO -> { - if (petDTO.getId().equals(dto.getId())) { + if (dto.getId() == null || petDTO.getId().equals(dto.getId())) { owner.addPet(pet); } else { @@ -72,18 +72,14 @@ public class PetService implements BaseService { PetDTO petDTO = modelMapper.map(entity, PetDTO.class); OwnerDTO ownerDTO = modelMapper.map(entity.getOwner(), OwnerDTO.class); + petRepository.findByOwnerId(ownerDTO.getId()).forEach(pet -> { + PetDTO otherPetDTO = modelMapper.map(pet, PetDTO.class); + otherPetDTO.setOwner(ownerDTO); + ownerDTO.addPet(otherPetDTO); + }); + entity.getVisits().forEach(visit -> petDTO.addVisit(visitService.entityToDTO(visit))); - entity.getOwner().getPets().forEach(pet -> { - if (pet.getId().equals(entity.getId())) { - ownerDTO.addPet(petDTO); - } - else { - PetDTO otherPetDTO = modelMapper.map(pet, PetDTO.class); - otherPetDTO.setOwner(ownerDTO); - ownerDTO.addPet(otherPetDTO); - } - }); petDTO.setOwner(ownerDTO); return petDTO; } @@ -125,6 +121,10 @@ public class PetService implements BaseService { petRepository.save(dtoToEntity(petDTO)); } + public List findByOwnerId(int id) { + return entitiesToDTOS(petRepository.findByOwnerId(id)); + } + public List findPetTypes() { List petTypes = petRepository.findPetTypes(); diff --git a/src/test/java/org/springframework/samples/petclinic/controller/VisitControllerTests.java b/src/test/java/org/springframework/samples/petclinic/controller/VisitControllerTests.java index f5cb862c4..718bab0f0 100644 --- a/src/test/java/org/springframework/samples/petclinic/controller/VisitControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/controller/VisitControllerTests.java @@ -65,7 +65,7 @@ class VisitControllerTests { @Tag("initNewVisitForm") void testInitNewVisitForm() throws Exception { mockMvc.perform(get(CommonEndPoint.VISITS_NEW, TEST_PET_ID)).andExpect(status().isOk()) - .andExpect(view().name(CommonView.PET_CREATE_OR_UPDATE)); + .andExpect(view().name(CommonView.VISIT_CREATE_OR_UPDATE)); } @Test