View Javadoc
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 }