1 package pk.lucidxpo.ynami.controller.sample; 2 3 import jakarta.servlet.http.HttpServletResponse; 4 import org.modelmapper.ModelMapper; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Value; 7 import org.springframework.http.ResponseEntity; 8 import org.springframework.stereotype.Controller; 9 import org.springframework.ui.Model; 10 import org.springframework.web.bind.annotation.DeleteMapping; 11 import org.springframework.web.bind.annotation.GetMapping; 12 import org.springframework.web.bind.annotation.ModelAttribute; 13 import org.springframework.web.bind.annotation.PatchMapping; 14 import org.springframework.web.bind.annotation.PathVariable; 15 import org.springframework.web.bind.annotation.PostMapping; 16 import org.springframework.web.bind.annotation.PutMapping; 17 import org.springframework.web.bind.annotation.RequestMapping; 18 import pk.lucidxpo.ynami.persistence.dto.sample.SampleCreationDTO; 19 import pk.lucidxpo.ynami.persistence.dto.sample.SampleDTO; 20 import pk.lucidxpo.ynami.persistence.dto.sample.SampleUpdateStatusDTO; 21 import pk.lucidxpo.ynami.persistence.dto.sample.SampleUpdationDTO; 22 import pk.lucidxpo.ynami.persistence.model.sample.Sample; 23 import pk.lucidxpo.ynami.service.sample.SampleService; 24 25 import java.util.List; 26 import java.util.Optional; 27 28 import static java.util.stream.Collectors.toList; 29 import static org.springframework.http.HttpStatus.CONFLICT; 30 import static org.springframework.http.HttpStatus.FOUND; 31 import static org.springframework.http.HttpStatus.NOT_FOUND; 32 import static org.springframework.http.HttpStatus.OK; 33 34 @SuppressWarnings("SameReturnValue") 35 @Controller 36 public class SampleController { 37 38 @Value("${welcome.message}") 39 private String message; 40 41 private final ModelMapper modelMapper; 42 private final SampleService sampleService; 43 44 @Autowired 45 public SampleController(final ModelMapper modelMapper, 46 final SampleService sampleService) { 47 this.modelMapper = modelMapper; 48 this.sampleService = sampleService; 49 } 50 51 @RequestMapping("/") 52 public String welcome(Model model) { 53 model.addAttribute("message", message); 54 return "welcome"; 55 } 56 57 @GetMapping(value = "/samples") 58 public String getSamples(final Model model) { 59 final List<Sample> samples = sampleService.getAll(); 60 final List<SampleDTO> sampleDTOs = samples.stream() 61 .map(sample -> modelMapper.map(sample, SampleDTO.class)) 62 .collect(toList()); 63 64 model.addAttribute("samples", sampleDTOs); 65 66 return "sample/listSamples"; 67 } 68 69 @GetMapping(value = "/samples/new") 70 public String prepareSampleCreation(final Model model) { 71 model.addAttribute("sample", SampleCreationDTO.builder().build()); 72 return "sample/createSample"; 73 } 74 75 @PostMapping(value = "/samples") 76 public String createSample(@ModelAttribute("sample") final SampleCreationDTO sampleCreationDTO, 77 final HttpServletResponse response) { 78 if (sampleService.existsByFirstName(sampleCreationDTO.getFirstName())) { 79 response.setStatus(CONFLICT.value()); 80 return "sample/createSample"; 81 } 82 final Sample sample = modelMapper.map(sampleCreationDTO, Sample.class); 83 sampleService.create(sample); 84 return "redirect:/samples"; 85 } 86 87 @GetMapping(value = "/samples/{id}/view") 88 public String getSample(@PathVariable final String id, final Model model, final HttpServletResponse response) { 89 final Optional<Sample> sample = sampleService.findById(id); 90 91 if (sample.isPresent()) { 92 final SampleDTO sampleDTO = modelMapper.map(sample.get(), SampleDTO.class); 93 model.addAttribute("sample", sampleDTO); 94 response.setStatus(FOUND.value()); 95 } else { 96 response.setStatus(NOT_FOUND.value()); 97 } 98 return "sample/viewSample"; 99 } 100 101 @GetMapping(value = "/samples/{id}") 102 public String prepareSampleUpdation(@PathVariable final String id, final Model model, final HttpServletResponse response) { 103 final Optional<Sample> optionalSample = sampleService.findById(id); 104 if (optionalSample.isPresent()) { 105 final SampleUpdationDTO sampleUpdationDTO = modelMapper.map(optionalSample.get(), SampleUpdationDTO.class); 106 model.addAttribute("sample", sampleUpdationDTO); 107 response.setStatus(FOUND.value()); 108 } else { 109 response.setStatus(NOT_FOUND.value()); 110 } 111 return "sample/editSample"; 112 } 113 114 @PutMapping(value = "/samples/{id}") 115 public String updateSample(@PathVariable final String id, 116 @ModelAttribute("sample") final SampleUpdationDTO sampleUpdationDTO, 117 final HttpServletResponse response) { 118 final Optional<Sample> optionalSample = sampleService.findById(id); 119 if (optionalSample.isPresent()) { 120 final Sample sample = optionalSample.get(); 121 modelMapper.map(sampleUpdationDTO, sample); 122 sampleService.update(sample); 123 return "redirect:/samples"; 124 } 125 response.setStatus(NOT_FOUND.value()); 126 return "sample/updateSample"; 127 } 128 129 @DeleteMapping(value = "/samples/{id}") 130 public String deleteSample(@PathVariable final String id, 131 final HttpServletResponse response) { 132 final Optional<Sample> optionalSample = sampleService.findById(id); 133 if (optionalSample.isPresent()) { 134 sampleService.delete(id); 135 return "redirect:/samples"; 136 } 137 response.setStatus(NOT_FOUND.value()); 138 return "sample/deleteSample"; 139 } 140 141 @PatchMapping(value = "/samples/{id}") 142 public ResponseEntity<String> updateSampleStatus(@PathVariable final String id, 143 @ModelAttribute("sample") final SampleUpdateStatusDTO sampleUpdateStatusDTO) { 144 final Optional<Sample> optionalSample = sampleService.findById(id); 145 if (optionalSample.isPresent()) { 146 final Sample sample = optionalSample.get(); 147 modelMapper.map(sampleUpdateStatusDTO, sample); 148 sampleService.update(sample); 149 return new ResponseEntity<>("Sample state has been updated successfully", OK); 150 } 151 return new ResponseEntity<>("Sample not found", NOT_FOUND); 152 } 153 }