Skip to content

Commit 1dce22f

Browse files
authored
Merge pull request #301 from GDGoCINHA/develop
merge dev
2 parents dca6cf1 + 076814a commit 1dce22f

3 files changed

Lines changed: 53 additions & 21 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public class RecruitMemberController {
7171
public ResponseEntity<ApiResponse<Void, Void>> recruitMemberAdd(
7272
@RequestBody Map<String, Object> applicationRequest
7373
) {
74-
recruitMemberService.addRecruitMember(applicationRequest);
74+
recruitMemberService.addRecruitMember(applicationRequest, null);
7575

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

8686
return ResponseEntity.ok(ApiResponse.ok(MEMBER_SAVE_SUCCESS));
8787
}

src/main/java/inha/gdgoc/domain/recruit/member/enums/InputType.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,47 @@
11
package inha.gdgoc.domain.recruit.member.enums;
22

3+
import java.util.Arrays;
4+
import java.util.Map;
5+
import java.util.function.Function;
6+
import java.util.stream.Collectors;
37
import lombok.Getter;
48

59
@Getter
610
public enum InputType {
7-
APPLY_MOTIVATION("gdgUserMotive", "String"),
8-
LIFE_STORY("gdgUserStory", "String"),
11+
// Recruit Member
912
INTERESTS("gdgInterest", "List"),
10-
GDG_PERIOD("gdgPeriod", "List"),
11-
ROUTE_TO_KNOW("gdgRoute", "String"),
12-
WANT_TO_GET("gdgExpect", "String"),
1313
EXPECTED_ACTIVITY("gdgWish", "List"),
14-
FEEDBACK("gdgFeedback", "String");
14+
FEEDBACK("gdgFeedback", "String"),
15+
PROOF_FILE("proofFileUrl", "String"),
16+
17+
// Recruit Core
18+
CORE_MOTIVATION("motivation", "String"),
19+
CORE_WISH("wish", "String"),
20+
CORE_STRENGTHS("strengths", "String"),
21+
CORE_PLEDGE("pledge", "String"),
22+
CORE_FILE_URLS("fileUrls", "List"),
23+
24+
// Legacy aliases (keep for existing DB rows / old payloads)
25+
@Deprecated APPLY_MOTIVATION("gdgUserMotive", "String"),
26+
@Deprecated LIFE_STORY("gdgUserStory", "String"),
27+
@Deprecated GDG_PERIOD("gdgPeriod", "List"),
28+
@Deprecated ROUTE_TO_KNOW("gdgRoute", "String"),
29+
@Deprecated WANT_TO_GET("gdgExpect", "String");
1530

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

1936
InputType(String question, String dataType) {
2037
this.question = question;
2138
this.dataType = dataType;
2239
}
2340

2441
public static InputType fromQuestion(String question) {
25-
for (InputType inputType : InputType.values()) {
26-
if (inputType.question.equals(question)) {
27-
return inputType;
28-
}
42+
InputType inputType = LOOKUP.get(question);
43+
if (inputType != null) {
44+
return inputType;
2945
}
3046
throw new IllegalArgumentException("Invalid question value: " + question);
3147
}

src/main/java/inha/gdgoc/domain/recruit/member/service/RecruitMemberService.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import static inha.gdgoc.domain.recruit.member.exception.RecruitMemberErrorCode.RECRUIT_MEMBER_ALREADY_APPLIED;
55

66
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import inha.gdgoc.domain.resource.enums.S3KeyType;
8+
import inha.gdgoc.domain.resource.service.S3Service;
79
import inha.gdgoc.domain.recruit.member.dto.request.ApplicationRequest;
810
import inha.gdgoc.domain.recruit.member.dto.request.RecruitMemberMemoRequest;
911
import inha.gdgoc.domain.recruit.member.dto.request.RecruitMemberRequest;
@@ -28,6 +30,7 @@
2830
import org.springframework.data.domain.Pageable;
2931
import org.springframework.stereotype.Service;
3032
import org.springframework.transaction.annotation.Transactional;
33+
import org.springframework.web.multipart.MultipartFile;
3134

3235
@RequiredArgsConstructor
3336
@Service
@@ -37,9 +40,10 @@ public class RecruitMemberService {
3740
private final AnswerRepository answerRepository;
3841
private final ObjectMapper objectMapper;
3942
private final SemesterCalculator semesterCalculator;
43+
private final S3Service s3Service;
4044

4145
@Transactional
42-
public void addRecruitMember(Map<String, Object> requestPayload) {
46+
public void addRecruitMember(Map<String, Object> requestPayload, MultipartFile file) {
4347
RecruitMemberRequest memberRequest;
4448
Map<String, Object> answers;
4549

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

59+
if (file != null && !file.isEmpty()) {
60+
String key = uploadProofFile(file);
61+
String proofFileUrl = s3Service.getS3FileUrl(key);
62+
answers.put("proofFileUrl", proofFileUrl);
63+
}
64+
5565
RecruitMember member = memberRequest
5666
.toEntity(semesterCalculator.currentSemester());
5767
recruitMemberRepository.save(member);
@@ -72,6 +82,14 @@ public void addRecruitMember(Map<String, Object> requestPayload) {
7282
answerRepository.saveAll(answerEntities);
7383
}
7484

85+
private String uploadProofFile(MultipartFile file) {
86+
try {
87+
return s3Service.upload(0L, S3KeyType.study, file);
88+
} catch (Exception e) {
89+
throw new RuntimeException("증빙 파일 업로드 중 오류가 발생했습니다.", e);
90+
}
91+
}
92+
7593
@Transactional
7694
public void addRecruitMemberMemo(RecruitMemberMemoRequest recruitMemberMemoRequest) {
7795
String cleanPhone = normalizePhoneNumber(recruitMemberMemoRequest.getPhoneNumber());
@@ -144,7 +162,7 @@ private RecruitMemberRequest buildMemberFromNumberedPayload(Map<String, Object>
144162
Map<String, Object> step3 = asMap(payload.get("3"));
145163
Map<String, Object> step4 = asMap(payload.get("4"));
146164
Map<String, Object> step5 = asMap(payload.get("5"));
147-
Map<String, Object> step11 = asMap(payload.get("11"));
165+
Map<String, Object> step6 = asMap(payload.get("6"));
148166

149167
Map<String, Object> member = new HashMap<>();
150168
member.put("name", step2.get("name"));
@@ -155,20 +173,18 @@ private RecruitMemberRequest buildMemberFromNumberedPayload(Map<String, Object>
155173
member.put("gender", step4.get("gender"));
156174
member.put("birth", step4.get("birth"));
157175
member.put("major", step5.get("major"));
158-
member.put("isPayed", step11.getOrDefault("isPayed", false));
176+
member.put("isPayed", step6.getOrDefault("isPayed", false));
159177

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

163181
private Map<String, Object> buildAnswersFromNumberedPayload(Map<String, Object> payload) {
164-
Map<String, Object> step8 = asMap(payload.get("8"));
165-
Map<String, Object> step9 = asMap(payload.get("9"));
166-
Map<String, Object> step10 = asMap(payload.get("10"));
182+
Map<String, Object> step6 = asMap(payload.get("6"));
167183

168184
Map<String, Object> answers = new HashMap<>();
169-
putIfPresent(answers, "gdgInterest", step8.get("gdgInterest"));
170-
putIfPresent(answers, "gdgWish", step9.get("gdgWish"));
171-
putIfPresent(answers, "gdgFeedback", step10.get("gdgFeedback"));
185+
putIfPresent(answers, "gdgInterest", step6.get("gdgInterest"));
186+
putIfPresent(answers, "gdgWish", step6.get("gdgWish"));
187+
putIfPresent(answers, "gdgFeedback", step6.get("gdgFeedback"));
172188

173189
return answers;
174190
}

0 commit comments

Comments
 (0)