diff --git a/.idea/libraries/Maven__com_google_guava_guava_18_0.xml b/.idea/libraries/Maven__com_google_guava_guava_18_0.xml new file mode 100644 index 0000000..bbd71d7 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_18_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_core_2_7_0.xml b/.idea/libraries/Maven__io_springfox_springfox_core_2_7_0.xml new file mode 100644 index 0000000..abb3fd9 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_core_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_schema_2_7_0.xml b/.idea/libraries/Maven__io_springfox_springfox_schema_2_7_0.xml new file mode 100644 index 0000000..706ae46 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_schema_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_spi_2_7_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spi_2_7_0.xml new file mode 100644 index 0000000..4d0a278 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_spi_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_spring_web_2_7_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spring_web_2_7_0.xml new file mode 100644 index 0000000..0813776 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_spring_web_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger2_2_7_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger2_2_7_0.xml new file mode 100644 index 0000000..117d4ee --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_swagger2_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger_common_2_7_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger_common_2_7_0.xml new file mode 100644 index 0000000..e6679b3 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_swagger_common_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_2_7_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_2_7_0.xml new file mode 100644 index 0000000..b1342e2 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_13.xml b/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_13.xml new file mode 100644 index 0000000..1fd5fc3 --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_swagger_models_1_5_13.xml b/.idea/libraries/Maven__io_swagger_swagger_models_1_5_13.xml new file mode 100644 index 0000000..fa7a4b3 --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_swagger_models_1_5_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml new file mode 100644 index 0000000..09c4cf0 --- /dev/null +++ b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml b/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml new file mode 100644 index 0000000..d8b2fb5 --- /dev/null +++ b/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_1_2_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_1_2_0_RELEASE.xml new file mode 100644 index 0000000..fbc0452 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_1_2_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_1_2_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_1_2_0_RELEASE.xml new file mode 100644 index 0000000..7e6f096 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_1_2_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_09_09_2020_11_06_[Default_Changelist]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Update_at_09_09_2020_11_06_[Default_Changelist]/shelved.patch deleted file mode 100644 index 2973e3c..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_09_09_2020_11_06_[Default_Changelist]/shelved.patch +++ /dev/null @@ -1,114 +0,0 @@ -Index: src/main/java/com/release11/klaus/mappers/MockedMessageMapper.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/main/java/com/release11/klaus/mappers/MockedMessageMapper.java (date 1599560197073) -+++ src/main/java/com/release11/klaus/mappers/MockedMessageMapper.java (date 1599560197073) -@@ -0,0 +1,13 @@ -+package com.release11.klaus.mappers; -+ -+import com.release11.klaus.model.MockedMessage; -+import com.release11.klaus.model.MockedMessageDto; -+import org.mapstruct.*; -+ -+@Mapper -+public interface MockedMessageMapper { -+ @Mapping( target = "compositePrimaryKey", expression = "java(mockedMessageDto.getClientUUID() + \"_\"" + -+ " + mockedMessageDto.getMockedResponseId())") -+ MockedMessage mockedMessageDtoToMockedMessage(MockedMessageDto mockedMessageDto); -+ MockedMessageDto mockedMessageToMockedMessageDto(MockedMessage mockedMessage); -+} -Index: src/main/java/com/release11/klaus/model/MockedMessage.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/main/java/com/release11/klaus/model/MockedMessage.java (date 1599557591277) -+++ src/main/java/com/release11/klaus/model/MockedMessage.java (date 1599557591277) -@@ -0,0 +1,53 @@ -+package com.release11.klaus.model; -+ -+import com.release11.klaus.model.constraints.HttpCode; -+import lombok.*; -+import org.springframework.data.annotation.Id; -+import org.springframework.data.redis.core.RedisHash; -+import org.springframework.data.redis.core.index.Indexed; -+ -+import javax.validation.constraints.Positive; -+import java.io.Serializable; -+import java.util.Map; -+import java.util.UUID; -+ -+@Data -+@ToString -+@RedisHash("mockedMessage") -+@NoArgsConstructor -+@AllArgsConstructor -+public class MockedMessage implements Serializable { -+ @Id -+ private String compositePrimaryKey; -+ @Indexed -+ private UUID clientUUID; -+ @Positive -+ private int mockedResponseId; -+ private String mediaType; -+ private String messageBody; -+ private Map httpHeaders; -+ @HttpCode -+ private Integer httpStatus; -+ -+ public MockedMessage(MockedMessage mockedMessage) { -+ this.compositePrimaryKey = mockedMessage.getClientUUID().toString() + "_" + mockedMessage.getMockedResponseId(); -+ this.clientUUID = mockedMessage.getClientUUID(); -+ this.mockedResponseId = mockedMessage.getMockedResponseId(); -+ this.mediaType = mockedMessage.getMediaType(); -+ this.messageBody = mockedMessage.getMessageBody(); -+ this.httpHeaders = mockedMessage.getHttpHeaders(); -+ this.httpStatus = mockedMessage.getHttpStatus(); -+ } -+ public MockedMessage(UUID clientUUID, int mockedResponseId, String mediaType, -+ String messageBody, Map httpHeaders, Integer httpStatus) { -+ this.compositePrimaryKey = clientUUID.toString() + "_" + mockedResponseId; -+ this.clientUUID = clientUUID; -+ this.mockedResponseId = mockedResponseId; -+ this.mediaType = mediaType; -+ this.messageBody = messageBody; -+ this.httpHeaders = httpHeaders; -+ this.httpStatus = httpStatus; -+ } -+} -+ -+ -Index: src/main/java/com/release11/klaus/model/MockedMessageDto.java -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- src/main/java/com/release11/klaus/model/MockedMessageDto.java (date 1599553108395) -+++ src/main/java/com/release11/klaus/model/MockedMessageDto.java (date 1599553108395) -@@ -0,0 +1,24 @@ -+package com.release11.klaus.model; -+ -+import com.release11.klaus.model.constraints.HttpCode; -+import lombok.*; -+ -+import javax.validation.constraints.Positive; -+import java.util.Map; -+import java.util.UUID; -+ -+@Data -+@Builder -+@ToString -+@NoArgsConstructor -+@AllArgsConstructor -+public class MockedMessageDto { -+ private UUID clientUUID; -+ @Positive -+ private int mockedResponseId; -+ private String mediaType; -+ private String messageBody; -+ private Map httpHeaders; -+ @HttpCode -+ private Integer httpStatus; -+} diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_09_09_2020_11_06__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_09_09_2020_11_06__Default_Changelist_.xml new file mode 100644 index 0000000..93a97a9 --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Update_at_09_09_2020_11_06__Default_Changelist_.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 98b688f..d361a94 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,5 +1,8 @@ + + @@ -20,14 +23,10 @@ - - - - - - + + + - @@ -51,6 +51,13 @@ + + + @@ -63,29 +70,34 @@ + + - - - - - - - - - - - + + + + + + + + + + + + + + @@ -115,7 +127,6 @@ @@ -132,7 +143,6 @@ @@ -149,7 +159,6 @@ @@ -166,14 +175,6 @@ - - @@ -186,6 +187,7 @@ + @@ -414,9 +416,89 @@ + + @@ -467,9 +549,10 @@ - - + + + @@ -480,68 +563,81 @@ - + - - - + + + - - - - - + + + + + + - - - - - + + + + + + - - - - - + + + + + + - - - - - + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - + + + - - + + - - - + + + + + + + + + + + + @@ -555,38 +651,28 @@ - - + + - + + - - + + - + + file://$PROJECT_DIR$/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java - 56 - - - file://$PROJECT_DIR$/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java - 55 - - - file://$PROJECT_DIR$/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java - 52 - - - file://$PROJECT_DIR$/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java - 64 - diff --git a/Klaus.iml b/Klaus.iml index 76d99e0..94c81e3 100644 --- a/Klaus.iml +++ b/Klaus.iml @@ -30,7 +30,6 @@ - @@ -73,7 +72,7 @@ - + @@ -89,7 +88,6 @@ - @@ -110,5 +108,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 700220d..fa56879 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,7 @@ Available scripts: ### docker-compose up -d --build Builds and launches Redis service and the application. Performs unit testing on the code and run the application. + +Plugins: +settings -> plugins -> install lombok plugin +settings -> annotation processors -> enable annotation processing \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4ec24d6..fa92d0d 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,16 @@ jedis ${jedis.version} + + io.springfox + springfox-swagger2 + 2.7.0 + + + io.springfox + springfox-swagger-ui + 2.7.0 + diff --git a/src/main/java/com/release11/klaus/KlausApplication.java b/src/main/java/com/release11/klaus/KlausApplication.java index 145bd70..827d7eb 100644 --- a/src/main/java/com/release11/klaus/KlausApplication.java +++ b/src/main/java/com/release11/klaus/KlausApplication.java @@ -2,6 +2,7 @@ package com.release11.klaus; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import springfox.documentation.swagger2.annotations.EnableSwagger2; @SpringBootApplication @@ -12,10 +13,5 @@ public class KlausApplication { } } -//TODO //TODO JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword) //TODO JedisPool optimalization https://partners-intl.aliyun.com/help/doc-detail/98726.htm -// logging, security, account creation -// tracking clients activity, admin panel -// use a centralized logging collection tool like logstash for admin panel -//TODO swagger \ No newline at end of file diff --git a/src/main/java/com/release11/klaus/config/SwaggerConfig.java b/src/main/java/com/release11/klaus/config/SwaggerConfig.java new file mode 100644 index 0000000..ae54b88 --- /dev/null +++ b/src/main/java/com/release11/klaus/config/SwaggerConfig.java @@ -0,0 +1,24 @@ +package com.release11.klaus.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import static springfox.documentation.builders.PathSelectors.regex; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + @Bean + public Docket productApi() { + return new Docket(DocumentationType.SWAGGER_2).select() + .apis(RequestHandlerSelectors.basePackage("com.release11.klaus.controller")) + .paths(regex("/klaus/v1.*")) + .build(); + } +} + + diff --git a/src/main/java/com/release11/klaus/controller/EventController.java b/src/main/java/com/release11/klaus/controller/EventController.java index 5e995f9..18ec6c5 100644 --- a/src/main/java/com/release11/klaus/controller/EventController.java +++ b/src/main/java/com/release11/klaus/controller/EventController.java @@ -1,16 +1,22 @@ package com.release11.klaus.controller; +import com.release11.klaus.model.Event; import com.release11.klaus.model.EventRequestDto; import com.release11.klaus.service.EtrackService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; @Slf4j @Controller @@ -19,11 +25,54 @@ import javax.validation.Valid; public class EventController { private final EtrackService etrackService; - - @PostMapping("/eventsForm") - @ResponseBody - public String getLogs(@Valid EventRequestDto eventsDto, BindingResult bindingResult){ - return String.valueOf(etrackService.getEventsByDateTimeAndBusinessKeys(eventsDto)); + private final String sortBy = "messageId"; + private final List eventList = new LinkedList<>(); + + @GetMapping("/etrack/{uuid}") + public String showEtrack(@Valid EventRequestDto eventRequestDto, @PathVariable UUID uuid, final Model model, + BindingResult bindingResult){ + model.addAttribute("clientUUID", uuid); + model.addAttribute("eventRequestDto", eventRequestDto); + return "etrack"; } + + @PostMapping("/etrack/{uuid}") + public String getLogs(@Valid EventRequestDto eventRequestDto, final Model model, BindingResult bindingResult, + @PathVariable UUID uuid){ + model.addAttribute("clientUUID", uuid); + populateModelWithLists(model, eventRequestDto, true); + return "etrack"; + } + + @PostMapping(value = "/etrack/{uuid}", params = {"sortBy"}) + public String sortBy(@Valid EventRequestDto eventRequestDto, final Model model, BindingResult bindingResult, + @PathVariable UUID uuid){ + model.addAttribute("clientUUID", uuid); + populateModelWithLists(model, eventRequestDto, false); + return "etrack"; + } + + private void populateModelWithLists(Model model, EventRequestDto eventRequestDto, boolean updateList){ + if (updateList){ + eventList.clear(); + eventList.addAll(etrackService.getEventsByDateTimeAndBusinessKeys(eventRequestDto)); + } + model.addAttribute("eventList", eventList); + } + + @ModelAttribute("eventRequestDto") + public EventRequestDto eventRequestDto() { + return EventRequestDto.builder() + .mockedResponseId(1) + .localDateTimeFrom(LocalDateTime.of(LocalDate.now(), LocalTime.MIN)) + .localDateTimeTo(LocalDateTime.of(LocalDate.now().plusDays(1), LocalTime.MIDNIGHT)) + .build(); + } + + @ModelAttribute("eventList") + public List eventList() { + return eventList; + } + } diff --git a/src/main/java/com/release11/klaus/controller/KlausController.java b/src/main/java/com/release11/klaus/controller/KlausController.java index 12ee6ee..92dea81 100644 --- a/src/main/java/com/release11/klaus/controller/KlausController.java +++ b/src/main/java/com/release11/klaus/controller/KlausController.java @@ -12,10 +12,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; @@ -29,7 +26,7 @@ public class KlausController { private final KlausService klausService; - @RequestMapping(value = "klaus/v1/delete/{clientUUID}/{mockedResponseId}") + @DeleteMapping(value = "klaus/v1/delete/{clientUUID}/{mockedResponseId}") public ResponseEntity deleteMockedResponse(@PathVariable UUID clientUUID, @PathVariable int mockedResponseId){ TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "deleteMockedResponse", @@ -38,9 +35,10 @@ public class KlausController { klausService.deleteMockedResponse(clientUUID, mockedResponseId); return new ResponseEntity<>("message has been deleted", HttpStatus.OK); } - @RequestMapping(value = "klaus/v1/getAll/{clientUUID}") + + @GetMapping(value = "klaus/v1/getAll/{clientUUID}") public ResponseEntity getAllMockedResponses(@PathVariable UUID clientUUID){ - TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getMockedResponse", + TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getAllMockedResponse", BusinessKey.CLIENT_UUID, String.valueOf(clientUUID), BusinessKey.MESSAGE_ID, "all")); List mockedMessages = klausService.getAllMockedResponses(clientUUID); diff --git a/src/main/java/com/release11/klaus/controller/KlausMvcController.java b/src/main/java/com/release11/klaus/controller/KlausMvcController.java index aa6b684..b263bc0 100644 --- a/src/main/java/com/release11/klaus/controller/KlausMvcController.java +++ b/src/main/java/com/release11/klaus/controller/KlausMvcController.java @@ -1,6 +1,5 @@ package com.release11.klaus.controller; -import com.release11.klaus.model.EventRequestDto; import com.release11.klaus.model.MockedMessageDto; import com.release11.klaus.service.KlausService; import com.release11.klaus.utilis.BusinessKey; @@ -16,9 +15,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.net.InetAddress; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.*; @Slf4j @@ -29,11 +25,6 @@ public class KlausMvcController { private final KlausService klausService; private final Set globalMockedMessageDtoList = new HashSet<>(); - @GetMapping("/login") - public String login() { - return "login"; - } - @SneakyThrows @GetMapping({"/home", "/home/{uuid}"}) public String showHome(final MockedMessageDto mockedMessageDto, final Model model, @@ -45,15 +36,28 @@ public class KlausMvcController { return "index"; } - @PostMapping("/home/{clientUUID}") + @PostMapping("/home/{uuid}") public String showHomePost(@Valid final MockedMessageDto mockedMessageDto, BindingResult bindingResult, final Model model) { TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "setMockedResponse", BusinessKey.CLIENT_UUID, String.valueOf(mockedMessageDto.getClientUUID()), BusinessKey.MESSAGE_ID, String.valueOf(mockedMessageDto.getMockedResponseId()))); + if (bindingResult.hasErrors()){ + populateModelWithLists(model, mockedMessageDto,false); + return "index"; + } klausService.setMockedResponse(mockedMessageDto); populateModelWithLists(model, mockedMessageDto,true); model.addAttribute("mockSaved", "true"); + model.addAttribute("canTest", "true"); + return "index"; + } + + @PostMapping(value="/home/{uuid}", params={"newMessage"}) + public String newMessage(final Model model, @RequestParam UUID clientUUID) { + MockedMessageDto mockedMessageDto = new MockedMessageDto(clientUUID, new LinkedHashMap<>()); + populateModelWithLists(model, mockedMessageDto, true); + model.addAttribute("mockedMessageDto", mockedMessageDto); return "index"; } @@ -67,7 +71,7 @@ public class KlausMvcController { mockedMessageDto.getMockedResponseId()).toString(); } - @RequestMapping(value = "/home/{clientUUID}", params = {"addHeader"} ) + @PostMapping(value = "/home/{uuid}", params = {"addHeader"} ) public String addHeader(final MockedMessageDto mockedMessageDto, @RequestParam String headerKey, @RequestParam String headerValue, final Model model) { populateModelWithLists(model, mockedMessageDto,false); @@ -75,23 +79,27 @@ public class KlausMvcController { return "index"; } - @RequestMapping(value="/home/{clientUUID}", params={"removeHeader"}) + @PostMapping(value="/home/{uuid}", params={"removeHeader"}) public String removeHeader(final MockedMessageDto mockedMessageDto, final HttpServletRequest req, final Model model) { populateModelWithLists(model, mockedMessageDto,false); mockedMessageDto.getHttpHeaders().remove(req.getParameter("removeHeader")); return "index"; } - @RequestMapping(value="/home/{clientUUID}", params={"updateMessage"}) + @PostMapping(value="/home/{uuid}", params={"updateMessage"}) public String updateMessage(final HttpServletRequest req, final MockedMessageDto mockedMessageDto, final Model model) { model.addAttribute("mockedMessageDto", klausService.getMockedResponse(mockedMessageDto.getClientUUID(), Integer.parseInt(req.getParameter("updateMessage")))); populateModelWithLists(model, mockedMessageDto, false); + model.addAttribute("canTest", "true"); return "index"; } - @RequestMapping(value="/home/{clientUUID}", params={"removeMessage"}) + @PostMapping(value="/home/{uuid}", params={"removeMessage"}) public String removeMessage(final MockedMessageDto mockedMessageDto, final HttpServletRequest req, final Model model) { + TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "deleteMockedResponse", + BusinessKey.CLIENT_UUID, String.valueOf(mockedMessageDto.getClientUUID()), + BusinessKey.MESSAGE_ID, String.valueOf(Integer.parseInt(req.getParameter("removeMessage"))))); klausService.deleteMockedResponse(mockedMessageDto.getClientUUID(), Integer.parseInt(req.getParameter("removeMessage"))); populateModelWithLists(model, mockedMessageDto, true); @@ -111,17 +119,7 @@ public class KlausMvcController { @ModelAttribute("mockedMessageDto") public MockedMessageDto mockedMessageDto() { - return new MockedMessageDto(UUID.randomUUID(), 1, - "application/xml", "body", new LinkedHashMap<>(), 200); - } - - @ModelAttribute("eventRequestDto") - public EventRequestDto eventRequestDto() { - return EventRequestDto.builder() - .mockedResponseId(1) - .localDateTimeFrom(LocalDateTime.of(LocalDate.now(), LocalTime.MIN)) - .localDateTimeTo(LocalDateTime.of(LocalDate.now().plusDays(1), LocalTime.MIDNIGHT)) - .build(); + return new MockedMessageDto(UUID.randomUUID(), new LinkedHashMap<>()); } private void populateModelWithLists(Model model, MockedMessageDto mockedMessageDto, boolean updateList){ diff --git a/src/main/java/com/release11/klaus/controller/MainController.java b/src/main/java/com/release11/klaus/controller/MainController.java new file mode 100644 index 0000000..96c266a --- /dev/null +++ b/src/main/java/com/release11/klaus/controller/MainController.java @@ -0,0 +1,20 @@ +package com.release11.klaus.controller; + +import com.release11.klaus.model.MockedMessageDto; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Slf4j +@Controller +@RequestMapping +@AllArgsConstructor +public class MainController { + + @GetMapping("/home/tools") + public String showGetMockedResponse(final MockedMessageDto mockedMessageDto) { + return "tools"; + } +} diff --git a/src/main/java/com/release11/klaus/model/Event.java b/src/main/java/com/release11/klaus/model/Event.java index 8fdfe66..a453453 100644 --- a/src/main/java/com/release11/klaus/model/Event.java +++ b/src/main/java/com/release11/klaus/model/Event.java @@ -16,12 +16,15 @@ public class Event { @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss") private LocalDateTime dateTimeStamp; @Nullable - private String[] businessKeys; + private String interfaceName; + @Nullable + private String clientUUID; + @Nullable + private Integer messageId; private String thread; private String level; @Nullable private String message; } - //{"date" : "%d{yyyy-MM-dd}", "timestamp":"%d{HH:mm:ss}", "businessKeys": {"interfaceName": "%X{interfaceName}", // "clientUUID": "%X{clientUUID}", "messageId": "%X{messageId}"},"thread":"%t","level":"%-5level", "message":"%msg"}%n diff --git a/src/main/java/com/release11/klaus/model/MockedMessage.java b/src/main/java/com/release11/klaus/model/MockedMessage.java index 99f5e5b..3446bd4 100644 --- a/src/main/java/com/release11/klaus/model/MockedMessage.java +++ b/src/main/java/com/release11/klaus/model/MockedMessage.java @@ -1,7 +1,10 @@ package com.release11.klaus.model; import com.release11.klaus.model.constraints.HttpCode; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.index.Indexed; @@ -22,7 +25,7 @@ public class MockedMessage implements Serializable { @Indexed private UUID clientUUID; @Positive - private int mockedResponseId; + private Integer mockedResponseId; private String mediaType; private String messageBody; private Map httpHeaders; diff --git a/src/main/java/com/release11/klaus/model/MockedMessageDto.java b/src/main/java/com/release11/klaus/model/MockedMessageDto.java index c47d7cf..4baa8fe 100644 --- a/src/main/java/com/release11/klaus/model/MockedMessageDto.java +++ b/src/main/java/com/release11/klaus/model/MockedMessageDto.java @@ -3,6 +3,7 @@ package com.release11.klaus.model; import com.release11.klaus.model.constraints.HttpCode; import lombok.*; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import java.util.Map; import java.util.UUID; @@ -14,11 +15,20 @@ import java.util.UUID; @AllArgsConstructor public class MockedMessageDto { private UUID clientUUID; + @NotNull @Positive - private int mockedResponseId; + private Integer mockedResponseId; private String mediaType; private String messageBody; private Map httpHeaders; @HttpCode private Integer httpStatus; + + public MockedMessageDto(UUID clientUUID) { + this.clientUUID = clientUUID; + } + public MockedMessageDto(UUID clientUUID, Map httpHeaders) { + this.clientUUID = clientUUID; + this.httpHeaders = httpHeaders; + } } diff --git a/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java b/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java index 244f930..9be7cfb 100644 --- a/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java +++ b/src/main/java/com/release11/klaus/repository/EventRepositoryImpl.java @@ -50,14 +50,11 @@ public class EventRepositoryImpl implements EventRepository { } private List businessKeysFilter(List events, Map businessKeys) { - List resultList = new ArrayList<>(); for (Map.Entry entry : businessKeys.entrySet()) { - String stringPattern = "\"" + entry.getKey() + ":" + entry.getValue() + "\""; - String u; - u = "das"; - resultList = events.stream().filter(s -> s.contains(stringPattern)).collect(Collectors.toList()); + String stringPattern = entry.getKey().getReasonPhrase()+ "\"" + ":" + "\"" + entry.getValue() + "\""; + events = events.stream().filter(s -> s.contains(stringPattern)).collect(Collectors.toList()); } - return resultList; + return events; } private List parseEvents(List eventStrings) { diff --git a/src/main/java/com/release11/klaus/service/KlausServiceImpl.java b/src/main/java/com/release11/klaus/service/KlausServiceImpl.java index 73e3aa5..4d67cf9 100644 --- a/src/main/java/com/release11/klaus/service/KlausServiceImpl.java +++ b/src/main/java/com/release11/klaus/service/KlausServiceImpl.java @@ -28,6 +28,7 @@ public class KlausServiceImpl implements KlausService { public void deleteMockedResponse(UUID clientUUID, int mockedResponseId) { String key = clientUUID.toString() + "_" + mockedResponseId; mockedResponseRepository.deleteById(key); + log.info("Message " + mockedResponseId + " has been removed."); } @Override @@ -39,20 +40,22 @@ public class KlausServiceImpl implements KlausService { @Override public MockedMessageDto getMockedResponse(UUID clientUUID, int mockedResponseId) { - log.info("KlausServiceImpl, operation getMockedResponse, clientId {}, mockedResponseId {} ", - clientUUID, mockedResponseId); String key = clientUUID.toString() + "_" + mockedResponseId; Optional optionalMockedMessage = mockedResponseRepository.findById(key); + MockedMessageDto mockedMessageDto = new MockedMessageDto(); if (optionalMockedMessage.isPresent()) { - return mockedMessageMapper.mockedMessageToMockedMessageDto(optionalMockedMessage.get()); + mockedMessageDto = mockedMessageMapper.mockedMessageToMockedMessageDto(optionalMockedMessage.get()); + log.info(mockedMessageDto.toString()); + return mockedMessageDto; } - return new MockedMessageDto(); + log.info(mockedMessageDto.toString()); + return mockedMessageDto; } @Override public ResponseEntity setMockedResponse(MockedMessageDto mockedMessageDto) { mockedResponseRepository.save(mockedMessageMapper.mockedMessageDtoToMockedMessage(mockedMessageDto)); - log.info("KlausServiceImpl, operation setMockedResponse, mockedMessage {} ", mockedMessageDto.toString()); + log.info(mockedMessageDto.toString()); return new ResponseEntity<>("MockedResponse has been setup successfully!", new HttpHeaders(), HttpStatus.ACCEPTED); } diff --git a/src/main/java/com/release11/klaus/utilis/TrackingClient.java b/src/main/java/com/release11/klaus/utilis/TrackingClient.java index 0c9e522..172d3b7 100644 --- a/src/main/java/com/release11/klaus/utilis/TrackingClient.java +++ b/src/main/java/com/release11/klaus/utilis/TrackingClient.java @@ -10,7 +10,8 @@ public final class TrackingClient { public static void setBusinessKeys(Map businessKeysMap){ for (Map.Entry entry : businessKeysMap.entrySet()) { - MDC.put(entry.getKey().toString(), entry.getValue()); + String s= entry.getKey().getReasonPhrase(); + MDC.put(entry.getKey().getReasonPhrase(), entry.getValue()); } } diff --git a/src/main/resources/data-access.properties b/src/main/resources/data-access.properties index 03646f0..13dab99 100644 --- a/src/main/resources/data-access.properties +++ b/src/main/resources/data-access.properties @@ -1,2 +1,2 @@ -redis.host = redis-server +redis.host = reidis-server redis.port = 6379 \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 2087fd3..ecfe542 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -3,13 +3,14 @@ - redis-server + localhost + 6379 logstash - {"dateTimeStamp" : "%d{yyyy-MM-dd}T%d{HH:mm:ss}", "businessKeys":["INTERFACE_NAME:%X{INTERFACE_NAME}", "CLIENT_UUID:%X{CLIENT_UUID}", "MESSAGE_ID:%X{MESSAGE_ID}"],"thread":"%t","level":"%-5level", "message":"%msg"}%n + {"dateTimeStamp" : "%d{yyyy-MM-dd}T%d{HH:mm:ss}", "eventId":"%X{eventId}", "interfaceName":"%X{interfaceName}", "clientUUID":"%X{clientUUID}", "messageId":"%X{messageId}", "thread":"%t","level":"%-5level", "message":"%msg"}%n diff --git a/src/main/resources/static/css/styles.css b/src/main/resources/static/css/styles.css index 12825a8..f953669 100644 --- a/src/main/resources/static/css/styles.css +++ b/src/main/resources/static/css/styles.css @@ -46,6 +46,10 @@ button:focus { } +tr[name="tr-button"]:hover{ +background-color: #ddd; +cursor: pointer; +} #pagination-wrapper button { background: none; @@ -80,3 +84,28 @@ button[name="removeHeader"] { transition: background-color 0.3s, color 0.3s; } + + +.btn-sort { + border: 0; + padding: 0 20px; + text-align: center; + color: #fff; + text-shadow: 1px 1px 1px #000; + border-radius: 10px; + background-color: rgb(0, 102, 255); + background-image: linear-gradient(to top left, + rgba(0, 0, 0, .2), + rgba(0, 0, 0, .2) 30%, + rgba(0, 0, 0, 0)); +} + +.btn-sort:hover { + background-color: rgb(153, 194, 255); + cursor: pointer; +} + +.active { + background-color: rgb(153, 194, 255); + } + diff --git a/src/main/resources/static/img/icons8-down-arrow-40.png b/src/main/resources/static/img/icons8-down-arrow-40.png new file mode 100644 index 0000000..7f9c67b Binary files /dev/null and b/src/main/resources/static/img/icons8-down-arrow-40.png differ diff --git a/src/main/resources/static/js/etrackPaggination.js b/src/main/resources/static/js/etrackPaggination.js new file mode 100644 index 0000000..ec50748 --- /dev/null +++ b/src/main/resources/static/js/etrackPaggination.js @@ -0,0 +1,178 @@ +var state = { + 'querySet': [{ + "clientUUID": "436c4774-038f-4540-9c18-2691ca9b53d4", + "mockedResponseId": 1908998, + "mediaType": "application/xml", + "messageBody": "body", + "httpHeaders": null, + "httpStatus": 200 + }], + + 'page': 1, + 'rows': 10, + 'window': 5, +} + +var myList, data, previousSort; + +state.querySet = listForPagination; +buildTable(); + +for (let i = 3; i >= 0; i--) { + document.querySelector('#btn-sort-' + i).addEventListener('click', function() { + addButtonListeners(i) + }) +} + +function addButtonListeners(i) { + var buttons = document.querySelectorAll('.btn-sort'); + for (var j = buttons.length - 1; j >= 0; j--) { + buttons[j].classList.remove('active'); + } + document.querySelector('#btn-sort-' + i).classList.add('active'); + buildTable(); +} + + +function pagination(querySet, page, rows) { + + var trimStart = (page - 1) * rows + var trimEnd = trimStart + rows + var trimmedData = querySet.slice(trimStart, trimEnd) + var pages = Math.ceil(querySet.length / rows); + if (pages === 0) { + pages = 1 + } + return { + 'querySet': trimmedData, + 'pages': pages, + } +} + + +function pageButtons(pages) { + var wrapper = document.getElementById('pagination-wrapper'); + + wrapper.innerHTML = ``; + var maxLeft = (state.page - Math.floor(state.window / 2)) + var maxRight = (state.page + Math.ceil(state.window / 2)) + if (maxLeft < 1) { + maxLeft = 1 + maxRight = state.window + } + + if (maxRight > pages) { + maxLeft = pages - (state.window - 1) + + if (maxLeft < 1) { + maxLeft = 1 + } + maxRight = pages + } + + for (var page = maxLeft; page <= maxRight; page++) { + if (page === state.page) { + wrapper.innerHTML += `` + } else { + wrapper.innerHTML += `` + } + } + if (state.page != 1) { + wrapper.innerHTML = `` + wrapper.innerHTML + } + if (state.page != pages) { + wrapper.innerHTML += `` + } + $('.page').on('click', function() { + $('#table-body').empty() + + state.page = Number($(this).val()) + + buildPage() + }) + +} + +function showBody(elt){ + $("#" + elt.id + "-body").toggle(); +} + +function showTable() { + var table = $('#table-body') + table.empty(); + var color; + for (var i = 1; i <= myList.length; i++) { + var j = i + (state.page - 1) * 10; + i % 2 === 0 ? color = "#b3ffff" : color="#e6ffff"; + var row = ` + ` + j + ` + ${myList[i-1].messageId} + ${myList[i-1].dateTimeStamp} + ${myList[i-1].interfaceName} + + + "${myList[i-1].message}" + ` + table.append(row) + } + for (var i = myList.length + 1; i <= state.rows; i++) { + i % 2 === 0 ? color = "#b3ffff" : color="#e6ffff"; + var j = i + (state.page - 1) * 10; + var row = ` + ` + j + ` + + + + ` + table.append(row) + } + + pageButtons(data.pages) +} + + +function sortTable() { + var sortBy = document.querySelector('.active').textContent + switch (sortBy) { + case "MessageId": + if (previousSort === "MessageId") { + state.querySet.sort((a, b) => (a.messageId > b.messageId) ? -1 : ((b.messageId > a.messageId) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.messageId > b.messageId) ? 1 : ((b.messageId > a.messageId) ? -1 : 0)); + } + break; + case "TimeStamp": + if (previousSort === "TimeStamp") { + state.querySet.sort((a, b) => (a.dateTimeStamp > b.dateTimeStamp) ? -1 : ((b.dateTimeStamp > a.dateTimeStamp) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.dateTimeStamp > b.dateTimeStamp) ? 1 : ((b.dateTimeStamp > a.dateTimeStamp) ? -1 : 0)); + } + break; + case "Action": + if (previousSort === "Action") { + state.querySet.sort((a, b) => (a.interfaceName > b.interfaceName) ? -1 : ((b.interfaceName > a.interfaceName) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.interfaceName > b.interfaceName) ? 1 : ((b.interfaceName > a.interfaceName) ? -1 : 0)); + } + break; + } + if (previousSort === sortBy) { + previousSort = "" + } else previousSort = sortBy; +} + +function prepareTable() { + data = pagination(state.querySet, state.page, state.rows) + myList = data.querySet +} + +function buildTable() { + sortTable(); + prepareTable(); + showTable(); +} + +function buildPage() { + prepareTable(); + showTable(); +} \ No newline at end of file diff --git a/src/main/resources/static/js/paggination.js b/src/main/resources/static/js/paggination.js index bc62f6d..39a249c 100644 --- a/src/main/resources/static/js/paggination.js +++ b/src/main/resources/static/js/paggination.js @@ -1,21 +1,47 @@ var state = { - 'querySet': [{"clientUUID":"436c4774-038f-4540-9c18-2691ca9b53d4","mockedResponseId":1908998,"mediaType":"application/xml","messageBody":"body","httpHeaders":null,"httpStatus":200}], + 'querySet': [{ + "clientUUID": "436c4774-038f-4540-9c18-2691ca9b53d4", + "mockedResponseId": 1908998, + "mediaType": "application/xml", + "messageBody": "body", + "httpHeaders": null, + "httpStatus": 200 + }], 'page': 1, 'rows': 10, 'window': 5, } -state.querySet = mockedMessageDtoList; +var myList, data, previousSort; + + +state.querySet = listForPagination; buildTable(); +for (let i = 3; i >= 0; i--) { + document.querySelector('#btn-sort-' + i).addEventListener('click', function() { + addButtonListeners(i) + }) +} + +function addButtonListeners(i) { + var buttons = document.querySelectorAll('.btn-sort'); + for (var j = buttons.length - 1; j >= 0; j--) { + buttons[j].classList.remove('active'); + } + document.querySelector('#btn-sort-' + i).classList.add('active'); + buildTable(); +} + + function pagination(querySet, page, rows) { var trimStart = (page - 1) * rows var trimEnd = trimStart + rows var trimmedData = querySet.slice(trimStart, trimEnd) var pages = Math.ceil(querySet.length / rows); - + if(pages === 0){pages = 1} return { 'querySet': trimmedData, 'pages': pages, @@ -44,12 +70,11 @@ function pageButtons(pages) { } for (var page = maxLeft; page <= maxRight; page++) { - if(page === state.page){ + if (page === state.page) { wrapper.innerHTML += `` - } - else{ + } else { wrapper.innerHTML += `` - } + } } if (state.page != 1) { @@ -65,20 +90,18 @@ function pageButtons(pages) { state.page = Number($(this).val()) - buildTable() + buildPage() }) + } - -function buildTable() { +function showTable() { var table = $('#table-body') - - var data = pagination(state.querySet, state.page, state.rows) - var myList = data.querySet - for(var i = 1; i<=myList.length; i++){ - var j = i + (state.page-1) * 10; - if(i%2 === 0){ + table.empty(); + for (var i = 1; i <= myList.length; i++) { + var j = i + (state.page - 1) * 10; + if (i % 2 === 0) { var row = ` ` + j + ` ${myList[i-1].mockedResponseId} @@ -95,7 +118,7 @@ function buildTable() { ` - }else{ + } else { var row = ` ` + j + ` ${myList[i-1].mockedResponseId} @@ -112,10 +135,76 @@ function buildTable() { ` - } + } table.append(row) } + for (var i = myList.length + 1; i <= state.rows; i++) { + var j = i + (state.page - 1) * 10; + if (i % 2 === 0) { + var row = ` + ` + j + ` + + + + ` + } else { + var row = ` + ` + j + ` + + + + ` + } + table.append(row) + } pageButtons(data.pages) } + +function sortTable() { + var sortBy = document.querySelector('.active').textContent + switch (sortBy) { + case "MessageId": + if (previousSort === "MessageId") { + state.querySet.sort((a, b) => (a.mockedResponseId > b.mockedResponseId) ? -1 : ((b.mockedResponseId > a.mockedResponseId) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.mockedResponseId > b.mockedResponseId) ? 1 : ((b.mockedResponseId > a.mockedResponseId) ? -1 : 0)); + } + break; + case "Media Type": + if (previousSort === "Media Type") { + state.querySet.sort((a, b) => (a.mediaType > b.mediaType) ? -1 : ((b.mediaType > a.mediaType) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.mediaType > b.mediaType) ? 1 : ((b.mediaType > a.mediaType) ? -1 : 0)); + } + break; + case "Http Status": + if (previousSort === "Http Status") { + state.querySet.sort((a, b) => (a.httpStatus > b.httpStatus) ? -1 : ((b.httpStatus > a.httpStatus) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.httpStatus > b.httpStatus) ? 1 : ((b.httpStatus > a.httpStatus) ? -1 : 0)); + } + break; + } + if (previousSort === sortBy) { + previousSort = "" + } else previousSort = sortBy; + myList = state.querySet; +} + +function prepareTable() { + data = pagination(state.querySet, state.page, state.rows) + myList = data.querySet +} + +function buildTable() { + sortTable(); + prepareTable(); + showTable(); +} + +function buildPage(){ + prepareTable(); + showTable(); +} diff --git a/src/main/resources/templates/etrack.html b/src/main/resources/templates/etrack.html new file mode 100644 index 0000000..70d1504 --- /dev/null +++ b/src/main/resources/templates/etrack.html @@ -0,0 +1,68 @@ + + + + + + R11 Klaus + + + + + + + +
+
+
+
+
To see your activity history use the form below +
+ +

