diff --git a/.github/image/tf-erd.png b/.github/image/tf-erd.png index 6e4e3b25..5fd5de98 100644 Binary files a/.github/image/tf-erd.png and b/.github/image/tf-erd.png differ diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/auth/response/LoginResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/auth/response/LoginResponse.java index 87c025dd..ab135c93 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/auth/response/LoginResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/auth/response/LoginResponse.java @@ -1,11 +1,7 @@ package clap.server.adapter.inbound.web.dto.auth.response; -import io.swagger.v3.oas.annotations.media.Schema; - public record LoginResponse( String accessToken, - String refreshToken, - @Schema(description = "회원 정보") - MemberInfoResponse memberInfo + String refreshToken ) {} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/member/request/UpdateInitialPasswordRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/member/request/UpdateInitialPasswordRequest.java new file mode 100644 index 00000000..03b6d35c --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/member/request/UpdateInitialPasswordRequest.java @@ -0,0 +1,10 @@ +package clap.server.adapter.inbound.web.dto.member.request; + +import clap.server.common.annotation.validation.password.ValidPassword; +import jakarta.validation.constraints.NotBlank; + +public record UpdateInitialPasswordRequest( + @NotBlank @ValidPassword + String password +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/member/request/UpdatePasswordRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/member/request/UpdatePasswordRequest.java new file mode 100644 index 00000000..2f54a0e3 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/member/request/UpdatePasswordRequest.java @@ -0,0 +1,10 @@ +package clap.server.adapter.inbound.web.dto.member.request; + +import clap.server.common.annotation.validation.password.ValidPassword; +import jakarta.validation.constraints.NotBlank; + +public record UpdatePasswordRequest( + @NotBlank @ValidPassword + String password +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/request/TerminateTaskRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/TerminateTaskRequest.java new file mode 100644 index 00000000..691b949e --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/TerminateTaskRequest.java @@ -0,0 +1,11 @@ +package clap.server.adapter.inbound.web.dto.task.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +public record TerminateTaskRequest( + @Schema(description = "종료 사유") + @NotBlank + String reason +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/member/ResetPasswordController.java b/src/main/java/clap/server/adapter/inbound/web/member/ResetPasswordController.java index 8713d54f..580f61c6 100644 --- a/src/main/java/clap/server/adapter/inbound/web/member/ResetPasswordController.java +++ b/src/main/java/clap/server/adapter/inbound/web/member/ResetPasswordController.java @@ -1,11 +1,12 @@ package clap.server.adapter.inbound.web.member; import clap.server.adapter.inbound.security.service.SecurityUserDetails; +import clap.server.adapter.inbound.web.dto.member.request.UpdateInitialPasswordRequest; +import clap.server.adapter.inbound.web.dto.member.request.UpdatePasswordRequest; import clap.server.application.port.inbound.member.ResetInitialPasswordUsecase; import clap.server.application.port.inbound.member.ResetPasswordUsecase; import clap.server.application.port.inbound.member.VerifyPasswordUseCase; import clap.server.common.annotation.architecture.WebAdapter; -import clap.server.common.annotation.validation.password.ValidPassword; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; @@ -25,18 +26,18 @@ public class ResetPasswordController { private final ResetInitialPasswordUsecase resetInitialPasswordUsecase; private final VerifyPasswordUseCase verifyPasswordUseCase; - @Operation(summary = "초기 로그인 후 비밀번호 재설정 API", description = "swagger에서 따옴표를 포함하지 않고 요청합니다.") + @Operation(summary = "초기 로그인 후 비밀번호 재설정 API") @PatchMapping("/members/initial-password") public void resetPasswordAndActivateMember(@AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody @NotBlank @ValidPassword String password) { - resetInitialPasswordUsecase.resetPasswordAndActivateMember(userInfo.getUserId(), password); + @RequestBody UpdateInitialPasswordRequest request) { + resetInitialPasswordUsecase.resetPasswordAndActivateMember(userInfo.getUserId(),request.password()); } - @Operation(summary = "비밀번호 재설정 API", description = "swagger에서 따옴표를 포함하지 않고 요청합니다.") + @Operation(summary = "비밀번호 재설정 API") @PatchMapping("/members/password") public void resetPassword(@AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody @NotBlank @ValidPassword String password) { - resetPasswordUsecase.resetPassword(userInfo.getUserId(), password); + @RequestBody UpdatePasswordRequest request) { + resetPasswordUsecase.resetPassword(userInfo.getUserId(), request.password()); } diff --git a/src/main/java/clap/server/adapter/inbound/web/task/TerminateTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/TerminateTaskController.java index 306478b2..9a9a20d4 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/TerminateTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/TerminateTaskController.java @@ -1,11 +1,13 @@ package clap.server.adapter.inbound.web.task; import clap.server.adapter.inbound.security.service.SecurityUserDetails; +import clap.server.adapter.inbound.web.dto.task.request.TerminateTaskRequest; import clap.server.application.port.inbound.task.TerminateTaskUsecase; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -24,8 +26,8 @@ public class TerminateTaskController { @PatchMapping("/{taskId}/terminate") public void terminateTask(@AuthenticationPrincipal SecurityUserDetails userInfo, @PathVariable Long taskId, - @RequestBody @Schema(example = "스웨거에서는 따옴표를 떼고 보내주세요") String reason) { - terminateTaskUsecase.terminateTask(userInfo.getUserId(), taskId, reason); + @RequestBody TerminateTaskRequest request) { + terminateTaskUsecase.terminateTask(userInfo.getUserId(), taskId, request.reason()); } } diff --git a/src/main/java/clap/server/application/mapper/AuthResponseMapper.java b/src/main/java/clap/server/application/mapper/AuthResponseMapper.java index ea7b219b..b423a4ab 100644 --- a/src/main/java/clap/server/application/mapper/AuthResponseMapper.java +++ b/src/main/java/clap/server/application/mapper/AuthResponseMapper.java @@ -11,22 +11,10 @@ private AuthResponseMapper() { throw new IllegalArgumentException(); } - public static LoginResponse toLoginResponse(final String accessToken, final String refreshToken, final Member member) { + public static LoginResponse toLoginResponse(final String accessToken, final String refreshToken) { return new LoginResponse( accessToken, - refreshToken, - toMemberInfoResponse(member) - ); - } - - public static MemberInfoResponse toMemberInfoResponse(Member member) { - return new MemberInfoResponse( - member.getMemberId(), - member.getMemberInfo().getName(), - member.getMemberInfo().getNickname(), - member.getImageUrl(), - member.getMemberInfo().getRole(), - member.getStatus() + refreshToken ); } diff --git a/src/main/java/clap/server/application/service/auth/AuthService.java b/src/main/java/clap/server/application/service/auth/AuthService.java index 58b6f83b..af265d8f 100644 --- a/src/main/java/clap/server/application/service/auth/AuthService.java +++ b/src/main/java/clap/server/application/service/auth/AuthService.java @@ -41,13 +41,13 @@ public LoginResponse login(String nickname, String password, String clientIp) { if (member.getStatus().equals(MemberStatus.APPROVAL_REQUEST)) { String temporaryToken = manageTokenService.issueTemporaryToken(member.getMemberId()); - return AuthResponseMapper.toLoginResponse(temporaryToken, null, member); + return AuthResponseMapper.toLoginResponse(temporaryToken, null); } CustomJwts jwtTokens = manageTokenService.issueTokens(member); refreshTokenService.saveRefreshToken(manageTokenService.issueRefreshToken(member.getMemberId())); loginAttemptService.resetFailedAttempts(clientIp); - return AuthResponseMapper.toLoginResponse(jwtTokens.accessToken(), jwtTokens.refreshToken(), member); + return AuthResponseMapper.toLoginResponse(jwtTokens.accessToken(), jwtTokens.refreshToken()); } @Override diff --git a/src/main/java/clap/server/exception/code/MemberErrorCode.java b/src/main/java/clap/server/exception/code/MemberErrorCode.java index 3cc8bd8d..85ff96a0 100644 --- a/src/main/java/clap/server/exception/code/MemberErrorCode.java +++ b/src/main/java/clap/server/exception/code/MemberErrorCode.java @@ -14,8 +14,8 @@ public enum MemberErrorCode implements BaseErrorCode { PASSWORD_VERIFY_FAILED(HttpStatus.BAD_REQUEST, "MEMBER_006", "비밀번호 검증에 실패하였습니다"), INVALID_CSV_FORMAT(HttpStatus.BAD_REQUEST, "MEMBER_007", "CSV 파일 형식이 잘못되었습니다."), CSV_PARSING_ERROR(HttpStatus.BAD_REQUEST, "MEMBER_008", "CSV 데이터 파싱 중 오류가 발생했습니다."), - MEMBER_REGISTRATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "MEMBER_009", "회원 등록 중 오류가 발생했습니다."), - NAME_CANNOT_BE_EMPTY(HttpStatus.BAD_REQUEST, "MEMBER_010", "이름은 공백일 수 없습니다.") + MEMBER_REGISTRATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "MEMBER_009", "담당자만 리뷰 권한이 있습니다."), + NAME_CANNOT_BE_EMPTY(HttpStatus.BAD_REQUEST, "MEMBER_010", "이름은 공백일 수 없습니다."), ;