Skip to content

Commit a6be106

Browse files
authored
[REFACTOR] #197: 기존 신입 멤버 가입 신청 및 조회 api 리팩토링
[REFACTOR] #197: 기존 신입 멤버 가입 신청 및 조회 api 리팩토링
2 parents e2062cf + f314721 commit a6be106

32 files changed

+307
-108
lines changed

src/main/java/inha/gdgoc/domain/auth/exception/AuthErrorCode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package inha.gdgoc.domain.auth.exception;
22

3-
import inha.gdgoc.global.error.ErrorCode;
3+
import inha.gdgoc.global.exception.ErrorCode;
44
import org.springframework.http.HttpStatus;
55

66
public enum AuthErrorCode implements ErrorCode {

src/main/java/inha/gdgoc/domain/auth/exception/AuthException.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package inha.gdgoc.domain.auth.exception;
22

3-
import inha.gdgoc.global.error.BusinessException;
4-
import inha.gdgoc.global.error.ErrorCode;
3+
import inha.gdgoc.global.exception.BusinessException;
4+
import inha.gdgoc.global.exception.ErrorCode;
55

66
public class AuthException extends BusinessException {
77

src/main/java/inha/gdgoc/domain/auth/service/AuthService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public Map<String, Object> processOAuthLogin(String code, HttpServletResponse re
9191
Optional<User> foundUser = userRepository.findByEmail(email);
9292
if (foundUser.isEmpty()) {
9393
return Map.of(
94-
"exists", false,
94+
"isExists", false,
9595
"email", email,
9696
"name", name
9797
);
@@ -117,7 +117,7 @@ public Map<String, Object> processOAuthLogin(String code, HttpServletResponse re
117117
response.addHeader(HttpHeaders.SET_COOKIE, refreshCookie.toString());
118118

119119
return Map.of(
120-
"exists", true,
120+
"isExists", true,
121121
"access_token", jwtAccessToken
122122
);
123123
}

src/main/java/inha/gdgoc/domain/recruit/controller/RecruitMemberController.java

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66
import static inha.gdgoc.domain.recruit.controller.message.RecruitMemberMessage.STUDENT_ID_DUPLICATION_CHECK_SUCCESS;
77

88
import inha.gdgoc.domain.recruit.dto.request.ApplicationRequest;
9-
import inha.gdgoc.domain.recruit.dto.request.CheckPhoneNumberRequest;
10-
import inha.gdgoc.domain.recruit.dto.request.CheckStudentIdRequest;
9+
import inha.gdgoc.domain.recruit.dto.response.CheckPhoneNumberResponse;
10+
import inha.gdgoc.domain.recruit.dto.response.CheckStudentIdResponse;
1111
import inha.gdgoc.domain.recruit.dto.response.SpecifiedMemberResponse;
1212
import inha.gdgoc.domain.recruit.service.RecruitMemberService;
1313
import inha.gdgoc.global.dto.response.ApiResponse;
14-
import jakarta.validation.Valid;
14+
import io.swagger.v3.oas.annotations.Operation;
15+
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
16+
import jakarta.validation.constraints.NotBlank;
17+
import jakarta.validation.constraints.Pattern;
1518
import lombok.RequiredArgsConstructor;
1619
import org.springframework.http.ResponseEntity;
20+
import org.springframework.security.access.prepost.PreAuthorize;
1721
import org.springframework.web.bind.annotation.GetMapping;
18-
import org.springframework.web.bind.annotation.ModelAttribute;
22+
import org.springframework.web.bind.annotation.PathVariable;
1923
import org.springframework.web.bind.annotation.PostMapping;
2024
import org.springframework.web.bind.annotation.RequestBody;
2125
import org.springframework.web.bind.annotation.RequestMapping;
@@ -38,34 +42,45 @@ public ResponseEntity<ApiResponse<Void, Void>> recruitMemberAdd(
3842
return ResponseEntity.ok(ApiResponse.ok(MEMBER_SAVE_SUCCESS));
3943
}
4044

41-
// TODO valid 핸들러 추가
42-
// TODO DTO로 응답 리팩토링, requestparam으로 변경하기
43-
@GetMapping("/check/studentId")
44-
public ResponseEntity<ApiResponse<Boolean, Void>> duplicatedStudentIdDetails(
45-
@Valid @ModelAttribute CheckStudentIdRequest studentIdRequest
45+
@GetMapping("/studentId")
46+
public ResponseEntity<ApiResponse<CheckStudentIdResponse, Void>> duplicatedStudentIdDetails(
47+
@RequestParam
48+
@NotBlank(message = "학번은 필수 입력 값입니다.")
49+
@Pattern(regexp = "^12[0-9]{6}$", message = "유효하지 않은 학번 값입니다.")
50+
String studentId
4651
) {
47-
boolean exists = recruitMemberService.isRegisteredStudentId(studentIdRequest.getStudentId());
52+
CheckStudentIdResponse response = recruitMemberService.isRegisteredStudentId(studentId);
4853

49-
return ResponseEntity.ok(ApiResponse.ok(STUDENT_ID_DUPLICATION_CHECK_SUCCESS, exists));
54+
return ResponseEntity.ok(ApiResponse.ok(STUDENT_ID_DUPLICATION_CHECK_SUCCESS, response));
5055
}
5156

52-
// TODO DTO로 응답 리팩토링
5357
@GetMapping("/check/phoneNumber")
54-
public ResponseEntity<ApiResponse<Boolean, Void>> duplicatedPhoneNumberDetails(
55-
@Valid @ModelAttribute CheckPhoneNumberRequest phoneNumberRequest
58+
public ResponseEntity<ApiResponse<CheckPhoneNumberResponse, Void>> duplicatedPhoneNumberDetails(
59+
@RequestParam
60+
@NotBlank(message = "전화번호는 필수 입력 값입니다.")
61+
@Pattern(regexp = "^010-\\d{4}-\\d{4}$", message = "전화번호 형식은 010-XXXX-XXXX 이어야 합니다.")
62+
String phoneNumber
5663
) {
57-
boolean exists = recruitMemberService.isRegisteredPhoneNumber(phoneNumberRequest.getPhoneNumber());
64+
CheckPhoneNumberResponse response = recruitMemberService
65+
.isRegisteredPhoneNumber(phoneNumber);
5866

59-
return ResponseEntity.ok(ApiResponse.ok(PHONE_NUMBER_DUPLICATION_CHECK_SUCCESS, exists));
67+
return ResponseEntity.ok(ApiResponse.ok(PHONE_NUMBER_DUPLICATION_CHECK_SUCCESS, response));
6068
}
6169

62-
// TODO 코어 멤버 인증 리팩토링 (Authentication), requestparam으로 변경하기
63-
@GetMapping("/recruit/member")
64-
public ResponseEntity<ApiResponse<SpecifiedMemberResponse, Void>> getSpecifiedMember (
65-
@RequestParam Long userId
70+
@Operation(summary = "특정 멤버 가입 신청서 조회", security = { @SecurityRequirement(name = "BearerAuth") })
71+
@PreAuthorize("hasRole('ADMIN')")
72+
@GetMapping("/recruit/members/{memberId}")
73+
public ResponseEntity<ApiResponse<SpecifiedMemberResponse, Void>> getSpecifiedMember(
74+
@PathVariable Long memberId
6675
) {
67-
SpecifiedMemberResponse response = recruitMemberService.findSpecifiedMember(userId);
76+
SpecifiedMemberResponse response = recruitMemberService.findSpecifiedMember(memberId);
6877

6978
return ResponseEntity.ok(ApiResponse.ok(MEMBER_RETRIEVED_SUCCESS, response));
7079
}
80+
81+
// TODO 전체 응답 조회 및 검색
82+
83+
// TODO 입금 완료
84+
85+
// TODO 입금 미완료
7186
}

src/main/java/inha/gdgoc/domain/recruit/dto/request/CheckStudentIdRequest.java

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/main/java/inha/gdgoc/domain/recruit/dto/request/RecruitMemberRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public RecruitMember toEntity() {
4040
.birth(birth)
4141
.major(major)
4242
.doubleMajor(doubleMajor)
43-
.isPayed(isPayed)
43+
.isPayed(false)
4444
.build();
4545
}
4646
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package inha.gdgoc.domain.recruit.dto.response;
2+
3+
import com.fasterxml.jackson.core.type.TypeReference;
4+
import com.fasterxml.jackson.databind.JsonNode;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import inha.gdgoc.domain.recruit.entity.Answer;
7+
import inha.gdgoc.domain.recruit.enums.InputType;
8+
import java.util.List;
9+
import java.util.Map;
10+
11+
public record AnswerResponse(
12+
Long id,
13+
InputType inputType,
14+
Object responseValue
15+
) {
16+
public static AnswerResponse from(Answer answer, ObjectMapper om) {
17+
return new AnswerResponse(
18+
answer.getId(),
19+
answer.getInputType(),
20+
toFriendlyValue(answer.getResponseValue(), om)
21+
);
22+
}
23+
24+
private static Object toFriendlyValue(String json, ObjectMapper om) {
25+
if (json == null || json.isBlank()) return null;
26+
try {
27+
JsonNode node = om.readTree(json);
28+
29+
if (node.isTextual()) {
30+
return node.asText();
31+
}
32+
if (node.isArray()) {
33+
return om.convertValue(node, new TypeReference<List<Object>>() {});
34+
}
35+
if (node.isObject()) {
36+
return om.convertValue(node, new TypeReference<Map<String, Object>>() {});
37+
}
38+
if (node.isNumber()) {
39+
return node.numberValue();
40+
}
41+
if (node.isBoolean()) {
42+
return node.booleanValue();
43+
}
44+
return null;
45+
} catch (Exception e) {
46+
return json;
47+
}
48+
}
49+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package inha.gdgoc.domain.recruit.dto.response;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import inha.gdgoc.domain.recruit.entity.Answer;
5+
import java.util.List;
6+
7+
public record AnswersResponse(
8+
List<AnswerResponse> answers
9+
) {
10+
public static AnswersResponse from(List<Answer> entities, ObjectMapper objectMapper) {
11+
return new AnswersResponse(
12+
entities.stream()
13+
.map(a -> AnswerResponse.from(a, objectMapper))
14+
.toList()
15+
);
16+
}
17+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package inha.gdgoc.domain.recruit.dto.response;
2+
3+
public record CheckPhoneNumberResponse(boolean isExists) {
4+
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package inha.gdgoc.domain.recruit.dto.response;
2+
3+
public record CheckStudentIdResponse(boolean isExists) {
4+
5+
}

0 commit comments

Comments
 (0)