Skip to content

Commit 7cda389

Browse files
authored
Merge pull request #5 from NET-ZERO-FitFit/develop
[FEAT] main <- develop (swagger 에러 처리 명세 추가, 닉네임 중복 확인 API 추가)
2 parents e2beeca + f360fcd commit 7cda389

6 files changed

Lines changed: 62 additions & 0 deletions

File tree

src/main/java/fitfit/domain/member/controller/MemberRestController.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import fitfit.global.enums.Provider;
1212
import io.swagger.v3.oas.annotations.Operation;
1313
import io.swagger.v3.oas.annotations.tags.Tag;
14+
import io.swagger.v3.oas.annotations.media.Content;
15+
import io.swagger.v3.oas.annotations.media.Schema;
16+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1417
import jakarta.validation.Valid;
1518
import lombok.RequiredArgsConstructor;
1619
import lombok.extern.slf4j.Slf4j;
@@ -30,6 +33,12 @@ public class MemberRestController {
3033

3134
@PostMapping("/auth/kko")
3235
@Operation(summary = "KAKAO OAuth2 로그인 API", description = "KAKAO OAuth2 로그인 API 입니다.")
36+
@ApiResponses({
37+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK, 성공"),
38+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Bad Request, 잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
39+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "유효하지 않은 ID Token 입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
40+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "카카오 토큰 검증 도중 에러 발생", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
41+
})
3342
public ResponseEntity<ApiResponse<MemberResponseDTO.KkoOAuth2LoginResponse>> kkoOAuth2Login (@Valid @RequestBody MemberRequestDTO.KkoOAuth2LoginRequest request) {
3443
// id_token 검증 후 멤버 데이터 추출
3544
MemberDataDTO.MemberData kakaoMemberData = kakaoOidcService.verifyAndParseIdToken(request);
@@ -43,6 +52,15 @@ public ResponseEntity<ApiResponse<MemberResponseDTO.KkoOAuth2LoginResponse>> kko
4352

4453
@PostMapping("/agreements")
4554
@Operation(summary = "약관 동의 API", description = "회원이 약관에 동의하는 API입니다.")
55+
@ApiResponses({
56+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK, 성공"),
57+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Bad Request, 잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
58+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "유효하지 않은 JWT 토큰입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
59+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "만료된 JWT 토큰입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
60+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "존재하지 않는 회원입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
61+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "존재하지 않는 약관입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
62+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "필수 약관에 동의하지 않았습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
63+
})
4664
public ResponseEntity<ApiResponse<MemberResponseDTO.TermAgreementResponse>> termAgreement(
4765
@RequestHeader(value = "Authorization", required = false) String authorization,
4866
@Valid @RequestBody MemberRequestDTO.TermAgreementRequest request) {
@@ -51,9 +69,30 @@ public ResponseEntity<ApiResponse<MemberResponseDTO.TermAgreementResponse>> term
5169

5270
@PatchMapping("/signup")
5371
@Operation(summary = "회원가입 완료 API", description = "회원의 추가 정보(닉네임, 사용자 커스텀 ID, 성별, 생년월일, 프로필 이미지)를 입력하여 회원가입을 완료하는 API입니다.")
72+
@ApiResponses({
73+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK, 성공"),
74+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Bad Request, 잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
75+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "유효하지 않은 JWT 토큰입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
76+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "만료된 JWT 토큰입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
77+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "존재하지 않는 회원입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
78+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "회원 필수 정보가 누락되었습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
79+
})
5480
public ResponseEntity<ApiResponse<MemberResponseDTO.MemberSignupResponse>> signup(
5581
@RequestHeader(value = "Authorization", required = false) String authorization,
5682
@Valid @RequestBody MemberRequestDTO.MemberSignupRequest request) {
5783
return ResponseEntity.ok(ApiResponse.onSuccess(memberCommandUseCase.memberSignup(authorization, request)));
5884
}
85+
86+
@PostMapping("/nickname/check")
87+
@Operation(summary = "닉네임 중복 확인 API", description = "닉네임 중복을 확인하는 API입니다.")
88+
@ApiResponses({
89+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK, 성공"),
90+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Bad Request, 잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
91+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "409", description = "이미 사용 중인 닉네임입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
92+
})
93+
public ResponseEntity<ApiResponse<String>> checkNickname(@Valid @RequestBody MemberRequestDTO.NicknameCheckRequest request) {
94+
memberCommandUseCase.checkNickname(request.getNickname());
95+
return ResponseEntity.ok(ApiResponse.onSuccess("사용 가능한 닉네임입니다."));
96+
}
5997
}
98+

src/main/java/fitfit/domain/member/dto/MemberRequestDTO.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ public static class TermAgreementRequest {
4242
private List<Long> disagreeTermIdList;
4343
}
4444

45+
@Getter
46+
@Builder
47+
@AllArgsConstructor
48+
@NoArgsConstructor
49+
public static class NicknameCheckRequest {
50+
@NotNull(message = "닉네임은 필수입니다.")
51+
@Size(max = 25, message = "닉네임은 최대 25자입니다.")
52+
private String nickname;
53+
}
54+
4555
@Getter
4656
@Builder
4757
@AllArgsConstructor

src/main/java/fitfit/domain/member/repository/MemberRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@
77

88
public interface MemberRepository extends JpaRepository<Member, Long> {
99
Optional<Member> findByProviderId(String sub);
10+
11+
boolean existsByName(String name);
1012
}

src/main/java/fitfit/domain/member/service/MemberCommandService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,14 @@ private boolean validateAdditionalInfo(MemberRequestDTO.MemberSignupRequest requ
191191
request.getBirth() != null;
192192
}
193193

194+
@Override
195+
@Transactional(readOnly = true)
196+
public void checkNickname(String nickname) {
197+
if (memberRepository.existsByName(nickname)) {
198+
throw new MemberHandler(ErrorStatus.NICKNAME_ALREADY_EXISTS);
199+
}
200+
}
201+
194202
/**
195203
* 회원 정보를 업데이트하는 메서드
196204
*/

src/main/java/fitfit/domain/member/service/MemberCommandUseCase.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ public interface MemberCommandUseCase {
1010
Member findOrCreateMember(MemberDataDTO.MemberData memberData, Provider provider);
1111
MemberResponseDTO.TermAgreementResponse termAgreement(String authorization, MemberRequestDTO.TermAgreementRequest request);
1212
MemberResponseDTO.MemberSignupResponse memberSignup(String authorization, MemberRequestDTO.MemberSignupRequest request);
13+
14+
void checkNickname(String nickname);
1315
}

src/main/java/fitfit/global/apiPayload/code/status/ErrorStatus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public enum ErrorStatus implements BaseErrorCode {
3333
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "MEMBER4001", "존재하지 않는 회원입니다."),
3434
INVALID_MEMBER_INFO(HttpStatus.BAD_REQUEST, "MEMBER4002", "회원 필수 정보가 누락되었습니다."),
3535
MEMBER_ALREADY_EXISTS(HttpStatus.CONFLICT, "MEMBER4003", "이미 존재하는 회원입니다."),
36+
NICKNAME_ALREADY_EXISTS(HttpStatus.CONFLICT, "MEMBER4004", "이미 사용 중인 닉네임입니다."),
3637
INVALID_USER_CUSTOM_ID_FORMAT(HttpStatus.BAD_REQUEST, "MEMBER4005", "사용자 커스텀 ID 형식이 올바르지 않습니다."),
3738
DUPLICATE_USER_CUSTOM_ID(HttpStatus.CONFLICT, "MEMBER4006", "이미 사용 중인 사용자 커스텀 ID입니다."),
3839
INVALID_BIRTH_DATE(HttpStatus.BAD_REQUEST, "MEMBER4007", "생년월일이 올바르지 않습니다."),

0 commit comments

Comments
 (0)