Files
release11-tools-mocked-serv…/src/main/java/com/release11/klaus/controller/MockController.java

118 lines
4.3 KiB
Java

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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Slf4j
@Controller
@RequestMapping
@AllArgsConstructor
public class MockController {
private final KlausService klausService;
//TODO: Write a method
private final MockedMessageDto defaultMessage = MockedMessageDto.builder().build();
/*
1. GET request to get the page
2. Javascripts checks for cookies if not it sends empty UUID on GetMapping /mock/json
3. When Javascript:
- 1. Saves: PUT request, then GET request
- 2. Deletes: DELETE request, then GET request
- 3. Adds new message: POST request, then GET request
4. After each action cookie is updated
Cookie holds uuid, last displayed message
*/
//TODO: Add cookie in javascript
/**
* 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<String> 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<MockedMessageDto> getJson(@PathVariable(required = false) String uuidValue){
UUID clientUUID = UUID.fromString(uuidValue);
if(clientUUID == null) clientUUID = UUID.randomUUID();
List<MockedMessageDto> messages = klausService.getAllMockedResponses(clientUUID);
if(messages.size() == 0) {
klausService.setMockedResponse(buildDefaultMessage(clientUUID));
messages = klausService.getAllMockedResponses(clientUUID);
}
return messages;
}
@ResponseBody
@PostMapping("/mock/json/{uuidValue}")
public ResponseEntity<String> addNewMessage(@PathVariable String uuidValue){
UUID clientUUID = UUID.fromString(uuidValue);
List<MockedMessageDto> messages = klausService.getAllMockedResponses(clientUUID);
MockedMessageDto nextMessage = buildDefaultMessage(clientUUID, findNextId(messages));
return klausService.setMockedResponse(nextMessage);
}
private static MockedMessageDto buildDefaultMessage(UUID uuid, int id){
MockedMessageDto message = buildDefaultMessage(uuid);
message.setMockedResponseId(id);
return message;
}
private static MockedMessageDto buildDefaultMessage(UUID uuid){
Map<String, String> 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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<note>\n" +
" <to>Tove</to>\n" +
" <from>Jani</from>\n" +
" <heading>Reminder</heading>\n" +
" <body>Don't forget me this weekend!</body>\n" +
"</note>")
.httpHeaders(headers)
.httpStatus(200)
.build();
}
public static int findNextId(List<MockedMessageDto> messages) {
int highestId = 0;
for (MockedMessageDto m : messages)
highestId = highestId > m.getMockedResponseId() ? highestId : m.getMockedResponseId();
return ++highestId;
}
}