Skip to content

Commit 2e91fae

Browse files
authored
chore: 공지사항 다중 삭제로 변경 (#314)
1 parent 36e78db commit 2e91fae

File tree

3 files changed

+69
-40
lines changed

3 files changed

+69
-40
lines changed

src/main/java/org/myteam/server/notice/controller/NoticeController.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.swagger.v3.oas.annotations.tags.Tag;
1111
import jakarta.servlet.http.HttpServletRequest;
1212
import jakarta.validation.Valid;
13+
import java.util.List;
1314
import lombok.RequiredArgsConstructor;
1415
import lombok.extern.slf4j.Slf4j;
1516
import org.myteam.server.global.exception.ErrorResponse;
@@ -30,6 +31,7 @@
3031
import org.springframework.web.bind.annotation.PutMapping;
3132
import org.springframework.web.bind.annotation.RequestBody;
3233
import org.springframework.web.bind.annotation.RequestMapping;
34+
import org.springframework.web.bind.annotation.RequestParam;
3335
import org.springframework.web.bind.annotation.RestController;
3436

3537
@Slf4j
@@ -98,9 +100,9 @@ public ResponseEntity<ResponseDto<NoticeSaveResponse>> updateNotice(
98100
@ApiResponse(responseCode = "404", description = "해당 공지사항이 존재하지 않음", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
99101
@ApiResponse(responseCode = "500", description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
100102
})
101-
@DeleteMapping("/{noticeId}")
102-
public ResponseEntity<ResponseDto<Void>> deleteNotice(@PathVariable Long noticeId) {
103-
noticeService.deleteNotice(noticeId);
103+
@DeleteMapping
104+
public ResponseEntity<ResponseDto<Void>> deleteNotice(@RequestParam List<Long> noticeIdList) {
105+
noticeService.deleteNotice(noticeIdList);
104106
return ResponseEntity.ok(new ResponseDto<>(
105107
SUCCESS.name(),
106108
"공지사항 삭제 성공",

src/main/java/org/myteam/server/notice/service/NoticeService.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package org.myteam.server.notice.service;
22

3+
import java.util.List;
34
import lombok.RequiredArgsConstructor;
45
import lombok.extern.slf4j.Slf4j;
56
import org.myteam.server.comment.domain.CommentType;
67
import org.myteam.server.comment.service.CommentService;
78
import org.myteam.server.global.exception.ErrorCode;
89
import org.myteam.server.global.exception.PlayHiveException;
910
import org.myteam.server.global.util.redis.CommonCountDto;
10-
import org.myteam.server.global.util.redis.service.RedisCountService;
1111
import org.myteam.server.global.util.redis.ServiceType;
12+
import org.myteam.server.global.util.redis.service.RedisCountService;
1213
import org.myteam.server.global.util.upload.MediaUtils;
1314
import org.myteam.server.member.entity.Member;
1415
import org.myteam.server.member.service.SecurityReadService;
@@ -123,30 +124,33 @@ public NoticeSaveResponse updateNotice(NoticeSaveRequest request, Long noticeId)
123124
/**
124125
* 공지사항 삭제
125126
*/
126-
public void deleteNotice(Long noticeId) {
127+
public void deleteNotice(List<Long> noticeIdList) {
127128
log.info("delete Notice 실행");
128129

129130
Member member = securityReadService.getMember();
130131
if (!member.isAdmin()) {
131132
throw new PlayHiveException(ErrorCode.UNAUTHORIZED);
132133
}
133134

134-
Notice notice = noticeReadService.findById(noticeId);
135-
if (notice.getMember().getPublicId() != member.getPublicId()) {
136-
throw new PlayHiveException(ErrorCode.UNAUTHORIZED);
137-
}
135+
for (Long noticeId : noticeIdList) {
138136

139-
if (notice.getImgUrl() != null) {
140-
s3Service.deleteFile(notice.getImgUrl());
141-
}
137+
Notice notice = noticeReadService.findById(noticeId);
138+
if (notice.getMember().getPublicId() != member.getPublicId()) {
139+
throw new PlayHiveException(ErrorCode.UNAUTHORIZED);
140+
}
142141

143-
redisCountService.removeCount(DomainType.NOTICE, noticeId);
142+
if (notice.getImgUrl() != null) {
143+
s3Service.deleteFile(notice.getImgUrl());
144+
}
144145

145-
noticeCountRepository.deleteByNoticeId(notice.getId());
146-
noticeRepository.delete(notice);
146+
redisCountService.removeCount(DomainType.NOTICE, noticeId);
147147

148-
log.info("공지사항 삭제: {}", noticeId);
148+
noticeCountRepository.deleteByNoticeId(notice.getId());
149+
noticeRepository.delete(notice);
149150

150-
commentService.deleteCommentByPost(CommentType.NOTICE, noticeId);
151+
log.info("공지사항 삭제: {}", noticeId);
152+
153+
commentService.deleteCommentByPost(CommentType.NOTICE, noticeId);
154+
}
151155
}
152156
}

src/test/java/org/myteam/server/notice/service/NoticeDeleteServiceTest.java

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
package org.myteam.server.notice.service;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.Assert.assertThrows;
5+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
6+
import static org.mockito.Mockito.verify;
7+
import static org.mockito.Mockito.when;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
311
import org.junit.jupiter.api.BeforeEach;
412
import org.junit.jupiter.api.DisplayName;
513
import org.junit.jupiter.api.Test;
6-
import org.myteam.server.support.IntegrationTestSupport;
714
import org.myteam.server.global.exception.ErrorCode;
815
import org.myteam.server.global.exception.PlayHiveException;
916
import org.myteam.server.member.entity.Member;
1017
import org.myteam.server.notice.domain.Notice;
1118
import org.myteam.server.report.domain.DomainType;
19+
import org.myteam.server.support.IntegrationTestSupport;
1220
import org.springframework.beans.factory.annotation.Autowired;
1321
import org.springframework.transaction.annotation.Transactional;
1422

15-
import static org.assertj.core.api.Assertions.assertThat;
16-
import static org.junit.Assert.assertEquals;
17-
import static org.junit.Assert.assertThrows;
18-
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
19-
import static org.mockito.Mockito.verify;
20-
import static org.mockito.Mockito.when;
21-
2223
class NoticeDeleteServiceTest extends IntegrationTestSupport {
2324

2425
@Autowired
@@ -27,7 +28,9 @@ class NoticeDeleteServiceTest extends IntegrationTestSupport {
2728
private Member author;
2829
private Member other;
2930
private Member admin;
30-
private Notice notice;
31+
private Notice notice1;
32+
private Notice notice2;
33+
List<Long> noticeIdList = new ArrayList<>();
3134

3235
@BeforeEach
3336
void setUp() {
@@ -41,35 +44,44 @@ void setUp() {
4144
@DisplayName("케이스 1: 작성자가 삭제 요청 → 성공")
4245
void deleteNotice_by_author_success() {
4346
// given
44-
notice = createNotice(admin, "Original Title", "Original Content", null);
47+
notice1 = createNotice(admin, "Original Title", "Original Content", null);
48+
notice2 = createNotice(admin, "Original Title", "Original Content", null);
49+
50+
noticeIdList.add(notice1.getId());
51+
noticeIdList.add(notice2.getId());
52+
4553
when(securityReadService.getMember()).thenReturn(admin);
4654

4755
// when && then
48-
assertDoesNotThrow(() -> noticeService.deleteNotice(notice.getId()));
56+
assertDoesNotThrow(() -> noticeService.deleteNotice(noticeIdList));
4957
}
5058

5159
@Transactional
5260
@Test
5361
@DisplayName("케이스 2: 관리자가 삭제 요청 → 성공")
5462
void deleteNotice_by_admin_success() {
5563
// given
56-
notice = createNotice(admin, "Original Title", "Original Content", null);
64+
notice1 = createNotice(admin, "Original Title", "Original Content", null);
65+
noticeIdList.add(notice1.getId());
66+
5767
when(securityReadService.getMember()).thenReturn(admin);
5868

5969
// when && then
60-
assertDoesNotThrow(() -> noticeService.deleteNotice(notice.getId()));
70+
assertDoesNotThrow(() -> noticeService.deleteNotice(noticeIdList));
6171
}
6272

6373
@Test
6474
@DisplayName("케이스 3: 작성자도 관리자도 아닌 유저가 삭제 요청 → 예외 발생")
6575
void deleteNotice_by_outsider_throws() {
6676
// given
67-
notice = createNotice(admin, "Original Title", "Original Content", null);
77+
notice1 = createNotice(admin, "Original Title", "Original Content", null);
78+
noticeIdList.add(notice1.getId());
79+
6880
when(securityReadService.getMember()).thenReturn(other);
6981

7082
// when
7183
PlayHiveException ex = assertThrows(PlayHiveException.class, () ->
72-
noticeService.deleteNotice(notice.getId()));
84+
noticeService.deleteNotice(noticeIdList));
7385

7486
// then
7587
assertThat(ex.getErrorCode()).isEqualTo(ErrorCode.UNAUTHORIZED);
@@ -80,40 +92,51 @@ void deleteNotice_by_outsider_throws() {
8092
@DisplayName("케이스 4: 작성자가 삭제 요청 → 성공 + 이미지 삭제 호출")
8193
void deleteNotice_by_author_success_img() {
8294
// given
83-
notice = createNotice(admin, "Original Title", "Original Content", "test.co.kr");
95+
notice1 = createNotice(admin, "Original Title", "Original Content", "test.co.kr");
96+
97+
noticeIdList.add(notice1.getId());
98+
8499
when(securityReadService.getMember()).thenReturn(admin);
85100

86101
// when
87-
assertDoesNotThrow(() -> noticeService.deleteNotice(notice.getId()));
102+
assertDoesNotThrow(() -> noticeService.deleteNotice(noticeIdList));
88103

89104
// then
90-
verify(s3Service).deleteFile(notice.getImgUrl()); // 이미지 삭제 확인
91-
verify(redisCountService).removeCount(DomainType.NOTICE, notice.getId()); // Redis 카운트 삭제
105+
verify(s3Service).deleteFile(notice1.getImgUrl()); // 이미지 삭제 확인
106+
verify(redisCountService).removeCount(DomainType.NOTICE, notice1.getId()); // Redis 카운트 삭제
92107
}
93108

94109
@Transactional
95110
@Test
96111
@DisplayName("케이스 5: 관리자가 삭제 요청 → 성공")
97112
void deleteNotice_by_admin_success_img() {
98113
// given
99-
notice = createNotice(admin, "Original Title", "Original Content", "test.co.kr");
114+
notice1 = createNotice(admin, "Original Title", "Original Content", "test.co.kr");
115+
116+
noticeIdList.add(notice1.getId());
117+
100118
when(securityReadService.getMember()).thenReturn(admin);
101119

102120
// when && then
103-
assertDoesNotThrow(() -> noticeService.deleteNotice(notice.getId()));
121+
assertDoesNotThrow(() -> noticeService.deleteNotice(noticeIdList));
122+
verify(s3Service).deleteFile(notice1.getImgUrl()); // 이미지 삭제 확인
123+
verify(redisCountService).removeCount(DomainType.NOTICE, notice1.getId()); // Redis 카운트 삭제
104124
}
105125

106126
@Transactional
107127
@Test
108128
@DisplayName("케이스 6: 작성자도 관리자도 아닌 유저가 삭제 요청 → 예외 발생")
109129
void deleteNotice_by_outsider_throws_img() {
110130
// given
111-
notice = createNotice(admin, "Original Title", "Original Content", "test.co.kr");
131+
notice1 = createNotice(admin, "Original Title", "Original Content", "test.co.kr");
132+
133+
noticeIdList.add(notice1.getId());
134+
112135
when(securityReadService.getMember()).thenReturn(other);
113136

114137
// when
115138
PlayHiveException ex = assertThrows(PlayHiveException.class, () ->
116-
noticeService.deleteNotice(notice.getId()));
139+
noticeService.deleteNotice(noticeIdList));
117140

118141
// then
119142
assertThat(ex.getErrorCode()).isEqualTo(ErrorCode.UNAUTHORIZED);

0 commit comments

Comments
 (0)