Improved Validation for Birth Dates AND Duplicate Pet Name Check Enhancement:

This commit is contained in:
viru 2024-10-13 14:42:21 +05:30
parent 62dbfa8e9a
commit f429502898

View file

@ -1,18 +1,3 @@
/*
* Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.samples.petclinic.owner; package org.springframework.samples.petclinic.owner;
import java.time.LocalDate; import java.time.LocalDate;
@ -33,130 +18,116 @@ import org.springframework.web.bind.annotation.RequestMapping;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
/**
* @author Juergen Hoeller
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller @Controller
@RequestMapping("/owners/{ownerId}") @RequestMapping("/owners/{ownerId}")
class PetController { class PetController {
private static final String VIEWS_PETS_CREATE_OR_UPDATE_FORM = "pets/createOrUpdatePetForm"; private static final String VIEWS_PETS_CREATE_OR_UPDATE_FORM = "pets/createOrUpdatePetForm";
private final OwnerRepository owners; private final OwnerRepository owners;
public PetController(OwnerRepository owners) { public PetController(OwnerRepository owners) {
this.owners = owners; this.owners = owners;
} }
@ModelAttribute("types") @ModelAttribute("types")
public Collection<PetType> populatePetTypes() { public Collection<PetType> populatePetTypes() {
return this.owners.findPetTypes(); return this.owners.findPetTypes();
} }
@ModelAttribute("owner") @ModelAttribute("owner")
public Owner findOwner(@PathVariable("ownerId") int ownerId) { public Owner findOwner(@PathVariable("ownerId") int ownerId) {
Owner owner = this.owners.findById(ownerId);
if (owner == null) {
throw new IllegalArgumentException("Owner ID not found: " + ownerId);
}
return owner;
}
Owner owner = this.owners.findById(ownerId); @ModelAttribute("pet")
if (owner == null) { public Pet findPet(@PathVariable("ownerId") int ownerId,
throw new IllegalArgumentException("Owner ID not found: " + ownerId); @PathVariable(name = "petId", required = false) Integer petId) {
} if (petId == null) {
return owner; return new Pet();
} }
Owner owner = this.owners.findById(ownerId);
if (owner == null) {
throw new IllegalArgumentException("Owner ID not found: " + ownerId);
}
return owner.getPet(petId);
}
@ModelAttribute("pet") @InitBinder("owner")
public Pet findPet(@PathVariable("ownerId") int ownerId, public void initOwnerBinder(WebDataBinder dataBinder) {
@PathVariable(name = "petId", required = false) Integer petId) { dataBinder.setDisallowedFields("id");
}
if (petId == null) { @InitBinder("pet")
return new Pet(); public void initPetBinder(WebDataBinder dataBinder) {
} dataBinder.setValidator(new PetValidator());
}
Owner owner = this.owners.findById(ownerId); @GetMapping("/pets/new")
if (owner == null) { public String initCreationForm(Owner owner, ModelMap model) {
throw new IllegalArgumentException("Owner ID not found: " + ownerId); Pet pet = new Pet();
} owner.addPet(pet);
return owner.getPet(petId); model.put("pet", pet);
} return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
}
@InitBinder("owner") @PostMapping("/pets/new")
public void initOwnerBinder(WebDataBinder dataBinder) { public String processCreationForm(Owner owner, @Valid Pet pet, BindingResult result, ModelMap model,
dataBinder.setDisallowedFields("id"); RedirectAttributes redirectAttributes) {
} validatePetNameAndBirthDate(owner, pet, result);
@InitBinder("pet") if (result.hasErrors()) {
public void initPetBinder(WebDataBinder dataBinder) { model.put("pet", pet);
dataBinder.setValidator(new PetValidator()); return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
} }
@GetMapping("/pets/new") owner.addPet(pet);
public String initCreationForm(Owner owner, ModelMap model) { this.owners.save(owner);
Pet pet = new Pet(); redirectAttributes.addFlashAttribute("message", "New Pet has been Added");
owner.addPet(pet); return "redirect:/owners/{ownerId}";
model.put("pet", pet); }
return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
}
@PostMapping("/pets/new") @GetMapping("/pets/{petId}/edit")
public String processCreationForm(Owner owner, @Valid Pet pet, BindingResult result, ModelMap model, public String initUpdateForm(Owner owner, @PathVariable("petId") int petId, ModelMap model) {
RedirectAttributes redirectAttributes) { Pet pet = owner.getPet(petId);
if (StringUtils.hasText(pet.getName()) && pet.isNew() && owner.getPet(pet.getName(), true) != null) { if (pet == null) {
result.rejectValue("name", "duplicate", "already exists"); throw new IllegalArgumentException("Pet ID not found: " + petId);
} }
model.put("pet", pet);
return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
}
LocalDate currentDate = LocalDate.now(); @PostMapping("/pets/{petId}/edit")
if (pet.getBirthDate() != null && pet.getBirthDate().isAfter(currentDate)) { public String processUpdateForm(@Valid Pet pet, BindingResult result, Owner owner, ModelMap model,
result.rejectValue("birthDate", "typeMismatch.birthDate"); RedirectAttributes redirectAttributes) {
} validatePetNameAndBirthDate(owner, pet, result);
owner.addPet(pet); if (result.hasErrors()) {
if (result.hasErrors()) { model.put("pet", pet);
model.put("pet", pet); return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
return VIEWS_PETS_CREATE_OR_UPDATE_FORM; }
}
this.owners.save(owner); owner.addPet(pet);
redirectAttributes.addFlashAttribute("message", "New Pet has been Added"); this.owners.save(owner);
return "redirect:/owners/{ownerId}"; redirectAttributes.addFlashAttribute("message", "Pet details have been edited");
} return "redirect:/owners/{ownerId}";
}
@GetMapping("/pets/{petId}/edit") private void validatePetNameAndBirthDate(Owner owner, Pet pet, BindingResult result) {
public String initUpdateForm(Owner owner, @PathVariable("petId") int petId, ModelMap model, String petName = pet.getName();
RedirectAttributes redirectAttributes) {
Pet pet = owner.getPet(petId);
model.put("pet", pet);
return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
}
@PostMapping("/pets/{petId}/edit") // Checking if the pet name already exists for the owner
public String processUpdateForm(@Valid Pet pet, BindingResult result, Owner owner, ModelMap model, if (StringUtils.hasText(petName) && owner.getPet(petName, true) != null) {
RedirectAttributes redirectAttributes) { result.rejectValue("name", "duplicate", "already exists");
}
String petName = pet.getName();
// checking if the pet name already exist for the owner
if (StringUtils.hasText(petName)) {
Pet existingPet = owner.getPet(petName.toLowerCase(), false);
if (existingPet != null && existingPet.getId() != pet.getId()) {
result.rejectValue("name", "duplicate", "already exists");
}
}
LocalDate currentDate = LocalDate.now();
if (pet.getBirthDate() != null && pet.getBirthDate().isAfter(currentDate)) {
result.rejectValue("birthDate", "typeMismatch.birthDate");
}
if (result.hasErrors()) {
model.put("pet", pet);
return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
}
owner.addPet(pet);
this.owners.save(owner);
redirectAttributes.addFlashAttribute("message", "Pet details has been edited");
return "redirect:/owners/{ownerId}";
}
LocalDate currentDate = LocalDate.now();
if (pet.getBirthDate() == null || pet.getBirthDate().isAfter(currentDate)) {
result.rejectValue("birthDate", "typeMismatch.birthDate");
}
}
} }