From 3d5dfbec6df3e7471fcc1411e0b2dbfeb7170b96 Mon Sep 17 00:00:00 2001 From: shinmj Date: Thu, 28 Oct 2021 15:34:01 +0900 Subject: [PATCH 01/11] update npm script --- frontend/portal/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/portal/package.json b/frontend/portal/package.json index 1e93fc1..acf54ff 100644 --- a/frontend/portal/package.json +++ b/frontend/portal/package.json @@ -8,8 +8,8 @@ }, "scripts": { "dev": "ts-node --project tsconfig.server.json server/index.ts", - "dev:sm": "SITE_ID=3 npm run dev", - "dev:lg": "SITE_ID=2 npm run dev", + "dev:sm": "set SITE_ID=3&&npm run dev", + "dev:lg": "set SITE_ID=2&&npm run dev", "build:server": "tsc --project tsconfig.server.json", "build:next": "next build", "prebuild": "rimraf ./build", From 13e26872f7fbf56783e5819b37382f994d1dc0aa Mon Sep 17 00:00:00 2001 From: shinmj Date: Thu, 28 Oct 2021 16:47:47 +0900 Subject: [PATCH 02/11] fixed blank --- config/reserve-item-service.yml | 22 +++++++++++----------- config/reserve-request-service.yml | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/config/reserve-item-service.yml b/config/reserve-item-service.yml index c14f1f6..e2c3bb1 100644 --- a/config/reserve-item-service.yml +++ b/config/reserve-item-service.yml @@ -3,14 +3,14 @@ spring: url: r2dbc:mysql://${mysql.hostname:localhost}:3306/msaportal?serverTimezone=Asia/Seoul username: msaportal password: msaportal -cloud: - stream: - function: - definition: reserveRequest # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer function - bindings: - reserveRequest-in-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer binding - destination: reserve-request.topic # queue name - group: reserved - inventoryUpdated-out-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 supplier binding - destination: inventory-updated.topic # queue name - group: reserved + cloud: + stream: + function: + definition: reserveRequest # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer function + bindings: + reserveRequest-in-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer binding + destination: reserve-request.topic # queue name + group: reserved + inventoryUpdated-out-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 supplier binding + destination: inventory-updated.topic # queue name + group: reserved diff --git a/config/reserve-request-service.yml b/config/reserve-request-service.yml index 8b6d989..a3bc2d5 100644 --- a/config/reserve-request-service.yml +++ b/config/reserve-request-service.yml @@ -3,14 +3,14 @@ spring: url: r2dbc:mysql://${mysql.hostname:localhost}:3306/reservation?serverTimezone=Asia/Seoul username: msaportal password: msaportal -cloud: - stream: - function: - definition: inventoryUpdated # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer function - bindings: - reserveRequest-out-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 supplier binding - destination: reserve-request.topic # queue name - group: reserved - inventoryUpdated-in-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer binding - destination: inventory-updated.topic # queue name - group: reserved + cloud: + stream: + function: + definition: inventoryUpdated # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer function + bindings: + reserveRequest-out-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 supplier binding + destination: reserve-request.topic # queue name + group: reserved + inventoryUpdated-in-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer binding + destination: inventory-updated.topic # queue name + group: reserved From 07ee5b92313a7788c4e1c1f6e97991e86b3abd99 Mon Sep 17 00:00:00 2001 From: shinmj Date: Thu, 28 Oct 2021 17:11:26 +0900 Subject: [PATCH 03/11] fixed add constructor --- .../cloud/reservechecksevice/client/dto/UserResponseDto.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/client/dto/UserResponseDto.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/client/dto/UserResponseDto.java index 3eb78c1..30daa50 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/client/dto/UserResponseDto.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/client/dto/UserResponseDto.java @@ -2,6 +2,7 @@ package org.egovframe.cloud.reservechecksevice.client.dto; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; /** * org.egovframe.cloud.userservice.api.user.dto.UserResponseDto @@ -21,6 +22,7 @@ import lombok.Getter; * */ @Getter +@NoArgsConstructor public class UserResponseDto { private String userId; From 767b8eacdc8ba478b9783f4425659a33576698ae Mon Sep 17 00:00:00 2001 From: kimjaeyeol Date: Fri, 29 Oct 2021 10:13:31 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=F0=9F=94=A7=20Modify=20config=20server?= =?UTF-8?q?=20profile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/config/src/main/resources/logback-spring.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/config/src/main/resources/logback-spring.xml b/backend/config/src/main/resources/logback-spring.xml index d3d82ad..28c2059 100644 --- a/backend/config/src/main/resources/logback-spring.xml +++ b/backend/config/src/main/resources/logback-spring.xml @@ -8,12 +8,12 @@ - + - + From 2417b14b0bf5aa974bb53bc00d5e4432db616aae Mon Sep 17 00:00:00 2001 From: jooho Date: Fri, 29 Oct 2021 15:39:35 +0900 Subject: [PATCH 05/11] unit test --- .../api/user/UserApiController.java | 18 +++--- .../api/user/dto/UserVerifyRequestDto.java | 2 +- .../userservice/service/user/UserService.java | 25 +++++--- .../role/AuthorizationApiControllerTest.java | 2 +- .../src/test/resources/h2/data.sql | 61 ++++++++++++++++++- 5 files changed, 84 insertions(+), 24 deletions(-) diff --git a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/UserApiController.java b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/UserApiController.java index 896f232..e530353 100644 --- a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/UserApiController.java +++ b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/UserApiController.java @@ -17,8 +17,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.io.IOException; -import java.security.GeneralSecurityException; /** * org.egovframe.cloud.userservice.api.user.UserApiController @@ -131,7 +129,7 @@ public class UserApiController { } /** - * 사용자 회원 가입 + * 사용자 소셜 정보 조회 * * @param requestDto 사용자 가입 요청 DTO * @return Boolean 성공 여부 @@ -243,23 +241,21 @@ public class UserApiController { /** * 사용자 회원탈퇴 * - * @param requestDto 사용자 비밀번호 확인 요청 DTO - * @return Boolean 일치 여부 - * @throws GeneralSecurityException 보안 예외 - * @throws IOException 입출력 예외 + * @param requestDto 사용자 검증 요청 DTO + * @return Boolean 처리 여부 */ @PostMapping("/api/v1/users/leave") - public Boolean leave(@RequestBody @Valid UserVerifyRequestDto requestDto) throws GeneralSecurityException, IOException { + public Boolean leave(@RequestBody @Valid UserVerifyRequestDto requestDto) { final String userId = SecurityContextHolder.getContext().getAuthentication().getName(); return userService.leave(userId, requestDto); } /** - * 사용자 회원탈퇴 + * 사용자 삭제 * - * @param userId 사용자 비밀번호 확인 요청 DTO - * @return Boolean 일치 여부 + * @param userId 사용자 id + * @return Boolean 처리 여부 */ @DeleteMapping("/api/v1/users/delete/{userId}") public Boolean delete(@PathVariable String userId) { diff --git a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserVerifyRequestDto.java b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserVerifyRequestDto.java index 949501d..90b716e 100644 --- a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserVerifyRequestDto.java +++ b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserVerifyRequestDto.java @@ -9,7 +9,7 @@ import javax.validation.constraints.Pattern; /** * org.egovframe.cloud.userservice.api.user.dto.UserVerifyRequestDto * - * 사용자 탈퇴 요청 DTO 클래스 + * 사용자 검증 요청 DTO 클래스 * * @author 표준프레임워크센터 jooho * @version 1.0 diff --git a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java index 3a1d9ef..caeeac8 100644 --- a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java +++ b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java @@ -163,7 +163,7 @@ public class UserService extends AbstractService implements UserDetailsService { @Transactional public String updateRefreshToken(String userId, String updateRefreshToken) { User user = userRepository.findByUserId(userId) - .orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다.")); + .orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists"))); user.updateRefreshToken(updateRefreshToken); @@ -178,7 +178,7 @@ public class UserService extends AbstractService implements UserDetailsService { */ public User findByRefreshToken(String refreshToken) { return userRepository.findByRefreshToken(refreshToken) - .orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다.")); + .orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists"))); } /** @@ -189,7 +189,7 @@ public class UserService extends AbstractService implements UserDetailsService { */ public UserResponseDto findByUserId(String userId) { User user = userRepository.findByUserId(userId) - .orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다.")); + .orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists"))); return new UserResponseDto(user); } @@ -202,7 +202,7 @@ public class UserService extends AbstractService implements UserDetailsService { */ public UserResponseDto findByEmail(String email) { User user = userRepository.findByEmail(email) - .orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다.")); + .orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists"))); return new UserResponseDto(user); } @@ -297,7 +297,6 @@ public class UserService extends AbstractService implements UserDetailsService { throw new BusinessMessageException(getMessage("valid.required.format", new Object[]{getMessage("user.email")})); } - if (userId == null || "".equals(userId)) { return userRepository.findByEmail(email).isPresent(); } else { @@ -431,7 +430,7 @@ public class UserService extends AbstractService implements UserDetailsService { } User user = userRepository.findByEmail(entity.getUserFindPasswordId().getEmailAddr()) - .orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다.")); + .orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists"))); user.updatePassword(passwordEncoder.encode(requestDto.getPassword())); // 비밀번호 수정 @@ -449,9 +448,14 @@ public class UserService extends AbstractService implements UserDetailsService { */ @Transactional public Boolean updatePassword(String userId, UserPasswordUpdateRequestDto requestDto) { - User entity = findUserVerify(userId, requestDto); + try { + User entity = findUserVerify(userId, requestDto); - entity.updatePassword(passwordEncoder.encode(requestDto.getNewPassword())); // 비밀번호 수정 + entity.updatePassword(passwordEncoder.encode(requestDto.getNewPassword())); // 비밀번호 수정 + } catch (Exception e) { + e.printStackTrace(); + throw e; + } return true; } @@ -547,7 +551,12 @@ public class UserService extends AbstractService implements UserDetailsService { * @return User 사용자 엔티티 */ private User findUserVerify(String userId, UserVerifyRequestDto requestDto) { + if (userId == null || "".equals(userId)) { + throw new BusinessMessageException(getMessage("err.required.login")); + } + User user = null; + if ("password".equals(requestDto.getProvider())) { user = findUserVerifyPassword(userId, requestDto.getPassword()); } else { diff --git a/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/role/AuthorizationApiControllerTest.java b/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/role/AuthorizationApiControllerTest.java index cbf1653..fbfdfd1 100644 --- a/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/role/AuthorizationApiControllerTest.java +++ b/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/role/AuthorizationApiControllerTest.java @@ -218,7 +218,7 @@ class AuthorizationApiControllerTest { .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) // .andExpect(MockMvcResultMatchers.content().string("11")); - .andExpect(MockMvcResultMatchers.content().string("129")); // /src/test/resources/h2/data.sql 초기화 데이터의 마지막 순번 + 1 + .andExpect(MockMvcResultMatchers.content().string("130")); // /src/test/resources/h2/data.sql 초기화 데이터의 마지막 순번 + 1 deleteTestDatas(); } diff --git a/backend/user-service/src/test/resources/h2/data.sql b/backend/user-service/src/test/resources/h2/data.sql index c34640d..a27086d 100644 --- a/backend/user-service/src/test/resources/h2/data.sql +++ b/backend/user-service/src/test/resources/h2/data.sql @@ -26,7 +26,9 @@ INSERT INTO `authorization` (authorization_name,url_pattern_value,http_method_co ('예약지역 사용여부 토글','/reserve-item-service/api/v1/locations/?*/?*','PUT',125,'87638675-11fa-49e5-9bd1-d2524bf6fa45',now(),'87638675-11fa-49e5-9bd1-d2524bf6fa45',now()), ('사용자 정보 수정','/user-service/api/v1/users/info/?*','PUT',126,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()), ('사용자 회원탈퇴','/user-service/api/v1/users/leave','POST',127,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()), - ('사용자 삭제','/user-service/api/v1/users/delete/?*','DELETE',128,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()); + ('사용자 삭제','/user-service/api/v1/users/delete/?*','DELETE',128,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()), + ('사용자 삭제','/user-service/api/v1/users/social','POST',129,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()); + INSERT INTO `role` (role_id,role_name,role_content,sort_seq,created_date) VALUES ('ROLE_ADMIN','시스템 관리자','시스템 관리자 권한',101,'2021-10-20 13:39:15'), @@ -34,5 +36,58 @@ INSERT INTO `role` (role_id,role_name,role_content,sort_seq,created_date) VALUES ('ROLE_EMPLOYEE','내부 사용자','내부 사용자 권한',102,'2021-10-20 13:39:15'), ('ROLE_USER','일반 사용자','일반 사용자 권한',103,'2021-10-20 13:39:15'); -INSERT INTO role_authorization (role_id,authorization_no,created_by,created_date) -select 'ROLE_ADMIN', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`; +INSERT INTO role_authorization (role_id,authorization_no,created_by,created_date) +select 'ROLE_ADMIN', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` + +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/?*' and http_method_code = 'GET' +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/token/refresh' and http_method_code = 'GET' +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/authorizations/check' and http_method_code = 'GET' +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/exists' and http_method_code = 'POST' +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/password/update' and http_method_code = 'PUT' +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/password/match' and http_method_code = 'POST' +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/info/?*' and http_method_code = 'PUT' +union all +select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/leave' and http_method_code = 'POST' + +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/?*' and http_method_code = 'GET' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/token/refresh' and http_method_code = 'GET' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/authorizations/check' and http_method_code = 'GET' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/exists' and http_method_code = 'POST' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/join' and http_method_code = 'POST' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/password/find' and http_method_code = 'POST' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/password/valid/?*' and http_method_code = 'GET' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/password/change' and http_method_code = 'PUT' +union all +select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization` +where url_pattern_value = '/user-service/api/v1/users/social' and http_method_code = 'POST'; From e83b77fb9863da9cead445d94190c65c660912ab Mon Sep 17 00:00:00 2001 From: jooho Date: Fri, 29 Oct 2021 15:41:00 +0900 Subject: [PATCH 06/11] unit test --- .../api/user/UserApiControllerTest.java | 664 ++++++++++++++++++ 1 file changed, 664 insertions(+) create mode 100644 backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/user/UserApiControllerTest.java diff --git a/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/user/UserApiControllerTest.java b/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/user/UserApiControllerTest.java new file mode 100644 index 0000000..3036ca1 --- /dev/null +++ b/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/user/UserApiControllerTest.java @@ -0,0 +1,664 @@ +package org.egovframe.cloud.userservice.api.user; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.egovframe.cloud.common.domain.Role; +import org.egovframe.cloud.userservice.api.user.dto.UserResponseDto; +import org.egovframe.cloud.userservice.api.user.dto.UserSaveRequestDto; +import org.egovframe.cloud.userservice.api.user.dto.UserUpdateRequestDto; +import org.egovframe.cloud.userservice.domain.user.User; +import org.egovframe.cloud.userservice.domain.user.UserRepository; +import org.egovframe.cloud.userservice.domain.user.UserStateCode; +import org.egovframe.cloud.userservice.service.user.UserService; +import org.json.JSONObject; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClientException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.filter.CharacterEncodingFilter; + +import java.util.*; + +import static org.assertj.core.api.Assertions.assertThat; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@EnableConfigurationProperties +@TestPropertySource(properties = {"spring.config.location=classpath:application-test.yml"}) +@ActiveProfiles(profiles = "test") +class UserApiControllerTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserService userService; + + @Autowired + private TestRestTemplate restTemplate; + + // private static final String USER_SERVICE_URL = "http://localhost:8000/user-service"; + private static final String TEST_COM = "@test.com"; + private static final String TEST_EMAIL = System.currentTimeMillis() + TEST_COM; + private static final String TEST_PASSWORD = "test1234!"; + + /** + * API 경로 + */ + private static final String URL = "/api/v1/users"; + + /** + * WebApplicationContext + */ + @Autowired + private WebApplicationContext context; + + /** + * MockMvc + */ + private MockMvc mvc; + + /** + * ObjectMapper + */ + @Autowired + private ObjectMapper objectMapper; + + /** + * 테스트 데이터 + */ + private List datas = new ArrayList<>(); + private final Integer GIVEN_DATA_COUNT = 10; + private final String USER_NAME_PREFIX = "USER"; + private final String TOKEN = "1234567890"; + private final String DECRYPTED_PASSWORD = "test1234!"; + private final String ENCRYPTED_PASSWORD = "$2a$10$Xf9rt9ziTa3AXCuxG2TTruCC0RKCG62ukI6cHrptHnTMgCrviC8j."; + + /** + * 테스트 시작 전 수행 + */ + @BeforeEach + void setUp() { + mvc = MockMvcBuilders.webAppContextSetup(context) + .addFilter(new CharacterEncodingFilter("UTF-8")) + .apply(SecurityMockMvcConfigurers.springSecurity()) + .build(); + } + + @Test + @Order(Integer.MAX_VALUE) + public void cleanup() { + // 테스트 후 데이터 삭제 + List users = userRepository.findByEmailContains("test.com"); + users.forEach(user -> userRepository.deleteById(user.getId())); + } + + @Test + @Order(Integer.MIN_VALUE) + public void 사용자_등록된다() { + // given + UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder() + .userName("사용자") + .email(TEST_EMAIL) + .password(TEST_PASSWORD) + .roleId(Role.USER.getKey()) + .userStateCode("01") + .build(); + userService.save(userSaveRequestDto); + + // when + UserResponseDto findUser = userService.findByEmail(TEST_EMAIL); + + // then + assertThat(findUser.getEmail()).isEqualTo(TEST_EMAIL); + } + + @Test + @Order(2) + public void 사용자_수정된다() { + // given + UserResponseDto findUser = userService.findByEmail(TEST_EMAIL); + UserUpdateRequestDto userUpdateRequestDto = UserUpdateRequestDto.builder() + .userName("사용자수정") + .email(TEST_EMAIL) + .roleId(Role.USER.getKey()) + .userStateCode("01") + .build(); + + // when + userService.update(findUser.getUserId(), userUpdateRequestDto); + UserResponseDto updatedUser = userService.findByEmail(TEST_EMAIL); + + // then + assertThat(updatedUser.getUserName()).isEqualTo("사용자수정"); + } + + @Test + public void 사용자_등록오류() { + // given + UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder() + .userName("사용자") + .email("email") + .password("test") + .build(); + + String url = "/api/v1/users"; + + RestClientException restClientException = Assertions.assertThrows(RestClientException.class, () -> { + restTemplate.postForEntity(url, userSaveRequestDto, Long.class); + }); + System.out.println("restClientException.getMessage() = " + restClientException.getMessage()); + } + + @Test + public void 사용자_로그인된다() throws Exception { + // given + JSONObject loginJson = new JSONObject(); + loginJson.put("email", TEST_EMAIL); + loginJson.put("password", TEST_PASSWORD); + + String url = "/login"; + + ResponseEntity responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class); + responseEntity.getHeaders().entrySet().forEach(System.out::println); + assertThat(responseEntity.getHeaders().containsKey("access-token")).isTrue(); + } + + @Test + public void 사용자_로그인_오류발생한다() throws Exception { + // given + JSONObject loginJson = new JSONObject(); + loginJson.put("email", TEST_EMAIL); + loginJson.put("password", "test"); + + String url = "/login"; + + ResponseEntity responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class); + System.out.println("responseEntity = " + responseEntity); + assertThat(responseEntity.getHeaders().containsKey("access-token")).isFalse(); + } + + /** + * 사용자 페이지 목록 조회 테스트 + */ + @Test + @WithMockUser(roles = "ADMIN") + void 사용자_페이지_목록_조회() throws Exception { + // given + insertUsers(); + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("keywordType", "userName"); + params.add("keyword", USER_NAME_PREFIX); + params.add("page", "0"); + params.add("size", "10"); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get(URL) + .params(params)); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.numberOfElements").value(GIVEN_DATA_COUNT)) + .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].userName").value(USER_NAME_PREFIX + "1")); + + deleteUsers(); + } + + /** + * 사용자 상세 조회 테스트 + */ + @Test + @WithMockUser(roles = "ADMIN") + void 사용자_상세_조회() throws Exception { + // given + User entity = insertUser(); + + final String userId = entity.getUserId(); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get(URL + "/" + userId)); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.userId").value(userId)) + .andExpect(MockMvcResultMatchers.jsonPath("$.userName").value(entity.getUserName())) + .andExpect(MockMvcResultMatchers.jsonPath("$.email").value(entity.getEmail())) + .andExpect(MockMvcResultMatchers.jsonPath("$.roleId").value(entity.getRole().getKey())) + .andExpect(MockMvcResultMatchers.jsonPath("$.userStateCode").value(entity.getUserStateCode())); + + deleteUser(entity.getId()); + } + + /** + * 사용자 소셜 정보 조회 테스트 + * 많이 시도하면 구글에서 블락 할수도.. + */ + @Test + void 사용자_소셜_정보_조회_테스트() throws Exception { + // given + Map params = new HashMap<>(); + params.put("provider", "google"); + params.put("token", TOKEN); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/social") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().is(HttpStatus.BAD_REQUEST.value())); // org.egovframe.cloud.common.exception.BusinessMessageException: 공급사에서 회원 정보를 확인할 수 없습니다. + } + + /** + * 이메일 중복 확인 테스트 + */ + @Test + void 이메일_중복_확인_테스트() throws Exception { + // given + User entity = insertUser(); + + Map params = new HashMap<>(); + params.put("email", "1" + TEST_COM); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/exists") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("true")); + + deleteUser(entity.getId()); + } + + /** + * 사용자 회원 가입 테스트 + */ + @Test + void 사용자_회원_가입_테스트() throws Exception { + // given + final String email = "test_join" + TEST_COM; + + Map params = new HashMap<>(); + params.put("userName", USER_NAME_PREFIX + "1"); + params.put("email", email); + params.put("password", DECRYPTED_PASSWORD); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/join") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("true")); + +// userRepository.findByEmail("test_join" + TEST_COM).ifPresent(u -> deleteUser(u.getId())); + + User user = userRepository.findByEmail(email).orElseThrow(() -> new UsernameNotFoundException(String.format("[%s]사용자가 없습니다.", email))); + assertThat(user.getUserName()).isEqualTo(USER_NAME_PREFIX + "1"); + assertThat(user.getEmail()).isEqualTo(email); + + deleteUser(user.getId()); + } + + /** + * 사용자 비밀번호 찾기 테스트 + */ + @Test + void 사용자_비밀번호_찾기_테스트() throws Exception { + // given + Map userData = new HashMap<>(); + userData.put("email", "give928@gmail.com"); + + User user = insertUser(userData); + + Map params = new HashMap<>(); + params.put("userName", user.getUserName()); + params.put("emailAddr", user.getEmail()); + params.put("mainUrl", "http://localhost:4000"); + params.put("changePasswordUrl", "http://localhost:4000/user/password/change"); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/password/find") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("true")); // 이메일 수신 확인 + + deleteUser(user.getId()); + } + + /** + * 사용자 비밀번호 찾기 유효성 확인 테스트 + */ + @Test + void 사용자_비밀번호_찾기_유효성_확인_테스트() throws Exception { + // given + final String token = TOKEN; + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get(URL + "/password/valid/" + token) + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8")); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("false")); + } + + /** + * 사용자 비밀번호 찾기 변경 테스트 + */ + @Test + void 사용자_비밀번호_찾기_변경_테스트() throws Exception { + // given + Map params = new HashMap<>(); + params.put("tokenValue", TOKEN); + params.put("password", DECRYPTED_PASSWORD); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.put(URL + "/password/change") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().is(HttpStatus.BAD_REQUEST.value())); // org.egovframe.cloud.common.exception.BusinessMessageException: 인증시간이 만료되었습니다. 처음부터 다시 진행해주시기 바랍니다. + } + + /** + * 사용자 비밀번호 변경 테스트 + */ + @Test + @WithMockUser(roles = "USER", username = "test-user") + void 사용자_비밀번호_변경_테스트() throws Exception { + // given + final String userId = "test-user"; + + Map userData = new HashMap<>(); + userData.put("userId", userId); + + User entity = insertUser(userData); + + final Long userNo = entity.getId(); + + Map params = new HashMap<>(); + params.put("provider", "password"); + params.put("password", DECRYPTED_PASSWORD); + params.put("newPassword", "P@ssw0rd1"); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.put(URL + "/password/update") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("true")); + + User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo))); + assertThat(user.getEncryptedPassword()).isNotEqualTo(entity.getEncryptedPassword()); + + deleteUser(entity.getId()); + } + + /** + * 사용자 비밀번호 확인 테스트 + */ + @Test + @WithMockUser(roles = "USER", username = "test-user") + void 사용자_비밀번호_확인_테스트() throws Exception { + // given + final String userId = "test-user"; + + Map userData = new HashMap<>(); + userData.put("userId", userId); + + User entity = insertUser(userData); + + Map params = new HashMap<>(); + params.put("password", DECRYPTED_PASSWORD); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/password/match") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("true")); + + deleteUser(entity.getId()); + } + + /** + * 사용자 회원정보 변경 테스트 + */ + @Test + @WithMockUser(roles = "USER", username = "test-user") + void 사용자_회원정보_변경_테스트() throws Exception { + // given + final String userId = "test-user"; + + Map userData = new HashMap<>(); + userData.put("userId", userId); + + User entity = insertUser(userData); + + final Long userNo = entity.getId(); + final String userName = "TEST-USER"; + final String email = "2" + TEST_COM; + + Map params = new HashMap<>(); + params.put("provider", "password"); + params.put("password", DECRYPTED_PASSWORD); + params.put("userName", userName); + params.put("email", email); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.put(URL + "/info/" + userId) + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string(userId)); + + User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo))); + assertThat(user.getUserName()).isEqualTo(userName); + assertThat(user.getEmail()).isEqualTo(email); + + deleteUser(entity.getId()); + } + + /** + * 사용자 회원 탈퇴 테스트 + */ + @Test + @WithMockUser(roles = "USER", username = "test-user") + void 사용자_회원_탈퇴_테스트() throws Exception { + // given + final String userId = "test-user"; + + Map userData = new HashMap<>(); + userData.put("userId", userId); + + User entity = insertUser(userData); + + final Long userNo = entity.getId(); + + Map params = new HashMap<>(); + params.put("provider", "password"); + params.put("password", DECRYPTED_PASSWORD); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/leave") + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8") + .content(objectMapper.writeValueAsString(params))); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("true")); + + User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo))); + assertThat(user.getUserStateCode()).isEqualTo(UserStateCode.LEAVE.getKey()); + + deleteUser(entity.getId()); + } + + /** + * 사용자 삭제 테스트 + */ + @Test + @WithMockUser(roles = "ADMIN") + void 사용자_삭제_테스트() throws Exception { + // given + final String userId = "test-user"; + + Map userData = new HashMap<>(); + userData.put("userId", userId); + + User entity = insertUser(userData); + + final Long userNo = entity.getId(); + + // when + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.delete(URL + "/delete/" + userId) + .accept(MediaType.APPLICATION_JSON) + .contentType("application/json;charset=UTF-8")); + + // then + resultActions + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().string("true")); + + User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo))); + assertThat(user.getUserStateCode()).isEqualTo(UserStateCode.DELETE.getKey()); + + deleteUser(entity.getId()); + } + + /** + * 테스트 데이터 등록 + */ + private void insertUsers() { + for (int i = 1; i <= GIVEN_DATA_COUNT; i++) { + datas.add(userRepository.save(User.builder() + .userId(UUID.randomUUID().toString()) + .encryptedPassword(ENCRYPTED_PASSWORD) + .userName(USER_NAME_PREFIX + i) + .email(i + TEST_COM) + .role(Role.USER) + .userStateCode(UserStateCode.NORMAL.getKey()) + .build())); + } + } + + /** + * 테스트 데이터 삭제 + */ + private void deleteUsers() { + if (datas != null) { + if (!datas.isEmpty()) userRepository.deleteAll(datas); + + datas.clear(); + } + } + + /** + * 테스트 데이터 단건 등록 + * + * @return User 사용자 엔티티 + */ + private User insertUser() { + Map userData = new HashMap<>(); + userData.put("email", "1" + TEST_COM); + + return insertUser(userData); + } + private User insertUser(Map userData) { + return userRepository.save(User.builder() + .userId(userData.get("userId") != null ? (String) userData.get("userId") : UUID.randomUUID().toString()) + .encryptedPassword(ENCRYPTED_PASSWORD) + .userName(USER_NAME_PREFIX + "1") + .email(userData.get("email") != null ? (String) userData.get("email") : "1" + TEST_COM) + .role(Role.USER) + .userStateCode(UserStateCode.NORMAL.getKey()) + .build()); + } + + /** + * 테스트 데이터 단건 삭제 + */ + private void deleteUser(Long userNo) { + userRepository.deleteById(userNo); + } + + /** + * 테스트 데이터 단건 조회 + * + * @param userNo 사용자 번호 + * @return Optional 사용자 + */ + private Optional selectUser(Long userNo) { + return userRepository.findById(userNo); + } + +} \ No newline at end of file From b3b9ea88d900c3bd0a303c818cb481de856245db Mon Sep 17 00:00:00 2001 From: jooho <71304361+give928@users.noreply.github.com> Date: Fri, 29 Oct 2021 15:42:07 +0900 Subject: [PATCH 07/11] move package --- .../api/UserApiControllerTest.java | 143 ------------------ 1 file changed, 143 deletions(-) delete mode 100644 backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/UserApiControllerTest.java diff --git a/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/UserApiControllerTest.java b/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/UserApiControllerTest.java deleted file mode 100644 index 5613f0b..0000000 --- a/backend/user-service/src/test/java/org/egovframe/cloud/userservice/api/UserApiControllerTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package org.egovframe.cloud.userservice.api; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; - -import org.egovframe.cloud.common.domain.Role; -import org.egovframe.cloud.userservice.api.user.dto.UserResponseDto; -import org.egovframe.cloud.userservice.api.user.dto.UserSaveRequestDto; -import org.egovframe.cloud.userservice.api.user.dto.UserUpdateRequestDto; -import org.egovframe.cloud.userservice.domain.user.User; -import org.egovframe.cloud.userservice.domain.user.UserRepository; -import org.egovframe.cloud.userservice.service.user.UserService; -import org.json.JSONObject; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.web.client.RestClientException; - -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@EnableConfigurationProperties -@TestPropertySource(properties = {"spring.config.location=classpath:application-test.yml"}) -@ActiveProfiles(profiles = "test") -class UserApiControllerTest { - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserService userService; - - @Autowired - private TestRestTemplate restTemplate; - -// private static final String USER_SERVICE_URL = "http://localhost:8000/user-service"; - private static final String TEST_COM = "@test.com"; - private static final String TEST_EMAIL = System.currentTimeMillis() + TEST_COM; - private static final String TEST_PASSWORD = "test1234!"; - - @Test - @Order(Integer.MAX_VALUE) - public void cleanup() throws Exception { - // 테스트 후 데이터 삭제 - List users = userRepository.findByEmailContains("test.com"); - users.forEach(user -> userRepository.deleteById(user.getId())); - } - - @Test - @Order(Integer.MIN_VALUE) - public void 사용자_등록된다() throws Exception { - // given - UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder() - .userName("사용자") - .email(TEST_EMAIL) - .password(TEST_PASSWORD) - .roleId(Role.USER.getKey()) - .userStateCode("01") - .build(); - userService.save(userSaveRequestDto); - - // when - UserResponseDto findUser = userService.findByEmail(TEST_EMAIL); - - // then - assertThat(findUser.getEmail()).isEqualTo(TEST_EMAIL); - } - - @Test - @Order(2) - public void 사용자_수정된다() throws Exception { - // given - UserResponseDto findUser = userService.findByEmail(TEST_EMAIL); - UserUpdateRequestDto userUpdateRequestDto = UserUpdateRequestDto.builder() - .userName("사용자수정") - .email(TEST_EMAIL) - .roleId(Role.USER.getKey()) - .userStateCode("01") - .build(); - - // when - userService.update(findUser.getUserId(), userUpdateRequestDto); - UserResponseDto updatedUser = userService.findByEmail(TEST_EMAIL); - - // then - assertThat(updatedUser.getUserName()).isEqualTo("사용자수정"); - } - - @Test - public void 사용자_등록오류() throws Exception { - // given - UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder() - .userName("사용자") - .email("email") - .password("test") - .build(); - - String url = "/api/v1/users"; - - RestClientException restClientException = Assertions.assertThrows(RestClientException.class, () -> { - restTemplate.postForEntity(url, userSaveRequestDto, Long.class); - }); - System.out.println("restClientException.getMessage() = " + restClientException.getMessage()); - } - - @Test - public void 사용자_로그인된다() throws Exception { - // given - JSONObject loginJson = new JSONObject(); - loginJson.put("email", TEST_EMAIL); - loginJson.put("password", TEST_PASSWORD); - - String url = "/login"; - - ResponseEntity responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class); - responseEntity.getHeaders().entrySet().forEach(System.out::println); - assertThat(responseEntity.getHeaders().containsKey("access-token")).isTrue(); - } - - @Test - public void 사용자_로그인_오류발생한다() throws Exception { - // given - JSONObject loginJson = new JSONObject(); - loginJson.put("email", TEST_EMAIL); - loginJson.put("password", "test"); - - String url = "/login"; - - ResponseEntity responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class); - System.out.println("responseEntity = " + responseEntity); - assertThat(responseEntity.getHeaders().containsKey("access-token")).isFalse(); - } - -} \ No newline at end of file From fb1a95ebb1270ec5726024d5042153471972b000 Mon Sep 17 00:00:00 2001 From: jooho <71304361+give928@users.noreply.github.com> Date: Fri, 29 Oct 2021 15:54:19 +0900 Subject: [PATCH 08/11] unit test --- backend/user-service/src/test/resources/h2/data.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/user-service/src/test/resources/h2/data.sql b/backend/user-service/src/test/resources/h2/data.sql index a27086d..fc19558 100644 --- a/backend/user-service/src/test/resources/h2/data.sql +++ b/backend/user-service/src/test/resources/h2/data.sql @@ -27,7 +27,7 @@ INSERT INTO `authorization` (authorization_name,url_pattern_value,http_method_co ('사용자 정보 수정','/user-service/api/v1/users/info/?*','PUT',126,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()), ('사용자 회원탈퇴','/user-service/api/v1/users/leave','POST',127,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()), ('사용자 삭제','/user-service/api/v1/users/delete/?*','DELETE',128,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()), - ('사용자 삭제','/user-service/api/v1/users/social','POST',129,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()); + ('사용자 소셜 정보 조회,'/user-service/api/v1/users/social','POST',129,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()); INSERT INTO `role` (role_id,role_name,role_content,sort_seq,created_date) VALUES From 0fbecedef435d16400a436cb4efb6d4470662f86 Mon Sep 17 00:00:00 2001 From: shinmj Date: Fri, 29 Oct 2021 16:23:23 +0900 Subject: [PATCH 09/11] =?UTF-8?q?=F0=9F=90=9B=20=20fixed=20reservation=20s?= =?UTF-8?q?ervice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/reserve/ReserveApiController.java | 2 +- .../domain/reserve/Reserve.java | 5 ++- .../domain/reserve/ReserveRepositoryImpl.java | 5 +++ .../service/reserve/ReserveService.java | 40 +++++++++++++------ .../api/ReserveApiControllerTest.java | 39 ++++++++++++++++++ .../api/ReserveApiController.java | 3 +- .../domain/ReserveRepositoryImpl.java | 1 + .../service/ReserveService.java | 18 ++++++++- .../api/ReserveApiControllerTest.java | 1 + .../src/components/Reserve/ReserveEdit.tsx | 40 ++++++++++++++----- 10 files changed, 126 insertions(+), 28 deletions(-) diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java index 0e3c9c4..2885120 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java @@ -168,7 +168,7 @@ public class ReserveApiController { public Mono countInventory(@PathVariable Long reserveItemId, @RequestParam(name = "startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, @RequestParam(name = "endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) { - return reserveService.countInventory(reserveItemId,startDate.atTime(1,1), endDate.atTime(1,1)); + return reserveService.countInventory(reserveItemId,startDate.atTime(0,0), endDate.atTime(23, 59)); } } diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java index 66076b4..c258e9a 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java @@ -197,7 +197,10 @@ public class Reserve extends BaseEntity { * @return */ public Reserve conversionReserveQty() { - this.reserveQty = (this.reserveQty * -1); + if (this.reserveQty != null) { + this.reserveQty = (this.reserveQty * -1); + } + return this; } } diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java index de835ad..21fc308 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java @@ -2,7 +2,9 @@ package org.egovframe.cloud.reservechecksevice.domain.reserve; import static org.springframework.data.relational.core.query.Criteria.*; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.ArrayList; import java.util.List; @@ -174,6 +176,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{ .matching(Query.query(where("reserve_item_id").is(reserveItemId) .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .all(); } @@ -194,6 +197,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{ .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) .and("reserve_id").not(reserveId) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .all(); } @@ -214,6 +218,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{ .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) .and("reserve_id").not(reserveId) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .count(); } diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java index 5f6a236..ee29be4 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java @@ -1,5 +1,6 @@ package org.egovframe.cloud.reservechecksevice.service.reserve; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; @@ -534,17 +535,16 @@ public class ReserveService extends ReactiveAbstractService { if (!Category.EDUCATION.isEquals(reserve1.getCategoryId())) { return Mono.just(reserve1); } -// return reserveItemServiceClient.updateInventory(reserve.getReserveItemId(), reserve.getReserveQty()) -// .transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME))) -// .onErrorResume(throwable -> Mono.just(false)) -// .flatMap(isSuccess -> { -// if (isSuccess) { -// return Mono.just(reserve); -// } -// //재고 업데이트에 실패했습니다. -// return Mono.error(new BusinessMessageException(getMessage("msg.inventory_failed"))); -// }); - return null; + return reserveItemServiceClient.updateInventory(reserve.getReserveItemId(), reserve.getReserveQty()) + .transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME))) + .onErrorResume(throwable -> Mono.just(false)) + .flatMap(isSuccess -> { + if (isSuccess) { + return Mono.just(reserve); + } + //재고 업데이트에 실패했습니다. + return Mono.error(new BusinessMessageException(getMessage("msg.inventory_failed"))); + }); }); } @@ -561,6 +561,7 @@ public class ReserveService extends ReactiveAbstractService { .transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME))) .onErrorResume(throwable -> Mono.empty()) .zipWith(getMaxByReserveDate(reserveItemId, startDate, endDate)) + .log("countinventory") .flatMap(tuple -> Mono.just(tuple.getT1().getTotalQty() - tuple.getT2())); } @@ -607,20 +608,33 @@ public class ReserveService extends ReactiveAbstractService { } long between = ChronoUnit.DAYS.between(startDate, endDate); + + if (between == 0) { + return reserveFlux.map(reserve -> { + if (startDate.isAfter(reserve.getReserveStartDate()) + || startDate.isBefore(reserve.getReserveEndDate()) + || startDate.isEqual(reserve.getReserveStartDate()) || startDate.isEqual(reserve.getReserveEndDate())) { + return reserve.getReserveQty(); + } + return 0; + }).reduce(0, (x1, x2) -> x1 + x2); + } + return Flux.fromStream(IntStream.iterate(0, i -> i + 1) .limit(between) .mapToObj(i -> startDate.plusDays(i))) .flatMap(localDateTime -> reserveFlux.map(findReserve -> { if (localDateTime.isAfter(findReserve.getReserveStartDate()) - || localDateTime.isBefore(findReserve.getReserveEndDate())) { + || localDateTime.isBefore(findReserve.getReserveEndDate()) + || localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate())) { return findReserve.getReserveQty(); } return 0; }).reduce(0, (x1, x2) -> x1 + x2)) .groupBy(integer -> integer) .flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2)) - .last(); + .last(0); } } diff --git a/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java b/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java index 2b5471c..2282eb5 100644 --- a/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java +++ b/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java @@ -34,6 +34,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.reactive.server.WebTestClient; @@ -58,6 +59,9 @@ public class ReserveApiControllerTest { @Autowired private WebTestClient webTestClient; + @Autowired + private R2dbcEntityTemplate entityTemplate; + private static final String API_URL = "/api/v1/reserves"; private UserResponseDto user; @@ -527,4 +531,39 @@ public class ReserveApiControllerTest { ; } + @Test + public void 물품재고조회_성공() throws Exception { + + BDDMockito.when(reserveItemServiceClient.findById(ArgumentMatchers.anyLong())) + .thenReturn(Mono.just(ReserveItemResponseDto.builder().reserveItem(reserveItem).build())); + + Reserve inventoryreserve = Reserve.builder() + .reserveId("1") + .reserveItemId(reserveItem.getReserveItemId()) + .reserveQty(50) + .reservePurposeContent("test") + .reserveStatusId("request") + .reserveStartDate(LocalDateTime.of(2021, 9, 9, 0, 0)) + .reserveEndDate(LocalDateTime.of(2021, 9, 9, 0, 0)) + .userId(user.getUserId()) + .userEmail("user@email.com") + .userContactNo("contact") + .build(); + inventoryreserve.setReserveItem(reserveItem); + inventoryreserve.setUser(user); + Reserve saved = reserveRepository.insert(inventoryreserve).block(); + assertNotNull(saved); + + Integer responseBody = webTestClient.get() + .uri("/api/v1/reserves/" + reserveItem.getReserveItemId() + + "/inventories?startDate=2021-09-09&endDate=2021-09-09") + .exchange() + .expectStatus().isOk() + .expectBody(Integer.class) + .returnResult().getResponseBody(); + + assertThat(responseBody).isEqualTo(50); + + } + } diff --git a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java index 7782e1f..7a0ffdc 100644 --- a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java +++ b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java @@ -84,7 +84,8 @@ public class ReserveApiController { @PostMapping("/api/v1/requests") @ResponseStatus(HttpStatus.CREATED) public Mono save(@RequestBody Mono saveRequestDtoMono) { - return saveRequestDtoMono.flatMap(saveRequestDto -> { + return saveRequestDtoMono + .flatMap(saveRequestDto -> { if (Category.EDUCATION.isEquals(saveRequestDto.getCategoryId())) { return reserveService.saveForEvent(saveRequestDto); } diff --git a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java index 99b6a0f..0e919d2 100644 --- a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java +++ b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java @@ -78,6 +78,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom { .matching(Query.query(where("reserve_item_id").is(reserveItemId) .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .count(); } diff --git a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java index e1cf582..76274f9 100644 --- a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java +++ b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java @@ -278,20 +278,34 @@ public class ReserveService extends ReactiveAbstractService { } long between = ChronoUnit.DAYS.between(startDate, endDate); + + if (between == 0) { + return reserveFlux.map(reserve -> { + if (startDate.isAfter(reserve.getReserveStartDate()) + || startDate.isBefore(reserve.getReserveEndDate()) + || startDate.isEqual(reserve.getReserveStartDate()) || startDate.isEqual(reserve.getReserveEndDate())) { + return reserve.getReserveQty(); + } + return 0; + }).reduce(0, (x1, x2) -> x1 + x2); + } + return Flux.fromStream(IntStream.iterate(0, i -> i + 1) .limit(between) .mapToObj(i -> startDate.plusDays(i))) .flatMap(localDateTime -> reserveFlux.map(findReserve -> { if (localDateTime.isAfter(findReserve.getReserveStartDate()) - || localDateTime.isBefore(findReserve.getReserveEndDate())) { + || localDateTime.isBefore(findReserve.getReserveEndDate()) + || localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate()) + ) { return findReserve.getReserveQty(); } return 0; }).reduce(0, (x1, x2) -> x1 + x2)) .groupBy(integer -> integer) .flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2)) - .last(); + .last(0); } /** diff --git a/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java b/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java index 935a53c..a7ae064 100644 --- a/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java +++ b/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java @@ -3,6 +3,7 @@ package org.egovframe.cloud.reserverequestservice.api; import static org.assertj.core.api.Assertions.*; import java.time.LocalDateTime; +import java.time.ZoneId; import org.egovframe.cloud.common.domain.Role; import org.egovframe.cloud.reserverequestservice.api.dto.ReserveResponseDto; diff --git a/frontend/portal/src/components/Reserve/ReserveEdit.tsx b/frontend/portal/src/components/Reserve/ReserveEdit.tsx index c9dc544..def2b79 100644 --- a/frontend/portal/src/components/Reserve/ReserveEdit.tsx +++ b/frontend/portal/src/components/Reserve/ReserveEdit.tsx @@ -66,7 +66,9 @@ const ReserveEdit = (props: ReserveEditProps) => { reserveItem.inventoryQty || null, ) - const [reserve, setReserve] = useState(undefined) + const [reserve, setReserve] = useState< + { reserve: IReserve; category: string } | undefined + >(undefined) const [isEvent, setEvents] = useState(false) const methods = useForm() @@ -129,14 +131,20 @@ const ReserveEdit = (props: ReserveEditProps) => { const successCallback = useCallback(() => { setComplete({ done: true, - reserveId: reserve.reserveId, + reserveId: reserve.reserve.reserveId, }) setLoading(false) }, [reserve]) + useEffect(() => { + if (reserve && reserve.category !== 'education') { + successCallback() + } + }, [reserve]) + const errorCallback = useCallback( (errors: any, attachmentCode: string) => { - setErrorState({ errors }) + setErrorState(errors) setLoading(false) if (attachmentCode) { uploadRef.current.rollback(attachmentCode) @@ -152,7 +160,10 @@ const ReserveEdit = (props: ReserveEditProps) => { try { const result = await reserveService.createAudit(formData) if (result) { - successCallback() + setReserve({ + reserve: result.data, + category: formData.categoryId, + }) } else { errorCallback( { message: DEFAULT_ERROR_MESSAGE }, @@ -160,7 +171,7 @@ const ReserveEdit = (props: ReserveEditProps) => { ) } } catch (error) { - errorCallback(error, formData.attachmentCode) + errorCallback({ error }, formData.attachmentCode) } } @@ -171,11 +182,12 @@ const ReserveEdit = (props: ReserveEditProps) => { try { const result = await reserveService.create(formData) if (result) { - setReserve(result.data) + setReserve({ + reserve: result.data, + category: formData.categoryId, + }) if (formData.categoryId === 'education') { setEvents(true) - } else { - successCallback() } } else { errorCallback( @@ -184,7 +196,7 @@ const ReserveEdit = (props: ReserveEditProps) => { ) } } catch (error) { - errorCallback(error, formData.attachmentCode) + errorCallback({ error }, formData.attachmentCode) } } @@ -221,6 +233,14 @@ const ReserveEdit = (props: ReserveEditProps) => { draft.attachmentCode = attachmentCode draft.userId = user.userId draft.userEmail = user.email + draft.reserveStartDate = convertStringToDateFormat( + draft.reserveStartDate, + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + ) + draft.reserveEndDate = convertStringToDateFormat( + draft.reserveEndDate, + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + ) }) if ( @@ -372,7 +392,7 @@ const ReserveEdit = (props: ReserveEditProps) => { {reserve && isEvent && ( From b6ae0c38a93539cdd8a0fe11fe57e9610595f684 Mon Sep 17 00:00:00 2001 From: shinmj Date: Fri, 29 Oct 2021 16:39:43 +0900 Subject: [PATCH 10/11] =?UTF-8?q?=E2=9E=95=20add=20deps=20sleuth=20&=20zip?= =?UTF-8?q?kin=20&=20logstash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/reserve-check-service/build.gradle | 4 +++ .../src/main/resources/logback-spring.xml | 34 +++++++++++++++++++ backend/reserve-item-service/build.gradle | 4 +++ .../src/main/resources/logback-spring.xml | 34 +++++++++++++++++++ backend/reserve-request-service/build.gradle | 4 +++ .../src/main/resources/logback-spring.xml | 34 +++++++++++++++++++ 6 files changed, 114 insertions(+) create mode 100644 backend/reserve-check-service/src/main/resources/logback-spring.xml create mode 100644 backend/reserve-item-service/src/main/resources/logback-spring.xml create mode 100644 backend/reserve-request-service/src/main/resources/logback-spring.xml diff --git a/backend/reserve-check-service/build.gradle b/backend/reserve-check-service/build.gradle index 5e05b18..1b3cd4c 100644 --- a/backend/reserve-check-service/build.gradle +++ b/backend/reserve-check-service/build.gradle @@ -41,6 +41,10 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j' implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0' + implementation 'org.springframework.cloud:spring-cloud-starter-sleuth' + implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin' + implementation 'net.logstash.logback:logstash-logback-encoder:6.6' // logstash logback + //messaging implementation 'org.springframework.cloud:spring-cloud-stream' implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit' diff --git a/backend/reserve-check-service/src/main/resources/logback-spring.xml b/backend/reserve-check-service/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..5f1cce1 --- /dev/null +++ b/backend/reserve-check-service/src/main/resources/logback-spring.xml @@ -0,0 +1,34 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger - %m%n + + + + + + + + + + + + + + + + + ${destination} + + {"app.name":"${app_name}"} + + + + + + + + + \ No newline at end of file diff --git a/backend/reserve-item-service/build.gradle b/backend/reserve-item-service/build.gradle index be6c424..2d4ca40 100644 --- a/backend/reserve-item-service/build.gradle +++ b/backend/reserve-item-service/build.gradle @@ -41,6 +41,10 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j' implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0' + implementation 'org.springframework.cloud:spring-cloud-starter-sleuth' + implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin' + implementation 'net.logstash.logback:logstash-logback-encoder:6.6' // logstash logback + implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE' diff --git a/backend/reserve-item-service/src/main/resources/logback-spring.xml b/backend/reserve-item-service/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c70f671 --- /dev/null +++ b/backend/reserve-item-service/src/main/resources/logback-spring.xml @@ -0,0 +1,34 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger - %m%n + + + + + + + + + + + + + + + + + ${destination} + + {"app.name":"${app_name}"} + + + + + + + + + \ No newline at end of file diff --git a/backend/reserve-request-service/build.gradle b/backend/reserve-request-service/build.gradle index 6da21ab..f77cc4d 100644 --- a/backend/reserve-request-service/build.gradle +++ b/backend/reserve-request-service/build.gradle @@ -42,6 +42,10 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j' implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0' + implementation 'org.springframework.cloud:spring-cloud-starter-sleuth' + implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin' + implementation 'net.logstash.logback:logstash-logback-encoder:6.6' // logstash logback + //messaging implementation 'org.springframework.cloud:spring-cloud-stream' implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit' diff --git a/backend/reserve-request-service/src/main/resources/logback-spring.xml b/backend/reserve-request-service/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..6d13950 --- /dev/null +++ b/backend/reserve-request-service/src/main/resources/logback-spring.xml @@ -0,0 +1,34 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger - %m%n + + + + + + + + + + + + + + + + + ${destination} + + {"app.name":"${app_name}"} + + + + + + + + + \ No newline at end of file From fad19050784498f466098bf54d9bdb2f6409c027 Mon Sep 17 00:00:00 2001 From: shinmj Date: Fri, 29 Oct 2021 17:39:33 +0900 Subject: [PATCH 11/11] =?UTF-8?q?=F0=9F=90=9B=20404=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EB=9D=BC=EC=9A=B0=ED=8C=85=20=EC=A1=B0=EA=B1=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/portal/src/components/App/index.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/portal/src/components/App/index.tsx b/frontend/portal/src/components/App/index.tsx index 570da3d..9c2171b 100644 --- a/frontend/portal/src/components/App/index.tsx +++ b/frontend/portal/src/components/App/index.tsx @@ -95,7 +95,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => { ) useEffect(() => { - if (mounted && flatMenus) { + if (mounted && data?.length > 0 && flatMenus?.length > 0) { let path = router.asPath.indexOf('?') === -1 ? router.asPath @@ -110,7 +110,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => { } // 권한 없는 페이지 대해 호출이 있으면 404로 redirect - if (!authPage && flatMenus.length > 0 && !current) { + if (!authPage && !current) { if (!PUBLIC_PAGES.includes(router.asPath)) { router.push('/404') } @@ -118,7 +118,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => { setCurrentMenus(current) } - }, [router, mounted, flatMenus]) + }, [router, mounted, flatMenus, data]) if (loading) { return @@ -128,6 +128,10 @@ const App = ({ component: Component, ...pageProps }: AppProps) => { return null } + if (data?.length <= 0 || flatMenus?.length <= 0) { + return + } + return errorPage || naverLoginCallbackPage ? (