Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -99,143 +99,4 @@ public String initCreationForm(Map<String, Object> model) {
@PostMapping("/owners/new")
public String processCreationForm(@Valid Owner owner, BindingResult result) {
if (result.hasErrors()) {
return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
}
validator.ValidateOwnerWithExternalService(owner);
validator.PerformValidationFlow(owner);

validator.checkOwnerValidity(owner);
this.owners.save(owner);
validator.ValidateUserAccess("admin", "pwd", "fullaccess");
return "redirect:/owners/" + owner.getId();
}

@GetMapping("/owners/find")
public String initFindForm() {
return "owners/findOwners";
}

@GetMapping("/owners")
public String processFindForm(@RequestParam(defaultValue = "1") int page, Owner owner, BindingResult result,
Model model) {

validator.ValidateUserAccess("admin", "pwd", "fullaccess");

// allow parameterless GET request for /owners to return all records
if (owner.getLastName() == null) {
owner.setLastName(""); // empty string signifies broadest possible search
}

// find owners by last name
Page<Owner> ownersResults = findPaginatedForOwnersLastName(page, owner.getLastName());
if (ownersResults.isEmpty()) {
// no owners found
result.rejectValue("lastName", "notFound", "not found");
return "owners/findOwners";
}

if (ownersResults.getTotalElements() == 1) {
// 1 owner found
owner = ownersResults.iterator().next();
return "redirect:/owners/" + owner.getId();
}

// multiple owners found
return addPaginationModel(page, model, ownersResults);
}

@WithSpan
private String addPaginationModel(int page, Model model, Page<Owner> paginated) {
// throw new RuntimeException();
model.addAttribute("listOwners", paginated);
List<Owner> listOwners = paginated.getContent();
model.addAttribute("currentPage", page);
model.addAttribute("totalPages", paginated.getTotalPages());
model.addAttribute("totalItems", paginated.getTotalElements());
model.addAttribute("listOwners", listOwners);
return "owners/ownersList";
}

@WithSpan()
private Page<Owner> findPaginatedForOwnersLastName(int page, String lastname) {
int pageSize = 5;
Pageable pageable = PageRequest.of(page - 1, pageSize);
return owners.findByLastName(lastname, pageable);
}

@GetMapping("/owners/{ownerId}/edit")
public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) {
Owner owner = this.owners.findById(ownerId);
model.addAttribute(owner);
return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
}

private static void delay(long millis) {
try {
Thread.sleep(millis);
}
catch (InterruptedException e) {
Thread.interrupted();
}
}

@PostMapping("/owners/{ownerId}/edit")
public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result,
@PathVariable("ownerId") int ownerId) {
if (result.hasErrors()) {
return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
}

owner.setId(ownerId);
validator.checkOwnerValidity(owner);

validator.ValidateOwnerWithExternalService(owner);

validator.PerformValidationFlow(owner);
this.owners.save(owner);
return "redirect:/owners/{ownerId}";
}

/**
* Custom handler for displaying an owner.
* @param ownerId the ID of the owner to display
* @return a ModelMap with the model attributes for the view
*/
@GetMapping("/owners/{ownerId}")
public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) {
validator.ValidateUserAccess("admin", "pwd", "fullaccess");

ModelAndView mav = new ModelAndView("owners/ownerDetails");
Owner owner = this.owners.findById(ownerId);
validator.ValidateOwnerWithExternalService(owner);

mav.addObject(owner);
return mav;
}

@GetMapping("/owners/{ownerId}/pets")
@ResponseBody
public String getOwnerPetsMap(@PathVariable("ownerId") int ownerId) {
String sql = "SELECT p.id AS pet_id, p.owner_id AS owner_id FROM pets p JOIN owners o ON p.owner_id = o.id";

List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);

Map<Integer, List<Integer>> ownerToPetsMap = rows.stream()
.collect(Collectors.toMap(
row -> (Integer) row.get("owner_id"),
row -> List.of((Integer) row.get("pet_id")) // Immutable list
));


List<Integer> pets = ownerToPetsMap.get(ownerId);

if (pets == null || pets.isEmpty()) {
return "No pets found for owner " + ownerId;
}

return "Pets for owner " + ownerId + ": " + pets.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));

}
}
return VIEWS_OWNER_CREATE_OR_UPDATE_
Loading