diff --git a/Backend/mocked-services/pom.xml b/Backend/mocked-services/pom.xml index 0a6ceb7..96e6d0e 100644 --- a/Backend/mocked-services/pom.xml +++ b/Backend/mocked-services/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.3.1.RELEASE + 2.7.11 @@ -18,9 +18,10 @@ 3.3.0 1.1.6 3.16.1 - 1.3.1.Final + 1.5.5.Final Release11 ${project.artifactId} + 1.18.26 @@ -57,21 +58,6 @@ org.springframework.boot spring-boot-starter-data-redis - - com.cwbase - logback-redis-appender - ${logback-redis-appender.version} - - - redis.clients - jedis - ${jedis.version} - - - org.codehaus.jettison - jettison - 1.4.1 - @@ -101,6 +87,11 @@ lombok ${lombok.version} + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + -Amapstruct.defaultComponentModel=spring diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/config/RedisConfig.java b/Backend/mocked-services/src/main/java/com/r11/tools/config/RedisConfig.java deleted file mode 100644 index c3438d2..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/config/RedisConfig.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.r11.tools.config; - -import java.util.Objects; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; -import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import redis.clients.jedis.JedisPool; - -/** - * Class containing configuration for Redis db client - * @author Rafał Żukowicz - */ -@Configuration -@EnableRedisRepositories -@PropertySource("classpath:data-access.properties") -public class RedisConfig { - - @Autowired - private Environment environment; - - /** - * Bean of JedisPool - the Redis client. It stores requests in "the pool" and then fires them at Redis. - * It's considered super lightweight and fast client variant - * @return lightweight client of the Redis - the JedisPool - */ - @Bean - JedisPool jedisPool(){ - final JedisPool pool = new JedisPool(environment.getProperty("redis.host"), - Integer.parseInt(environment.getProperty("redis.port"))); - return pool; - } - - /** - * Bean of a factory for connenction object. - * It's initialized with Redis db url property and is fed to other methods. - * @return the factory for RedisTemplates - */ - @Bean - JedisConnectionFactory jedisConnectionFactory() { - RedisStandaloneConfiguration redisStandaloneConfiguration = - new RedisStandaloneConfiguration(Objects.requireNonNull(environment.getProperty("redis.host")), - Integer.parseInt(Objects.requireNonNull(environment.getProperty("redis.port")))); - return new JedisConnectionFactory(redisStandaloneConfiguration); - } - - /** - * RedisTemplate is the tool to store and retrieve given type (object) of hash from the database. - * It's like you could store your Java object by just naming it inside database. You might thing about it - * as of DAO. - * @return RedisTemplate the redis dao. - */ - @Bean - public RedisTemplate redisTemplate() { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(jedisConnectionFactory()); - redisTemplate.setExposeConnection(true); - redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer()); - return redisTemplate; - } - -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/configuration/WebConfig.java b/Backend/mocked-services/src/main/java/com/r11/tools/configuration/WebConfig.java new file mode 100644 index 0000000..5364bce --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/configuration/WebConfig.java @@ -0,0 +1,22 @@ +package com.r11.tools.configuration; + +import com.r11.tools.interceptor.IncomingMockRequestInterceptor; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class WebConfig implements WebMvcConfigurer{ + + private final IncomingMockRequestInterceptor requestInterceptor; + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor( requestInterceptor ) + .addPathPatterns("/api/mock/r/**"); + } + +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/controller/EventController.java b/Backend/mocked-services/src/main/java/com/r11/tools/controller/EventController.java deleted file mode 100644 index 81ff153..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/controller/EventController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.r11.tools.controller; - -import com.r11.tools.model.EventRequestDto; -import com.r11.tools.service.EtrackService; -import lombok.AllArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import java.time.LocalDateTime; -import java.util.UUID; - -/** - * It's the REST api for {@link com.r11.tools.model.Event} - * @author Gabriel Modzelewski - */ -@RestController -@RequestMapping(path = "/api/event") -@AllArgsConstructor -public class EventController { - private final EtrackService service; - - /** - * Returns the list of Events in given time bracket. - * The list of objects is received via {@link EventRequestDto}, which contains time brackets, - * as well as the key - uuid. - * @param event EventRequestDto object that contains data needed to query the database - * @return list of {@link com.r11.tools.model.Event} - */ - @PostMapping - public ResponseEntity filterHistory(@RequestBody EventRequestDto event){ - return new ResponseEntity(service.getEventsByDateTimeAndBusinessKeys(event), HttpStatus.OK); - } - - /** - * Returns the list of Events of last 24h from given date. - * @param uuid unique id of message list - * @param messageId unique id of message in message list - * @return list of {@link com.r11.tools.model.Event} - */ - @GetMapping(path = "/{uuid}/{messageId}") - public ResponseEntity getLastDay(@PathVariable UUID uuid, - @PathVariable Integer messageId){ - LocalDateTime requestTime = LocalDateTime.now(); - LocalDateTime dayBeforeRequest = requestTime.minusDays(1L); - EventRequestDto eventRequestDto = EventRequestDto.builder() - .clientUUID(uuid) - .mockedResponseId(messageId) - .localDateTimeFrom(dayBeforeRequest) - .localDateTimeTo(requestTime) - .build(); - return new ResponseEntity(service.getEventsByDateTimeAndBusinessKeys(eventRequestDto), HttpStatus.OK); - } - - -} - diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/controller/MockController.java b/Backend/mocked-services/src/main/java/com/r11/tools/controller/MockController.java index 38d0bc3..184f5e7 100644 --- a/Backend/mocked-services/src/main/java/com/r11/tools/controller/MockController.java +++ b/Backend/mocked-services/src/main/java/com/r11/tools/controller/MockController.java @@ -3,13 +3,14 @@ package com.r11.tools.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.r11.tools.model.MockedMessageDto; import com.r11.tools.service.KlausService; -import com.r11.tools.utilis.BusinessKey; -import com.r11.tools.utilis.TrackingClient; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.springframework.http.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; @@ -18,6 +19,7 @@ import java.util.*; /** * Returns the homepage and provides the api for javascript async requests. * @author Gabriel Modzelewski + * @author Mikołaj Widła */ @RestController @RequestMapping(path = "/api/mock") @@ -28,7 +30,7 @@ public class MockController { @ExceptionHandler(Exception.class) public void errorHandler(Exception ex){ - log.error(ex.getStackTrace()); + log.error(Arrays.toString(ex.getStackTrace())); } /** @@ -175,22 +177,14 @@ public class MockController { /** * It's one of the most important features - the bread and butter of the Mocked Service. It's link that allows * to receive mocked response from the server and use it to mock! - * @param requestEntity Logs the data of request * @param clientUUID the key-uuid of given set of messages * @param mockedResponseId unique id of given message * @return */ @GetMapping(value = "/r/{clientUUID}/{mockedResponseId}") - public ResponseEntity getMockedResponse(RequestEntity requestEntity, + public ResponseEntity getMockedResponse( @PathVariable UUID clientUUID, @PathVariable int mockedResponseId) { - TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getMockedResponse - request", - BusinessKey.CLIENT_UUID, String.valueOf(clientUUID), - BusinessKey.MESSAGE_ID, String.valueOf(mockedResponseId))); - // log.info(requestEntity.toString().replaceAll("\"", "\\\\\"").substring(1).replaceAll("\n","")); - TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getMockedResponse - response", - BusinessKey.CLIENT_UUID, String.valueOf(clientUUID), - BusinessKey.MESSAGE_ID, String.valueOf(mockedResponseId))); MockedMessageDto mockedMessageDto = klausService.getMockedResponse(clientUUID, mockedResponseId); HttpHeaders httpHeaders = new HttpHeaders(); if (mockedMessageDto.getHttpHeaders() != null) mockedMessageDto.getHttpHeaders().forEach(httpHeaders::set); diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/controller/RequestHistoryController.java b/Backend/mocked-services/src/main/java/com/r11/tools/controller/RequestHistoryController.java new file mode 100644 index 0000000..8ce8581 --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/controller/RequestHistoryController.java @@ -0,0 +1,70 @@ +package com.r11.tools.controller; + +import com.r11.tools.mappers.RequestHistoryMapper; +import com.r11.tools.model.HistoryRequestModel; +import com.r11.tools.model.RequestHistory; +import com.r11.tools.model.RequestHistoryDTO; +import com.r11.tools.service.RequestHistoryService; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * It's the REST api for {@link RequestHistory} + * @author Gabriel Modzelewski + * @author Mikołaj Widła + */ +@RestController +@RequestMapping(path = "/api/event") +@AllArgsConstructor +public class RequestHistoryController { + private final RequestHistoryService service; + private final RequestHistoryMapper mapper; + + /** + * Returns the list of Events in given time bracket. + * The list of objects is received via {@link RequestHistoryDTO}, which contains time brackets, + * as well as the key - uuid. + * @param historyRequestModel EventRequestDto object that contains data needed to query the database + * @return list of {@link RequestHistory} + */ + @PostMapping + public ResponseEntity> filterHistory(@RequestBody HistoryRequestModel historyRequestModel){ + return ResponseEntity.ok( + service.getHistoryRecordsBetweenDatesAndByUUIDAndMessageId(historyRequestModel) + .stream() + .map(mapper::requestHistoryToRequestHistoryDTO) + .collect(Collectors.toList()) + ); + } + + /** + * Returns the list of Events of last 24h from given date. + * @param uuid unique id of message list + * @param messageId unique id of message in message list + * @return list of {@link RequestHistory} + */ + @GetMapping(path = "/{uuid}/{messageId}") + public ResponseEntity> getLastDay(@PathVariable UUID uuid, + @PathVariable Integer messageId){ + LocalDateTime requestTime = LocalDateTime.now(); + LocalDateTime dayBeforeRequest = requestTime.minusDays(1L); + List requestHistory = service.getHistoryRecordsBetweenDatesAndByUUIDAndMessageId( + HistoryRequestModel.builder() + .localDateTimeFrom(dayBeforeRequest) + .localDateTimeTo(requestTime) + .clientUUID(uuid) + .mockedResponseId(messageId) + .build() + ).stream() + .map(mapper::requestHistoryToRequestHistoryDTO) + .collect(Collectors.toList()); + return ResponseEntity.ok(requestHistory); + } +} + diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/interceptor/IncomingMockRequestInterceptor.java b/Backend/mocked-services/src/main/java/com/r11/tools/interceptor/IncomingMockRequestInterceptor.java new file mode 100644 index 0000000..ed6fdc4 --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/interceptor/IncomingMockRequestInterceptor.java @@ -0,0 +1,60 @@ +package com.r11.tools.interceptor; + +import com.r11.tools.model.RequestHistoryDTO; +import com.r11.tools.service.RequestHistoryService; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.HandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +@Component +@AllArgsConstructor +public class IncomingMockRequestInterceptor implements HandlerInterceptor { + + private final RequestHistoryService historyService; + + @Override + public boolean preHandle(HttpServletRequest httpRequest, HttpServletResponse response, Object handler){ + Map headers = getHeadersFromHttpRequest(httpRequest); + Map pathVariable = getPathVariablesFromHttpRequest(httpRequest); + + RequestHistoryDTO historyDTO = RequestHistoryDTO.builder() + .httpMethod(HttpMethod.valueOf(httpRequest.getMethod())) + .headers( headers ) + .messageID(Integer.valueOf(pathVariable.get("mockedResponseId"))) + .clientUUID(UUID.fromString(pathVariable.get("clientUUID"))) + .dateTimeStamp(LocalDateTime.now()) + .build(); + historyService.saveRequest(historyDTO); + return true; + } + + private Map getHeadersFromHttpRequest( HttpServletRequest httpRequest ){ + Set headersName = StreamSupport.stream( + Spliterators.spliteratorUnknownSize( + httpRequest.getHeaderNames().asIterator(), + Spliterator.ORDERED + ), false + ).collect(Collectors.toSet()); + + return headersName.stream() + .collect(Collectors.toMap( + value -> value, + httpRequest::getHeader + )); + } + + private Map getPathVariablesFromHttpRequest( HttpServletRequest httpRequest ){ + return (Map) httpRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + } + + +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/mappers/RequestHistoryMapper.java b/Backend/mocked-services/src/main/java/com/r11/tools/mappers/RequestHistoryMapper.java new file mode 100644 index 0000000..5bef839 --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/mappers/RequestHistoryMapper.java @@ -0,0 +1,12 @@ +package com.r11.tools.mappers; + +import com.r11.tools.model.RequestHistory; +import com.r11.tools.model.RequestHistoryDTO; +import org.mapstruct.Mapper; + +@Mapper +public interface RequestHistoryMapper { + RequestHistory requestHistoryDTOToRequestHistory(RequestHistoryDTO requestHistoryDTO); + RequestHistoryDTO requestHistoryToRequestHistoryDTO(RequestHistory requestHistory); + +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/model/Event.java b/Backend/mocked-services/src/main/java/com/r11/tools/model/Event.java deleted file mode 100644 index 4bd0b4e..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/model/Event.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.r11.tools.model; - -import java.time.LocalDateTime; -import lombok.*; -import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.lang.Nullable; - -/** - * Pojo class for Event entity - * @author Rafał Żukowicz - */ -@Data -@Builder -@ToString -@NoArgsConstructor -@AllArgsConstructor -public class Event implements Comparable{ - - @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss") - private LocalDateTime dateTimeStamp; - @Nullable - private String interfaceName; - @Nullable - private String clientUUID; - @Nullable - private Integer messageId; - private String thread; - private String level; - @Nullable - private String message; - - @Override - public int compareTo(Event o) { - return this.getDateTimeStamp().compareTo(o.getDateTimeStamp()) * -1; - } -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/model/EventRequestDto.java b/Backend/mocked-services/src/main/java/com/r11/tools/model/HistoryRequestModel.java similarity index 78% rename from Backend/mocked-services/src/main/java/com/r11/tools/model/EventRequestDto.java rename to Backend/mocked-services/src/main/java/com/r11/tools/model/HistoryRequestModel.java index ecfc03f..356ca4c 100644 --- a/Backend/mocked-services/src/main/java/com/r11/tools/model/EventRequestDto.java +++ b/Backend/mocked-services/src/main/java/com/r11/tools/model/HistoryRequestModel.java @@ -1,22 +1,19 @@ package com.r11.tools.model; -import java.time.LocalDateTime; -import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; -/** - * Pojo for history query request. Contains information necessary to obtain {@link Event} list - * @author Rafał Żukowicz - */ +import java.time.LocalDateTime; +import java.util.UUID; + @Data @Builder @NoArgsConstructor @AllArgsConstructor -public class EventRequestDto { +public class HistoryRequestModel { private UUID clientUUID; @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/model/RequestHistory.java b/Backend/mocked-services/src/main/java/com/r11/tools/model/RequestHistory.java new file mode 100644 index 0000000..5008be8 --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/model/RequestHistory.java @@ -0,0 +1,44 @@ +package com.r11.tools.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.redis.core.RedisHash; +import org.springframework.data.redis.core.index.Indexed; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpMethod; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Map; + +/** + * Pojo class for Event entity + * @author Rafał Żukowicz + * @author Mikołaj Widła + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RedisHash("mockHistory") +public class RequestHistory implements Comparable, Serializable { + + @Id + private String id; + @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss") + private LocalDateTime dateTimeStamp; + @Indexed + private String clientUUID; + @Indexed + private Integer messageID; + private Map headers; + private HttpMethod httpMethod; + + @Override + public int compareTo(RequestHistory o) { + return this.getDateTimeStamp().compareTo(o.getDateTimeStamp()) * -1; + } +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/model/RequestHistoryDTO.java b/Backend/mocked-services/src/main/java/com/r11/tools/model/RequestHistoryDTO.java new file mode 100644 index 0000000..5f23ea2 --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/model/RequestHistoryDTO.java @@ -0,0 +1,32 @@ +package com.r11.tools.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpMethod; + +import java.time.LocalDateTime; +import java.util.Map; +import java.util.UUID; + +/** + * Pojo for history query request. Contains information necessary to obtain {@link RequestHistory} list + * @author Rafał Żukowicz + * @author Mikołaj Widła + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RequestHistoryDTO { + + private UUID clientUUID; + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + private LocalDateTime dateTimeStamp; + private Integer messageID; + private Map headers; + private HttpMethod httpMethod; + +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/repository/EventRepository.java b/Backend/mocked-services/src/main/java/com/r11/tools/repository/EventRepository.java deleted file mode 100644 index c634732..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/repository/EventRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.r11.tools.repository; - -import com.r11.tools.model.Event; -import com.r11.tools.utilis.BusinessKey; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -/** - * Event entity dao interface - * @author Rafał Żukowicz - */ -@Repository -@Transactional -public interface EventRepository { - List findEvents(LocalDateTime localDateTimeFrom, LocalDateTime localDateTimeTo, - Map businessKeys); -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/repository/EventRepositoryImpl.java b/Backend/mocked-services/src/main/java/com/r11/tools/repository/EventRepositoryImpl.java deleted file mode 100644 index 3de0e2a..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/repository/EventRepositoryImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.r11.tools.repository; - -import static com.r11.tools.utilis.RedisAppender.LOG_PREFIX; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.r11.tools.model.Event; -import com.r11.tools.utilis.BusinessKey; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Repository; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; - -/** - * Builds Event list based on logs created via {@link com.r11.tools.utilis.TrackingClient} and {@link com.r11.tools.utilis.RedisAppender} - * @author Rafał Żukowicz - */ -@Repository -@AllArgsConstructor -public class EventRepositoryImpl implements EventRepository { - private final JedisPool jedisPool; - private final ObjectMapper objectMapper; - - /** - * Creates list of {@link Event} based on {@link com.r11.tools.model.EventRequestDto} data via searching logs - * @param localDateTimeFrom date from which logs are retrieved - * @param localDateTimeTo date to which logs are retrieved - * @param businessKeys set keys for redis values - * @return - */ - @Override - public List findEvents(LocalDateTime localDateTimeFrom, LocalDateTime localDateTimeTo, - Map businessKeys) { - List eventStrings = findEventsBetweenDates(localDateTimeFrom.toLocalDate(), localDateTimeTo.toLocalDate()); - if (businessKeys.size() > 0) { - eventStrings = businessKeysFilter(eventStrings, businessKeys); - } - List events = parseEvents(eventStrings); - if (localDateTimeFrom.toLocalTime() != LocalTime.MIN) { - events = events.stream().filter(event -> event.getDateTimeStamp().compareTo(localDateTimeFrom) >= 0) - .collect(Collectors.toList()); - } - return events.stream().filter(event -> event.getDateTimeStamp().compareTo(localDateTimeTo) <= 0) - .collect(Collectors.toList()); - } - - /** - * Returns logs between given dates - * @param localDateFrom date from which logs are retrieved - * @param localDateTo date to which logs are retrieved - * @return - */ - private List findEventsBetweenDates(LocalDate localDateFrom, LocalDate localDateTo) { - try (Jedis jedis = jedisPool.getResource()) { - return localDateFrom.datesUntil(localDateTo.plusDays(1)).map(day -> LOG_PREFIX + day.toString()) - .map(key -> jedis.lrange(key, 0, -1)).flatMap(Collection::stream).collect(Collectors.toList()); - } - } - - /** - * Filters keys so only the ones queried are retirned - * @param events list of logs - * @param businessKeys set keys for redis values - * @return filtered list of logs - */ - private List businessKeysFilter(List events, Map businessKeys) { - for (Map.Entry entry : businessKeys.entrySet()) { - String stringPattern = entry.getKey().getReasonPhrase()+ "\"" + ":" + "\"" + entry.getValue() + "\""; - events = events.stream().filter(s -> s.contains(stringPattern)).collect(Collectors.toList()); - } - return events; - } - - /** - * Parses list of logs into list of {@link Event} - * @param eventStrings list of logs - * @return list of {@link Event} - */ - private List parseEvents(List eventStrings) { - List events = new ArrayList<>(); - for (String eventString : eventStrings) { - eventString = eventString.replaceAll("\\R", ""); - try { - events.add(objectMapper.readValue(eventString, Event.class)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - } - return events; - } -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/repository/RequestHistoryRepository.java b/Backend/mocked-services/src/main/java/com/r11/tools/repository/RequestHistoryRepository.java new file mode 100644 index 0000000..8f7973a --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/repository/RequestHistoryRepository.java @@ -0,0 +1,20 @@ +package com.r11.tools.repository; + +import com.r11.tools.model.RequestHistory; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * Event entity dao interface + * @author Rafał Żukowicz + */ +@Repository +@Transactional +public interface RequestHistoryRepository extends CrudRepository { + List findAllByClientUUIDAndMessageID( + String clientUUID, + Integer messageID); +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/service/EtrackService.java b/Backend/mocked-services/src/main/java/com/r11/tools/service/EtrackService.java deleted file mode 100644 index 98c6658..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/service/EtrackService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.r11.tools.service; - -import com.r11.tools.model.Event; -import com.r11.tools.model.EventRequestDto; -import java.util.List; -import org.springframework.stereotype.Service; - -/** - * Spring service interface for {@link com.r11.tools.controller.EventController} - * @author Rafał Żukowicz - */ -@Service -public interface EtrackService { - /** - * Searches for {@link Event} objects between date brackets - * @param eventsDto object containing required data for request - * @return list of {@link Event} - */ - List getEventsByDateTimeAndBusinessKeys(EventRequestDto eventsDto); -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/service/EtrackServiceImpl.java b/Backend/mocked-services/src/main/java/com/r11/tools/service/EtrackServiceImpl.java deleted file mode 100644 index ea49c17..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/service/EtrackServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.r11.tools.service; - -import com.r11.tools.model.Event; -import com.r11.tools.model.EventRequestDto; -import com.r11.tools.repository.EventRepository; -import com.r11.tools.utilis.BusinessKey; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Spring Service for {@link com.r11.tools.controller.EventController}. Contains logic required for quering - * the database for {@link Event} objects - * @author Rafał Żukowicz - */ -@Service -@AllArgsConstructor -public class EtrackServiceImpl implements EtrackService { - - private final EventRepository eventRepository; - - /** - * Adds {@link BusinessKey} to {@link EventRequestDto} - * in order to create query via{@link com.r11.tools.repository.EventRepositoryImpl} - * @param eventsDto object containing required data for request - * @return list of {@link Event} - */ - @Override - public List getEventsByDateTimeAndBusinessKeys(EventRequestDto eventsDto) { - Map businessKeys = new HashMap<>(); - businessKeys.put(BusinessKey.CLIENT_UUID, eventsDto.getClientUUID().toString()); - if (eventsDto.getMockedResponseId() != null){ - businessKeys.put(BusinessKey.MESSAGE_ID, String.valueOf(eventsDto.getMockedResponseId())); - } - List events = eventRepository.findEvents(eventsDto.getLocalDateTimeFrom(), eventsDto.getLocalDateTimeTo(), - businessKeys); - Collections.sort(events); - return events; - } -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/service/RequestHistoryService.java b/Backend/mocked-services/src/main/java/com/r11/tools/service/RequestHistoryService.java new file mode 100644 index 0000000..1f8042a --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/service/RequestHistoryService.java @@ -0,0 +1,23 @@ +package com.r11.tools.service; + +import com.r11.tools.controller.RequestHistoryController; +import com.r11.tools.model.HistoryRequestModel; +import com.r11.tools.model.RequestHistory; +import com.r11.tools.model.RequestHistoryDTO; +import java.util.List; +import org.springframework.stereotype.Service; + +/** + * Spring service interface for {@link RequestHistoryController} + * @author Rafał Żukowicz + */ +@Service +public interface RequestHistoryService { + /** + * Searches for {@link RequestHistory} objects between date brackets + * @param historyRequestModel object containing required data for request + * @return list of {@link RequestHistory} + */ + List getHistoryRecordsBetweenDatesAndByUUIDAndMessageId(HistoryRequestModel historyRequestModel); + void saveRequest(RequestHistoryDTO requestDTO); +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/service/RequestHistoryServiceImpl.java b/Backend/mocked-services/src/main/java/com/r11/tools/service/RequestHistoryServiceImpl.java new file mode 100644 index 0000000..68afbd4 --- /dev/null +++ b/Backend/mocked-services/src/main/java/com/r11/tools/service/RequestHistoryServiceImpl.java @@ -0,0 +1,59 @@ +package com.r11.tools.service; + +import com.r11.tools.controller.RequestHistoryController; +import com.r11.tools.mappers.RequestHistoryMapper; +import com.r11.tools.model.HistoryRequestModel; +import com.r11.tools.model.RequestHistory; +import com.r11.tools.model.RequestHistoryDTO; +import com.r11.tools.repository.RequestHistoryRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Spring Service for {@link RequestHistoryController}. Contains logic required for quering + * the database for {@link RequestHistory} objects + * @author Rafał Żukowicz + * @author Mikołaj Widła + */ +@Service +@AllArgsConstructor +public class RequestHistoryServiceImpl implements RequestHistoryService { + + private final RequestHistoryRepository repository; + private final RequestHistoryMapper requestMapper; + + /** + * f + * in order to create query via{@link com.r11.tools.repository.RequestHistoryRepository} + * @param historyRequestModel object containing required data for request + * @return list of {@link RequestHistory} + */ + @Override + public List getHistoryRecordsBetweenDatesAndByUUIDAndMessageId(HistoryRequestModel historyRequestModel) { + List history = repository.findAllByClientUUIDAndMessageID( + historyRequestModel.getClientUUID().toString(), + historyRequestModel.getMockedResponseId() + ); + Collections.sort(history); + + return history.stream() + .filter( historyRecord -> historyRecord + .getDateTimeStamp() + .isAfter(historyRequestModel.getLocalDateTimeFrom()) + ).filter( + historyRecord-> historyRecord + .getDateTimeStamp() + .isBefore(historyRequestModel.getLocalDateTimeTo()) + ) + .collect(Collectors.toList()); + } + + @Override + public void saveRequest(RequestHistoryDTO requestDTO) { + repository.save(requestMapper.requestHistoryDTOToRequestHistory(requestDTO)); + } +} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/utilis/BusinessKey.java b/Backend/mocked-services/src/main/java/com/r11/tools/utilis/BusinessKey.java deleted file mode 100644 index fc90cdd..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/utilis/BusinessKey.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.r11.tools.utilis; - -import lombok.AllArgsConstructor; - -/** - * Enum of keys for redis database. - * @author Rafał Żukowicz - */ -@AllArgsConstructor -public enum BusinessKey { - INTERFACE_NAME("interfaceName"), - CLIENT_UUID("clientUUID"), - MESSAGE_ID("messageId"); - - private final String phrase; - - /** - * Returns string value of given enum variant - * @return string value of enum - */ - public String getReasonPhrase() { - return this.phrase; - } -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/utilis/RedisAppender.java b/Backend/mocked-services/src/main/java/com/r11/tools/utilis/RedisAppender.java deleted file mode 100644 index 0626848..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/utilis/RedisAppender.java +++ /dev/null @@ -1,235 +0,0 @@ -package com.r11.tools.utilis; - -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.Layout; -import ch.qos.logback.core.UnsynchronizedAppenderBase; -import com.cwbase.logback.AdditionalField; -import com.cwbase.logback.JSONEventLayout; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Iterator; -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.Protocol; - -/** - * Class is used to insert logs directly to Redis. {@link com.release11.klaus.repository.EventRepositoryImpl} is using those logs. - * @author Rafał Żukowicz - * @author Gabriel Modzelewski - */ -public class RedisAppender extends UnsynchronizedAppenderBase { - - JedisPool pool; - JSONEventLayout jsonlayout; - Layout layout; - String host = "localhost"; - int port = Protocol.DEFAULT_PORT; - String key = null; - int timeout = Protocol.DEFAULT_TIMEOUT; - String password = null; - int database = Protocol.DEFAULT_DATABASE; - - public static final String LOG_PREFIX = "logstash_"; - - - public RedisAppender() { - jsonlayout = new JSONEventLayout(); - } - - /** - * Appends JedisPool by another log - * @param event object containing log info - */ - @Override - protected void append(ILoggingEvent event) { - Jedis client = pool.getResource(); - try { - String json = layout == null ? jsonlayout.doLayout(event) : layout.doLayout(event); - key = LOG_PREFIX + LocalDate.now(); - client.rpush(key, json); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (client != null) { - client.close(); - } - } - } - - @Deprecated - public String getSource() { - return jsonlayout.getSource(); - } - - @Deprecated - public void setSource(String source) { - jsonlayout.setSource(source); - } - - @Deprecated - public String getSourceHost() { - return jsonlayout.getSourceHost(); - } - - @Deprecated - public void setSourceHost(String sourceHost) { - jsonlayout.setSourceHost(sourceHost); - } - - @Deprecated - public String getSourcePath() { - return jsonlayout.getSourcePath(); - } - - @Deprecated - public void setSourcePath(String sourcePath) { - jsonlayout.setSourcePath(sourcePath); - } - - @Deprecated - public String getTags() { - if (jsonlayout.getTags() != null) { - Iterator i = jsonlayout.getTags().iterator(); - StringBuilder sb = new StringBuilder(); - while (i.hasNext()) { - sb.append(i.next()); - if (i.hasNext()) { - sb.append(','); - } - } - return sb.toString(); - } - return null; - } - - @Deprecated - public void setTags(String tags) { - if (tags != null) { - String[] atags = tags.split(","); - jsonlayout.setTags(Arrays.asList(atags)); - } - } - - @Deprecated - public String getType() { - return jsonlayout.getType(); - } - - @Deprecated - public void setType(String type) { - jsonlayout.setType(type); - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public int getTimeout() { - return timeout; - } - - public void setTimeout(int timeout) { - this.timeout = timeout; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public int getDatabase() { - return database; - } - - public void setDatabase(int database) { - this.database = database; - } - - @Deprecated - public void setMdc(boolean flag) { - jsonlayout.setProperties(flag); - } - - @Deprecated - public boolean getMdc() { - return jsonlayout.getProperties(); - } - - @Deprecated - public void setLocation(boolean flag) { - jsonlayout.setLocationInfo(flag); - } - - @Deprecated - public boolean getLocation() { - return jsonlayout.getLocationInfo(); - } - - @Deprecated - public void setCallerStackIndex(int index) { - jsonlayout.setCallerStackIdx(index); - } - - @Deprecated - public int getCallerStackIndex() { - return jsonlayout.getCallerStackIdx(); - } - - @Deprecated - public void addAdditionalField(AdditionalField p) { - jsonlayout.addAdditionalField(p); - } - - public Layout getLayout() { - return layout; - } - - public void setLayout(Layout layout) { - this.layout = layout; - } - - /** - * Starts new instance of JedisPool - */ - @Override - public void start() { - super.start(); - GenericObjectPoolConfig config = new GenericObjectPoolConfig(); - config.setTestOnBorrow(true); - pool = new JedisPool(config, host, port, timeout, password, database); - } - - /** - * Stops and destroys JedisPool object - */ - @Override - public void stop() { - super.stop(); - pool.destroy(); - } - -} diff --git a/Backend/mocked-services/src/main/java/com/r11/tools/utilis/TrackingClient.java b/Backend/mocked-services/src/main/java/com/r11/tools/utilis/TrackingClient.java deleted file mode 100644 index 3f49400..0000000 --- a/Backend/mocked-services/src/main/java/com/r11/tools/utilis/TrackingClient.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.r11.tools.utilis; - -import java.util.Map; -import org.slf4j.MDC; - -/** - * This static class has one purpose and one purpose only. It logs data about incomming requests. - * The data from logs is received via {@link com.release11.klaus.repository.EventRepositoryImpl} - * @author Rafał Żukowski - */ -public final class TrackingClient { - - /** - * Logs data inside the given map - * @param businessKeysMap map containing all the information about incomming request - */ - public static void setBusinessKeys(Map businessKeysMap){ - for (Map.Entry entry : businessKeysMap.entrySet()) { - MDC.put(entry.getKey().getReasonPhrase(), entry.getValue()); - } - } - - -} diff --git a/Backend/mocked-services/src/main/resources/application.properties b/Backend/mocked-services/src/main/resources/application.properties index bd52dd8..698b023 100644 --- a/Backend/mocked-services/src/main/resources/application.properties +++ b/Backend/mocked-services/src/main/resources/application.properties @@ -1,5 +1,7 @@ #environment: server.port = 8097 +spring.redis.host=redis +spring.redis.port=6379 spring.application.name = klaus spring.mvc.view.suffix=.html logging.level.root=INFO diff --git a/Backend/mocked-services/src/main/resources/data-access.properties b/Backend/mocked-services/src/main/resources/data-access.properties deleted file mode 100644 index 27196b6..0000000 --- a/Backend/mocked-services/src/main/resources/data-access.properties +++ /dev/null @@ -1,2 +0,0 @@ -redis.host = redis -redis.port = 6379 \ No newline at end of file diff --git a/Backend/mocked-services/src/main/resources/logback.xml b/Backend/mocked-services/src/main/resources/logback.xml index 16733a7..1827e28 100644 --- a/Backend/mocked-services/src/main/resources/logback.xml +++ b/Backend/mocked-services/src/main/resources/logback.xml @@ -2,25 +2,8 @@ - - - redis - 6379 - logstash - - - - {"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 - - - - - - - ${HOME_LOG} - logs/mockServices.%d{yyyy-MM-dd}.%i.log 10MB @@ -34,7 +17,6 @@ -