diff --git a/src/main/java/com/eactive/httpmockserver/client/controller/ApiClientController.java b/src/main/java/com/eactive/httpmockserver/client/controller/ApiClientController.java index 721cd1f..52660b0 100644 --- a/src/main/java/com/eactive/httpmockserver/client/controller/ApiClientController.java +++ b/src/main/java/com/eactive/httpmockserver/client/controller/ApiClientController.java @@ -2,13 +2,9 @@ package com.eactive.httpmockserver.client.controller; import com.eactive.httpmockserver.client.dto.ApiRequestDTO; import com.eactive.httpmockserver.client.dto.ApiResponse; -import com.eactive.httpmockserver.client.entity.ApiCollection; import com.eactive.httpmockserver.client.entity.Server; import com.eactive.httpmockserver.client.repository.ServerRepository; -import com.eactive.httpmockserver.client.service.ApiTesterService; import com.eactive.httpmockserver.client.service.NettyApiClient; -import com.eactive.httpmockserver.common.security.CurrentUser; -import com.eactive.httpmockserver.user.entity.StaffUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; @@ -25,13 +21,10 @@ public class ApiClientController { @Autowired private ServerRepository serverRepository; - @Autowired - private ApiTesterService apiTesterService; - @Autowired private NettyApiClient nettyApiClient; - @PostMapping("/api/test.do") + @PostMapping("/mgmt/api/test.do") @ResponseBody public ApiResponse handleApiRequest(@RequestBody ApiRequestDTO request) { @@ -43,14 +36,10 @@ public class ApiClientController { } @GetMapping("/mgmt/api_tester.do") - public String testView(ModelMap model, - @CurrentUser StaffUser user) { + public String testView(ModelMap model) { List servers = serverRepository.findAll(); - List collections = apiTesterService.findMyCollections(user.getEsntlId()); - model.addAttribute("servers", servers); - model.addAttribute("collections", collections); return "page/apiTester"; } diff --git a/src/main/java/com/eactive/httpmockserver/client/controller/ApiRequestMgmtController.java b/src/main/java/com/eactive/httpmockserver/client/controller/ApiRequestMgmtController.java new file mode 100644 index 0000000..999f71d --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/controller/ApiRequestMgmtController.java @@ -0,0 +1,75 @@ +package com.eactive.httpmockserver.client.controller; + +import com.eactive.httpmockserver.client.dto.ApiCollectionDTO; +import com.eactive.httpmockserver.client.dto.ApiRequestDTO; +import com.eactive.httpmockserver.client.entity.ApiCollection; +import com.eactive.httpmockserver.client.entity.ApiRequestInfo; +import com.eactive.httpmockserver.client.mapper.ApiRequestMapper; +import com.eactive.httpmockserver.client.service.ApiRequestMgmtService; +import com.eactive.httpmockserver.common.security.CurrentUser; +import com.eactive.httpmockserver.user.entity.StaffUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +public class ApiRequestMgmtController { + + @Autowired + ApiRequestMgmtService apiRequestMgmtService; + + @Autowired + ApiRequestMapper apiRequestMapper; + + @GetMapping("/mgmt/collections/list.do") + public ResponseEntity> listApiRequests(@CurrentUser StaffUser user) { + List collections = apiRequestMgmtService.getMyApis(user); + return ResponseEntity.ok(apiRequestMapper.mapCollections(collections)); + } + + @PostMapping("/mgmt/collections/create.do") + public ResponseEntity createApiCollection( + @CurrentUser StaffUser user, + @RequestBody ApiCollectionDTO dto) { + + ApiCollection collection = apiRequestMapper.map(dto); + collection.setOwner(user); + + apiRequestMgmtService.createNewApiCollection(collection); + return ResponseEntity.ok("success"); + } + + + @PutMapping("/mgmt/collections/update.do") + public ResponseEntity updateApiCollection(@RequestBody ApiCollectionDTO dto) { + ApiCollection updated = apiRequestMapper.map(dto); + apiRequestMgmtService.updateApiCollection(updated.getId(), updated); + return ResponseEntity.ok("success"); + } + + @PostMapping("/mgmt/collections/delete.do") + public ResponseEntity deleteApiCollection(@RequestBody ApiCollectionDTO dto) { + apiRequestMgmtService.deleteApiCollection(dto.getId()); + return ResponseEntity.ok("success"); + } + + @PostMapping("/mgmt/collections/{id}/apis/save.do") + public ResponseEntity addApiToCollection(@PathVariable(name = "id") String id, + @RequestBody ApiRequestDTO dto, + @CurrentUser StaffUser user) { + ApiRequestInfo apiRequestInfo = apiRequestMapper.map(dto); + apiRequestInfo.setOwner(user); + String apiId = apiRequestMgmtService.saveApiToCollection(id, apiRequestInfo); + return ResponseEntity.ok(apiId); + } + + @PostMapping("/mgmt/collections/{id}/apis/delete.do") + public ResponseEntity removeApiFromCollection(@PathVariable(name = "id") String id, + @RequestBody ApiRequestDTO dto) { + apiRequestMgmtService.removeApiFromCollection(id, dto.getId()); + return ResponseEntity.ok("success"); + } + +} diff --git a/src/main/java/com/eactive/httpmockserver/client/dto/ApiCollectionDTO.java b/src/main/java/com/eactive/httpmockserver/client/dto/ApiCollectionDTO.java new file mode 100644 index 0000000..39eea98 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/dto/ApiCollectionDTO.java @@ -0,0 +1,39 @@ +package com.eactive.httpmockserver.client.dto; + +import javax.validation.constraints.NotEmpty; +import java.util.ArrayList; +import java.util.List; + +public class ApiCollectionDTO { + + private String id; + + @NotEmpty + private String name; + + private List apis = new ArrayList<>(); + + public void setId(String id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public void setApis(List apis) { + this.apis = apis; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public List getApis() { + return apis; + } +} diff --git a/src/main/java/com/eactive/httpmockserver/client/dto/ApiRequestDTO.java b/src/main/java/com/eactive/httpmockserver/client/dto/ApiRequestDTO.java index 4fd96e3..7926cbe 100644 --- a/src/main/java/com/eactive/httpmockserver/client/dto/ApiRequestDTO.java +++ b/src/main/java/com/eactive/httpmockserver/client/dto/ApiRequestDTO.java @@ -1,17 +1,40 @@ package com.eactive.httpmockserver.client.dto; +import java.util.ArrayList; import java.util.List; public class ApiRequestDTO { + private String id; + + private String name; + private String path; private String method; private Long server; - private List headers; + private List headers = new ArrayList<>(); + + private List queryParams = new ArrayList<>(); private String requestBody; + 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 getPath() { return path; } @@ -36,14 +59,22 @@ public class ApiRequestDTO { this.method = method; } - public List getHeaders() { + public List getHeaders() { return headers; } - public void setHeaders(List headers) { + public void setHeaders(List headers) { this.headers = headers; } + public List getQueryParams() { + return queryParams; + } + + public void setQueryParams(List queryParams) { + this.queryParams = queryParams; + } + public String getRequestBody() { return requestBody; } diff --git a/src/main/java/com/eactive/httpmockserver/client/dto/ApiHeaderDTO.java b/src/main/java/com/eactive/httpmockserver/client/dto/ApiRequestKeyValueDTO.java similarity index 80% rename from src/main/java/com/eactive/httpmockserver/client/dto/ApiHeaderDTO.java rename to src/main/java/com/eactive/httpmockserver/client/dto/ApiRequestKeyValueDTO.java index 681054c..c3e4548 100644 --- a/src/main/java/com/eactive/httpmockserver/client/dto/ApiHeaderDTO.java +++ b/src/main/java/com/eactive/httpmockserver/client/dto/ApiRequestKeyValueDTO.java @@ -1,6 +1,6 @@ package com.eactive.httpmockserver.client.dto; -public class ApiHeaderDTO { +public class ApiRequestKeyValueDTO { private boolean enabled; @@ -30,4 +30,8 @@ public class ApiHeaderDTO { public void setValue(String value) { this.value = value; } + + public String toString() { + return (enabled?"//":"")+ key + "=" + value; + } } diff --git a/src/main/java/com/eactive/httpmockserver/client/dto/ApiResponse.java b/src/main/java/com/eactive/httpmockserver/client/dto/ApiResponse.java index 54fb547..459272a 100644 --- a/src/main/java/com/eactive/httpmockserver/client/dto/ApiResponse.java +++ b/src/main/java/com/eactive/httpmockserver/client/dto/ApiResponse.java @@ -6,7 +6,7 @@ public class ApiResponse { private int status; - private List headers; + private List headers; private String body; @@ -20,11 +20,11 @@ public class ApiResponse { this.status = status; } - public List getHeaders() { + public List getHeaders() { return headers; } - public void setHeaders(List headers) { + public void setHeaders(List headers) { this.headers = headers; } diff --git a/src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java b/src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java index eb431cd..ea57421 100644 --- a/src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java +++ b/src/main/java/com/eactive/httpmockserver/client/entity/ApiCollection.java @@ -3,6 +3,7 @@ package com.eactive.httpmockserver.client.entity; import com.eactive.httpmockserver.user.entity.StaffUser; import javax.persistence.*; +import java.util.ArrayList; import java.util.List; @Entity @@ -20,11 +21,11 @@ public class ApiCollection { @ManyToMany @JoinTable( - name = "API_COLLECTION_API_REQUEST_INFO", - joinColumns = @JoinColumn(name = "API_COLLECTION_ID"), - inverseJoinColumns = @JoinColumn(name = "API_REQUEST_INFO_ID") + name = "API_COLLECTION_API_REQUEST_INFO", + joinColumns = @JoinColumn(name = "API_COLLECTION_ID"), + inverseJoinColumns = @JoinColumn(name = "API_REQUEST_INFO_ID") ) - private List apis; + private List apis = new ArrayList<>(); public String getId() { return id; diff --git a/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java b/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java index 06a629d..f0e4ba2 100644 --- a/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java +++ b/src/main/java/com/eactive/httpmockserver/client/entity/ApiRequestInfo.java @@ -3,6 +3,7 @@ package com.eactive.httpmockserver.client.entity; import com.eactive.httpmockserver.user.entity.StaffUser; import javax.persistence.*; +import java.util.Objects; @Entity @@ -20,6 +21,8 @@ public class ApiRequestInfo { @JoinColumn(name = "USER_ID") private StaffUser owner; + private String name; + private String method; private String path; @@ -30,6 +33,14 @@ public class ApiRequestInfo { private String requestBody; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public String getId() { return id; } @@ -93,4 +104,26 @@ public class ApiRequestInfo { public void setRequestBody(String requestBody) { this.requestBody = requestBody; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ApiRequestInfo that = (ApiRequestInfo) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id, server, owner, method, path, headers, queryParams, requestBody); + } + + public static void main(String[] args) { + ApiRequestInfo a= new ApiRequestInfo(); + a.setId("a"); + ApiRequestInfo b = new ApiRequestInfo(); + a.setId("a"); + + System.out.println(a.equals(b)); + } } diff --git a/src/main/java/com/eactive/httpmockserver/client/mapper/ApiRequestMapper.java b/src/main/java/com/eactive/httpmockserver/client/mapper/ApiRequestMapper.java new file mode 100644 index 0000000..04a77e3 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/mapper/ApiRequestMapper.java @@ -0,0 +1,34 @@ +package com.eactive.httpmockserver.client.mapper; + +import com.eactive.httpmockserver.client.dto.ApiCollectionDTO; +import com.eactive.httpmockserver.client.dto.ApiRequestDTO; +import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO; +import com.eactive.httpmockserver.client.entity.ApiCollection; +import com.eactive.httpmockserver.client.entity.ApiRequestInfo; +import com.eactive.httpmockserver.common.mapper.CommonMapper; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ReportingPolicy; +import org.springframework.stereotype.Component; + +import java.util.List; + + +@Mapper(componentModel = "spring", + uses = {CommonMapper.class, ServerMapper.class}, + unmappedTargetPolicy = ReportingPolicy.IGNORE) +@Component +public interface ApiRequestMapper { + ApiCollection map(ApiCollectionDTO dto); + + ApiRequestInfo map(ApiRequestDTO dto); + + + ApiRequestDTO map(ApiRequestInfo entity); + + + + List mapApis(List apis); + + List mapCollections(List apis); +} diff --git a/src/main/java/com/eactive/httpmockserver/client/mapper/ServerMapper.java b/src/main/java/com/eactive/httpmockserver/client/mapper/ServerMapper.java new file mode 100644 index 0000000..42fb8db --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/mapper/ServerMapper.java @@ -0,0 +1,30 @@ +package com.eactive.httpmockserver.client.mapper; + + +import com.eactive.httpmockserver.client.entity.Server; +import com.eactive.httpmockserver.client.repository.ServerRepository; +import com.eactive.httpmockserver.common.exception.NotFoundException; +import org.mapstruct.Mapper; +import org.mapstruct.ReportingPolicy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Mapper(componentModel = "spring", + unmappedTargetPolicy = ReportingPolicy.IGNORE) +@Component +public class ServerMapper { + + @Autowired + ServerRepository serverRepository; + + Server map(Long id) { + if (id == null) return null; + return serverRepository.findById(id).orElseThrow(() -> new NotFoundException("Server[" + id + "] not found")); + } + + Long map(Server server) { + if (server == null) return null; + return server.getId(); + } + +} diff --git a/src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java b/src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java index d6f009d..ec301bb 100644 --- a/src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java +++ b/src/main/java/com/eactive/httpmockserver/client/repository/ApiRequestRepository.java @@ -1,8 +1,13 @@ package com.eactive.httpmockserver.client.repository; +import com.eactive.httpmockserver.client.entity.ApiCollection; import com.eactive.httpmockserver.client.entity.ApiRequestInfo; +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 ApiRequestRepository extends JpaRepository, JpaSpecificationExecutor { + } diff --git a/src/main/java/com/eactive/httpmockserver/client/service/ApiRequestMgmtService.java b/src/main/java/com/eactive/httpmockserver/client/service/ApiRequestMgmtService.java new file mode 100644 index 0000000..4d5de51 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/client/service/ApiRequestMgmtService.java @@ -0,0 +1,84 @@ +package com.eactive.httpmockserver.client.service; + +import com.eactive.httpmockserver.client.entity.ApiCollection; +import com.eactive.httpmockserver.client.entity.ApiRequestInfo; +import com.eactive.httpmockserver.client.repository.ApiCollectionRepository; +import com.eactive.httpmockserver.client.repository.ApiRequestRepository; +import com.eactive.httpmockserver.common.exception.NotFoundException; +import com.eactive.httpmockserver.user.entity.StaffUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thymeleaf.util.StringUtils; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.UUID; + +@Service +@Transactional +public class ApiRequestMgmtService { + + @Autowired + ApiCollectionRepository apiCollectionRepository; + + @Autowired + ApiRequestRepository apiRequestRepository; + + + public List getMyApis(StaffUser user) { + return apiCollectionRepository.findAllByOwner(user); + } + + public void deleteApiCollection(String id) { + apiCollectionRepository.deleteById(id); + } + + public void createNewApiCollection(ApiCollection collection) { + collection.setId(UUID.randomUUID().toString()); + apiCollectionRepository.save(collection); + } + + public void updateApiCollection(String id, ApiCollection updated) { + ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found")); + collection.setName(updated.getName()); + apiCollectionRepository.save(collection); + } + + public String saveApiToCollection(String id, ApiRequestInfo api) { + ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found")); + + if (StringUtils.isEmpty(api.getId())) { + api.setId(UUID.randomUUID().toString()); + apiRequestRepository.save(api); + } else { + String apiId = api.getId(); + ApiRequestInfo existing = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException("api[" + apiId + "] not found")); + existing.setName(api.getName()); + existing.setMethod(api.getMethod()); + existing.setPath(api.getPath()); + existing.setHeaders(api.getHeaders()); + existing.setQueryParams(api.getQueryParams()); + existing.setServer(api.getServer()); + existing.setRequestBody(api.getRequestBody()); + apiRequestRepository.save(existing); + api = existing; + } + + + if (!collection.getApis().contains(api)) { + collection.getApis().add(api); + apiCollectionRepository.save(collection); + } + + return api.getId(); + } + + public void removeApiFromCollection(String id, String apiId) { + ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found")); + ApiRequestInfo api = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException("api[" + apiId + "] not found")); + + collection.getApis().remove(api); + apiCollectionRepository.save(collection); + + } +} diff --git a/src/main/java/com/eactive/httpmockserver/client/service/ApiTesterService.java b/src/main/java/com/eactive/httpmockserver/client/service/ApiTesterService.java deleted file mode 100644 index 15d3a0c..0000000 --- a/src/main/java/com/eactive/httpmockserver/client/service/ApiTesterService.java +++ /dev/null @@ -1,25 +0,0 @@ -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/HttptHandler.java b/src/main/java/com/eactive/httpmockserver/client/service/HttptHandler.java index 2f63099..bf00325 100644 --- a/src/main/java/com/eactive/httpmockserver/client/service/HttptHandler.java +++ b/src/main/java/com/eactive/httpmockserver/client/service/HttptHandler.java @@ -1,6 +1,6 @@ package com.eactive.httpmockserver.client.service; -import com.eactive.httpmockserver.client.dto.ApiHeaderDTO; +import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO; import com.eactive.httpmockserver.client.dto.ApiResponse; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -49,10 +49,10 @@ public class HttptHandler extends SimpleChannelInboundHandler return headerSize; } - public List convertHttpHeadersToList(HttpHeaders headers) { - List headerList = new ArrayList<>(); + public List convertHttpHeadersToList(HttpHeaders headers) { + List headerList = new ArrayList<>(); for (Map.Entry entry : headers.entries()) { - ApiHeaderDTO header = new ApiHeaderDTO(); + ApiRequestKeyValueDTO header = new ApiRequestKeyValueDTO(); header.setKey(entry.getKey()); header.setValue(entry.getValue()); headerList.add(header); 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 f7f9e4e..507ee31 100644 --- a/src/main/java/com/eactive/httpmockserver/client/service/NettyApiClient.java +++ b/src/main/java/com/eactive/httpmockserver/client/service/NettyApiClient.java @@ -1,6 +1,6 @@ package com.eactive.httpmockserver.client.service; -import com.eactive.httpmockserver.client.dto.ApiHeaderDTO; +import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO; import com.eactive.httpmockserver.client.dto.ApiRequestDTO; import com.eactive.httpmockserver.client.dto.ApiResponse; import com.eactive.httpmockserver.client.entity.Server; @@ -91,7 +91,7 @@ public class NettyApiClient { if (apiRequest.getHeaders().size() > 0) { HttpHeaders customHeaders = new DefaultHttpHeaders(); - apiRequest.getHeaders().stream().filter(ApiHeaderDTO::isEnabled).forEach((header) -> { + apiRequest.getHeaders().stream().filter(ApiRequestKeyValueDTO::isEnabled).forEach((header) -> { if(StringUtils.isNotEmpty(header.getKey()) && StringUtils.isNotEmpty(header.getValue())){ customHeaders.set(header.getKey(), header.getValue()); } diff --git a/src/main/java/com/eactive/httpmockserver/common/exception/CustomErrorResponse.java b/src/main/java/com/eactive/httpmockserver/common/exception/CustomErrorResponse.java new file mode 100644 index 0000000..0fd3c3c --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/common/exception/CustomErrorResponse.java @@ -0,0 +1,34 @@ +package com.eactive.httpmockserver.common.exception; + +import java.time.LocalDateTime; + +public class CustomErrorResponse { + + private LocalDateTime timestamp; + private String error; + private int status; + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public void setTimestamp(LocalDateTime timestamp) { + this.timestamp = timestamp; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } +} diff --git a/src/main/java/com/eactive/httpmockserver/common/exception/CustomGlobalExceptionHandler.java b/src/main/java/com/eactive/httpmockserver/common/exception/CustomGlobalExceptionHandler.java new file mode 100644 index 0000000..98d2710 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/common/exception/CustomGlobalExceptionHandler.java @@ -0,0 +1,24 @@ +package com.eactive.httpmockserver.common.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +import java.time.LocalDateTime; + +@RestControllerAdvice +public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @ExceptionHandler(NotFoundException.class) + public ResponseEntity customHandleNotFound(Exception ex, WebRequest request) { + CustomErrorResponse errors = new CustomErrorResponse(); + errors.setTimestamp(LocalDateTime.now()); + errors.setError(ex.getMessage()); + errors.setStatus(HttpStatus.NOT_FOUND.value()); + return new ResponseEntity<>(errors, HttpStatus.NOT_FOUND); + } + +} diff --git a/src/main/java/com/eactive/httpmockserver/common/mapper/CommonMapper.java b/src/main/java/com/eactive/httpmockserver/common/mapper/CommonMapper.java index 7b3b077..e0146d6 100644 --- a/src/main/java/com/eactive/httpmockserver/common/mapper/CommonMapper.java +++ b/src/main/java/com/eactive/httpmockserver/common/mapper/CommonMapper.java @@ -1,5 +1,6 @@ package com.eactive.httpmockserver.common.mapper; +import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO; import org.mapstruct.Mapper; import org.mapstruct.Named; import org.mapstruct.ReportingPolicy; @@ -41,4 +42,40 @@ public class CommonMapper { return grantedAuthorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()); } + + public String mapKeyValue(List list) { + if (list == null) return ""; + StringBuilder result = new StringBuilder(); + for (ApiRequestKeyValueDTO dto : list) { + result.append(dto.toString()).append("||"); + } + if (result.length() > 0) { + result.setLength(result.length() - 2); // Remove the last "||" + } + return result.toString(); + } + + public List keyValueToList(String keyValue) { + List list = new ArrayList<>(); + + if (!StringUtils.hasLength(keyValue)) return list; + + String[] pairs = keyValue.split("\\|\\|"); + for (String pair : pairs) { + ApiRequestKeyValueDTO dto = new ApiRequestKeyValueDTO(); + if (pair.startsWith("//")) { + dto.setEnabled(false); + pair = pair.substring(2); + } else { + dto.setEnabled(true); + } + String[] keyValueArray = pair.split("="); + if (keyValueArray.length == 2) { + dto.setKey(keyValueArray[0]); + dto.setValue(keyValueArray[1]); + list.add(dto); + } + } + return list; + } } diff --git a/src/main/resources/templates/fragment/header.html b/src/main/resources/templates/fragment/header.html index 245cde1..b5d29c0 100644 --- a/src/main/resources/templates/fragment/header.html +++ b/src/main/resources/templates/fragment/header.html @@ -16,14 +16,14 @@ -
+
-