Skip to content

Commit b324e4b

Browse files
authored
[Feat] - email task selection remove (#57)
* feat: implement email selection delete * test : write test code for email selection delete * fix : change api endpoint * fix : fix endpoint
1 parent 137071f commit b324e4b

File tree

6 files changed

+86
-14
lines changed

6 files changed

+86
-14
lines changed

src/main/java/gdsc/konkuk/platformcore/application/email/EmailService.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.util.HashSet;
1212
import java.util.List;
1313
import java.util.Set;
14+
15+
import jakarta.validation.constraints.Email;
1416
import lombok.RequiredArgsConstructor;
1517
import org.springframework.data.domain.Page;
1618
import org.springframework.data.domain.PageRequest;
@@ -30,11 +32,6 @@ public List<EmailTask> getAllTaskAsList() {
3032
return emailTaskRepository.findAll();
3133
}
3234

33-
public Page<EmailTask> getAllTaskWithPage(int pageNo) {
34-
Pageable pageable = PageRequest.of(pageNo, 10);
35-
return emailTaskRepository.findAll(pageable);
36-
}
37-
3835
public EmailTask getTaskDetails(Long taskId) {
3936
return findEmailTaskById(emailTaskRepository, taskId);
4037
}
@@ -75,6 +72,12 @@ public void delete(Long emailId) {
7572
emailTaskRepository.delete(task);
7673
}
7774

75+
@Transactional
76+
public void deleteAll(List<Long> emailIds) {
77+
List<EmailTask> tasks = emailTaskRepository.findAllById(emailIds);
78+
emailTaskRepository.deleteAllInBatch(tasks);
79+
}
80+
7881
private void validateEmailTaskAlreadySent(EmailTask emailTask) {
7982
if (emailTask.isSent()) {
8083
throw EmailAlreadyProcessedException.of(EmailErrorCode.EMAIL_ALREADY_PROCESSED);

src/main/java/gdsc/konkuk/platformcore/application/email/EmailTaskFacade.java

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import gdsc.konkuk.platformcore.global.scheduler.TaskScheduler;
66
import java.time.LocalDateTime;
77
import java.time.temporal.ChronoUnit;
8+
import java.util.List;
9+
810
import lombok.RequiredArgsConstructor;
911
import org.springframework.stereotype.Service;
1012
import org.springframework.transaction.annotation.Transactional;
@@ -35,6 +37,11 @@ public void cancel(Long emailId) {
3537
emailService.delete(emailId);
3638
}
3739

40+
public void cancelAll(List<Long> emailIds) {
41+
emailIds.forEach(emailId -> emailTaskScheduler.cancelTask(String.valueOf(emailId)));
42+
emailService.deleteAll(emailIds);
43+
}
44+
3845
private long getWaitingPeriod(EmailTask emailTask) {
3946
return ChronoUnit.SECONDS.between(LocalDateTime.now(), emailTask.getSendAt());
4047
}

src/main/java/gdsc/konkuk/platformcore/controller/email/EmailController.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import gdsc.konkuk.platformcore.global.responses.SuccessResponse;
1111
import jakarta.validation.Valid;
1212
import java.net.URI;
13+
import java.util.List;
14+
1315
import lombok.RequiredArgsConstructor;
1416
import org.springframework.http.ResponseEntity;
1517
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -36,14 +38,6 @@ public ResponseEntity<SuccessResponse> getAllEmailTask() {
3638
return ResponseEntity.ok(SuccessResponse.of(emailTasks));
3739
}
3840

39-
@GetMapping("/pages")
40-
public ResponseEntity<SuccessResponse> getAllEmailTask(
41-
@RequestParam(required = false, defaultValue = "0", value = "page") int pageNo
42-
) {
43-
EmailTaskListResponse emailTasks = EmailTaskMapper.mapToEmailTaskPageResponse(emailService.getAllTaskWithPage(pageNo));
44-
return ResponseEntity.ok(SuccessResponse.of(emailTasks));
45-
}
46-
4741
@GetMapping("/{taskId}")
4842
public ResponseEntity<SuccessResponse> getEmailTask(@PathVariable Long taskId) {
4943
EmailTaskDetailResponse emailTask = EmailTaskMapper.mapToEmailTaskDetailsResponse(emailService.getTaskDetails(taskId));
@@ -67,4 +61,10 @@ public ResponseEntity<SuccessResponse> deleteEmailTask(@PathVariable Long emailI
6761
emailTaskFacade.cancel(emailId);
6862
return ResponseEntity.noContent().build();
6963
}
64+
65+
@DeleteMapping("")
66+
public ResponseEntity<SuccessResponse> deleteEmailTaskInBatch(@RequestParam List<Long> emailIds) {
67+
emailTaskFacade.cancelAll(emailIds);
68+
return ResponseEntity.noContent().build();
69+
}
7070
}

src/main/java/gdsc/konkuk/platformcore/domain/email/repository/EmailTaskRepository.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ public interface EmailTaskRepository extends JpaRepository<EmailTask, Long> {
1313
@Query("SELECT e FROM EmailTask e WHERE e.isSent = false")
1414
List<EmailTask> findAllWhereNotSent();
1515

16-
Page<EmailTask> findAll(Pageable pageable);
16+
@Query("SELECT e FROM EmailTask e " +
17+
"order by e.sendAt desc")
18+
List<EmailTask> findAll();
1719
}

src/test/java/gdsc/konkuk/platformcore/application/email/EmailIntegrationTest.java

+31
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import gdsc.konkuk.platformcore.global.scheduler.TaskNotFoundException;
2424
import gdsc.konkuk.platformcore.global.scheduler.TaskInMemoryRepository;
2525
import java.time.LocalDateTime;
26+
import java.util.List;
2627
import java.util.concurrent.ScheduledThreadPoolExecutor;
2728
import org.junit.jupiter.api.AfterEach;
2829
import org.junit.jupiter.api.DisplayName;
@@ -198,4 +199,34 @@ void should_send_discord_message_when_email_sending_error() throws InterruptedEx
198199
verify(emailClient).sendEmailToReceivers(any(EmailTask.class));
199200
verify(discordClient).sendErrorMessage(any());
200201
}
202+
203+
@Test
204+
@DisplayName("모든 작업 취소 성공")
205+
void should_cancel_all_tasks() {
206+
// given
207+
EmailSendRequest emailRequest1 = EmailSendRequestFixture.builder()
208+
.sendAt(LocalDateTime.now().plusHours(1)).build()
209+
.getFixture();
210+
EmailSendRequest emailRequest2 = EmailSendRequestFixture.builder()
211+
.sendAt(LocalDateTime.now().plusHours(2)).build()
212+
.getFixture();
213+
EmailTask emailTask1 = emailTaskFacade.register(emailRequest1);
214+
EmailTask emailTask2 = emailTaskFacade.register(emailRequest2);
215+
assertEquals(2, executor.getQueue().size());
216+
217+
// when
218+
emailTaskFacade.cancelAll(List.of(emailTask1.getId(), emailTask2.getId()));
219+
220+
// then
221+
assertEquals(0, executor.getQueue().size());
222+
assertTrue(emailTaskRepository.findById(emailTask1.getId()).isEmpty());
223+
assertTrue(emailTaskRepository.findById(emailTask2.getId()).isEmpty());
224+
assertThrows(
225+
TaskNotFoundException.class,
226+
() -> taskInMemoryRepository.getTask(emailTask1.getId().toString()));
227+
assertThrows(
228+
TaskNotFoundException.class,
229+
() -> taskInMemoryRepository.getTask(emailTask2.getId().toString()));
230+
}
231+
201232
}

src/test/java/gdsc/konkuk/platformcore/controller/email/EmailControllerTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -264,4 +264,33 @@ void should_success_when_cancel_registered_task() throws Exception {
264264
parameterWithName("emailId").description("취소할 이메일 작업 ID"))
265265
.build())));
266266
}
267+
268+
@Test
269+
@DisplayName("선택한 모든 이메일 작업을 취소한다.")
270+
void should_success_when_cancel_all_tasks() throws Exception {
271+
//given
272+
Member member = MemberFixture.builder().role(MemberRole.CORE).build().getFixture();
273+
String jwt = jwtTokenProvider.createToken(member);
274+
List<Long> emailIds = List.of(1L, 2L);
275+
willDoNothing().given(emailTaskFacade).cancelAll(emailIds);
276+
277+
//when
278+
ResultActions result = mockMvc.perform(
279+
RestDocumentationRequestBuilders.delete("/api/v1/emails?emailIds=1&emailIds=2")
280+
.header("Authorization", "Bearer " + jwt)
281+
.contentType(APPLICATION_JSON)
282+
.with(csrf()));
283+
284+
//then
285+
result
286+
.andDo(print())
287+
.andExpect(status().isNoContent())
288+
.andDo(
289+
document("cancel all EmailTask",
290+
preprocessRequest(prettyPrint()),
291+
resource(ResourceSnippetParameters.builder()
292+
.tag("email")
293+
.description("선택한 모든 이메일 작업을 취소합니다.")
294+
.build())));
295+
}
267296
}

0 commit comments

Comments
 (0)