Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,6 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AuthConverter {

/** 이메일 중복 확인 응답 */
public static CheckEmailResDTO toCheckEmailResDTO(boolean available) {
return new CheckEmailResDTO(available);
}

/** 회원가입 응답 */
public static AuthSignUpResDTO toSignUpResDTO(Member member, Long personaId) {
return new AuthSignUpResDTO(
Expand All @@ -34,9 +29,4 @@ public static AuthLoginResDTO toLoginResDTO(String accessToken, Member member) {
)
);
}

/** 토큰 재발급 응답 */
public static AuthReissueResDTO toReissueResDTO(String accessToken) {
return new AuthReissueResDTO(accessToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

@Getter
public class AuthLoginReqDTO {
// 로그인 DTO
// 로그인 요청 DTO

@Email(message = "유효한 이메일이어야 합니다.")
@NotBlank(message = "이메일을 입력하세요.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
@AllArgsConstructor
@Builder
public class AuthSignUpReqDTO {
// 회원가입 요청 DTO

@NotBlank(message = "email은 필수입니다.")
@Email(message = "email 형식이 올바르지 않습니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
@Getter
@AllArgsConstructor
public class AuthReissueResDTO {
// 토큰 재발급 응답 DTO

private String accessToken;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
@Getter
@AllArgsConstructor
public class AuthSignUpResDTO {
// 회원가입 응답 DTO

private Long memberId;
private String email;
private String nickname;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
@Getter
@AllArgsConstructor
public class CheckEmailResDTO {
// 이메일 중복 확인 응답 DTO

private final boolean available;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
@Getter
@AllArgsConstructor
public class TermDetailResDTO {
// 약관 상세 조회 응답 DTO

private Long termId;
private String termType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

import java.util.List;

// 약관 관련 API 응답 DTO
public class TermResDTO {
// 약관 조회 응답 DTO

// 약관 목록 응답 Wrapper
@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
@AllArgsConstructor
public enum AuthErrorCode implements BaseCode {

EMAIL_ALREADY_EXISTS(HttpStatus.CONFLICT, "AUTH409", "이미 가입된 이메일입니다."),

// 400
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "AUTH400_1", "비밀번호 형식이 올바르지 않습니다."),
INVALID_NICKNAME(HttpStatus.BAD_REQUEST, "AUTH400_2", "닉네임 형식이 올바르지 않습니다."),
Expand All @@ -28,13 +26,16 @@ public enum AuthErrorCode implements BaseCode {
REFRESH_TOKEN_MISMATCH(HttpStatus.UNAUTHORIZED, "AUTH401_8", "서버에 저장된 refreshToken과 일치하지 않습니다."),

//403
FORBIDDEN(HttpStatus.FORBIDDEN, "AUTH403", "접근 권한이 없습니다."),
FORBIDDEN(HttpStatus.FORBIDDEN, "AUTH403_1", "접근 권한이 없습니다."),

// 404
TERM_NOT_FOUND(HttpStatus.NOT_FOUND, "AUTH404", "해당 약관이 없습니다."),
TERM_NOT_FOUND(HttpStatus.NOT_FOUND, "AUTH404_1", "해당 약관이 없습니다."),

//409
EMAIL_ALREADY_EXISTS(HttpStatus.CONFLICT, "AUTH409_1", "이미 가입된 이메일입니다."),

// 422
REQUIRED_TERM_NOT_AGREED(HttpStatus.UNPROCESSABLE_ENTITY, "AUTH422", "필수 약관에 동의해야 합니다.");
REQUIRED_TERM_NOT_AGREED(HttpStatus.UNPROCESSABLE_ENTITY, "AUTH422_1", "필수 약관에 동의해야 합니다.");

private final HttpStatus httpStatus;
private final String code;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ public AuthSignUpResDTO signup(AuthSignUpReqDTO request) {
// 8. 약관 동의 저장
saveTermAgreements(savedMember, agreedMap);

// Converter로 이동
return AuthConverter.toSignUpResDTO(savedMember, persona.getId());
}

Expand Down Expand Up @@ -147,7 +146,6 @@ public LoginTokens login(AuthLoginReqDTO request) {
(jwtProvider.getExpiration(refreshToken).getTime() - System.currentTimeMillis()) / 1000
);

// Converter로 이동
AuthLoginResDTO body = AuthConverter.toLoginResDTO(accessToken, member);

return new LoginTokens(body, refreshToken, refreshMaxAgeSeconds);
Expand Down Expand Up @@ -244,6 +242,7 @@ public void logout(HttpServletResponse response) {
}

// -----------------------------------------------------------
/** 유효성 검사 **/
private boolean isValidPassword(String raw) {
return PasswordPolicy.isValid(raw);
}
Expand All @@ -252,6 +251,7 @@ private boolean isValidNickname(String nickname) {
return nickname != null && nickname.matches(NICKNAME_REGEX);
}

// 약관 동의 요청 리스트 맵으로 변환
private Map<Long, Boolean> toAgreedMap(List<AuthSignUpReqDTO.TermAgreementReq> agreements) {
if (agreements == null || agreements.isEmpty()) {
throw new CustomException(AuthErrorCode.INVALID_TERM_REQUEST);
Expand All @@ -264,6 +264,7 @@ private Map<Long, Boolean> toAgreedMap(List<AuthSignUpReqDTO.TermAgreementReq> a
));
}

// 필수 약관이 모두 True로 처리됐는지 검증
private void validateRequiredTermsAgreed(Map<Long, Boolean> agreedMap) {
List<Term> requiredTerms = REQUIRED_TERMS.stream()
.map(tt -> termRepository.findByTermType(tt)
Expand All @@ -279,6 +280,7 @@ private void validateRequiredTermsAgreed(Map<Long, Boolean> agreedMap) {
}
}

// 회원가입 시 제출된 페르소나 답변 리스트로부터 최종 페르소나 계산
private Persona resolvePersonaFromSignup(List<PersonaAnswerReqDTO> answers) {
if (answers == null || answers.isEmpty()) {
throw new CustomException(AuthErrorCode.INVALID_PERSONA_ANSWERS);
Expand All @@ -291,6 +293,7 @@ private Persona resolvePersonaFromSignup(List<PersonaAnswerReqDTO> answers) {
return personaScoringService.resolvePersona(convertedAnswers);
}

// agreedMap 기반으로 members-terms 매핑 테이블에 저장
private void saveTermAgreements(Member member, Map<Long, Boolean> agreedMap) {
List<Long> termIds = new ArrayList<>(agreedMap.keySet());

Expand Down