From c47320f56cc98e73b60f08a576730ca161c187fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=98=84=EC=84=B1=ED=95=84?= Date: Fri, 12 May 2023 11:47:09 +0900 Subject: [PATCH] . --- .../api/controller/MockApiController.java | 13 +- .../controller/MockRouteMgmtController.java | 2 +- .../api/dto/MockResponseDTO.java | 6 +- .../api/mapper/MockRouteMapper.java | 13 ++ .../api/service/MockRouteService.java | 8 ++ .../client/entity/ApiCollection.java | 60 +++++++++ .../client/entity/ApiRequestHistory.java | 116 ++++++++++++++++++ .../client/entity/ApiRequestInfo.java | 96 +++++++++++++++ .../httpmockserver/client/entity/Server.java | 12 +- .../repository/ApiCollectionRepository.java | 13 ++ .../repository/ApiRequestRepository.java | 8 ++ .../client/service/ApiTesterService.java | 25 ++++ .../client/service/NettyApiClient.java | 7 +- .../exception/PortalErrorController.java | 2 +- .../user/controller/AccountController.java | 4 +- .../httpmockserver/user/entity/UserGroup.java | 51 ++++++++ src/main/resources/application.yml | 2 +- .../resources/templates/page/apiTester.html | 19 ++- src/main/resources/templates/page/login.html | 2 +- .../templates/page/routes/mockRouteEdit.html | 7 +- .../templates/page/routes/mockRouteList.html | 2 +- .../templates/page/users/adminRegister.html | 2 +- .../templates/page/users/staffUserEdit.html | 2 +- .../templates/page/users/staffUserList.html | 2 +- 24 files changed, 444 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java create mode 100644 src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestHistory.java create mode 100644 src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java create mode 100644 src/main/java/com/eactive/httpmockserver/client/repository/ApiCollectionRepository.java create mode 100644 src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java create mode 100644 src/main/java/com/eactive/httpmockserver/client/service/ApiTesterService.java create mode 100644 src/main/java/com/eactive/httpmockserver/user/entity/UserGroup.java diff --git a/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java b/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java index d89054d..c6cb39e 100644 --- a/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java +++ b/src/main/java/com/eactive/httpmockserver/api/controller/MockApiController.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.PathNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -108,14 +109,10 @@ public class MockApiController { return false; } } else if (condition.getType().equalsIgnoreCase("jsonpath")) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode jsonNode = objectMapper.readTree(request.getBody()); - boolean isMatch = JsonPath.parse(jsonNode).read(condition.getKey()+ '=' + condition.getValue()); - if (!isMatch) { - return false; - } - } catch (JsonProcessingException e) { + try{ + Object value = JsonPath.read(request.getBody(), condition.getKey()); + return value.toString().equals(condition.getValue()); + }catch(PathNotFoundException e) { return false; } } diff --git a/src/main/java/com/eactive/httpmockserver/api/controller/MockRouteMgmtController.java b/src/main/java/com/eactive/httpmockserver/api/controller/MockRouteMgmtController.java index 16f91f3..1986fbd 100644 --- a/src/main/java/com/eactive/httpmockserver/api/controller/MockRouteMgmtController.java +++ b/src/main/java/com/eactive/httpmockserver/api/controller/MockRouteMgmtController.java @@ -47,7 +47,7 @@ public class MockRouteMgmtController { public String createView(ModelMap model) { MockRouteDTO defaultRoute = new MockRouteDTO(); MockResponseDTO defaultResponse = new MockResponseDTO(); - defaultResponse.setDefaultResponse(true); + defaultResponse.setDefaultResponse("true"); defaultRoute.getResponses().add(defaultResponse); model.addAttribute("mockRoute", defaultRoute); return MOCK_ROUTE_EDIT; diff --git a/src/main/java/com/eactive/httpmockserver/api/dto/MockResponseDTO.java b/src/main/java/com/eactive/httpmockserver/api/dto/MockResponseDTO.java index c127796..3dba04e 100644 --- a/src/main/java/com/eactive/httpmockserver/api/dto/MockResponseDTO.java +++ b/src/main/java/com/eactive/httpmockserver/api/dto/MockResponseDTO.java @@ -15,7 +15,7 @@ public class MockResponseDTO { private long delay = 0; //millisecond - private boolean defaultResponse = false; + private String defaultResponse; private List conditions; public int getStatusCode() { @@ -58,11 +58,11 @@ public class MockResponseDTO { this.conditions = conditions; } - public boolean isDefaultResponse() { + public String getDefaultResponse() { return defaultResponse; } - public void setDefaultResponse(boolean defaultResponse) { + public void setDefaultResponse(String defaultResponse) { this.defaultResponse = defaultResponse; } } diff --git a/src/main/java/com/eactive/httpmockserver/api/mapper/MockRouteMapper.java b/src/main/java/com/eactive/httpmockserver/api/mapper/MockRouteMapper.java index 875d2c8..4049e64 100644 --- a/src/main/java/com/eactive/httpmockserver/api/mapper/MockRouteMapper.java +++ b/src/main/java/com/eactive/httpmockserver/api/mapper/MockRouteMapper.java @@ -27,11 +27,24 @@ public abstract class MockRouteMapper { public abstract MockRouteDTO map(MockRoute entity); @Mapping(target = "headers", source = "headers", qualifiedByName = "mapHeadersToMap") + @Mapping(target ="defaultResponse", source = "defaultResponse", qualifiedByName = "mapEntityDefaultResponse") public abstract MockResponse map(MockResponseDTO dto); @Mapping(target = "headers", source = "headers", qualifiedByName = "mapHeadersToList") + @Mapping(target ="defaultResponse", source = "defaultResponse", qualifiedByName = "mapDTODefaultResponse") public abstract MockResponseDTO map(MockResponse entity); + @Named("mapDTODefaultResponse") + public String map(boolean value) { + return value ? "true" : "false"; + } + + @Named("mapEntityDefaultResponse") + public boolean map(String value) { + if (value == null) return false; + return value.equals("true"); + } + @Named("mapHeadersToList") public List mapHeadersToList(Map headers) { List list = new ArrayList<>(); diff --git a/src/main/java/com/eactive/httpmockserver/api/service/MockRouteService.java b/src/main/java/com/eactive/httpmockserver/api/service/MockRouteService.java index 727d895..0879e52 100644 --- a/src/main/java/com/eactive/httpmockserver/api/service/MockRouteService.java +++ b/src/main/java/com/eactive/httpmockserver/api/service/MockRouteService.java @@ -28,6 +28,11 @@ public class MockRouteService { } public void create(MockRoute mockRoute) { + + if (!mockRoute.getPathPattern().startsWith("/")){ + mockRoute.setPathPattern("/" + mockRoute.getPathPattern()); + } + for (MockResponse response : mockRoute.getResponses()) { response.setRoute(mockRoute); @@ -53,6 +58,9 @@ public class MockRouteService { route.setDescription(updated.getDescription()); route.setMethod(updated.getMethod()); route.setPathPattern(updated.getPathPattern()); + if (!route.getPathPattern().startsWith("/")){ + route.setPathPattern("/" + route.getPathPattern()); + } route.getResponses().addAll(updated.getResponses()); for (MockResponse response : route.getResponses()) { diff --git a/src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java b/src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java new file mode 100644 index 0000000..eb431cd --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java @@ -0,0 +1,60 @@ +package com.eactive.httpmockserver.client.entity; + +import com.eactive.httpmockserver.user.entity.StaffUser; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "API_COLLECTION") +public class ApiCollection { + + @Id + private String id; //uuid + + private String name; + + @ManyToOne + @JoinColumn(name = "USER_ID") + private StaffUser owner; + + @ManyToMany + @JoinTable( + name = "API_COLLECTION_API_REQUEST_INFO", + joinColumns = @JoinColumn(name = "API_COLLECTION_ID"), + inverseJoinColumns = @JoinColumn(name = "API_REQUEST_INFO_ID") + ) + private List apis; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getApis() { + return apis; + } + + public void setApis(List apis) { + this.apis = apis; + } + + public StaffUser getOwner() { + return owner; + } + + public void setOwner(StaffUser owner) { + this.owner = owner; + } +} diff --git a/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestHistory.java b/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestHistory.java new file mode 100644 index 0000000..22fa750 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestHistory.java @@ -0,0 +1,116 @@ +package com.eactive.httpmockserver.client.entity; + +import com.eactive.httpmockserver.user.entity.StaffUser; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.time.LocalDateTime; + +public class ApiRequestHistory { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + + @ManyToOne + @JoinColumn(name = "SERVER_ID") + private Server server; + + @ManyToOne + @JoinColumn(name = "USER_ID") + private StaffUser owner; + + private String method; + + private String uri; + + private String requestHeaders; + + private String requestBody; + + private String responseBody; + + private String responseHeaders; + + @Type(type = "org.hibernate.type.LocalDateTimeType") + private LocalDateTime requestTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Server getServer() { + return server; + } + + public void setServer(Server server) { + this.server = server; + } + + public StaffUser getOwner() { + return owner; + } + + public void setOwner(StaffUser owner) { + this.owner = owner; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getRequestHeaders() { + return requestHeaders; + } + + public void setRequestHeaders(String requestHeaders) { + this.requestHeaders = requestHeaders; + } + + public String getRequestBody() { + return requestBody; + } + + public void setRequestBody(String requestBody) { + this.requestBody = requestBody; + } + + public String getResponseBody() { + return responseBody; + } + + public void setResponseBody(String responseBody) { + this.responseBody = responseBody; + } + + public String getResponseHeaders() { + return responseHeaders; + } + + public void setResponseHeaders(String responseHeaders) { + this.responseHeaders = responseHeaders; + } + + public LocalDateTime getRequestTime() { + return requestTime; + } + + public void setRequestTime(LocalDateTime requestTime) { + this.requestTime = requestTime; + } +} diff --git a/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java b/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java new file mode 100644 index 0000000..06a629d --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java @@ -0,0 +1,96 @@ +package com.eactive.httpmockserver.client.entity; + +import com.eactive.httpmockserver.user.entity.StaffUser; + +import javax.persistence.*; + + +@Entity +@Table(name = "API_REQUEST_INFO") +public class ApiRequestInfo { + + @Id + private String id; //uuid + + @ManyToOne + @JoinColumn(name = "SERVER_ID") + private Server server; + + @ManyToOne + @JoinColumn(name = "USER_ID") + private StaffUser owner; + + private String method; + + private String path; + + private String headers; + + private String queryParams; + + private String requestBody; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Server getServer() { + return server; + } + + public void setServer(Server server) { + this.server = server; + } + + public StaffUser getOwner() { + return owner; + } + + public void setOwner(StaffUser owner) { + this.owner = owner; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getHeaders() { + return headers; + } + + public void setHeaders(String headers) { + this.headers = headers; + } + + public String getQueryParams() { + return queryParams; + } + + public void setQueryParams(String queryParams) { + this.queryParams = queryParams; + } + + public String getRequestBody() { + return requestBody; + } + + public void setRequestBody(String requestBody) { + this.requestBody = requestBody; + } +} diff --git a/src/main/java/com/eactive/httpmockserver/client/entity/Server.java b/src/main/java/com/eactive/httpmockserver/client/entity/Server.java index 5190cc7..f37d71a 100644 --- a/src/main/java/com/eactive/httpmockserver/client/entity/Server.java +++ b/src/main/java/com/eactive/httpmockserver/client/entity/Server.java @@ -16,6 +16,8 @@ public class Server { private String hostname; + private String basePath; + private int port; public Long getId() { @@ -50,6 +52,14 @@ public class Server { this.hostname = hostname; } + public String getBasePath() { + return basePath; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + public int getPort() { return port; } @@ -60,6 +70,6 @@ public class Server { @Transient public String getHostAddress() { - return scheme + "://" + hostname + ":" + port; + return scheme + "://" + hostname; } } diff --git a/src/main/java/com/eactive/httpmockserver/client/repository/ApiCollectionRepository.java b/src/main/java/com/eactive/httpmockserver/client/repository/ApiCollectionRepository.java new file mode 100644 index 0000000..b3319eb --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/repository/ApiCollectionRepository.java @@ -0,0 +1,13 @@ +package com.eactive.httpmockserver.client.repository; + +import com.eactive.httpmockserver.client.entity.ApiCollection; +import com.eactive.httpmockserver.user.entity.StaffUser; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.List; + +public interface ApiCollectionRepository extends JpaRepository, JpaSpecificationExecutor { + + List findAllByOwner(StaffUser owner); +} diff --git a/src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java b/src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java new file mode 100644 index 0000000..d6f009d --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java @@ -0,0 +1,8 @@ +package com.eactive.httpmockserver.client.repository; + +import com.eactive.httpmockserver.client.entity.ApiRequestInfo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface ApiRequestRepository extends JpaRepository, JpaSpecificationExecutor { +} diff --git a/src/main/java/com/eactive/httpmockserver/client/service/ApiTesterService.java b/src/main/java/com/eactive/httpmockserver/client/service/ApiTesterService.java new file mode 100644 index 0000000..15d3a0c --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/service/ApiTesterService.java @@ -0,0 +1,25 @@ +package com.eactive.httpmockserver.client.service; + +import com.eactive.httpmockserver.client.entity.ApiCollection; +import com.eactive.httpmockserver.client.repository.ApiCollectionRepository; +import com.eactive.httpmockserver.user.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.List; + +@Service +@Transactional +public class ApiTesterService { + + @Autowired + private UserService userService; + + @Autowired + ApiCollectionRepository apiCollectionRepository; + + public List findMyCollections(String esntlId) { + return apiCollectionRepository.findAllByOwner(userService.findByEsntlId(esntlId)); + } +} diff --git a/src/main/java/com/eactive/httpmockserver/client/service/NettyApiClient.java b/src/main/java/com/eactive/httpmockserver/client/service/NettyApiClient.java index 7f7faa2..f7f9e4e 100644 --- a/src/main/java/com/eactive/httpmockserver/client/service/NettyApiClient.java +++ b/src/main/java/com/eactive/httpmockserver/client/service/NettyApiClient.java @@ -73,8 +73,13 @@ public class NettyApiClient { content = Unpooled.EMPTY_BUFFER; } + String basePath = server.getBasePath(); + if(!apiRequest.getPath().startsWith("/")){ + basePath = basePath + "/"; + } + HttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.valueOf(apiRequest.getMethod()), - apiRequest.getPath(), content); + (basePath + apiRequest.getPath()).replaceAll("//", "/"), content); request.headers().set("Host", host); request.headers().set("Connection", HttpHeaderValues.CLOSE); diff --git a/src/main/java/com/eactive/httpmockserver/common/exception/PortalErrorController.java b/src/main/java/com/eactive/httpmockserver/common/exception/PortalErrorController.java index 831d73e..3f1636c 100644 --- a/src/main/java/com/eactive/httpmockserver/common/exception/PortalErrorController.java +++ b/src/main/java/com/eactive/httpmockserver/common/exception/PortalErrorController.java @@ -17,7 +17,7 @@ public class PortalErrorController implements ErrorController { if (status != null) { model.addAttribute("status", status); - return "/error"; + return "error"; } return "redirect:/"; diff --git a/src/main/java/com/eactive/httpmockserver/user/controller/AccountController.java b/src/main/java/com/eactive/httpmockserver/user/controller/AccountController.java index 5ac6b0b..2f31710 100644 --- a/src/main/java/com/eactive/httpmockserver/user/controller/AccountController.java +++ b/src/main/java/com/eactive/httpmockserver/user/controller/AccountController.java @@ -26,7 +26,7 @@ public class AccountController { @GetMapping("/change_password.do") public String changePassword(ModelMap model, @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO) { - return "/apps/main/updatePw"; + return "apps/main/updatePw"; } @PostMapping(value = "/update_password.do") @@ -51,7 +51,7 @@ public class AccountController { model.addAttribute("resultMsg", resultMsg); model.addAttribute("passwordChangeRequest", new PasswordChangeRequestDTO()); - return "/apps/main/updatePw"; + return "apps/main/updatePw"; } diff --git a/src/main/java/com/eactive/httpmockserver/user/entity/UserGroup.java b/src/main/java/com/eactive/httpmockserver/user/entity/UserGroup.java new file mode 100644 index 0000000..632cf04 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/user/entity/UserGroup.java @@ -0,0 +1,51 @@ +package com.eactive.httpmockserver.user.entity; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "PT_USER_GROUP") +public class UserGroup { + + @Id + private String id; + + private String name; + + private String description; + + @OneToMany(mappedBy = "group", fetch = FetchType.LAZY) + private List users; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fda6e63..3f84e61 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -25,7 +25,7 @@ spring: show-sql: false database-platform: org.hibernate.dialect.H2Dialect thymeleaf: - prefix: classpath:templates/ + prefix: classpath:/templates/ check-template-location: true suffix: .html mode: HTML diff --git a/src/main/resources/templates/page/apiTester.html b/src/main/resources/templates/page/apiTester.html index 252b406..1141c30 100644 --- a/src/main/resources/templates/page/apiTester.html +++ b/src/main/resources/templates/page/apiTester.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/api_tester_layout}">
@@ -28,7 +28,7 @@