From 8e3610ec266449ce2508a68ebb43312685550513 Mon Sep 17 00:00:00 2001 From: Youth <109585620+Youthhing@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:07:05 +0900 Subject: [PATCH] =?UTF-8?q?Feature:=20=ED=9A=8C=EC=9B=90=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=84=B1=EA=B3=B5=20=EC=8B=9C=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=20PK=20=EB=B0=98=ED=99=98=20=EB=B0=8F=20=ED=95=84=EC=88=98=20?= =?UTF-8?q?=EC=A0=95=EC=B1=85=20=EB=B0=98=ED=99=98=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 회원 가입 시 생성된 member_id 반환 * feat: 회원 가입 시 필요한 회원 정책 목록 반환 * refactor: 체크하지 않은 필수 정책 파라미터 변경 --- .../api/auth/controller/AuthController.java | 11 +++++++---- .../cotato/csquiz/api/auth/dto/JoinResponse.java | 15 +++++++++++++++ .../api/policy/controller/PolicyController.java | 10 +++++++++- .../csquiz/api/policy/dto/PoliciesResponse.java | 8 ++++++++ .../csquiz/common/config/SecurityConfig.java | 3 ++- .../config/filter/JwtAuthorizationFilter.java | 3 ++- .../csquiz/domain/auth/service/AuthService.java | 6 +++++- .../csquiz/domain/auth/service/PolicyService.java | 8 ++++++++ 8 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/cotato/csquiz/api/auth/dto/JoinResponse.java create mode 100644 src/main/java/org/cotato/csquiz/api/policy/dto/PoliciesResponse.java diff --git a/src/main/java/org/cotato/csquiz/api/auth/controller/AuthController.java b/src/main/java/org/cotato/csquiz/api/auth/controller/AuthController.java index ae8e37c0..b08bd83c 100644 --- a/src/main/java/org/cotato/csquiz/api/auth/controller/AuthController.java +++ b/src/main/java/org/cotato/csquiz/api/auth/controller/AuthController.java @@ -1,11 +1,14 @@ package org.cotato.csquiz.api.auth.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.cotato.csquiz.api.auth.dto.FindPasswordResponse; import org.cotato.csquiz.api.auth.dto.JoinRequest; +import org.cotato.csquiz.api.auth.dto.JoinResponse; import org.cotato.csquiz.api.auth.dto.LogoutRequest; import org.cotato.csquiz.api.auth.dto.ReissueResponse; import org.cotato.csquiz.api.auth.dto.SendEmailRequest; @@ -22,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j +@Tag(name = "인증 관련 API", description = "회원 인증 관련 API 모음") @RestController @RequiredArgsConstructor @RequestMapping("/v1/api/auth") @@ -29,11 +33,10 @@ public class AuthController { private final AuthService authService; + @Operation(summary = "회원 가입 API") @PostMapping("/join") - public ResponseEntity joinAuth(@RequestBody @Valid JoinRequest request) { - log.info("[회원 가입 컨트롤러]: {}, {}", request.email(), request.name()); - authService.createLoginInfo(request); - return ResponseEntity.status(HttpStatus.CREATED).build(); + public ResponseEntity joinAuth(@RequestBody @Valid JoinRequest request) { + return ResponseEntity.status(HttpStatus.CREATED).body(authService.createLoginInfo(request)); } @PostMapping("/reissue") diff --git a/src/main/java/org/cotato/csquiz/api/auth/dto/JoinResponse.java b/src/main/java/org/cotato/csquiz/api/auth/dto/JoinResponse.java new file mode 100644 index 00000000..342be9a8 --- /dev/null +++ b/src/main/java/org/cotato/csquiz/api/auth/dto/JoinResponse.java @@ -0,0 +1,15 @@ +package org.cotato.csquiz.api.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.cotato.csquiz.domain.auth.entity.Member; + +public record JoinResponse( + @Schema(description = "가입된 회원 PK") + Long memberId +) { + public static JoinResponse from(Member member) { + return new JoinResponse( + member.getId() + ); + } +} diff --git a/src/main/java/org/cotato/csquiz/api/policy/controller/PolicyController.java b/src/main/java/org/cotato/csquiz/api/policy/controller/PolicyController.java index d7d8701f..f80c6f96 100644 --- a/src/main/java/org/cotato/csquiz/api/policy/controller/PolicyController.java +++ b/src/main/java/org/cotato/csquiz/api/policy/controller/PolicyController.java @@ -6,8 +6,10 @@ import lombok.RequiredArgsConstructor; import org.cotato.csquiz.api.policy.dto.CheckMemberPoliciesRequest; import org.cotato.csquiz.api.policy.dto.FindMemberPolicyResponse; +import org.cotato.csquiz.api.policy.dto.PoliciesResponse; import org.cotato.csquiz.domain.auth.service.PolicyService; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -25,7 +27,7 @@ public class PolicyController { @Operation(summary = "체크하지 않은 정책 조회 API") @GetMapping("/essential") - public ResponseEntity getUnCheckedPolicies(@RequestParam(value = "member-id") Long memberId) { + public ResponseEntity getUnCheckedPolicies(@AuthenticationPrincipal Long memberId) { return ResponseEntity.ok().body(policyService.findUnCheckedPolicies(memberId)); } @@ -35,4 +37,10 @@ public ResponseEntity checkPolicies(@RequestBody @Valid CheckMemberPolicie policyService.checkPolicies(request); return ResponseEntity.noContent().build(); } + + @Operation(summary = "회원 가입 시 정책 목록 반환 API") + @GetMapping + public ResponseEntity getPolicies() { + return ResponseEntity.ok().body(policyService.findPolicies()); + } } diff --git a/src/main/java/org/cotato/csquiz/api/policy/dto/PoliciesResponse.java b/src/main/java/org/cotato/csquiz/api/policy/dto/PoliciesResponse.java new file mode 100644 index 00000000..f6f833aa --- /dev/null +++ b/src/main/java/org/cotato/csquiz/api/policy/dto/PoliciesResponse.java @@ -0,0 +1,8 @@ +package org.cotato.csquiz.api.policy.dto; + +import java.util.List; + +public record PoliciesResponse( + List policies +) { +} diff --git a/src/main/java/org/cotato/csquiz/common/config/SecurityConfig.java b/src/main/java/org/cotato/csquiz/common/config/SecurityConfig.java index a473d026..8a248f06 100644 --- a/src/main/java/org/cotato/csquiz/common/config/SecurityConfig.java +++ b/src/main/java/org/cotato/csquiz/common/config/SecurityConfig.java @@ -30,7 +30,8 @@ public class SecurityConfig { "/swagger-ui.html", "/v1/api/generation", "/v1/api/session", - "/websocket/csquiz" + "/websocket/csquiz", + "/v2/api/policies" }; private final JwtTokenProvider jwtTokenProvider; diff --git a/src/main/java/org/cotato/csquiz/common/config/filter/JwtAuthorizationFilter.java b/src/main/java/org/cotato/csquiz/common/config/filter/JwtAuthorizationFilter.java index 302f19f5..f274e870 100644 --- a/src/main/java/org/cotato/csquiz/common/config/filter/JwtAuthorizationFilter.java +++ b/src/main/java/org/cotato/csquiz/common/config/filter/JwtAuthorizationFilter.java @@ -32,6 +32,7 @@ public class JwtAuthorizationFilter extends OncePerRequestFilter { private static final String WS = "/websocket/csquiz"; private static final String GENERATION_PATH = "/v1/api/generation"; private static final String SESSION_PATH = "/v1/api/session"; + private static final String POLICIES_PATH = "/v2/api/policies"; private final JwtTokenProvider jwtTokenProvider; @@ -67,6 +68,6 @@ protected boolean shouldNotFilter(HttpServletRequest request) { return path.startsWith(AUTH_PATH) || path.equals(LOGIN_PATH) || path.startsWith(SWAGGER_PATH) || path.equals(SWAGGER_FAVICON) || path.startsWith(SWAGGER_PATH_3) || path.startsWith(WS) - || path.equals(GENERATION_PATH) || path.equals(SESSION_PATH); + || path.equals(GENERATION_PATH) || path.equals(SESSION_PATH) || path.equals(POLICIES_PATH); } } diff --git a/src/main/java/org/cotato/csquiz/domain/auth/service/AuthService.java b/src/main/java/org/cotato/csquiz/domain/auth/service/AuthService.java index 7805b691..0dbdf537 100644 --- a/src/main/java/org/cotato/csquiz/domain/auth/service/AuthService.java +++ b/src/main/java/org/cotato/csquiz/domain/auth/service/AuthService.java @@ -7,10 +7,12 @@ import lombok.extern.slf4j.Slf4j; import org.cotato.csquiz.api.auth.dto.FindPasswordResponse; import org.cotato.csquiz.api.auth.dto.JoinRequest; +import org.cotato.csquiz.api.auth.dto.JoinResponse; import org.cotato.csquiz.api.auth.dto.LogoutRequest; import org.cotato.csquiz.api.auth.dto.ReissueResponse; import org.cotato.csquiz.api.auth.dto.SendEmailRequest; import org.cotato.csquiz.api.member.dto.MemberEmailResponse; +import org.cotato.csquiz.api.member.dto.MemberInfo; import org.cotato.csquiz.common.config.jwt.BlackListRepository; import org.cotato.csquiz.common.config.jwt.JwtTokenProvider; import org.cotato.csquiz.common.config.jwt.RefreshToken; @@ -50,7 +52,7 @@ public class AuthService { private int refreshTokenAge; @Transactional - public void createLoginInfo(JoinRequest request) { + public JoinResponse createLoginInfo(JoinRequest request) { validateService.checkDuplicateEmail(request.email()); validateService.checkPasswordPattern(request.password()); validateService.checkPhoneNumber(request.phoneNumber()); @@ -66,6 +68,8 @@ public void createLoginInfo(JoinRequest request) { .phoneNumber(encryptedPhoneNumber) .build(); memberRepository.save(newMember); + + return JoinResponse.from(newMember); } @Transactional diff --git a/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java b/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java index 972711c1..5c5b88b2 100644 --- a/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java +++ b/src/main/java/org/cotato/csquiz/domain/auth/service/PolicyService.java @@ -8,6 +8,7 @@ import org.cotato.csquiz.api.policy.dto.CheckMemberPoliciesRequest; import org.cotato.csquiz.api.policy.dto.CheckPolicyRequest; import org.cotato.csquiz.api.policy.dto.FindMemberPolicyResponse; +import org.cotato.csquiz.api.policy.dto.PoliciesResponse; import org.cotato.csquiz.api.policy.dto.PolicyInfoResponse; import org.cotato.csquiz.common.error.ErrorCode; import org.cotato.csquiz.common.error.exception.AppException; @@ -91,4 +92,11 @@ private boolean hasDisagreementInEssential(List checkedPolicies) { .map(Policy::getPolicyType) .anyMatch(PolicyType.ESSENTIAL::equals); } + + public PoliciesResponse findPolicies() { + List policies = policyRepository.findAll().stream() + .map(PolicyInfoResponse::from) + .toList(); + return new PoliciesResponse(policies); + } }