sonar 대응

This commit is contained in:
현성필
2023-08-22 13:57:28 +09:00
parent 32a5719a12
commit 1063aaf19e
36 changed files with 188 additions and 243 deletions
@@ -4,7 +4,6 @@ import com.eactive.httpmockserver.api.dto.MockRequest;
import com.eactive.httpmockserver.api.entity.MockCondition; import com.eactive.httpmockserver.api.entity.MockCondition;
import com.eactive.httpmockserver.api.entity.MockResponse; import com.eactive.httpmockserver.api.entity.MockResponse;
import com.eactive.httpmockserver.api.entity.MockRoute; import com.eactive.httpmockserver.api.entity.MockRoute;
import com.eactive.httpmockserver.api.repository.MockRouteRepository;
import com.eactive.httpmockserver.api.service.MockRouteService; import com.eactive.httpmockserver.api.service.MockRouteService;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.PathNotFoundException;
@@ -19,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -35,7 +35,7 @@ public class MockApiController {
@RequestMapping(value = "/{_:^(?!swagger-ui|mgmt|min-maps|plugins|dist|css|fonts|js|h2-console|img|pages|favicon.ico).*$}/**") @RequestMapping(value = "/{_:^(?!swagger-ui|mgmt|min-maps|plugins|dist|css|fonts|js|h2-console|img|pages|favicon.ico).*$}/**")
public ResponseEntity<String> handleRequest(HttpServletRequest httpRequest) { public ResponseEntity<String> handleRequest(HttpServletRequest httpRequest) throws IOException {
MockRequest request = new MockRequest(httpRequest); MockRequest request = new MockRequest(httpRequest);
AntPathMatcher pathMatcher = new AntPathMatcher(); AntPathMatcher pathMatcher = new AntPathMatcher();
@@ -51,7 +51,7 @@ public class MockApiController {
try { try {
Thread.sleep(matchingResponse.getDelay()); Thread.sleep(matchingResponse.getDelay());
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); logger.error("Error while delaying response", e);
} }
} }
HttpHeaders responseHeaders = new HttpHeaders(); HttpHeaders responseHeaders = new HttpHeaders();
@@ -98,34 +98,59 @@ public class MockApiController {
private boolean isRequestMatching(List<MockCondition> conditions, MockRequest request, Map<String, String> pathVariables) { private boolean isRequestMatching(List<MockCondition> conditions, MockRequest request, Map<String, String> pathVariables) {
if (conditions == null || conditions.size() == 0) { if (conditions == null) {
return true; return true;
} }
for (MockCondition condition : conditions) { for (MockCondition condition : conditions) {
if (condition.getType().equalsIgnoreCase("query")) { switch (condition.getType().toLowerCase()) {
if(!condition.getValue().equals(request.getParam(condition.getKey()))){ case "query":
return false; if (!isQueryMatching(condition, request)) {
} return false;
} else if (condition.getType().equalsIgnoreCase("header")) { }
if (!condition.getValue().equals(request.getHeader(condition.getKey()))){ break;
return false; case "header":
} if (!isHeaderMatching(condition, request)) {
} else if (condition.getType().equalsIgnoreCase("path")) { return false;
if (!condition.getValue().equals(pathVariables.get(condition.getKey()))){ }
return false; break;
} case "path":
} else if (condition.getType().equalsIgnoreCase("jsonpath")) { if (!isPathMatching(condition, pathVariables)) {
try{ return false;
Object value = JsonPath.read(request.getBody(), condition.getKey()); }
return value.toString().equals(condition.getValue()); break;
}catch(PathNotFoundException e) { case "jsonpath":
return false; if (!isJsonPathMatching(condition, request)) {
} return false;
}
break;
default:
break;
} }
} }
return true; return true;
} }
private boolean isQueryMatching(MockCondition condition, MockRequest request) {
return condition.getValue().equals(request.getParam(condition.getKey()));
}
private boolean isHeaderMatching(MockCondition condition, MockRequest request) {
return condition.getValue().equals(request.getHeader(condition.getKey()));
}
private boolean isPathMatching(MockCondition condition, Map<String, String> pathVariables) {
return condition.getValue().equals(pathVariables.get(condition.getKey()));
}
private boolean isJsonPathMatching(MockCondition condition, MockRequest request) {
try {
Object value = JsonPath.read(request.getBody(), condition.getKey());
return value.toString().equals(condition.getValue());
} catch (PathNotFoundException e) {
return false;
}
}
} }
@@ -17,11 +17,14 @@ import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.List;
@Controller @Controller
@RequestMapping("/mgmt/routes") @RequestMapping("/mgmt/routes")
public class MockRouteMgmtController { public class MockRouteMgmtController {
private static final String MOCK_ROUTE = "mockRoute";
@PostConstruct @PostConstruct
public void init() { public void init() {
mockRouteService.initAllRoutes(); mockRouteService.initAllRoutes();
@@ -56,7 +59,7 @@ public class MockRouteMgmtController {
MockResponseDTO defaultResponse = new MockResponseDTO(); MockResponseDTO defaultResponse = new MockResponseDTO();
defaultResponse.setDefaultResponse("true"); defaultResponse.setDefaultResponse("true");
defaultRoute.getResponses().add(defaultResponse); defaultRoute.getResponses().add(defaultResponse);
model.addAttribute("mockRoute", defaultRoute); model.addAttribute(MOCK_ROUTE, defaultRoute);
return MOCK_ROUTE_EDIT; return MOCK_ROUTE_EDIT;
} }
@@ -65,7 +68,7 @@ public class MockRouteMgmtController {
MockRoute found = mockRouteService.findById(id); MockRoute found = mockRouteService.findById(id);
model.addAttribute("mockRoute", mockRouteMapper.map(found)); model.addAttribute(MOCK_ROUTE, mockRouteMapper.map(found));
return MOCK_ROUTE_EDIT; return MOCK_ROUTE_EDIT;
} }
@@ -79,7 +82,7 @@ public class MockRouteMgmtController {
validator.validate(dto, bindingResult); validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {
model.addAttribute("mockRoute", dto); model.addAttribute(MOCK_ROUTE, dto);
return MOCK_ROUTE_EDIT; return MOCK_ROUTE_EDIT;
} }
@@ -102,7 +105,7 @@ public class MockRouteMgmtController {
validator.validate(dto, bindingResult); validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {
model.addAttribute("mockRoute", dto); model.addAttribute(MOCK_ROUTE, dto);
return MOCK_ROUTE_EDIT; return MOCK_ROUTE_EDIT;
} }
@@ -114,10 +117,10 @@ public class MockRouteMgmtController {
@PostMapping("/delete.do") @PostMapping("/delete.do")
public String delete(@ModelAttribute MockRouteSearch modelSearch) { public String delete(@RequestParam("checkedIdForDel") List<String> ids) {
modelSearch.getCheckedIdForDel().forEach(id -> { for (String id : ids) {
mockRouteService.deleteById(Long.parseLong(id)); mockRouteService.deleteById(Long.parseLong(id));
}); }
mockRouteService.initAllRoutes(); mockRouteService.initAllRoutes();
return MOCK_ROUTE_LIST_VIEW; return MOCK_ROUTE_LIST_VIEW;
} }
@@ -27,7 +27,7 @@ public class MockRequest {
return queryParams; return queryParams;
} }
public MockRequest(HttpServletRequest request) { public MockRequest(HttpServletRequest request) throws IOException {
this.method = request.getMethod(); this.method = request.getMethod();
this.uri = request.getRequestURI(); this.uri = request.getRequestURI();
this.headers = Collections.list(request.getHeaderNames()).stream() this.headers = Collections.list(request.getHeaderNames()).stream()
@@ -35,11 +35,7 @@ public class MockRequest {
this.params = parseQueryString(request); this.params = parseQueryString(request);
try { this.body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
this.body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
} catch (IOException e) {
e.printStackTrace();
}
} }
private String uri; private String uri;
@@ -13,8 +13,6 @@ public class MockRouteSearch implements BaseSearch<MockRoute> {
private String name; private String name;
private List<String> checkedIdForDel;
@Override @Override
public List<SearchModel> buildSearchCondition() { public List<SearchModel> buildSearchCondition() {
List<SearchModel> models = new ArrayList<>(); List<SearchModel> models = new ArrayList<>();
@@ -30,11 +28,4 @@ public class MockRouteSearch implements BaseSearch<MockRoute> {
this.name = name; this.name = name;
} }
public List<String> getCheckedIdForDel() {
return checkedIdForDel;
}
public void setCheckedIdForDel(List<String> checkedIdForDel) {
this.checkedIdForDel = checkedIdForDel;
}
} }
@@ -73,8 +73,4 @@ public class MockRoute {
this.description = description; this.description = description;
} }
public void updateFields(MockRoute update) {
}
} }
@@ -77,23 +77,26 @@ public abstract class MockRouteMapper {
public List<MockHeaderDTO> mapHeadersToList(Map<String, String> headers) { public List<MockHeaderDTO> mapHeadersToList(Map<String, String> headers) {
List<MockHeaderDTO> list = new ArrayList<>(); List<MockHeaderDTO> list = new ArrayList<>();
if (headers != null) { if (headers != null) {
headers.forEach((key, value) -> { for (Map.Entry<String, String> entry : headers.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
MockHeaderDTO header = new MockHeaderDTO(); MockHeaderDTO header = new MockHeaderDTO();
header.setKey(key); header.setKey(key);
header.setValue(value); header.setValue(value);
list.add(header); list.add(header);
}); }
} }
return list; return list;
} }
@Named("mapHeadersToMap") @Named("mapHeadersToMap")
public Map<String, String> mapHeadersToMap(List<MockHeaderDTO> headers) { public Map<String, String> mapHeadersToMap(List<MockHeaderDTO> headers) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
if (headers != null) { if (headers != null) {
headers.forEach(header -> { for (MockHeaderDTO header : headers) {
map.put(header.getKey(), header.getValue()); map.put(header.getKey(), header.getValue());
}); }
} }
return map; return map;
} }
@@ -13,11 +13,8 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.sql.Array;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -30,10 +27,7 @@ public class MockRouteService {
@Autowired @Autowired
MockRouteRepository mockRouteRepository; MockRouteRepository mockRouteRepository;
@PersistenceContext private List<MockRoute> allRoutes = new ArrayList<>();
private EntityManager entityManager;
private List<MockRoute> allRoutes = new ArrayList<MockRoute>();
public List<MockRoute> getAllRoutes() { public List<MockRoute> getAllRoutes() {
return allRoutes; return allRoutes;
@@ -116,7 +110,6 @@ public class MockRouteService {
} }
Hibernate.initialize(response); Hibernate.initialize(response);
} }
// entityManager.detach(route);
try { try {
MockRoute cloned = (MockRoute) BeanUtils.cloneBean(route); MockRoute cloned = (MockRoute) BeanUtils.cloneBean(route);
allRoutes.add(cloned); allRoutes.add(cloned);
@@ -2,9 +2,9 @@ package com.eactive.httpmockserver.client.controller;
import com.eactive.httpmockserver.client.dto.ApiRequestDTO; import com.eactive.httpmockserver.client.dto.ApiRequestDTO;
import com.eactive.httpmockserver.client.dto.ApiResponse; import com.eactive.httpmockserver.client.dto.ApiResponse;
import com.eactive.httpmockserver.client.service.NettyApiClient;
import com.eactive.httpmockserver.server.entity.Server; import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository; import com.eactive.httpmockserver.server.entity.ServerRepository;
import com.eactive.httpmockserver.client.service.NettyApiClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
@@ -6,9 +6,9 @@ import com.eactive.httpmockserver.client.entity.ApiCollection;
import com.eactive.httpmockserver.client.entity.ApiRequestInfo; import com.eactive.httpmockserver.client.entity.ApiRequestInfo;
import com.eactive.httpmockserver.client.mapper.ApiRequestMapper; import com.eactive.httpmockserver.client.mapper.ApiRequestMapper;
import com.eactive.httpmockserver.client.service.ApiRequestMgmtService; import com.eactive.httpmockserver.client.service.ApiRequestMgmtService;
import com.eactive.httpmockserver.common.security.CurrentUser; import com.eactive.httpmockserver.common.util.SecurityUtil;
import com.eactive.httpmockserver.user.entity.StaffUser; import com.eactive.httpmockserver.user.entity.StaffUser;
import org.springframework.beans.factory.annotation.Autowired; import com.eactive.httpmockserver.user.service.UserService;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -17,28 +17,36 @@ import java.util.List;
@RestController @RestController
public class ApiRequestMgmtController { public class ApiRequestMgmtController {
@Autowired private static final String SUCCESS = "success";
ApiRequestMgmtService apiRequestMgmtService; ApiRequestMgmtService apiRequestMgmtService;
@Autowired
ApiRequestMapper apiRequestMapper; ApiRequestMapper apiRequestMapper;
UserService userService;
public ApiRequestMgmtController(ApiRequestMgmtService apiRequestMgmtService, ApiRequestMapper apiRequestMapper, UserService userService) {
this.apiRequestMgmtService = apiRequestMgmtService;
this.apiRequestMapper = apiRequestMapper;
this.userService = userService;
}
@GetMapping("/mgmt/collections/list.do") @GetMapping("/mgmt/collections/list.do")
public ResponseEntity<List<ApiCollectionDTO>> listApiRequests(@CurrentUser StaffUser user) { public ResponseEntity<List<ApiCollectionDTO>> listApiRequests() {
StaffUser user = userService.findByEsntlId(SecurityUtil.getCurrentUserEsntlId());
List<ApiCollection> collections = apiRequestMgmtService.getMyApis(user); List<ApiCollection> collections = apiRequestMgmtService.getMyApis(user);
return ResponseEntity.ok(apiRequestMapper.mapCollections(collections)); return ResponseEntity.ok(apiRequestMapper.mapCollections(collections));
} }
@PostMapping("/mgmt/collections/create.do") @PostMapping("/mgmt/collections/create.do")
public ResponseEntity<String> createApiCollection( public ResponseEntity<String> createApiCollection(
@CurrentUser StaffUser user,
@RequestBody ApiCollectionDTO dto) { @RequestBody ApiCollectionDTO dto) {
ApiCollection collection = apiRequestMapper.map(dto); ApiCollection collection = apiRequestMapper.map(dto);
StaffUser user = userService.findByEsntlId(SecurityUtil.getCurrentUserEsntlId());
collection.setOwner(user); collection.setOwner(user);
apiRequestMgmtService.createNewApiCollection(collection); apiRequestMgmtService.createNewApiCollection(collection);
return ResponseEntity.ok("success"); return ResponseEntity.ok(SUCCESS);
} }
@@ -46,20 +54,20 @@ public class ApiRequestMgmtController {
public ResponseEntity<String> updateApiCollection(@RequestBody ApiCollectionDTO dto) { public ResponseEntity<String> updateApiCollection(@RequestBody ApiCollectionDTO dto) {
ApiCollection updated = apiRequestMapper.map(dto); ApiCollection updated = apiRequestMapper.map(dto);
apiRequestMgmtService.updateApiCollection(updated.getId(), updated); apiRequestMgmtService.updateApiCollection(updated.getId(), updated);
return ResponseEntity.ok("success"); return ResponseEntity.ok(SUCCESS);
} }
@PostMapping("/mgmt/collections/delete.do") @PostMapping("/mgmt/collections/delete.do")
public ResponseEntity<String> deleteApiCollection(@RequestBody ApiCollectionDTO dto) { public ResponseEntity<String> deleteApiCollection(@RequestBody ApiCollectionDTO dto) {
apiRequestMgmtService.deleteApiCollection(dto.getId()); apiRequestMgmtService.deleteApiCollection(dto.getId());
return ResponseEntity.ok("success"); return ResponseEntity.ok(SUCCESS);
} }
@PostMapping("/mgmt/collections/{id}/apis/save.do") @PostMapping("/mgmt/collections/{id}/apis/save.do")
public ResponseEntity<String> addApiToCollection(@PathVariable(name = "id") String id, public ResponseEntity<String> addApiToCollection(@PathVariable(name = "id") String id,
@RequestBody ApiRequestDTO dto, @RequestBody ApiRequestDTO dto) {
@CurrentUser StaffUser user) {
ApiRequestInfo apiRequestInfo = apiRequestMapper.map(dto); ApiRequestInfo apiRequestInfo = apiRequestMapper.map(dto);
StaffUser user = userService.findByEsntlId(SecurityUtil.getCurrentUserEsntlId());
apiRequestInfo.setOwner(user); apiRequestInfo.setOwner(user);
String apiId = apiRequestMgmtService.saveApiToCollection(id, apiRequestInfo); String apiId = apiRequestMgmtService.saveApiToCollection(id, apiRequestInfo);
return ResponseEntity.ok(apiId); return ResponseEntity.ok(apiId);
@@ -69,7 +77,7 @@ public class ApiRequestMgmtController {
public ResponseEntity<String> removeApiFromCollection(@PathVariable(name = "id") String id, public ResponseEntity<String> removeApiFromCollection(@PathVariable(name = "id") String id,
@RequestBody ApiRequestDTO dto) { @RequestBody ApiRequestDTO dto) {
apiRequestMgmtService.removeApiFromCollection(id, dto.getId()); apiRequestMgmtService.removeApiFromCollection(id, dto.getId());
return ResponseEntity.ok("success"); return ResponseEntity.ok(SUCCESS);
} }
} }
@@ -119,12 +119,4 @@ public class ApiRequestInfo {
return Objects.hash(id, server, owner, method, path, headers, queryParams, requestBody); 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));
}
} }
@@ -1,13 +1,9 @@
package com.eactive.httpmockserver.client.repository; package com.eactive.httpmockserver.client.repository;
import com.eactive.httpmockserver.client.entity.ApiCollection;
import com.eactive.httpmockserver.client.entity.ApiRequestInfo; 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.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
public interface ApiRequestRepository extends JpaRepository<ApiRequestInfo, String>, JpaSpecificationExecutor<ApiRequestInfo> { public interface ApiRequestRepository extends JpaRepository<ApiRequestInfo, String>, JpaSpecificationExecutor<ApiRequestInfo> {
} }
@@ -18,6 +18,10 @@ import java.util.UUID;
@Transactional @Transactional
public class ApiRequestMgmtService { public class ApiRequestMgmtService {
private static final String API_COLLECTION_NOT_FOUND = "api collection[%s] not found";
private static final String API_NOT_FOUND = "api collection[%s] not found";
@Autowired @Autowired
ApiCollectionRepository apiCollectionRepository; ApiCollectionRepository apiCollectionRepository;
@@ -30,9 +34,9 @@ public class ApiRequestMgmtService {
} }
public void deleteApiCollection(String id) { public void deleteApiCollection(String id) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found")); ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
if (collection.getApis().size()>0){ if (!collection.getApis().isEmpty()) {
throw new RuntimeException("api collection[" + id + "] is not empty"); throw new RuntimeException("api collection[" + id + "] is not empty");
} }
apiCollectionRepository.deleteById(id); apiCollectionRepository.deleteById(id);
@@ -44,20 +48,20 @@ public class ApiRequestMgmtService {
} }
public void updateApiCollection(String id, ApiCollection updated) { public void updateApiCollection(String id, ApiCollection updated) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found")); ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
collection.setName(updated.getName()); collection.setName(updated.getName());
apiCollectionRepository.save(collection); apiCollectionRepository.save(collection);
} }
public String saveApiToCollection(String id, ApiRequestInfo api) { public String saveApiToCollection(String id, ApiRequestInfo api) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found")); ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
if (StringUtils.isEmpty(api.getId())) { if (StringUtils.isEmpty(api.getId())) {
api.setId(UUID.randomUUID().toString()); api.setId(UUID.randomUUID().toString());
apiRequestRepository.save(api); apiRequestRepository.save(api);
} else { } else {
String apiId = api.getId(); String apiId = api.getId();
ApiRequestInfo existing = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException("api[" + apiId + "] not found")); ApiRequestInfo existing = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException(String.format(API_NOT_FOUND, apiId)));
existing.setName(api.getName()); existing.setName(api.getName());
existing.setMethod(api.getMethod()); existing.setMethod(api.getMethod());
existing.setPath(api.getPath()); existing.setPath(api.getPath());
@@ -79,8 +83,8 @@ public class ApiRequestMgmtService {
} }
public void removeApiFromCollection(String id, String apiId) { public void removeApiFromCollection(String id, String apiId) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found")); ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
ApiRequestInfo api = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException("api[" + apiId + "] not found")); ApiRequestInfo api = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException(String.format(API_NOT_FOUND, apiId)));
collection.getApis().remove(api); collection.getApis().remove(api);
apiCollectionRepository.save(collection); apiCollectionRepository.save(collection);
@@ -20,8 +20,8 @@ public class ApiRequestMigrationService {
public void migrate() { public void migrate() {
apiRequestRepository.findAll().forEach(apiRequest -> { apiRequestRepository.findAll().forEach(apiRequest -> {
apiRequest.setHeaders(apiRequest.getHeaders().replaceAll("=", "::")); apiRequest.setHeaders(apiRequest.getHeaders().replace("=", "::"));
apiRequest.setQueryParams(apiRequest.getQueryParams().replaceAll("=", "::")); apiRequest.setQueryParams(apiRequest.getQueryParams().replace("=", "::"));
apiRequestRepository.save(apiRequest); apiRequestRepository.save(apiRequest);
}); });
@@ -1,8 +1,9 @@
package com.eactive.httpmockserver.client.service; package com.eactive.httpmockserver.client.service;
import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO;
import com.eactive.httpmockserver.client.dto.ApiRequestDTO; import com.eactive.httpmockserver.client.dto.ApiRequestDTO;
import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO;
import com.eactive.httpmockserver.client.dto.ApiResponse; import com.eactive.httpmockserver.client.dto.ApiResponse;
import com.eactive.httpmockserver.common.exception.ServerNotFoundException;
import com.eactive.httpmockserver.server.entity.Server; import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository; import com.eactive.httpmockserver.server.entity.ServerRepository;
import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.Bootstrap;
@@ -24,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.net.ssl.SSLException; import javax.net.ssl.SSLException;
import java.nio.file.Paths;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@Service @Service
@@ -32,9 +34,9 @@ public class NettyApiClient {
@Autowired @Autowired
ServerRepository serverRepository; ServerRepository serverRepository;
public CompletableFuture<ApiResponse> handleRequest(ApiRequestDTO apiRequest) throws Exception { public CompletableFuture<ApiResponse> handleRequest(ApiRequestDTO apiRequest) throws InterruptedException {
Server server = serverRepository.findById(apiRequest.getServer()).orElseThrow(() -> new Exception("Server not found")); Server server = serverRepository.findById(apiRequest.getServer()).orElseThrow(() -> new ServerNotFoundException("Server not found"));
String host = server.getHostname(); String host = server.getHostname();
int port = server.getPort(); int port = server.getPort();
@@ -74,12 +76,9 @@ public class NettyApiClient {
} }
String basePath = server.getBasePath(); String basePath = server.getBasePath();
if(!apiRequest.getPath().startsWith("/")){ String fullPath = Paths.get(basePath, apiRequest.getPath()).toString();
basePath = basePath + "/";
}
HttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.valueOf(apiRequest.getMethod()), HttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.valueOf(apiRequest.getMethod()), fullPath, content);
(basePath + apiRequest.getPath()).replaceAll("//", "/"), content);
request.headers().set("Host", host); request.headers().set("Host", host);
request.headers().set("Connection", HttpHeaderValues.CLOSE); request.headers().set("Connection", HttpHeaderValues.CLOSE);
@@ -89,9 +88,9 @@ public class NettyApiClient {
request.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes()); request.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
} }
if (apiRequest.getHeaders().size() > 0) { if (!apiRequest.getHeaders().isEmpty()) {
HttpHeaders customHeaders = new DefaultHttpHeaders(); HttpHeaders customHeaders = new DefaultHttpHeaders();
apiRequest.getHeaders().stream().filter(ApiRequestKeyValueDTO::isEnabled).forEach((header) -> { apiRequest.getHeaders().stream().filter(ApiRequestKeyValueDTO::isEnabled).forEach(header -> {
if(StringUtils.isNotEmpty(header.getKey()) && StringUtils.isNotEmpty(header.getValue())){ if(StringUtils.isNotEmpty(header.getKey()) && StringUtils.isNotEmpty(header.getValue())){
customHeaders.set(header.getKey(), header.getValue()); customHeaders.set(header.getKey(), header.getValue());
} }
@@ -0,0 +1,8 @@
package com.eactive.httpmockserver.common.exception;
public class ServerNotFoundException extends RuntimeException {
public ServerNotFoundException(String message) {
super(message);
}
}
@@ -1,9 +0,0 @@
package com.eactive.httpmockserver.common.security;
import java.lang.annotation.*;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentUser {
}
@@ -1,49 +0,0 @@
package com.eactive.httpmockserver.common.security;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.service.UserService;
import com.eactive.httpmockserver.common.exception.NotFoundException;
import com.eactive.httpmockserver.common.exception.UserNotLoginException;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.security.core.Authentication;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import java.lang.reflect.InvocationTargetException;
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private UserService userService;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(CurrentUser.class) != null &&
parameter.getParameterType().equals(StaffUser.class);
}
@Override
@Transactional
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
Authentication authentication = (Authentication) webRequest.getUserPrincipal();
if (authentication == null || !authentication.isAuthenticated()) {
throw new UserNotLoginException();
}
StaffUser user = null;
try {
user = userService.findByEsntlId((String) PropertyUtils.getProperty(authentication.getPrincipal(), "esntlId"));
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
throw new NotFoundException("User not found");
}
if (user == null) throw new UserNotLoginException();
return user;
}
}
@@ -1,8 +1,8 @@
package com.eactive.httpmockserver.common.validator; package com.eactive.httpmockserver.common.validator;
import com.eactive.httpmockserver.user.service.UserService;
import com.eactive.httpmockserver.common.exception.UserNotFoundException; import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import com.eactive.httpmockserver.common.util.ApplicationContextUtil; import com.eactive.httpmockserver.common.util.ApplicationContextUtil;
import com.eactive.httpmockserver.user.service.UserService;
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; import javax.validation.ConstraintValidatorContext;
@@ -7,7 +7,8 @@ import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User; import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.repository.StaffUserRepository; import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import com.eactive.httpmockserver.user.service.UserService; import com.eactive.httpmockserver.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -22,12 +23,16 @@ import java.io.IOException;
@Transactional @Transactional
public class PortalAuthenticationFailureHandler implements AuthenticationFailureHandler { public class PortalAuthenticationFailureHandler implements AuthenticationFailureHandler {
@Autowired private static final Logger logger = LoggerFactory.getLogger(PortalAuthenticationFailureHandler.class);
UserService userService; UserService userService;
@Autowired
StaffUserRepository staffUserRepository; StaffUserRepository staffUserRepository;
public PortalAuthenticationFailureHandler(UserService userService, StaffUserRepository staffUserRepository) {
this.userService = userService;
this.staffUserRepository = staffUserRepository;
}
@Override @Override
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {AuthenticationException.class, UserNotFoundException.class}) @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {AuthenticationException.class, UserNotFoundException.class})
@@ -44,7 +49,8 @@ public class PortalAuthenticationFailureHandler implements AuthenticationFailure
staffUserRepository.save((StaffUser) user); staffUserRepository.save((StaffUser) user);
} }
} catch (UserNotFoundException ignored) { } catch (UserNotFoundException e) {
logger.error("{} login try {}", username, e.getMessage());
} }
request.getSession().setAttribute(LoginController.LOGIN_MESSAGE, exception.getLocalizedMessage()); request.getSession().setAttribute(LoginController.LOGIN_MESSAGE, exception.getLocalizedMessage());
@@ -31,7 +31,7 @@ public class PortalAuthenticationSuccessHandler implements AuthenticationSuccess
userService.updateUser((User) user); userService.updateUser((User) user);
String contextPath = request.getContextPath(); String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/"); response.sendRedirect(contextPath + "/mgmt/routes/list_view.do");
} }
@Override @Override
@@ -3,13 +3,10 @@ package com.eactive.httpmockserver.config;
import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.domain.AuditorAware; import org.springframework.data.domain.AuditorAware;
import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean; import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
/** /**
* @author * @author
@@ -16,6 +16,21 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@EnableWebSecurity @EnableWebSecurity
public class PortalConfigSecurity extends WebSecurityConfigurerAdapter { public class PortalConfigSecurity extends WebSecurityConfigurerAdapter {
private final PortalAuthenticationFailureHandler authenticationFailureHandler;
private final PortalAuthenticationSuccessHandler authenticationSuccessHandler;
private final PortalAuthenticationManager portalAuthenticationManager;
@Autowired
public PortalConfigSecurity(PortalAuthenticationFailureHandler authenticationFailureHandler,
PortalAuthenticationSuccessHandler authenticationSuccessHandler,
PortalAuthenticationManager portalAuthenticationManager) {
this.authenticationFailureHandler = authenticationFailureHandler;
this.authenticationSuccessHandler = authenticationSuccessHandler;
this.portalAuthenticationManager = portalAuthenticationManager;
}
@Bean @Bean
public FilterRegistrationBean<XssEscapeServletFilter> xssFilterRegistrationBean() { public FilterRegistrationBean<XssEscapeServletFilter> xssFilterRegistrationBean() {
FilterRegistrationBean<XssEscapeServletFilter> registrationBean = new FilterRegistrationBean<>(); FilterRegistrationBean<XssEscapeServletFilter> registrationBean = new FilterRegistrationBean<>();
@@ -26,12 +41,6 @@ public class PortalConfigSecurity extends WebSecurityConfigurerAdapter {
return registrationBean; return registrationBean;
} }
@Autowired
public PortalAuthenticationFailureHandler authenticationFailureHandler;
@Autowired
public PortalAuthenticationSuccessHandler authenticationSuccessHandler;
@Override @Override
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {
@@ -56,9 +65,6 @@ public class PortalConfigSecurity extends WebSecurityConfigurerAdapter {
} }
@Autowired
PortalAuthenticationManager portalAuthenticationManager;
@Override @Override
@Bean @Bean
public PortalAuthenticationManager authenticationManager() { public PortalAuthenticationManager authenticationManager() {
@@ -1,7 +1,6 @@
package com.eactive.httpmockserver.config; package com.eactive.httpmockserver.config;
import com.eactive.httpmockserver.common.interceptor.AuthenticInterceptor; import com.eactive.httpmockserver.common.interceptor.AuthenticInterceptor;
import com.eactive.httpmockserver.common.security.CurrentUserArgumentResolver;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
@@ -42,13 +41,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Override @Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserArgumentResolver());
resolvers.add(pageableHandlerMethodArgumentResolver()); resolvers.add(pageableHandlerMethodArgumentResolver());
} }
@Bean
public CurrentUserArgumentResolver currentUserArgumentResolver() {
return new CurrentUserArgumentResolver();
}
@Bean @Bean
public PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver() { public PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver() {
@@ -8,6 +8,6 @@ public class HomeController {
@GetMapping("/") @GetMapping("/")
public String home() { public String home() {
return "index"; return "redirect:/mgmt/routes/list_view.do";
} }
} }
@@ -1,9 +1,9 @@
package com.eactive.httpmockserver.server.controller; package com.eactive.httpmockserver.server.controller;
import com.eactive.httpmockserver.server.mapper.ServerMapper;
import com.eactive.httpmockserver.server.dto.ServerDTO; import com.eactive.httpmockserver.server.dto.ServerDTO;
import com.eactive.httpmockserver.server.dto.ServerSearch; import com.eactive.httpmockserver.server.dto.ServerSearch;
import com.eactive.httpmockserver.server.entity.Server; import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.mapper.ServerMapper;
import com.eactive.httpmockserver.server.service.ServerMgmtService; import com.eactive.httpmockserver.server.service.ServerMgmtService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +15,8 @@ import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator; import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller @Controller
@RequestMapping("/mgmt/servers") @RequestMapping("/mgmt/servers")
@@ -29,6 +31,8 @@ public class ServerMgmtController {
@Autowired @Autowired
private Validator validator; private Validator validator;
public static final String SERVER = "server";
public static final String SERVER_EDIT = "page/servers/serverEdit"; public static final String SERVER_EDIT = "page/servers/serverEdit";
public static final String SERVER_LIST_VIEW = "redirect:/mgmt/servers/list_view.do"; public static final String SERVER_LIST_VIEW = "redirect:/mgmt/servers/list_view.do";
@@ -49,7 +53,7 @@ public class ServerMgmtController {
@GetMapping("/create_view.do") @GetMapping("/create_view.do")
public String createView(ModelMap model) { public String createView(ModelMap model) {
ServerDTO defaultServer = new ServerDTO(); ServerDTO defaultServer = new ServerDTO();
model.addAttribute("server", defaultServer); model.addAttribute(SERVER, defaultServer);
return SERVER_EDIT; return SERVER_EDIT;
} }
@@ -57,12 +61,12 @@ public class ServerMgmtController {
public String updateView(ModelMap model, @RequestParam("id") Long id) { public String updateView(ModelMap model, @RequestParam("id") Long id) {
Server found = serverMgmtService.findById(id); Server found = serverMgmtService.findById(id);
ServerDTO server = serverMapper.map(found); ServerDTO server = serverMapper.map(found);
model.addAttribute("server", server); model.addAttribute(SERVER, server);
return SERVER_EDIT; return SERVER_EDIT;
} }
@PostMapping("/register.do") @PostMapping("/register.do")
public String register(@ModelAttribute("server") ServerDTO dto, public String register(@ModelAttribute(SERVER) ServerDTO dto,
BindingResult bindingResult, BindingResult bindingResult,
ModelMap model) { ModelMap model) {
@@ -73,7 +77,7 @@ public class ServerMgmtController {
validator.validate(dto, bindingResult); validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {
model.addAttribute("server", dto); model.addAttribute(SERVER, dto);
return SERVER_EDIT; return SERVER_EDIT;
} }
@@ -83,7 +87,7 @@ public class ServerMgmtController {
} }
@PostMapping("/update.do") @PostMapping("/update.do")
public String update(@ModelAttribute("server") ServerDTO dto, public String update(@ModelAttribute(SERVER) ServerDTO dto,
BindingResult bindingResult, BindingResult bindingResult,
ModelMap model) { ModelMap model) {
@@ -94,7 +98,7 @@ public class ServerMgmtController {
validator.validate(dto, bindingResult); validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {
model.addAttribute("server", dto); model.addAttribute(SERVER, dto);
return SERVER_EDIT; return SERVER_EDIT;
} }
@@ -104,12 +108,10 @@ public class ServerMgmtController {
} }
@PostMapping("/delete.do") @PostMapping("/delete.do")
public String delete(@ModelAttribute ServerSearch modelSearch) { public String delete(@RequestParam("checkedIdForDel") List<String> checkedIdForDel) {
for (String id : checkedIdForDel) {
modelSearch.getCheckedIdForDel().forEach(id -> {
serverMgmtService.delete(Long.parseLong(id)); serverMgmtService.delete(Long.parseLong(id));
}); }
return SERVER_LIST_VIEW; return SERVER_LIST_VIEW;
} }
@@ -20,8 +20,6 @@ public class ServerSearch implements BaseSearch<Server> {
private String port; private String port;
private List<String> checkedIdForDel;
@Override @Override
public List<SearchModel> buildSearchCondition() { public List<SearchModel> buildSearchCondition() {
List<SearchModel> models = new ArrayList<>(); List<SearchModel> models = new ArrayList<>();
@@ -77,11 +75,4 @@ public class ServerSearch implements BaseSearch<Server> {
this.port = port; this.port = port;
} }
public List<String> getCheckedIdForDel() {
return checkedIdForDel;
}
public void setCheckedIdForDel(List<String> checkedIdForDel) {
this.checkedIdForDel = checkedIdForDel;
}
} }
@@ -1,10 +1,10 @@
package com.eactive.httpmockserver.server.mapper; package com.eactive.httpmockserver.server.mapper;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import com.eactive.httpmockserver.common.exception.NotFoundException; import com.eactive.httpmockserver.common.exception.NotFoundException;
import com.eactive.httpmockserver.server.dto.ServerDTO; import com.eactive.httpmockserver.server.dto.ServerDTO;
import com.eactive.httpmockserver.server.entity.Server; import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -1,8 +1,8 @@
package com.eactive.httpmockserver.server.service; package com.eactive.httpmockserver.server.service;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import com.eactive.httpmockserver.common.exception.NotFoundException; import com.eactive.httpmockserver.common.exception.NotFoundException;
import com.eactive.httpmockserver.server.entity.Server; import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@@ -1,10 +1,8 @@
package com.eactive.httpmockserver.user.controller; package com.eactive.httpmockserver.user.controller;
import com.eactive.httpmockserver.common.util.SecurityUtil;
import com.eactive.httpmockserver.user.dto.PasswordChangeRequestDTO; import com.eactive.httpmockserver.user.dto.PasswordChangeRequestDTO;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.service.UserService; import com.eactive.httpmockserver.user.service.UserService;
import com.eactive.httpmockserver.common.security.CurrentUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -18,6 +16,7 @@ import org.springframework.web.bind.annotation.PostMapping;
@Controller @Controller
public class AccountController { public class AccountController {
public static final String UPDATE_PW = "page/updatePw";
@Autowired @Autowired
private Validator validator; private Validator validator;
@@ -25,33 +24,31 @@ public class AccountController {
private UserService userService; private UserService userService;
@GetMapping("/change_password.do") @GetMapping("/change_password.do")
public String changePassword(ModelMap model, @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO) { public String changePassword( @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO) {
return "page/updatePw"; return UPDATE_PW;
} }
@PostMapping(value = "/update_password.do") @PostMapping(value = "/update_password.do")
@Transactional @Transactional
public String updatePassword(ModelMap model, @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO, public String updatePassword(ModelMap model, @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO,
@CurrentUser StaffUser user,
BindingResult result) { BindingResult result) {
validator.validate(passwordChangeRequestDTO, result); validator.validate(passwordChangeRequestDTO, result);
if (result.hasErrors()) { if (result.hasErrors()) {
model.addAttribute("errors", result); model.addAttribute("errors", result);
return "page/updatePw"; return UPDATE_PW;
} }
String oldPassword = passwordChangeRequestDTO.getOldPassword(); String oldPassword = passwordChangeRequestDTO.getOldPassword();
String newPassword = passwordChangeRequestDTO.getNewPassword(); String newPassword = passwordChangeRequestDTO.getNewPassword();
String newPassword2 = passwordChangeRequestDTO.getNewPassword2(); String newPassword2 = passwordChangeRequestDTO.getNewPassword2();
String resultMsg = userService.updateUserPassword(SecurityUtil.getCurrentUserEsntlId(), oldPassword, newPassword, newPassword2);
String resultMsg = userService.updateUserPassword(user.getUserId(), oldPassword, newPassword, newPassword2);
model.addAttribute("resultMsg", resultMsg); model.addAttribute("resultMsg", resultMsg);
model.addAttribute("passwordChangeRequest", new PasswordChangeRequestDTO()); model.addAttribute("passwordChangeRequest", new PasswordChangeRequestDTO());
return "page/updatePw"; return "redirect:/";
} }
@@ -1,11 +1,10 @@
package com.eactive.httpmockserver.user.controller; package com.eactive.httpmockserver.user.controller;
import com.eactive.httpmockserver.common.security.CurrentUser; import com.eactive.httpmockserver.common.util.SecurityUtil;
import com.eactive.httpmockserver.user.dto.UserRegisterDTO; import com.eactive.httpmockserver.user.dto.UserRegisterDTO;
import com.eactive.httpmockserver.user.dto.UserSearch; import com.eactive.httpmockserver.user.dto.UserSearch;
import com.eactive.httpmockserver.user.dto.UserUpdateDTO; import com.eactive.httpmockserver.user.dto.UserUpdateDTO;
import com.eactive.httpmockserver.user.entity.StaffUser; import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.mapper.StaffUserMapper; import com.eactive.httpmockserver.user.mapper.StaffUserMapper;
import com.eactive.httpmockserver.user.service.StaffUserService; import com.eactive.httpmockserver.user.service.StaffUserService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -108,10 +107,9 @@ public class UserMgmtController {
@PostMapping("/delete.do") @PostMapping("/delete.do")
public String delete(@CurrentUser User user, public String delete(@ModelAttribute UserSearch modelSearch) {
@ModelAttribute UserSearch modelSearch) {
modelSearch.getCheckedIdForDel().forEach(id -> { modelSearch.getCheckedIdForDel().forEach(id -> {
if (!user.getEsntlId().equals(id)) { // 자기 자신은 삭제 불가 if (!SecurityUtil.getCurrentUserEsntlId().equals(id)) { // 자기 자신은 삭제 불가
staffUserService.deleteById(id); staffUserService.deleteById(id);
} }
}); });
@@ -1,11 +1,10 @@
package com.eactive.httpmockserver.user.dto; package com.eactive.httpmockserver.user.dto;
import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.common.validator.PasswordMatch; import com.eactive.httpmockserver.common.validator.PasswordMatch;
import com.eactive.httpmockserver.common.validator.UniqueId; import com.eactive.httpmockserver.common.validator.UniqueId;
import com.eactive.httpmockserver.user.entity.UserStatus;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import java.io.Serializable; import java.io.Serializable;
@@ -23,7 +22,7 @@ public class UserRegisterDTO implements Serializable {
*/ */
@NotEmpty @NotEmpty
@UniqueId @UniqueId
@Email // @Email
private String userId; private String userId;
@@ -1,11 +1,11 @@
package com.eactive.httpmockserver.user.dto; package com.eactive.httpmockserver.user.dto;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.common.search.BaseSearch; import com.eactive.httpmockserver.common.search.BaseSearch;
import com.eactive.httpmockserver.common.search.ColumnSearchModel; import com.eactive.httpmockserver.common.search.ColumnSearchModel;
import com.eactive.httpmockserver.common.search.SearchCondition; import com.eactive.httpmockserver.common.search.SearchCondition;
import com.eactive.httpmockserver.common.search.SearchModel; import com.eactive.httpmockserver.common.search.SearchModel;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.UserStatus;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -1,7 +1,7 @@
package com.eactive.httpmockserver.user.dto; package com.eactive.httpmockserver.user.dto;
import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.common.entity.EnabledStatus; import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.user.entity.UserStatus;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@@ -1,12 +1,11 @@
package com.eactive.httpmockserver.user.mapper; package com.eactive.httpmockserver.user.mapper;
import com.eactive.httpmockserver.common.mapper.CommonMapper;
import com.eactive.httpmockserver.common.util.EncryptionUtil;
import com.eactive.httpmockserver.user.dto.UserRegisterDTO; import com.eactive.httpmockserver.user.dto.UserRegisterDTO;
import com.eactive.httpmockserver.user.dto.UserUpdateDTO; import com.eactive.httpmockserver.user.dto.UserUpdateDTO;
import com.eactive.httpmockserver.user.entity.StaffUser; import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.common.mapper.CommonMapper;
import com.eactive.httpmockserver.common.util.EncryptionUtil;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
@@ -1,10 +1,10 @@
package com.eactive.httpmockserver.user.service; package com.eactive.httpmockserver.user.service;
import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import com.eactive.httpmockserver.user.entity.StaffUser; import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.UserStatus; import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.user.repository.StaffUserRepository; import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@@ -1,11 +1,11 @@
package com.eactive.httpmockserver.user.service; package com.eactive.httpmockserver.user.service;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import com.eactive.httpmockserver.common.entity.EnabledStatus; import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.common.exception.UserNotFoundException; import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import com.eactive.httpmockserver.common.util.EncryptionUtil; import com.eactive.httpmockserver.common.util.EncryptionUtil;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
@@ -39,8 +39,8 @@ public class UserService implements UserDetailsService {
return staffUserRepository.findByUserId(userId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND_MESSAGE)); return staffUserRepository.findByUserId(userId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND_MESSAGE));
} }
public String updateUserPassword(String userId, String oldPassword, String newPassword, String newPassword2) { public String updateUserPassword(String esntlId, String oldPassword, String newPassword, String newPassword2) {
User user = staffUserRepository.findByUserId(userId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND_MESSAGE)); User user = staffUserRepository.findById(esntlId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND_MESSAGE));
String encryptedOldPass = encryptionUtil.encryptPassword(oldPassword, user.getUserId()); String encryptedOldPass = encryptionUtil.encryptPassword(oldPassword, user.getUserId());
String resultMsg = null; String resultMsg = null;