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 @@ -71,7 +71,7 @@ public class RecruitMemberController {
public ResponseEntity<ApiResponse<Void, Void>> recruitMemberAdd(
@RequestBody Map<String, Object> applicationRequest
) {
recruitMemberService.addRecruitMember(applicationRequest);
recruitMemberService.addRecruitMember(applicationRequest, null);

return ResponseEntity.ok(ApiResponse.ok(MEMBER_SAVE_SUCCESS));
}
Expand All @@ -81,7 +81,7 @@ public ResponseEntity<ApiResponse<Void, Void>> recruitMemberAddMultipart(
@RequestPart("request") Map<String, Object> applicationRequest,
@RequestPart(value = "file", required = false) MultipartFile file
) {
recruitMemberService.addRecruitMember(applicationRequest);
recruitMemberService.addRecruitMember(applicationRequest, file);

return ResponseEntity.ok(ApiResponse.ok(MEMBER_SAVE_SUCCESS));
}
Expand Down
36 changes: 26 additions & 10 deletions src/main/java/inha/gdgoc/domain/recruit/member/enums/InputType.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,47 @@
package inha.gdgoc.domain.recruit.member.enums;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.Getter;

@Getter
public enum InputType {
APPLY_MOTIVATION("gdgUserMotive", "String"),
LIFE_STORY("gdgUserStory", "String"),
// Recruit Member
INTERESTS("gdgInterest", "List"),
GDG_PERIOD("gdgPeriod", "List"),
ROUTE_TO_KNOW("gdgRoute", "String"),
WANT_TO_GET("gdgExpect", "String"),
EXPECTED_ACTIVITY("gdgWish", "List"),
FEEDBACK("gdgFeedback", "String");
FEEDBACK("gdgFeedback", "String"),
PROOF_FILE("proofFileUrl", "String"),

// Recruit Core
CORE_MOTIVATION("motivation", "String"),
CORE_WISH("wish", "String"),
CORE_STRENGTHS("strengths", "String"),
CORE_PLEDGE("pledge", "String"),
CORE_FILE_URLS("fileUrls", "List"),

// Legacy aliases (keep for existing DB rows / old payloads)
@Deprecated APPLY_MOTIVATION("gdgUserMotive", "String"),
@Deprecated LIFE_STORY("gdgUserStory", "String"),
@Deprecated GDG_PERIOD("gdgPeriod", "List"),
@Deprecated ROUTE_TO_KNOW("gdgRoute", "String"),
@Deprecated WANT_TO_GET("gdgExpect", "String");

private final String question;
private final String dataType;
private static final Map<String, InputType> LOOKUP = Arrays.stream(values())
.collect(Collectors.toUnmodifiableMap(InputType::getQuestion, Function.identity(), (first, second) -> first));

InputType(String question, String dataType) {
this.question = question;
this.dataType = dataType;
}

public static InputType fromQuestion(String question) {
for (InputType inputType : InputType.values()) {
if (inputType.question.equals(question)) {
return inputType;
}
InputType inputType = LOOKUP.get(question);
if (inputType != null) {
return inputType;
}
throw new IllegalArgumentException("Invalid question value: " + question);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import static inha.gdgoc.domain.recruit.member.exception.RecruitMemberErrorCode.RECRUIT_MEMBER_ALREADY_APPLIED;

import com.fasterxml.jackson.databind.ObjectMapper;
import inha.gdgoc.domain.resource.enums.S3KeyType;
import inha.gdgoc.domain.resource.service.S3Service;
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;
Expand All @@ -28,6 +30,7 @@
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@RequiredArgsConstructor
@Service
Expand All @@ -37,9 +40,10 @@ public class RecruitMemberService {
private final AnswerRepository answerRepository;
private final ObjectMapper objectMapper;
private final SemesterCalculator semesterCalculator;
private final S3Service s3Service;

@Transactional
public void addRecruitMember(Map<String, Object> requestPayload) {
public void addRecruitMember(Map<String, Object> requestPayload, MultipartFile file) {
RecruitMemberRequest memberRequest;
Map<String, Object> answers;

Expand All @@ -52,6 +56,12 @@ public void addRecruitMember(Map<String, Object> requestPayload) {
answers = buildAnswersFromNumberedPayload(requestPayload);
}

if (file != null && !file.isEmpty()) {
String key = uploadProofFile(file);
String proofFileUrl = s3Service.getS3FileUrl(key);
answers.put("proofFileUrl", proofFileUrl);
}

RecruitMember member = memberRequest
.toEntity(semesterCalculator.currentSemester());
recruitMemberRepository.save(member);
Expand All @@ -72,6 +82,14 @@ public void addRecruitMember(Map<String, Object> requestPayload) {
answerRepository.saveAll(answerEntities);
}

private String uploadProofFile(MultipartFile file) {
try {
return s3Service.upload(0L, S3KeyType.study, file);
} catch (Exception e) {
throw new RuntimeException("증빙 파일 μ—…λ‘œλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.", e);
}
}

@Transactional
public void addRecruitMemberMemo(RecruitMemberMemoRequest recruitMemberMemoRequest) {
String cleanPhone = normalizePhoneNumber(recruitMemberMemoRequest.getPhoneNumber());
Expand Down Expand Up @@ -144,7 +162,7 @@ private RecruitMemberRequest buildMemberFromNumberedPayload(Map<String, Object>
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> step6 = asMap(payload.get("6"));

Map<String, Object> member = new HashMap<>();
member.put("name", step2.get("name"));
Expand All @@ -155,20 +173,18 @@ private RecruitMemberRequest buildMemberFromNumberedPayload(Map<String, Object>
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));
member.put("isPayed", step6.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> step6 = asMap(payload.get("6"));

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

return answers;
}
Expand Down
Loading