package com.release11.klaus.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.release11.klaus.model.MockedMessageDto; import com.release11.klaus.service.KlausService; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.*; @Slf4j @Controller @RequestMapping @AllArgsConstructor public class MockController { private final KlausService klausService; private final MockedMessageDto defaultMessage = MockedMessageDto.builder().build(); /** * Responds to first user request. If UUID is given then it's set if it's not, then new one is generated. * Next recalls method that populates model based on UUID * @return */ @SneakyThrows @GetMapping({"/","/mock"}) public String showHome(){ return "mock"; } @SneakyThrows @PutMapping("/mock/json") public ResponseEntity updateMessage(@RequestBody String body){ ObjectMapper mapper = new ObjectMapper(); MockedMessageDto message = mapper.readValue(body, MockedMessageDto.class); return klausService.setMockedResponse(message); } @ResponseBody @GetMapping({"/mock/json", "/mock/json/{uuidValue}"}) public List getJson(@PathVariable(required = false) String uuidValue){ UUID clientUUID; if(uuidValue == null || uuidValue.equals("")) clientUUID = UUID.randomUUID(); else clientUUID = UUID.fromString(uuidValue); List messages = klausService.getAllMockedResponses(clientUUID); if(messages.size() == 0) { klausService.setMockedResponse(buildDefaultMessage(clientUUID)); messages = klausService.getAllMockedResponses(clientUUID); } Collections.sort(messages); return messages; } @ResponseBody @PostMapping("/mock/json/{uuidValue}") public ResponseEntity addNewMessage(@PathVariable String uuidValue){ UUID clientUUID = UUID.fromString(uuidValue); List messages = klausService.getAllMockedResponses(clientUUID); MockedMessageDto nextMessage = buildDefaultMessage(clientUUID, findNextId(messages)); return klausService.setMockedResponse(nextMessage); } @ResponseBody @DeleteMapping("/mock/json/{uuidValue}/{idValue}") public ResponseEntity removeMessage(@PathVariable String uuidValue, @PathVariable String idValue){ UUID clientUUID = UUID.fromString(uuidValue); int id = Integer.parseInt(idValue); return klausService.deleteMockedResponse(clientUUID, id); } private static MockedMessageDto buildDefaultMessage(UUID uuid, int id){ MockedMessageDto message = buildDefaultMessage(uuid); message.setMockedResponseId(id); return message; } private static MockedMessageDto buildDefaultMessage(UUID uuid){ Map headers = new HashMap<>(); headers.put("Keep-Alive", "timeout=60"); headers.put("Connection", "keep-alive"); headers.put("Date", LocalDateTime.now().toString()); return MockedMessageDto.builder() .clientUUID(uuid) .mockedResponseId(1) .mediaType(MediaType.APPLICATION_XML_VALUE) .messageBody("\n" + "\n" + " Tove\n" + " Jani\n" + " Reminder\n" + " Don't forget me this weekend!\n" + "") .httpHeaders(headers) .httpStatus(200) .build(); } public static int findNextId(List messages) { int highestId = 0; for (MockedMessageDto m : messages) highestId = highestId > m.getMockedResponseId() ? highestId : m.getMockedResponseId(); return ++highestId; } }