Skip to content

Commit 4ad696c

Browse files
committed
feat: 뉴스 수정 요청 이미지 삭제 요청 처리 구현
- 파일 업로드 API를 통해 추가할 이미지 별도 업로드
1 parent 9e2cfad commit 4ad696c

File tree

5 files changed

+51
-21
lines changed

5 files changed

+51
-21
lines changed

src/main/java/dmu/dasom/api/domain/news/controller/NewsController.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package dmu.dasom.api.domain.news.controller;
22

3-
import dmu.dasom.api.domain.news.dto.NewsCreationResponseDto;
4-
import dmu.dasom.api.domain.news.dto.NewsListResponseDto;
5-
import dmu.dasom.api.domain.news.dto.NewsRequestDto;
6-
import dmu.dasom.api.domain.news.dto.NewsResponseDto;
3+
import dmu.dasom.api.domain.news.dto.*;
74
import dmu.dasom.api.domain.news.service.NewsService;
85
import io.swagger.v3.oas.annotations.tags.Tag;
96
import io.swagger.v3.oas.annotations.Operation;
@@ -44,7 +41,7 @@ public ResponseEntity<NewsCreationResponseDto> createNews(@Valid @RequestBody Ne
4441
@Operation(summary = "뉴스 수정")
4542
@PutMapping("/{id}")
4643
public ResponseEntity<NewsResponseDto> updateNews(@PathVariable @Min(1) Long id,
47-
@Valid @RequestBody NewsRequestDto requestDto) {
44+
@Valid @RequestBody NewsUpdateRequestDto requestDto) {
4845
return ResponseEntity.ok(newsService.updateNews(id, requestDto));
4946
}
5047

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dmu.dasom.api.domain.news.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.Size;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.util.List;
10+
11+
@Getter
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Schema(name = "NewsUpdateRequestDto", description = "뉴스 수정 요청 DTO")
15+
public class NewsUpdateRequestDto {
16+
17+
@Size(max = 100, message = "뉴스 제목은 최대 100자입니다.")
18+
@Schema(description = "수정할 뉴스 제목", example = "뉴스 제목", nullable = true)
19+
private String title;
20+
21+
@Schema(description = "수정할 뉴스 내용", example = "뉴스 내용", nullable = true)
22+
private String content;
23+
24+
@Schema(description = "삭제할 이미지 ID 목록", example = "[1, 2, 3]", nullable = true)
25+
private List<Long> deleteImageIds;
26+
27+
}

src/main/java/dmu/dasom/api/domain/news/entity/NewsEntity.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
import jakarta.persistence.*;
99
import lombok.*;
1010
import org.apache.commons.lang3.ObjectUtils;
11+
import org.hibernate.annotations.DynamicUpdate;
1112

1213
import java.util.List;
1314

15+
@DynamicUpdate
1416
@Getter
1517
@Entity
1618
@Table(name = "news")
@@ -46,16 +48,6 @@ public NewsResponseDto toResponseDto(List<FileResponseDto> images) {
4648
.build();
4749
}
4850

49-
public NewsResponseDto toResponseDto() {
50-
return NewsResponseDto.builder()
51-
.id(this.id)
52-
.title(this.title)
53-
.content(this.content)
54-
.createdAt(getCreatedAt())
55-
.images(null)
56-
.build();
57-
}
58-
5951
public NewsListResponseDto toListResponseDto(FileResponseDto file) {
6052
return NewsListResponseDto.builder()
6153
.id(this.id)

src/main/java/dmu/dasom/api/domain/news/service/NewsService.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
package dmu.dasom.api.domain.news.service;
22

3-
import dmu.dasom.api.domain.news.dto.NewsCreationResponseDto;
4-
import dmu.dasom.api.domain.news.dto.NewsListResponseDto;
3+
import dmu.dasom.api.domain.news.dto.*;
54
import dmu.dasom.api.global.file.dto.FileResponseDto;
65
import dmu.dasom.api.global.file.enums.FileType;
76
import dmu.dasom.api.global.file.service.FileService;
87
import dmu.dasom.api.domain.common.exception.CustomException;
98
import dmu.dasom.api.domain.common.exception.ErrorCode;
10-
import dmu.dasom.api.domain.news.dto.NewsRequestDto;
11-
import dmu.dasom.api.domain.news.dto.NewsResponseDto;
129
import dmu.dasom.api.domain.news.entity.NewsEntity;
1310
import dmu.dasom.api.domain.news.repository.NewsRepository;
1411
import lombok.RequiredArgsConstructor;
12+
import org.apache.commons.lang3.ObjectUtils;
1513
import org.springframework.stereotype.Service;
1614
import org.springframework.transaction.annotation.Transactional;
1715

@@ -60,13 +58,17 @@ public NewsCreationResponseDto createNews(NewsRequestDto requestDto) {
6058

6159
// 뉴스 수정
6260
@Transactional
63-
public NewsResponseDto updateNews(Long id, NewsRequestDto requestDto) {
61+
public NewsResponseDto updateNews(Long id, NewsUpdateRequestDto requestDto) {
6462
NewsEntity news = newsRepository.findById(id)
6563
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND));
6664

6765
news.update(requestDto.getTitle(), requestDto.getContent());
6866

69-
return news.toResponseDto();
67+
// 삭제 요청된 이미지 삭제
68+
if (ObjectUtils.isNotEmpty(requestDto.getDeleteImageIds()))
69+
fileService.deleteFilesById(news, requestDto.getDeleteImageIds());
70+
71+
return news.toResponseDto(fileService.getFilesByTypeAndTargetId(FileType.NEWS, id));
7072
}
7173

7274
// 뉴스 삭제

src/main/java/dmu/dasom/api/global/file/service/FileService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dmu.dasom.api.domain.common.exception.CustomException;
44
import dmu.dasom.api.domain.common.exception.ErrorCode;
5+
import dmu.dasom.api.domain.news.entity.NewsEntity;
56
import dmu.dasom.api.global.file.dto.FileResponseDto;
67
import dmu.dasom.api.global.file.entity.FileEntity;
78
import dmu.dasom.api.global.file.enums.FileType;
@@ -62,6 +63,17 @@ public void deleteFilesByTypeAndTargetId(FileType fileType, Long targetId) {
6263
fileRepository.deleteAll(files);
6364
}
6465

66+
public void deleteFilesById(NewsEntity news, List<Long> fileIds) {
67+
List<FileEntity> files = fileRepository.findAllById(fileIds);
68+
69+
List<FileEntity> filesToDelete = files.stream()
70+
.filter(file -> file.getTargetId().equals(news.getId()))
71+
.toList();
72+
73+
if (ObjectUtils.isNotEmpty(filesToDelete))
74+
fileRepository.deleteAll(filesToDelete);
75+
}
76+
6577
public Map<Long, FileResponseDto> getFirstFileByTypeAndTargetIds(FileType fileType, List<Long> targetIds) {
6678
if (targetIds.isEmpty()) {
6779
return Map.of();

0 commit comments

Comments
 (0)