Skip to content

Commit 58461b6

Browse files
Merge pull request #378 from JNU-econovation/feature/BE-133
[BE-133] year에 해당하는 지원서 전체 삭제 기능
2 parents d914a1c + a9e6f9c commit 58461b6

File tree

24 files changed

+117
-4
lines changed

24 files changed

+117
-4
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.econovation.recruit.api.applicant.controller;
22

3+
import static com.econovation.recruitcommon.consts.RecruitStatic.APPLICANTS_BY_YEAR_SUCCESS_DELETE_MESSAGE;
34
import static com.econovation.recruitcommon.consts.RecruitStatic.APPLICANT_SUCCESS_REGISTER_MESSAGE;
45
import static com.econovation.recruitcommon.consts.RecruitStatic.PASS_STATE_KEY;
56

@@ -12,7 +13,6 @@
1213
import com.econovation.recruit.api.applicant.usecase.TimeTableLoadUseCase;
1314
import com.econovation.recruit.api.applicant.usecase.TimeTableRegisterUseCase;
1415
import com.econovation.recruit.api.applicant.validate.ApplicantValidator;
15-
import com.econovation.recruit.api.recruitment.usecase.RecruitmentUseCase;
1616
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
1717
import com.econovation.recruitcommon.annotation.ApiErrorExceptionsExample;
1818
import com.econovation.recruitcommon.annotation.TimeTrace;
@@ -50,7 +50,6 @@ public class ApplicantController {
5050
private final CommandGateway commandGateway;
5151
private final ApplicantValidator applicantValidator;
5252
private final ApplicantCommandUseCase applicantCommandUseCase;
53-
private final RecruitmentUseCase applicationManagementUseCase;
5453
private final LatestRecruitmentVo latestRecruitInfo;
5554

5655
@Operation(summary = "지원자가 지원서를 작성합니다.", description = "반환 값은 생성된 지원자의 ID입니다.")
@@ -175,4 +174,11 @@ public ResponseEntity<List<GetApplicantsStatusResponse>> getApplicantsStatus(
175174
applicantQueryUseCase.getApplicantsStatus(year, sortType);
176175
return new ResponseEntity<>(result, HttpStatus.OK);
177176
}
177+
178+
@Operation(summary = "year에 해당하는 모든 지원서를 삭제합니다.")
179+
@DeleteMapping("/applicants/all/{year}")
180+
public ResponseEntity<String> deleteApplicants(@PathVariable("year") Integer year) {
181+
applicantCommandUseCase.deleteByYear(year);
182+
return new ResponseEntity<>(APPLICANTS_BY_YEAR_SUCCESS_DELETE_MESSAGE, HttpStatus.OK);
183+
}
178184
}

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

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@
44
import com.econovation.recruit.api.applicant.usecase.ApplicantCommandUseCase;
55
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
66
import com.econovation.recruitdomain.common.aop.domainEvent.Events;
7+
import com.econovation.recruitdomain.domains.applicant.adaptor.AnswerAdaptor;
78
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswer;
89
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswerAdaptor;
910
import com.econovation.recruitdomain.domains.applicant.domain.state.ApplicantState;
1011
import com.econovation.recruitdomain.domains.applicant.event.domainevent.ApplicantRegisterEvent;
1112
import com.econovation.recruitdomain.domains.applicant.event.domainevent.ApplicantStateModifyEvent;
13+
import com.econovation.recruitdomain.domains.board.adaptor.BoardAdaptor;
14+
import com.econovation.recruitdomain.domains.card.adaptor.CardAdaptor;
15+
import com.econovation.recruitdomain.domains.label.adaptor.LabelAdaptor;
16+
import com.econovation.recruitdomain.domains.score.adaptor.ScoreAdaptor;
17+
import com.econovation.recruitdomain.domains.timetable.adaptor.TimeTableAdapter;
18+
import java.util.List;
1219
import java.util.Map;
1320
import java.util.UUID;
1421
import lombok.RequiredArgsConstructor;
@@ -18,9 +25,15 @@
1825
@Service
1926
@RequiredArgsConstructor
2027
public class AnswerCommandService implements ApplicantCommandUseCase {
21-
private final MongoAnswerAdaptor answerAdaptor;
28+
private final MongoAnswerAdaptor mongoAnswerAdaptor;
2229
private final ApplicantStateUpdateEventHandler applicantStateUpdateEventHandler;
2330
private final LatestRecruitmentVo latestRecruitInfo;
31+
private final AnswerAdaptor answerAdaptor;
32+
private final TimeTableAdapter timeTableAdapter;
33+
private final ScoreAdaptor scoreAdaptor;
34+
private final LabelAdaptor labelAdaptor;
35+
private final CardAdaptor cardAdaptor;
36+
private final BoardAdaptor boardAdaptor;
2437

2538
@Override
2639
@Transactional
@@ -51,7 +64,7 @@ public UUID execute(Map<String, Object> qna, UUID id) {
5164
.build();
5265
// 학번으로 중복 체크
5366
// validateRegisterApplicant(qna);
54-
answerAdaptor.save(answer);
67+
mongoAnswerAdaptor.save(answer);
5568

5669
String name = qna.get("name").toString();
5770
String hopeField = qna.get("field").toString();
@@ -62,4 +75,19 @@ public UUID execute(Map<String, Object> qna, UUID id) {
6275
Events.raise(applicantRegisterEvent);
6376
return null;
6477
}
78+
79+
@Override
80+
@Transactional
81+
public void deleteByYear(Integer year) {
82+
List<String> applicantIds = answerAdaptor.findApplicantIdsByYear(year);
83+
mongoAnswerAdaptor.delete(year);
84+
85+
timeTableAdapter.deleteAllByApplicantIds(applicantIds);
86+
scoreAdaptor.deleteAllByApplicantIds(applicantIds);
87+
labelAdaptor.deleteAllByApplicantIds(applicantIds);
88+
89+
List<Long> cardIds = cardAdaptor.findAllByApplicantIds(applicantIds);
90+
boardAdaptor.deleteAllByCardIds(cardIds);
91+
cardAdaptor.deleteAllByApplicantIds(applicantIds);
92+
}
6593
}

server/Recruit-Api/src/main/java/com/econovation/recruit/api/applicant/usecase/ApplicantCommandUseCase.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ public interface ApplicantCommandUseCase {
1111
String execute(String applicantId, String state);
1212

1313
UUID execute(Map<String, Object> blocks, UUID id);
14+
15+
void deleteByYear(Integer year);
1416
}

server/Recruit-Api/src/main/java/com/econovation/recruit/api/config/security/SecurityConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
8787
.hasAnyRole("ROLE_OPERATION", "ROLE_PRESIDENT")
8888
.mvcMatchers(HttpMethod.POST, "/api/v1/recruitment")
8989
.hasAnyRole("ROLE_OPERATION", "ROLE_PRESIDENT")
90+
.mvcMatchers(HttpMethod.DELETE, "/api/v1/applicants/all/*")
91+
.hasAnyRole("ROLE_OPERATION")
9092
.anyRequest()
9193
.hasAnyRole(RolePattern);
9294

server/Recruit-Common/src/main/java/com/econovation/recruitcommon/consts/RecruitStatic.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public class RecruitStatic {
6565
public static final String COMMENT_SUCCESS_UPDATE_MESSAGE = "성공적으로 댓글이 수정됐습니다";
6666
public static final String WORK_CARD_SUCCESS_UPDATE_MESSAGE = "성공적으로 업무카드가 수정됐습니다";
6767
public static final List<String> TIMETABLE_APPLICANT_FIELD = List.of("field", "name");
68+
public static String APPLICANTS_BY_YEAR_SUCCESS_DELETE_MESSAGE =
69+
"성공적으로 year에 해당하는 전체 지원서가 삭제되었습니다";
6870

6971
public static final String LOGOUT_SUCCESS_MESSAGE = "성공적으로 로그아웃 됐습니다";
7072

server/Recruit-Domain/src/main/java/com/econovation/recruitdomain/domains/applicant/adaptor/AnswerAdaptor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,12 @@ public Optional<MongoAnswer> findByIdAndRequestedFields(
194194
MongoAnswer result = mongoTemplate.findOne(query, MongoAnswer.class);
195195
return Optional.ofNullable(result);
196196
}
197+
198+
public List<String> findApplicantIdsByYear(Integer year) {
199+
Query query = new Query().addCriteria(Criteria.where("year").is(year));
200+
query.fields().include("id");
201+
202+
List<MongoAnswer> answers = mongoTemplate.find(query, MongoAnswer.class);
203+
return answers.stream().map(MongoAnswer::getId).toList();
204+
}
197205
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,8 @@ public boolean existsByAnswer(String studentId, Integer year) {
3737
query.addCriteria(Criteria.where("qna.classOf").is(studentId).and("year").is(year));
3838
return mongoTemplate.exists(query, MongoAnswer.class);
3939
}
40+
41+
public void delete(Integer year) {
42+
mongoAnswerRepository.deleteByYear(year);
43+
}
4044
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ public interface MongoAnswerRepository extends MongoRepository<MongoAnswer, Stri
99

1010
// @Query("{'qna': {$regex: ?0, $options: 'i', $limit: 10}}")
1111
// List<MongoAnswer> search(String searchKeyword);
12+
void deleteByYear(Integer year);
1213
}

server/Recruit-Domain/src/main/java/com/econovation/recruitdomain/domains/board/adaptor/BoardAdaptor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,10 @@ public void delete(Board board) {
8686
public void saveAll(List<Board> board) {
8787
boardRepository.saveAll(board);
8888
}
89+
90+
@Override
91+
public void deleteAllByCardIds(List<Long> cardIds) {
92+
boardRepository.deleteAllByCardIdIn(cardIds);
93+
}
94+
;
8995
}

server/Recruit-Domain/src/main/java/com/econovation/recruitdomain/domains/board/domain/BoardRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ public interface BoardRepository extends JpaRepository<Board, Integer> {
1717
List<Board> findByColumnIdIn(List<Integer> columnsIds);
1818

1919
Optional<Board> findByCardId(Long cardId);
20+
21+
void deleteAllByCardIdIn(List<Long> cardIds);
2022
}

0 commit comments

Comments
 (0)