+ + mockedResponseId + error + +

+ + localDateTimeFrom + Error + +

+ + localDateTimeTo + Error + +
+

...

+
+ +
+
+
+
+ + + + + + + + + + + +

#

MessageId

TimeStamp

Action

+
+
+
+
+
+
+
+ + + + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index dc2f4e7..b62720f 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -10,30 +10,31 @@
-
+
-
+

In order to set mockup response please fill the form below: -
- - +
+ + - + - + - + @@ -54,7 +55,7 @@ @@ -68,47 +69,65 @@ - + + -
Mocked response id: Id Error
Mocked response body: Body Error
Mocked response http code status: HttpStatus Error
-
+ +
-
+ +
-

Mock has been saved

+
+

+
-

+

+

Mock has been saved


-
- - - - - - - - - - - -
#MessageIdMedia TypeHttp Status
+ + + + + + + + + + + + + +
+

#

+
+

MessageId

+
+

Media Type

+
+

Http Status

+
-
-
@@ -118,45 +137,28 @@
-
In order to set or get responses through curl or http tools you can use urls below. -
When you set your response simply set headers and media type of your request that you expect to get in the - response from the next step. -
http://localhost:8097/klaus/v1/delete/clientUUID should be here/{mockedResponseId} -
http://localhost:8097/klaus/v1/set/ clientUUID should be here/{mockedResponseId}?httpStatus={httpStatus} -
http://localhost:8097/klaus/v1/get/clientUUID should be here/{mockedResponseId} -
http://localhost:8097/klaus/v1/getAll/clientUUID should be here +
If you are keen to use the mocking service with bigger amount of messages or automate the process by inserting high amount of random messages please consider using the tools below: + +
http://[[${localhost}]]:8097/swagger-ui.html +
+
http://[[${localhost}]]:8097/klaus/v1/delete/[[${mockedMessageDto.clientUUID}]]/{mockedResponseId} +
http://[[${localhost}]]:8097/klaus/v1/set/[[${mockedMessageDto.clientUUID}]]/{mockedResponseId}?httpStatus={httpStatus} +
http://[[${localhost}]]:8097/klaus/v1/get/[[${mockedMessageDto.clientUUID}]]/{mockedResponseId} +
http://[[${localhost}]]:8097/klaus/v1/getAll/[[${mockedMessageDto.clientUUID}]] + +

