Skip to content

Commit

Permalink
Feature: 회원 가입 성공 시 회원 PK 반환 및 필수 정책 반환 API 구현 (#90)
Browse files Browse the repository at this point in the history
* feat: 회원 가입 시 생성된 member_id 반환

* feat: 회원 가입 시 필요한 회원 정책 목록 반환

* refactor: 체크하지 않은 필수 정책 파라미터 변경
  • Loading branch information
Youthhing authored Aug 12, 2024
1 parent f1a5ab8 commit 8e3610e
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -22,18 +25,18 @@
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@Tag(name = "인증 관련 API", description = "회원 인증 관련 API 모음")
@RestController
@RequiredArgsConstructor
@RequestMapping("/v1/api/auth")
public class AuthController {

private final AuthService authService;

@Operation(summary = "회원 가입 API")
@PostMapping("/join")
public ResponseEntity<Void> joinAuth(@RequestBody @Valid JoinRequest request) {
log.info("[회원 가입 컨트롤러]: {}, {}", request.email(), request.name());
authService.createLoginInfo(request);
return ResponseEntity.status(HttpStatus.CREATED).build();
public ResponseEntity<JoinResponse> joinAuth(@RequestBody @Valid JoinRequest request) {
return ResponseEntity.status(HttpStatus.CREATED).body(authService.createLoginInfo(request));
}

@PostMapping("/reissue")
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/org/cotato/csquiz/api/auth/dto/JoinResponse.java
Original file line number Diff line number Diff line change
@@ -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()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,7 +27,7 @@ public class PolicyController {

@Operation(summary = "체크하지 않은 정책 조회 API")
@GetMapping("/essential")
public ResponseEntity<FindMemberPolicyResponse> getUnCheckedPolicies(@RequestParam(value = "member-id") Long memberId) {
public ResponseEntity<FindMemberPolicyResponse> getUnCheckedPolicies(@AuthenticationPrincipal Long memberId) {
return ResponseEntity.ok().body(policyService.findUnCheckedPolicies(memberId));
}

Expand All @@ -35,4 +37,10 @@ public ResponseEntity<Void> checkPolicies(@RequestBody @Valid CheckMemberPolicie
policyService.checkPolicies(request);
return ResponseEntity.noContent().build();
}

@Operation(summary = "회원 가입 시 정책 목록 반환 API")
@GetMapping
public ResponseEntity<PoliciesResponse> getPolicies() {
return ResponseEntity.ok().body(policyService.findPolicies());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.cotato.csquiz.api.policy.dto;

import java.util.List;

public record PoliciesResponse(
List<PolicyInfoResponse> policies
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand All @@ -66,6 +68,8 @@ public void createLoginInfo(JoinRequest request) {
.phoneNumber(encryptedPhoneNumber)
.build();
memberRepository.save(newMember);

return JoinResponse.from(newMember);
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -91,4 +92,11 @@ private boolean hasDisagreementInEssential(List<MemberPolicy> checkedPolicies) {
.map(Policy::getPolicyType)
.anyMatch(PolicyType.ESSENTIAL::equals);
}

public PoliciesResponse findPolicies() {
List<PolicyInfoResponse> policies = policyRepository.findAll().stream()
.map(PolicyInfoResponse::from)
.toList();
return new PoliciesResponse(policies);
}
}

0 comments on commit 8e3610e

Please sign in to comment.