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 @@ -10,7 +10,6 @@
import static inha.gdgoc.domain.recruit.member.controller.message.RecruitMemberMessage.PHONE_NUMBER_DUPLICATION_CHECK_SUCCESS;
import static inha.gdgoc.domain.recruit.member.controller.message.RecruitMemberMessage.STUDENT_ID_DUPLICATION_CHECK_SUCCESS;

import inha.gdgoc.domain.recruit.member.dto.request.ApplicationRequest;
import inha.gdgoc.domain.recruit.member.dto.request.CheckEmailRequest;
import inha.gdgoc.domain.recruit.member.dto.request.CheckPhoneNumberRequest;
import inha.gdgoc.domain.recruit.member.dto.request.CheckStudentIdRequest;
Expand Down Expand Up @@ -50,6 +49,7 @@
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.Map;

@Tag(name = "Recruit - Members", description = "λ¦¬ν¬λ£¨νŒ… μ§€μ›μž 관리 API")
@RequestMapping("/api/v1/recruit/member")
Expand All @@ -69,7 +69,7 @@ public class RecruitMemberController {

@PostMapping(value = "/apply", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ApiResponse<Void, Void>> recruitMemberAdd(
@RequestBody ApplicationRequest applicationRequest
@RequestBody Map<String, Object> applicationRequest
) {
recruitMemberService.addRecruitMember(applicationRequest);

Expand All @@ -78,7 +78,7 @@ public ResponseEntity<ApiResponse<Void, Void>> recruitMemberAdd(

@PostMapping(value = "/apply", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<ApiResponse<Void, Void>> recruitMemberAddMultipart(
@RequestPart("request") ApplicationRequest applicationRequest,
@RequestPart("request") Map<String, Object> applicationRequest,
@RequestPart(value = "file", required = false) MultipartFile file
) {
recruitMemberService.addRecruitMember(applicationRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@
@Getter
public class RecruitMemberRequest {
private String name;
private String grade;
private String studentId;
private String enrolledClassification;
private String phoneNumber;
private String nationality;
private String email;
private String gender;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd")
Expand All @@ -33,11 +31,9 @@ public RecruitMember toEntity(AdmissionSemester admissionSemester) {
String cleanPhone = phoneNumber.replaceAll("[^0-9]", "");
return RecruitMember.builder()
.name(name)
.grade(grade)
.studentId(studentId)
.enrolledClassification(EnrolledClassification.fromStatus(enrolledClassification))
.phoneNumber(cleanPhone)
.nationality(nationality)
.email(email)
.gender(Gender.fromType(gender))
.birth(birth)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,6 @@ public class RecruitMember extends BaseEntity {
@Column(name = "name", nullable = false)
private String name;

@Column(name = "grade", nullable = false)
private String grade;

@Column(name = "student_id", nullable = false, unique = true)
private String studentId;

Expand All @@ -51,9 +48,6 @@ public class RecruitMember extends BaseEntity {
@Column(name = "phone_number", nullable = false, unique = true)
private String phoneNumber;

@Column(name = "nationality", nullable = false)
private String nationality;

@Column(name = "email", nullable = false)
private String email;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import inha.gdgoc.domain.recruit.member.dto.request.ApplicationRequest;
import inha.gdgoc.domain.recruit.member.dto.request.RecruitMemberMemoRequest;
import inha.gdgoc.domain.recruit.member.dto.request.RecruitMemberRequest;
import inha.gdgoc.domain.recruit.member.dto.response.CheckEmailResponse;
import inha.gdgoc.domain.recruit.member.dto.response.CheckPhoneNumberResponse;
import inha.gdgoc.domain.recruit.member.dto.response.CheckStudentIdResponse;
Expand All @@ -19,7 +20,9 @@
import inha.gdgoc.domain.recruit.member.repository.RecruitMemberMemoRepository;
import inha.gdgoc.domain.recruit.member.repository.RecruitMemberRepository;
import inha.gdgoc.global.util.SemesterCalculator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand All @@ -36,12 +39,24 @@ public class RecruitMemberService {
private final SemesterCalculator semesterCalculator;

@Transactional
public void addRecruitMember(ApplicationRequest applicationRequest) {
RecruitMember member = applicationRequest.getMember()
public void addRecruitMember(Map<String, Object> requestPayload) {
RecruitMemberRequest memberRequest;
Map<String, Object> answers;

if (requestPayload.containsKey("member")) {
ApplicationRequest applicationRequest = objectMapper.convertValue(requestPayload, ApplicationRequest.class);
memberRequest = applicationRequest.getMember();
answers = normalizeAnswers(applicationRequest.getAnswers());
} else {
memberRequest = buildMemberFromNumberedPayload(requestPayload);
answers = buildAnswersFromNumberedPayload(requestPayload);
}

RecruitMember member = memberRequest
.toEntity(semesterCalculator.currentSemester());
recruitMemberRepository.save(member);

List<Answer> answers = applicationRequest.getAnswers().entrySet().stream()
List<Answer> answerEntities = answers.entrySet().stream()
.map(entry -> {
try {
// Object β†’ JSON String λ³€ν™˜
Expand All @@ -54,7 +69,7 @@ public void addRecruitMember(ApplicationRequest applicationRequest) {
})
.toList();

answerRepository.saveAll(answers);
answerRepository.saveAll(answerEntities);
}

@Transactional
Expand Down Expand Up @@ -123,4 +138,64 @@ private String normalizePhoneNumber(String phoneNumber) {
return phoneNumber.replaceAll("[^0-9]", "");
}

@SuppressWarnings("unchecked")
private RecruitMemberRequest buildMemberFromNumberedPayload(Map<String, Object> payload) {
Map<String, Object> step2 = asMap(payload.get("2"));
Map<String, Object> step3 = asMap(payload.get("3"));
Map<String, Object> step4 = asMap(payload.get("4"));
Map<String, Object> step5 = asMap(payload.get("5"));
Map<String, Object> step11 = asMap(payload.get("11"));

Map<String, Object> member = new HashMap<>();
member.put("name", step2.get("name"));
member.put("studentId", step2.get("studentId"));
member.put("enrolledClassification", step2.get("enrolledClassification"));
member.put("phoneNumber", step3.get("phoneNumber"));
member.put("email", step4.get("email"));
member.put("gender", step4.get("gender"));
member.put("birth", step4.get("birth"));
member.put("major", step5.get("major"));
member.put("isPayed", step11.getOrDefault("isPayed", false));

return objectMapper.convertValue(member, RecruitMemberRequest.class);
}

private Map<String, Object> buildAnswersFromNumberedPayload(Map<String, Object> payload) {
Map<String, Object> step8 = asMap(payload.get("8"));
Map<String, Object> step9 = asMap(payload.get("9"));
Map<String, Object> step10 = asMap(payload.get("10"));

Map<String, Object> answers = new HashMap<>();
putIfPresent(answers, "gdgInterest", step8.get("gdgInterest"));
putIfPresent(answers, "gdgWish", step9.get("gdgWish"));
putIfPresent(answers, "gdgFeedback", step10.get("gdgFeedback"));

return answers;
}

@SuppressWarnings("unchecked")
private Map<String, Object> asMap(Object value) {
if (value instanceof Map<?, ?> raw) {
return (Map<String, Object>) raw;
}
return Map.of();
}

private void putIfPresent(Map<String, Object> target, String key, Object value) {
if (value != null) {
target.put(key, value);
}
}

private Map<String, Object> normalizeAnswers(Map<String, Object> rawAnswers) {
Map<String, Object> answers = new HashMap<>();
if (rawAnswers == null) {
return answers;
}
putIfPresent(answers, "gdgInterest", rawAnswers.get("gdgInterest"));
putIfPresent(answers, "gdgWish", rawAnswers.get("gdgWish"));
putIfPresent(answers, "gdgFeedback", rawAnswers.get("gdgFeedback"));
return answers;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
ALTER TABLE IF EXISTS recruit_member
DROP COLUMN IF EXISTS grade,
DROP COLUMN IF EXISTS nationality;

ALTER TABLE IF EXISTS answer
DROP COLUMN IF EXISTS gdg_user_motive,
DROP COLUMN IF EXISTS gdg_user_story,
DROP COLUMN IF EXISTS gdg_period,
DROP COLUMN IF EXISTS gdg_route,
DROP COLUMN IF EXISTS gdg_expect;
Loading