- -
-
To see your activity history use the form below -
- -

- - mockedResponseId error -

- - localDateTimeFrom Error -

- - localDateTimeTo Error -
-

...

-
- -
-

+ \ No newline at end of file diff --git a/src/main/resources/templates/tools.html b/src/main/resources/templates/tools.html new file mode 100644 index 0000000..29ae2fc --- /dev/null +++ b/src/main/resources/templates/tools.html @@ -0,0 +1,128 @@ + + + + Blog - Release11 - nowoczesne technologie IT.2 + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+

Blog

  • Tytuł Artykul 4

    Tekst 100 znaków

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

  • Tytuł Artykul 3

    Tekst 100 znaków

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

  • Tytuł Artykul 2

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

  • Tytuł Artykul 1

    Tekst 100 znaków

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

+ +
+
+
+ +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.java b/src/test/java/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.java index 8d68d5d..df9dfe2 100644 --- a/src/test/java/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.java +++ b/src/test/java/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.java @@ -2,16 +2,10 @@ package com.release11.klaus.repository; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.release11.klaus.model.Event; -import com.release11.klaus.model.MockedMessageDto; -import com.release11.klaus.utilis.BusinessKey; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import java.time.LocalDateTime; -import java.util.*; - @SpringBootTest class MockedResponseRedisRepositoryTest { @Autowired @@ -20,42 +14,12 @@ class MockedResponseRedisRepositoryTest { @Test void getMockedResponse() throws JsonProcessingException { - Map businessKeys = new HashMap<>(); - String[] businessKeys1 = {"fdsa", "Dsa", "dsa"}; - businessKeys.put(BusinessKey.CLIENT_UUID, "xxx"); - businessKeys.put(BusinessKey.INTERFACE_NAME, "interfaceName"); - businessKeys.put(BusinessKey.MESSAGE_ID, "2323"); - Event event = Event.builder() - .dateTimeStamp(LocalDateTime.now()) - .businessKeys(businessKeys1) - .message("hello") - .level("INFO") - .thread("main") - .build(); - String eventString = objectMapper.writeValueAsString(event); - - String ddd = "{\"dateTimeStamp\" : \"2020-09-04T15:31:48\", \"businessKeys\":[\"INTERFACE_NAME:setMockedResponse\", \"CLIENT_UUID:436c4774-038f-4540-9c18-2691ca9b53d4\", \"MESSAGE_ID:1\"],\"thread\":\"http-nio-8097-exec-6\",\"level\":\"INFO \", \"message\":\"mockedMessage(compositePrimaryKey=null, clientUUID=436c4774-038f-4540-9c18-2691ca9b53d4, mockedResponseId=1, mediaType=application/xml, messageBody=body, httpHeaders=null, httpStatus=200)\" dsads}das"; - objectMapper.readValue(eventString, Event.class); } @Test void setMockedResponse() throws JsonProcessingException { - List mockedMessageDtoList = new LinkedList<>(); - mockedMessageDtoList.add(new MockedMessageDto(UUID.randomUUID(), 1, - "application/xml", "body", new LinkedHashMap<>(), 200)); - mockedMessageDtoList.add(new MockedMessageDto(UUID.randomUUID(), 1, - "application/xml", "body", new LinkedHashMap<>(), 200)); - mockedMessageDtoList.add(new MockedMessageDto(UUID.randomUUID(), 1, - "application/xml", "body", new LinkedHashMap<>(), 200)); - mockedMessageDtoList.add(new MockedMessageDto(UUID.randomUUID(), 1, - "application/xml", "body", new LinkedHashMap<>(), 200)); - List mockedMessageDtoList1 = new LinkedList<>(); - for (MockedMessageDto mockedMessageDto : mockedMessageDtoList){ - mockedMessageDtoList1.add(objectMapper.writeValueAsString(mockedMessageDto)); - } - mockedMessageDtoList1.forEach(System.out::println); } diff --git a/target/classes/com/release11/klaus/KlausApplication.class b/target/classes/com/release11/klaus/KlausApplication.class index 3c14ac5..3c7716c 100644 Binary files a/target/classes/com/release11/klaus/KlausApplication.class and b/target/classes/com/release11/klaus/KlausApplication.class differ diff --git a/target/classes/com/release11/klaus/config/SwaggerConfig.class b/target/classes/com/release11/klaus/config/SwaggerConfig.class new file mode 100644 index 0000000..fb98640 Binary files /dev/null and b/target/classes/com/release11/klaus/config/SwaggerConfig.class differ diff --git a/target/classes/com/release11/klaus/controller/EventController.class b/target/classes/com/release11/klaus/controller/EventController.class index e1a520e..291e036 100644 Binary files a/target/classes/com/release11/klaus/controller/EventController.class and b/target/classes/com/release11/klaus/controller/EventController.class differ diff --git a/target/classes/com/release11/klaus/controller/KlausController.class b/target/classes/com/release11/klaus/controller/KlausController.class index e077884..8428ca6 100644 Binary files a/target/classes/com/release11/klaus/controller/KlausController.class and b/target/classes/com/release11/klaus/controller/KlausController.class differ diff --git a/target/classes/com/release11/klaus/controller/KlausMvcController.class b/target/classes/com/release11/klaus/controller/KlausMvcController.class index bae3459..55159cb 100644 Binary files a/target/classes/com/release11/klaus/controller/KlausMvcController.class and b/target/classes/com/release11/klaus/controller/KlausMvcController.class differ diff --git a/target/classes/com/release11/klaus/controller/MainController.class b/target/classes/com/release11/klaus/controller/MainController.class new file mode 100644 index 0000000..1f0987f Binary files /dev/null and b/target/classes/com/release11/klaus/controller/MainController.class differ diff --git a/target/classes/com/release11/klaus/mappers/MockedMessageMapperImpl.class b/target/classes/com/release11/klaus/mappers/MockedMessageMapperImpl.class index ab2ad8d..5a6aa0b 100644 Binary files a/target/classes/com/release11/klaus/mappers/MockedMessageMapperImpl.class and b/target/classes/com/release11/klaus/mappers/MockedMessageMapperImpl.class differ diff --git a/target/classes/com/release11/klaus/model/Event$EventBuilder.class b/target/classes/com/release11/klaus/model/Event$EventBuilder.class index 198c7e2..2e999ac 100644 Binary files a/target/classes/com/release11/klaus/model/Event$EventBuilder.class and b/target/classes/com/release11/klaus/model/Event$EventBuilder.class differ diff --git a/target/classes/com/release11/klaus/model/Event.class b/target/classes/com/release11/klaus/model/Event.class index 29c3fdf..1225857 100644 Binary files a/target/classes/com/release11/klaus/model/Event.class and b/target/classes/com/release11/klaus/model/Event.class differ diff --git a/target/classes/com/release11/klaus/model/MockedMessage.class b/target/classes/com/release11/klaus/model/MockedMessage.class index 44ba22a..bfd5348 100644 Binary files a/target/classes/com/release11/klaus/model/MockedMessage.class and b/target/classes/com/release11/klaus/model/MockedMessage.class differ diff --git a/target/classes/com/release11/klaus/model/MockedMessageDto$MockedMessageDtoBuilder.class b/target/classes/com/release11/klaus/model/MockedMessageDto$MockedMessageDtoBuilder.class index 5d4554a..7dfc1f6 100644 Binary files a/target/classes/com/release11/klaus/model/MockedMessageDto$MockedMessageDtoBuilder.class and b/target/classes/com/release11/klaus/model/MockedMessageDto$MockedMessageDtoBuilder.class differ diff --git a/target/classes/com/release11/klaus/model/MockedMessageDto.class b/target/classes/com/release11/klaus/model/MockedMessageDto.class index e0a97d3..928a19e 100644 Binary files a/target/classes/com/release11/klaus/model/MockedMessageDto.class and b/target/classes/com/release11/klaus/model/MockedMessageDto.class differ diff --git a/target/classes/com/release11/klaus/repository/EventRepositoryImpl.class b/target/classes/com/release11/klaus/repository/EventRepositoryImpl.class index b35cbaa..163d8d7 100644 Binary files a/target/classes/com/release11/klaus/repository/EventRepositoryImpl.class and b/target/classes/com/release11/klaus/repository/EventRepositoryImpl.class differ diff --git a/target/classes/com/release11/klaus/service/KlausServiceImpl.class b/target/classes/com/release11/klaus/service/KlausServiceImpl.class index 7366147..48fcf23 100644 Binary files a/target/classes/com/release11/klaus/service/KlausServiceImpl.class and b/target/classes/com/release11/klaus/service/KlausServiceImpl.class differ diff --git a/target/classes/com/release11/klaus/utilis/TrackingClient.class b/target/classes/com/release11/klaus/utilis/TrackingClient.class index df8eb0e..7945090 100644 Binary files a/target/classes/com/release11/klaus/utilis/TrackingClient.class and b/target/classes/com/release11/klaus/utilis/TrackingClient.class differ diff --git a/target/classes/logback.xml b/target/classes/logback.xml index 2087fd3..ecfe542 100644 --- a/target/classes/logback.xml +++ b/target/classes/logback.xml @@ -3,13 +3,14 @@ - redis-server + localhost + 6379 logstash - {"dateTimeStamp" : "%d{yyyy-MM-dd}T%d{HH:mm:ss}", "businessKeys":["INTERFACE_NAME:%X{INTERFACE_NAME}", "CLIENT_UUID:%X{CLIENT_UUID}", "MESSAGE_ID:%X{MESSAGE_ID}"],"thread":"%t","level":"%-5level", "message":"%msg"}%n + {"dateTimeStamp" : "%d{yyyy-MM-dd}T%d{HH:mm:ss}", "eventId":"%X{eventId}", "interfaceName":"%X{interfaceName}", "clientUUID":"%X{clientUUID}", "messageId":"%X{messageId}", "thread":"%t","level":"%-5level", "message":"%msg"}%n diff --git a/target/classes/static/css/styles.css b/target/classes/static/css/styles.css index 12825a8..f953669 100644 --- a/target/classes/static/css/styles.css +++ b/target/classes/static/css/styles.css @@ -46,6 +46,10 @@ button:focus { } +tr[name="tr-button"]:hover{ +background-color: #ddd; +cursor: pointer; +} #pagination-wrapper button { background: none; @@ -80,3 +84,28 @@ button[name="removeHeader"] { transition: background-color 0.3s, color 0.3s; } + + +.btn-sort { + border: 0; + padding: 0 20px; + text-align: center; + color: #fff; + text-shadow: 1px 1px 1px #000; + border-radius: 10px; + background-color: rgb(0, 102, 255); + background-image: linear-gradient(to top left, + rgba(0, 0, 0, .2), + rgba(0, 0, 0, .2) 30%, + rgba(0, 0, 0, 0)); +} + +.btn-sort:hover { + background-color: rgb(153, 194, 255); + cursor: pointer; +} + +.active { + background-color: rgb(153, 194, 255); + } + diff --git a/target/classes/static/img/icons8-down-arrow-40.png b/target/classes/static/img/icons8-down-arrow-40.png new file mode 100644 index 0000000..7f9c67b Binary files /dev/null and b/target/classes/static/img/icons8-down-arrow-40.png differ diff --git a/target/classes/static/img/update-button.png b/target/classes/static/img/update-button.png new file mode 100644 index 0000000..3a72824 Binary files /dev/null and b/target/classes/static/img/update-button.png differ diff --git a/target/classes/static/js/etrackPaggination.js b/target/classes/static/js/etrackPaggination.js new file mode 100644 index 0000000..ec50748 --- /dev/null +++ b/target/classes/static/js/etrackPaggination.js @@ -0,0 +1,178 @@ +var state = { + 'querySet': [{ + "clientUUID": "436c4774-038f-4540-9c18-2691ca9b53d4", + "mockedResponseId": 1908998, + "mediaType": "application/xml", + "messageBody": "body", + "httpHeaders": null, + "httpStatus": 200 + }], + + 'page': 1, + 'rows': 10, + 'window': 5, +} + +var myList, data, previousSort; + +state.querySet = listForPagination; +buildTable(); + +for (let i = 3; i >= 0; i--) { + document.querySelector('#btn-sort-' + i).addEventListener('click', function() { + addButtonListeners(i) + }) +} + +function addButtonListeners(i) { + var buttons = document.querySelectorAll('.btn-sort'); + for (var j = buttons.length - 1; j >= 0; j--) { + buttons[j].classList.remove('active'); + } + document.querySelector('#btn-sort-' + i).classList.add('active'); + buildTable(); +} + + +function pagination(querySet, page, rows) { + + var trimStart = (page - 1) * rows + var trimEnd = trimStart + rows + var trimmedData = querySet.slice(trimStart, trimEnd) + var pages = Math.ceil(querySet.length / rows); + if (pages === 0) { + pages = 1 + } + return { + 'querySet': trimmedData, + 'pages': pages, + } +} + + +function pageButtons(pages) { + var wrapper = document.getElementById('pagination-wrapper'); + + wrapper.innerHTML = ``; + var maxLeft = (state.page - Math.floor(state.window / 2)) + var maxRight = (state.page + Math.ceil(state.window / 2)) + if (maxLeft < 1) { + maxLeft = 1 + maxRight = state.window + } + + if (maxRight > pages) { + maxLeft = pages - (state.window - 1) + + if (maxLeft < 1) { + maxLeft = 1 + } + maxRight = pages + } + + for (var page = maxLeft; page <= maxRight; page++) { + if (page === state.page) { + wrapper.innerHTML += `` + } else { + wrapper.innerHTML += `` + } + } + if (state.page != 1) { + wrapper.innerHTML = `` + wrapper.innerHTML + } + if (state.page != pages) { + wrapper.innerHTML += `` + } + $('.page').on('click', function() { + $('#table-body').empty() + + state.page = Number($(this).val()) + + buildPage() + }) + +} + +function showBody(elt){ + $("#" + elt.id + "-body").toggle(); +} + +function showTable() { + var table = $('#table-body') + table.empty(); + var color; + for (var i = 1; i <= myList.length; i++) { + var j = i + (state.page - 1) * 10; + i % 2 === 0 ? color = "#b3ffff" : color="#e6ffff"; + var row = ` + ` + j + ` + ${myList[i-1].messageId} + ${myList[i-1].dateTimeStamp} + ${myList[i-1].interfaceName} + + + "${myList[i-1].message}" + ` + table.append(row) + } + for (var i = myList.length + 1; i <= state.rows; i++) { + i % 2 === 0 ? color = "#b3ffff" : color="#e6ffff"; + var j = i + (state.page - 1) * 10; + var row = ` + ` + j + ` + + + + ` + table.append(row) + } + + pageButtons(data.pages) +} + + +function sortTable() { + var sortBy = document.querySelector('.active').textContent + switch (sortBy) { + case "MessageId": + if (previousSort === "MessageId") { + state.querySet.sort((a, b) => (a.messageId > b.messageId) ? -1 : ((b.messageId > a.messageId) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.messageId > b.messageId) ? 1 : ((b.messageId > a.messageId) ? -1 : 0)); + } + break; + case "TimeStamp": + if (previousSort === "TimeStamp") { + state.querySet.sort((a, b) => (a.dateTimeStamp > b.dateTimeStamp) ? -1 : ((b.dateTimeStamp > a.dateTimeStamp) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.dateTimeStamp > b.dateTimeStamp) ? 1 : ((b.dateTimeStamp > a.dateTimeStamp) ? -1 : 0)); + } + break; + case "Action": + if (previousSort === "Action") { + state.querySet.sort((a, b) => (a.interfaceName > b.interfaceName) ? -1 : ((b.interfaceName > a.interfaceName) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.interfaceName > b.interfaceName) ? 1 : ((b.interfaceName > a.interfaceName) ? -1 : 0)); + } + break; + } + if (previousSort === sortBy) { + previousSort = "" + } else previousSort = sortBy; +} + +function prepareTable() { + data = pagination(state.querySet, state.page, state.rows) + myList = data.querySet +} + +function buildTable() { + sortTable(); + prepareTable(); + showTable(); +} + +function buildPage() { + prepareTable(); + showTable(); +} \ No newline at end of file diff --git a/target/classes/static/js/paggination.js b/target/classes/static/js/paggination.js index bc62f6d..39a249c 100644 --- a/target/classes/static/js/paggination.js +++ b/target/classes/static/js/paggination.js @@ -1,21 +1,47 @@ var state = { - 'querySet': [{"clientUUID":"436c4774-038f-4540-9c18-2691ca9b53d4","mockedResponseId":1908998,"mediaType":"application/xml","messageBody":"body","httpHeaders":null,"httpStatus":200}], + 'querySet': [{ + "clientUUID": "436c4774-038f-4540-9c18-2691ca9b53d4", + "mockedResponseId": 1908998, + "mediaType": "application/xml", + "messageBody": "body", + "httpHeaders": null, + "httpStatus": 200 + }], 'page': 1, 'rows': 10, 'window': 5, } -state.querySet = mockedMessageDtoList; +var myList, data, previousSort; + + +state.querySet = listForPagination; buildTable(); +for (let i = 3; i >= 0; i--) { + document.querySelector('#btn-sort-' + i).addEventListener('click', function() { + addButtonListeners(i) + }) +} + +function addButtonListeners(i) { + var buttons = document.querySelectorAll('.btn-sort'); + for (var j = buttons.length - 1; j >= 0; j--) { + buttons[j].classList.remove('active'); + } + document.querySelector('#btn-sort-' + i).classList.add('active'); + buildTable(); +} + + function pagination(querySet, page, rows) { var trimStart = (page - 1) * rows var trimEnd = trimStart + rows var trimmedData = querySet.slice(trimStart, trimEnd) var pages = Math.ceil(querySet.length / rows); - + if(pages === 0){pages = 1} return { 'querySet': trimmedData, 'pages': pages, @@ -44,12 +70,11 @@ function pageButtons(pages) { } for (var page = maxLeft; page <= maxRight; page++) { - if(page === state.page){ + if (page === state.page) { wrapper.innerHTML += `` - } - else{ + } else { wrapper.innerHTML += `` - } + } } if (state.page != 1) { @@ -65,20 +90,18 @@ function pageButtons(pages) { state.page = Number($(this).val()) - buildTable() + buildPage() }) + } - -function buildTable() { +function showTable() { var table = $('#table-body') - - var data = pagination(state.querySet, state.page, state.rows) - var myList = data.querySet - for(var i = 1; i<=myList.length; i++){ - var j = i + (state.page-1) * 10; - if(i%2 === 0){ + table.empty(); + for (var i = 1; i <= myList.length; i++) { + var j = i + (state.page - 1) * 10; + if (i % 2 === 0) { var row = ` ` + j + ` ${myList[i-1].mockedResponseId} @@ -95,7 +118,7 @@ function buildTable() { ` - }else{ + } else { var row = ` ` + j + ` ${myList[i-1].mockedResponseId} @@ -112,10 +135,76 @@ function buildTable() { ` - } + } table.append(row) } + for (var i = myList.length + 1; i <= state.rows; i++) { + var j = i + (state.page - 1) * 10; + if (i % 2 === 0) { + var row = ` + ` + j + ` + + + + ` + } else { + var row = ` + ` + j + ` + + + + ` + } + table.append(row) + } pageButtons(data.pages) } + +function sortTable() { + var sortBy = document.querySelector('.active').textContent + switch (sortBy) { + case "MessageId": + if (previousSort === "MessageId") { + state.querySet.sort((a, b) => (a.mockedResponseId > b.mockedResponseId) ? -1 : ((b.mockedResponseId > a.mockedResponseId) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.mockedResponseId > b.mockedResponseId) ? 1 : ((b.mockedResponseId > a.mockedResponseId) ? -1 : 0)); + } + break; + case "Media Type": + if (previousSort === "Media Type") { + state.querySet.sort((a, b) => (a.mediaType > b.mediaType) ? -1 : ((b.mediaType > a.mediaType) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.mediaType > b.mediaType) ? 1 : ((b.mediaType > a.mediaType) ? -1 : 0)); + } + break; + case "Http Status": + if (previousSort === "Http Status") { + state.querySet.sort((a, b) => (a.httpStatus > b.httpStatus) ? -1 : ((b.httpStatus > a.httpStatus) ? 1 : 0)); + } else { + state.querySet.sort((a, b) => (a.httpStatus > b.httpStatus) ? 1 : ((b.httpStatus > a.httpStatus) ? -1 : 0)); + } + break; + } + if (previousSort === sortBy) { + previousSort = "" + } else previousSort = sortBy; + myList = state.querySet; +} + +function prepareTable() { + data = pagination(state.querySet, state.page, state.rows) + myList = data.querySet +} + +function buildTable() { + sortTable(); + prepareTable(); + showTable(); +} + +function buildPage(){ + prepareTable(); + showTable(); +} diff --git a/target/classes/templates/etrack.html b/target/classes/templates/etrack.html new file mode 100644 index 0000000..70d1504 --- /dev/null +++ b/target/classes/templates/etrack.html @@ -0,0 +1,68 @@ + + + + + + R11 Klaus + + + + + + + +
+
+
+
+
To see your activity history use the form below +
+ +

+ + mockedResponseId + error + +

+ + localDateTimeFrom + Error + +

+ + localDateTimeTo + Error + +
+

...

+
+ +
+
+
+
+ + + + + + + + + + + +

#

MessageId

TimeStamp

Action

+
+
+
+
+
+
+
+ + + + diff --git a/target/classes/templates/index.html b/target/classes/templates/index.html index dc2f4e7..b62720f 100644 --- a/target/classes/templates/index.html +++ b/target/classes/templates/index.html @@ -10,30 +10,31 @@
-
+
-
+

In order to set mockup response please fill the form below: -
- - +
+ + - + - + - + @@ -54,7 +55,7 @@ @@ -68,47 +69,65 @@ - + + -
Mocked response id: Id Error
Mocked response body: Body Error
Mocked response http code status: HttpStatus Error
-
+ +
-
+ +
-

Mock has been saved

+
+

+
-

+

+

Mock has been saved


-
- - - - - - - - - - - -
#MessageIdMedia TypeHttp Status
+ + + + + + + + + + + + + +
+

#

+
+

MessageId

+
+

Media Type

+
+

Http Status

+
-
-
@@ -118,45 +137,28 @@
-
In order to set or get responses through curl or http tools you can use urls below. -
When you set your response simply set headers and media type of your request that you expect to get in the - response from the next step. -
http://localhost:8097/klaus/v1/delete/clientUUID should be here/{mockedResponseId} -
http://localhost:8097/klaus/v1/set/ clientUUID should be here/{mockedResponseId}?httpStatus={httpStatus} -
http://localhost:8097/klaus/v1/get/clientUUID should be here/{mockedResponseId} -
http://localhost:8097/klaus/v1/getAll/clientUUID should be here +
If you are keen to use the mocking service with bigger amount of messages or automate the process by inserting high amount of random messages please consider using the tools below: + +
http://[[${localhost}]]:8097/swagger-ui.html +
+
http://[[${localhost}]]:8097/klaus/v1/delete/[[${mockedMessageDto.clientUUID}]]/{mockedResponseId} +
http://[[${localhost}]]:8097/klaus/v1/set/[[${mockedMessageDto.clientUUID}]]/{mockedResponseId}?httpStatus={httpStatus} +
http://[[${localhost}]]:8097/klaus/v1/get/[[${mockedMessageDto.clientUUID}]]/{mockedResponseId} +
http://[[${localhost}]]:8097/klaus/v1/getAll/[[${mockedMessageDto.clientUUID}]] + +

- -
-
To see your activity history use the form below -
- -

- - mockedResponseId error -

- - localDateTimeFrom Error -

- - localDateTimeTo Error -
-

...

-
- -
-

+ \ No newline at end of file diff --git a/target/classes/templates/tools.html b/target/classes/templates/tools.html new file mode 100644 index 0000000..29ae2fc --- /dev/null +++ b/target/classes/templates/tools.html @@ -0,0 +1,128 @@ + + + + Blog - Release11 - nowoczesne technologie IT.2 + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+

Blog

  • Tytuł Artykul 4

    Tekst 100 znaków

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

  • Tytuł Artykul 3

    Tekst 100 znaków

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

  • Tytuł Artykul 2

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

  • Tytuł Artykul 1

    Tekst 100 znaków

    +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque

+ +
+
+
+ +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/target/generated-sources/annotations/com/release11/klaus/mappers/MockedMessageMapperImpl.java b/target/generated-sources/annotations/com/release11/klaus/mappers/MockedMessageMapperImpl.java index c08984a..8c3d2f2 100644 --- a/target/generated-sources/annotations/com/release11/klaus/mappers/MockedMessageMapperImpl.java +++ b/target/generated-sources/annotations/com/release11/klaus/mappers/MockedMessageMapperImpl.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Component; @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2020-09-11T10:05:20+0200", + date = "2020-09-21T16:25:27+0200", comments = "version: 1.3.1.Final, compiler: javac, environment: Java 14.0.1 (Oracle Corporation)" ) @Component diff --git a/target/test-classes/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.class b/target/test-classes/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.class index 32d6dae..e5039b5 100644 Binary files a/target/test-classes/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.class and b/target/test-classes/com/release11/klaus/repository/MockedResponseRedisRepositoryTest.class differ