diff --git a/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java b/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java index affca4c..3345fb3 100644 --- a/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java @@ -186,4 +186,15 @@ public ResponseEntity> agreeTerms( return ResponseEntity.status(HttpStatus.OK) .body(BaseResponse.ok("약관 동의 저장에 성공했습니다.")); } + + @Operation(summary = "온보딩, 약관동의 여부 조회") + @CustomExceptionDescription(GET_COMPLETION) + @GetMapping("completion") + public ResponseEntity> getMemberCompletionStatus( + @AuthenticationPrincipal Long memberId + ){ + return ResponseEntity.status(HttpStatus.OK) + .body(BaseResponse.ok(memberService.getCompletion(memberId), "온보딩/약관동의 여부 조회에 성공하였습니다,")); + } + } diff --git a/src/main/java/org/sopt/kareer/domain/member/dto/response/MemberCompletionResponse.java b/src/main/java/org/sopt/kareer/domain/member/dto/response/MemberCompletionResponse.java new file mode 100644 index 0000000..ac7f5ee --- /dev/null +++ b/src/main/java/org/sopt/kareer/domain/member/dto/response/MemberCompletionResponse.java @@ -0,0 +1,20 @@ +package org.sopt.kareer.domain.member.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +public record MemberCompletionResponse( + @Schema(description = "온보딩 여부") + boolean onboardingRequired, + + @Schema(description = "약관 동의 여부") + boolean agreeTerm +) { + public static MemberCompletionResponse of(boolean onboardingRequired, boolean agreeTerm){ + return MemberCompletionResponse.builder() + .onboardingRequired(onboardingRequired) + .agreeTerm(agreeTerm) + .build(); + } +} diff --git a/src/main/java/org/sopt/kareer/domain/member/dto/response/MemberStatusResponse.java b/src/main/java/org/sopt/kareer/domain/member/dto/response/MemberStatusResponse.java index c36719d..756162f 100644 --- a/src/main/java/org/sopt/kareer/domain/member/dto/response/MemberStatusResponse.java +++ b/src/main/java/org/sopt/kareer/domain/member/dto/response/MemberStatusResponse.java @@ -20,23 +20,15 @@ public record MemberStatusResponse( LocalDate expectedGraduationDate, @Schema(description = "졸업일") - LocalDate graduationDate, - - @Schema(description = "온보딩 여부", example = "true") - boolean onboardingRequired, - - @Schema(description = "약관 동의 여부", example = "true") - boolean agreedTerm + LocalDate graduationDate ) { - public static MemberStatusResponse from(Member member, MemberVisa visa, boolean onboardingRequired, boolean agreedTerm) { + public static MemberStatusResponse from(Member member, MemberVisa visa) { return MemberStatusResponse.builder() .visaType(visa.getVisaType()) .visaExpiredAt(visa.getVisaExpiredAt()) .graduationDate(member.getGraduationDate()) .expectedGraduationDate(member.getExpectedGraduationDate()) - .onboardingRequired(onboardingRequired) - .agreedTerm(agreedTerm) .build(); } } diff --git a/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java b/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java index 8672676..3f95da4 100644 --- a/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java @@ -1,21 +1,21 @@ package org.sopt.kareer.domain.member.service; import lombok.RequiredArgsConstructor; -import org.sopt.kareer.domain.member.dto.response.*; -import org.sopt.kareer.domain.member.entity.enums.*; -import org.sopt.kareer.domain.member.service.dto.request.MypageCommand; import org.sopt.kareer.domain.member.dto.request.MemberOnboardRequest; import org.sopt.kareer.domain.member.dto.request.MemberOnboardV2Request; import org.sopt.kareer.domain.member.dto.request.MemberTermsRequest; +import org.sopt.kareer.domain.member.dto.response.*; import org.sopt.kareer.domain.member.entity.Member; import org.sopt.kareer.domain.member.entity.MemberTerm; import org.sopt.kareer.domain.member.entity.MemberVisa; +import org.sopt.kareer.domain.member.entity.enums.LocalizedOnboardCategoryType; import org.sopt.kareer.domain.member.entity.enums.MemberStatus; import org.sopt.kareer.domain.member.exception.MemberErrorCode; import org.sopt.kareer.domain.member.exception.MemberException; import org.sopt.kareer.domain.member.repository.MemberRepository; import org.sopt.kareer.domain.member.repository.MemberTermRepository; import org.sopt.kareer.domain.member.repository.MemberVisaRepository; +import org.sopt.kareer.domain.member.service.dto.request.MypageCommand; import org.sopt.kareer.domain.member.util.PassportOcrParser; import org.sopt.kareer.domain.member.util.VisaOcrParser; import org.sopt.kareer.domain.term.entity.Term; @@ -177,10 +177,7 @@ public MemberStatusResponse getMemberStatus(Long memberId) { MemberVisa memberVisa = memberVisaRepository.findActiveByMemberId(memberId) .orElseThrow(() -> new MemberException(MemberErrorCode.VISA_NOT_FOUND)); - boolean onboardingRequired = member.getStatus().equals(MemberStatus.PENDING); - boolean agreedTerm = memberTermRepository.existsByMemberIdAndAgreedTrue(memberId); - - return MemberStatusResponse.from(member, memberVisa, onboardingRequired, agreedTerm); + return MemberStatusResponse.from(member, memberVisa); } public MypageResponse getMypage(Long memberId) { @@ -308,4 +305,17 @@ public void agreeTerms(Long memberId, MemberTermsRequest request) { memberTermRepository.saveAll(memberTerms); } + + + public MemberCompletionResponse getCompletion(Long memberId){ + Member member = getById(memberId); + + MemberVisa memberVisa = memberVisaRepository.findActiveByMemberId(memberId) + .orElseThrow(() -> new MemberException(MemberErrorCode.VISA_NOT_FOUND)); + + boolean onboardingRequired = member.getStatus().equals(MemberStatus.PENDING); + boolean agreedTerm = memberTermRepository.existsByMemberIdAndAgreedTrue(memberId); + + return MemberCompletionResponse.of(onboardingRequired, agreedTerm); + } } diff --git a/src/main/java/org/sopt/kareer/global/config/swagger/SwaggerResponseDescription.java b/src/main/java/org/sopt/kareer/global/config/swagger/SwaggerResponseDescription.java index 7c05e16..30c3da1 100644 --- a/src/main/java/org/sopt/kareer/global/config/swagger/SwaggerResponseDescription.java +++ b/src/main/java/org/sopt/kareer/global/config/swagger/SwaggerResponseDescription.java @@ -1,39 +1,20 @@ package org.sopt.kareer.global.config.swagger; -import static org.sopt.kareer.domain.jobposting.exception.JobPostingErrorCode.JOB_POSTING_NOT_FOUND; -import static org.sopt.kareer.domain.jobposting.exception.JobPostingErrorCode.RESUME_CONTEXT_FAILED; -import static org.sopt.kareer.domain.jobposting.exception.JobPostingErrorCode.TOO_MANY_FILES; -import static org.sopt.kareer.domain.member.exception.MemberErrorCode.INVALID_COUNTRY; -import static org.sopt.kareer.domain.member.exception.MemberErrorCode.INVALID_VISA_POINT; -import static org.sopt.kareer.domain.member.exception.MemberErrorCode.MEMBER_NOT_FOUND; -import static org.sopt.kareer.domain.member.exception.MemberErrorCode.ONBOARDING_ALREADY_COMPLETED; -import static org.sopt.kareer.domain.member.exception.MemberErrorCode.ONBOARDING_REQUIRED; -import static org.sopt.kareer.domain.member.exception.MemberErrorCode.VISA_NOT_FOUND; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.ACTION_ITEM_INACTIVE; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.ACTION_ITEM_NOT_FOUND; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.ACTION_ITEM_TYPE_BLANK; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.ACTION_ITEM_TYPE_INVALID; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.PHASE_ACTION_ALREADY_COMPLETED; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.PHASE_ACTION_NOT_FOUND; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.PHASE_ACTION_TYPE_BLANK; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.PHASE_ACTION_TYPE_INVALID; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.PHASE_NOT_FOUND; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.PHASE_STATUS_BLANK; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.PHASE_STATUS_INVALID; -import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.TODO_ALREADY_ADDED; +import lombok.Getter; +import org.sopt.kareer.global.exception.errorcode.ErrorCode; +import org.sopt.kareer.global.exception.errorcode.GlobalErrorCode; + +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.sopt.kareer.domain.jobposting.exception.JobPostingErrorCode.*; +import static org.sopt.kareer.domain.member.exception.MemberErrorCode.*; +import static org.sopt.kareer.domain.roadmap.exception.RoadmapErrorCode.*; import static org.sopt.kareer.domain.term.exception.TermErrorCode.*; import static org.sopt.kareer.global.auth.exception.AuthErrorCode.LOGIN_CODE_ALREADY_USED; import static org.sopt.kareer.global.auth.exception.AuthErrorCode.LOGIN_CODE_NOT_FOUND; import static org.sopt.kareer.global.external.ai.exception.LlmErrorCode.LLM_JSON_PARSING_FAILED; -import static org.sopt.kareer.global.external.ai.exception.RagErrorCode.DOCUMENTS_RETRIEVED_EMPTY; -import static org.sopt.kareer.global.external.ai.exception.RagErrorCode.EMBEDDING_FAILED; -import static org.sopt.kareer.global.external.ai.exception.RagErrorCode.EXTRACT_TEXT_FAILED; - -import java.util.LinkedHashSet; -import java.util.Set; -import lombok.Getter; -import org.sopt.kareer.global.exception.errorcode.ErrorCode; -import org.sopt.kareer.global.exception.errorcode.GlobalErrorCode; +import static org.sopt.kareer.global.external.ai.exception.RagErrorCode.*; @Getter public enum SwaggerResponseDescription { @@ -128,6 +109,10 @@ public enum SwaggerResponseDescription { DUPLICATE_TERM, MISSING_TERM, REQUIRED_TERM_NOT_AGREED + ))), + GET_COMPLETION(new LinkedHashSet<>(Set.of( + MEMBER_NOT_FOUND, + VISA_NOT_FOUND ))) ; diff --git a/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java b/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java index a53ebf4..d99d04e 100644 --- a/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java +++ b/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java @@ -35,6 +35,7 @@ public class OnboardingRestrictionFilter extends OncePerRequestFilter { "/api/v1/members/roadmap/test", "/api/v1/terms", "/api/v1/members/term-agreements", + "/api/v1/members/completion", "/v3/api-docs/**" );