Skip to content

Commit cd35a60

Browse files
authored
[BE-146] 합/불 상태 변경 가능 여부 계산 로직 추가 (#386)
* move: 패키지 이동 * feat: NotOperatedException 정의 * refactor: 상태 변경 로직 수정 - 상태 변경을 할 수 있는지 검증하는 메소드 추가 * refactor: swagger 명세 수정 * refactor: 응답 데이터에 isPassable, isNonPassable 추가 * refactor: 리뷰 반영 * refactor: 리뷰 반영 2
1 parent 48477c8 commit cd35a60

File tree

19 files changed

+127
-39
lines changed

19 files changed

+127
-39
lines changed

server/Recruit-Api/src/main/java/com/econovation/recruit/api/applicant/controller/ApplicantController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,12 @@ public ResponseEntity<Map<String, String>> updateStatus(
171171
}
172172

173173
@Operation(
174-
summary = "지원서의 합/불 상태를 조회합니다. (합/불 관리자 페이지 전용)",
174+
summary = "지원서의 합/불 상태를 조회합니다.",
175175
description =
176176
"""
177-
응답으로 오는 passState 값의 종류는 non-processed, non-passed, first-passed, final-passed 입니다.
177+
- passState : non-processed | non-passed | first-passed | final-passed
178+
- isPassable : 현재 상태에서 pass 할 수 있는지 여부
179+
- isNonPassable : 현재 상태에서 non-pass 할 수 있는지 여부
178180
""")
179181
@GetMapping("/year/{year}/applicants/pass-state")
180182
public ResponseEntity<List<GetApplicantsStatusResponse>> getApplicantsStatus(
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.econovation.recruit.api.applicant.dto;
22

3-
public record ApplicantStateResponse(String passState) {
43

5-
public static ApplicantStateResponse of(String passState) {
6-
return new ApplicantStateResponse(passState);
4+
public record ApplicantStateResponse(String passState, boolean isPassable, boolean isNonPassable) {
5+
6+
public static ApplicantStateResponse of(String passState, boolean isPassable, boolean isNonPassable) {
7+
return new ApplicantStateResponse(passState, isPassable, isNonPassable);
78
}
89
}

server/Recruit-Api/src/main/java/com/econovation/recruit/api/applicant/dto/GetApplicantsStatusResponse.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static com.econovation.recruitcommon.consts.RecruitStatic.PASS_STATE_KEY;
44

55
import com.econovation.recruitdomain.domains.applicant.domain.state.ApplicantState;
6+
import com.econovation.recruitdomain.domains.applicant.domain.state.PeriodStates;
67
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantWrongStateException;
78
import java.util.Map;
89
import lombok.AllArgsConstructor;
@@ -21,16 +22,20 @@ public class GetApplicantsStatusResponse {
2122
private Integer year;
2223
private ApplicantStateResponse state;
2324

24-
public static GetApplicantsStatusResponse of(Map<String, Object> result) {
25+
public static GetApplicantsStatusResponse of(Map<String, Object> result, PeriodStates period) {
2526
if (result.get(PASS_STATE_KEY) instanceof ApplicantState applicantState) {
27+
String passState = applicantState.getPassState();
28+
boolean isPassable = applicantState.isPassable(period);
29+
boolean isNonPassable = applicantState.isNonPassable(period);
30+
2631
return GetApplicantsStatusResponse.builder()
2732
.field((String) result.get("field"))
2833
.field1((String) result.get("field1"))
2934
.field2((String) result.get("field2"))
3035
.name((String) result.get("name"))
3136
.id((String) result.get("id"))
3237
.year((Integer) result.get("year"))
33-
.state(ApplicantStateResponse.of(applicantState.getPassState()))
38+
.state(ApplicantStateResponse.of(passState, isPassable, isNonPassable))
3439
.build();
3540
}
3641
throw ApplicantWrongStateException.wrongStatusException;

server/Recruit-Api/src/main/java/com/econovation/recruit/api/applicant/service/ApplicantService.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
import com.econovation.recruit.api.applicant.dto.AnswersResponseDto;
77
import com.econovation.recruit.api.applicant.dto.GetApplicantsStatusResponse;
88
import com.econovation.recruit.api.applicant.query.AnswerQuery;
9+
import com.econovation.recruit.api.applicant.state.support.PeriodCalculator;
910
import com.econovation.recruit.api.applicant.usecase.ApplicantQueryUseCase;
1011
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
1112
import com.econovation.recruit.utils.sort.SortHelper;
1213
import com.econovation.recruit.utils.vo.PageInfo;
1314
import com.econovation.recruitdomain.domains.applicant.adaptor.AnswerAdaptor;
1415
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswer;
16+
import com.econovation.recruitdomain.domains.applicant.domain.state.PeriodStates;
1517
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantNotFoundException;
1618
import java.util.Collections;
1719
import java.util.HashMap;
@@ -30,6 +32,7 @@ public class ApplicantService implements ApplicantQueryUseCase {
3032
private final QueryGateway queryGateway;
3133
private final SortHelper<MongoAnswer> sortHelper;
3234
private final LatestRecruitmentVo latestRecruitInfo;
35+
private final PeriodCalculator periodCalculator;
3336

3437
@Transactional(readOnly = true)
3538
public Map<String, Object> execute(String answerId) {
@@ -241,7 +244,12 @@ public List<Map<String, Object>> execute(List<String> fields, Integer page) {
241244
public List<GetApplicantsStatusResponse> getApplicantsStatus(Integer year, String sortType) {
242245
List<MongoAnswer> result = answerAdaptor.findByYear(year);
243246
List<Map<String, Object>> sortedResult = sortAndAddIds(result, sortType);
244-
return sortedResult.stream().map(GetApplicantsStatusResponse::of).toList();
247+
248+
PeriodStates period = periodCalculator.execute();
249+
250+
return sortedResult.stream()
251+
.map(map -> GetApplicantsStatusResponse.of(map, period))
252+
.toList();
245253
}
246254

247255
private List<Map<String, Object>> sortAndAddIds(List<MongoAnswer> result, String sortType) {

server/Recruit-Api/src/main/java/com/econovation/recruit/api/applicant/validate/ApplicantValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
44
import com.econovation.recruitcommon.exception.RecruitCodeException;
55
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswerAdaptor;
6-
import com.econovation.recruitdomain.domains.applicant.domain.state.RecruitmentStates;
6+
import com.econovation.recruitdomain.domains.recruitment.domain.RecruitmentStates;
77
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantDuplicateSubmitException;
88
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantOutOfDateException;
99
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantWrongPositionException;

server/Recruit-Api/src/main/java/com/econovation/recruit/api/recruitment/quartz/RecruitmentJob.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.econovation.recruit.api.recruitment.quartz;
22

33
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
4-
import com.econovation.recruitdomain.domains.applicant.domain.state.RecruitmentStates;
4+
import com.econovation.recruitdomain.domains.recruitment.domain.RecruitmentStates;
55
import com.econovation.recruitdomain.domains.recruitment.domain.Recruitment;
66
import com.econovation.recruitdomain.domains.recruitment.exception.RecruitmentNotFoundException;
77
import com.econovation.recruitdomain.out.RecruitmentPort;

server/Recruit-Api/src/main/java/com/econovation/recruit/api/recruitment/service/RecruitmentService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.econovation.recruit.api.recruitment.quartz.RecruitmentScheduler;
44
import com.econovation.recruit.api.recruitment.usecase.RecruitmentUseCase;
55
import com.econovation.recruitdomain.common.aop.domainEvent.Events;
6-
import com.econovation.recruitdomain.domains.applicant.domain.state.RecruitmentStates;
6+
import com.econovation.recruitdomain.domains.recruitment.domain.RecruitmentStates;
77
import com.econovation.recruitdomain.domains.recruitment.domain.Recruitment;
88
import com.econovation.recruitdomain.domains.recruitment.event.RecruitmentRegistered;
99
import com.econovation.recruitdomain.domains.recruitment.event.RecruitmentTerminated;

server/Recruit-Api/src/main/java/com/econovation/recruit/api/recruitment/util/LatestRecruitmentVo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.econovation.recruit.api.recruitment.util;
22

33
import com.econovation.recruitdomain.common.aop.redissonLock.RedissonLock;
4-
import com.econovation.recruitdomain.domains.applicant.domain.state.RecruitmentStates;
4+
import com.econovation.recruitdomain.domains.recruitment.domain.RecruitmentStates;
55
import com.econovation.recruitdomain.domains.recruitment.domain.Recruitment;
66
import java.time.LocalDateTime;
77
import java.util.Objects;

server/Recruit-Domain/src/main/java/com/econovation/recruitdomain/domains/applicant/domain/state/ApplicantState.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ public void nonPass(PeriodStates period) {
1818
this.passState = this.passState.nonPass(period);
1919
}
2020

21+
public boolean isPassable(PeriodStates period){ return passState.isPassable(period); }
22+
23+
public boolean isNonPassable(PeriodStates period){ return passState.isNonPassable(period); }
24+
2125
public String getPassState() {
2226
return this.passState.toString();
2327
}

server/Recruit-Domain/src/main/java/com/econovation/recruitdomain/domains/applicant/domain/state/PassStates.java

Lines changed: 75 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.econovation.recruitdomain.domains.applicant.domain.state;
22

33
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantWrongStateException;
4+
import com.econovation.recruitdomain.domains.applicant.exception.NotOperatedException;
45
import java.util.Arrays;
56
import lombok.Getter;
67

@@ -9,68 +10,119 @@ public enum PassStates {
910
NON_PROCESSED("non-processed") {
1011
@Override
1112
public PassStates pass(PeriodStates period) {
12-
if (period.equals(PeriodStates.FIRST_DISCUSSION)) return PassStates.FIRST_PASSED;
13+
if (isPassable(period)) return PassStates.FIRST_PASSED;
1314
else return this;
1415
}
1516

1617
@Override
1718
public PassStates nonPass(PeriodStates period) {
18-
if (period.equals(PeriodStates.FIRST_DISCUSSION)) return PassStates.FIRST_FAILED;
19+
if (isNonPassable(period)) return PassStates.FIRST_FAILED;
1920
else return this;
2021
}
22+
23+
@Override
24+
public boolean isPassable(PeriodStates period) {
25+
return period.equals(PeriodStates.FIRST_DISCUSSION);
26+
}
27+
28+
@Override
29+
public boolean isNonPassable(PeriodStates period) {
30+
return period.equals(PeriodStates.FIRST_DISCUSSION);
31+
}
2132
},
2233
FIRST_PASSED("first-passed") {
2334
@Override
2435
public PassStates pass(PeriodStates period) {
25-
if (period.equals(PeriodStates.FIRST_DISCUSSION)) return this;
26-
else if (period.equals(PeriodStates.FINAL_DISCUSSION)) return PassStates.FINAL_PASSED;
27-
else return PassStates.FINAL_FAILED;
36+
if (isPassable(period)) return PassStates.FINAL_PASSED;
37+
else throw NotOperatedException.EXCEPTION;
2838
}
2939

3040
@Override
3141
public PassStates nonPass(PeriodStates period) {
32-
if (period.equals(PeriodStates.FIRST_DISCUSSION)) return PassStates.FIRST_FAILED;
33-
else if (period.equals(PeriodStates.FINAL_DISCUSSION)) return PassStates.FINAL_FAILED;
34-
else return this;
42+
if (isNonPassable(period)) {
43+
if (period.equals(PeriodStates.FIRST_DISCUSSION))
44+
return PassStates.FIRST_FAILED;
45+
else
46+
return PassStates.FINAL_FAILED;
47+
}
48+
49+
else throw NotOperatedException.EXCEPTION;
50+
}
51+
52+
@Override
53+
public boolean isPassable(PeriodStates period) {
54+
return period.equals(PeriodStates.FINAL_DISCUSSION);
55+
}
56+
57+
@Override
58+
public boolean isNonPassable(PeriodStates period) {
59+
return period.equals(PeriodStates.FIRST_DISCUSSION) || period.equals(PeriodStates.FINAL_DISCUSSION);
3560
}
3661
},
3762
FIRST_FAILED("first-failed") {
3863
@Override
3964
public PassStates pass(PeriodStates period) {
40-
if (period.equals(PeriodStates.FIRST_DISCUSSION)) return PassStates.FIRST_PASSED;
65+
if (isPassable(period)) return PassStates.FIRST_PASSED;
4166
else return this;
4267
}
4368

4469
@Override
4570
public PassStates nonPass(PeriodStates period) {
46-
return this;
71+
throw NotOperatedException.EXCEPTION;
72+
}
73+
74+
@Override
75+
public boolean isPassable(PeriodStates period) {
76+
return period.equals(PeriodStates.FIRST_DISCUSSION);
77+
}
78+
79+
@Override
80+
public boolean isNonPassable(PeriodStates period) {
81+
return false;
4782
}
4883
},
4984
FINAL_PASSED("final-passed") {
5085
@Override
5186
public PassStates pass(PeriodStates period) {
52-
return this;
87+
throw NotOperatedException.EXCEPTION;
5388
}
5489

5590
@Override
5691
public PassStates nonPass(PeriodStates period) {
57-
if (period.equals(PeriodStates.FIRST_DISCUSSION))
58-
return this; // 1차 합격자 논의 기간에 최종합격 상태에 대한 요청이 있으면 에러를..?
59-
else if (period.equals(PeriodStates.FINAL_DISCUSSION)) return PassStates.FIRST_PASSED;
60-
else return this;
92+
if (isNonPassable(period)) return PassStates.FINAL_FAILED;
93+
else throw NotOperatedException.EXCEPTION;
94+
}
95+
96+
@Override
97+
public boolean isPassable(PeriodStates period) {
98+
return false;
99+
}
100+
101+
@Override
102+
public boolean isNonPassable(PeriodStates period) {
103+
return period.equals(PeriodStates.FINAL_DISCUSSION);
61104
}
62105
},
63106
FINAL_FAILED("final-failed") {
64107
@Override
65108
public PassStates pass(PeriodStates period) {
66-
if (period.equals(PeriodStates.FIRST_DISCUSSION)) return this;
67-
else if (period.equals(PeriodStates.FINAL_DISCUSSION)) return PassStates.FIRST_PASSED;
68-
else return this;
109+
if(isPassable(period)) return PassStates.FINAL_PASSED;
110+
else throw NotOperatedException.EXCEPTION;
69111
}
70112

71113
@Override
72114
public PassStates nonPass(PeriodStates period) {
73-
return this;
115+
throw NotOperatedException.EXCEPTION;
116+
}
117+
118+
@Override
119+
public boolean isPassable(PeriodStates period) {
120+
return period.equals(PeriodStates.FINAL_DISCUSSION);
121+
}
122+
123+
@Override
124+
public boolean isNonPassable(PeriodStates period) {
125+
return false;
74126
}
75127
};
76128

@@ -84,6 +136,10 @@ public PassStates nonPass(PeriodStates period) {
84136

85137
public abstract PassStates nonPass(PeriodStates period);
86138

139+
public abstract boolean isPassable(PeriodStates period);
140+
141+
public abstract boolean isNonPassable(PeriodStates period);
142+
87143
public static PassStates findStatus(String state) {
88144
return Arrays.stream(PassStates.values())
89145
.filter(s -> s.getState().equals(state))

0 commit comments

Comments
 (0)