From 4600d6d6d2cbb5c33a983cb98f248cb785a2c8f9 Mon Sep 17 00:00:00 2001 From: minjikim Date: Mon, 7 Aug 2023 22:57:22 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[feat]=20=EC=BB=A4=EB=AE=A4=EB=8B=88?= =?UTF-8?q?=ED=8B=B0=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/co/wingle/common/util/S3Util.java | 9 ++++- .../community/article/ArticleImage.java | 39 +++++++++++++++++++ .../article/ArticleImageRepository.java | 10 +++++ .../community/article/ArticleService.java | 27 ++++++++++--- 4 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 wingle/src/main/java/kr/co/wingle/community/article/ArticleImage.java create mode 100644 wingle/src/main/java/kr/co/wingle/community/article/ArticleImageRepository.java diff --git a/wingle/src/main/java/kr/co/wingle/common/util/S3Util.java b/wingle/src/main/java/kr/co/wingle/common/util/S3Util.java index 9d9658a0..a41eae74 100644 --- a/wingle/src/main/java/kr/co/wingle/common/util/S3Util.java +++ b/wingle/src/main/java/kr/co/wingle/common/util/S3Util.java @@ -66,8 +66,13 @@ public String profileImageUpload(MultipartFile file) { } } - public String articleImageUpload(MultipartFile file) throws IOException { - return upload(file, "article"); + public String articleImageUpload(MultipartFile file) { + try { + return upload(file, "article"); + } catch (IOException e) { + log.warn(e.getMessage()); + throw new InternalServerErrorException(ErrorCode.FILE_UPLOAD_FAIL); + } } public void delete(String url) { diff --git a/wingle/src/main/java/kr/co/wingle/community/article/ArticleImage.java b/wingle/src/main/java/kr/co/wingle/community/article/ArticleImage.java new file mode 100644 index 00000000..3c008c97 --- /dev/null +++ b/wingle/src/main/java/kr/co/wingle/community/article/ArticleImage.java @@ -0,0 +1,39 @@ +package kr.co.wingle.community.article; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.ManyToOne; + +import org.springframework.util.Assert; + +import kr.co.wingle.common.entity.BaseEntity; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ArticleImage extends BaseEntity { + + @ManyToOne(fetch = FetchType.LAZY) + private Article article; + + @Column(nullable = false) + private String imageUrl; + + @Column(nullable = false) + private int orderNumber; + + @Builder + ArticleImage(Article article, String imageUrl, int orderNumber) { + Assert.notNull(article, "article must not be null"); + Assert.notNull(imageUrl, "imageUrl must not be null"); + + this.article = article; + this.imageUrl = imageUrl; + this.orderNumber = orderNumber; + } +} diff --git a/wingle/src/main/java/kr/co/wingle/community/article/ArticleImageRepository.java b/wingle/src/main/java/kr/co/wingle/community/article/ArticleImageRepository.java new file mode 100644 index 00000000..80df07c1 --- /dev/null +++ b/wingle/src/main/java/kr/co/wingle/community/article/ArticleImageRepository.java @@ -0,0 +1,10 @@ +package kr.co.wingle.community.article; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ArticleImageRepository extends JpaRepository { + + List getArticleImagesByArticleIdAndIsDeletedOrderByOrderNumber(Long articleId, boolean isDeleted); +} diff --git a/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java b/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java index 6d9881f4..6bd557fd 100644 --- a/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java +++ b/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java @@ -13,6 +13,7 @@ import kr.co.wingle.common.constants.ErrorCode; import kr.co.wingle.common.exception.ForbiddenException; import kr.co.wingle.common.exception.NotFoundException; +import kr.co.wingle.common.util.S3Util; import kr.co.wingle.community.forum.Forum; import kr.co.wingle.community.forum.ForumCode; import kr.co.wingle.community.forum.ForumService; @@ -25,9 +26,11 @@ @Service public class ArticleService extends WritingService { private final ArticleRepository articleRepository; + private final ArticleImageRepository articleImageRepository; private final ForumService forumService; private final AuthService authService; private final ArticleMapper articleMapper; + private final S3Util s3Util; @Transactional public ArticleResponseDto create(ArticleRequestDto request) { @@ -47,18 +50,28 @@ public ArticleResponseDto create(ArticleRequestDto request) { articleRepository.save(article); + ArrayList imageUrlList = new ArrayList<>(); + for (int i = 0; i < request.getImages().size(); i++) { + String imageUrl = s3Util.articleImageUpload(request.getImages().get(i)); + imageUrlList.add(imageUrl); + articleImageRepository.save(new ArticleImage(article, imageUrl, i + 1)); + } + // TODO: Redis 최신목록에 등록 - // TODO: new ArrayList 부분을 s3에서 받은 이미지 경로로 변경 - return articleMapper.toResponseDto(article, new ArrayList()); + return articleMapper.toResponseDto(article, imageUrlList); } @Transactional(readOnly = true) public ArticleResponseDto getOne(Long forumId, Long articleId) { Article article = getArticleById(articleId); isValidForum(article, forumId); - // TODO: new ArrayList 부분을 s3에서 받은 이미지 경로로 변경 - return articleMapper.toResponseDto(article, new ArrayList()); + + List imageUrlList = articleImageRepository.getArticleImagesByArticleIdAndIsDeletedOrderByOrderNumber( + article.getId(), false) + .stream().map(articleImage -> articleImage.getImageUrl()).collect(Collectors.toList()); + + return articleMapper.toResponseDto(article, imageUrlList); } @Transactional(readOnly = true) @@ -71,9 +84,11 @@ public List getList(Long forumId, int page, int size, boolea } else { pages = articleRepository.findByForumIdAndIsDeleted(forumId, false, pageable); } - // TODO: new ArrayList 부분을 s3에서 받은 이미지 경로로 변경 + return pages.stream() - .map(x -> articleMapper.toResponseDto(x, new ArrayList())) + .map(x -> articleMapper.toResponseDto(x, + articleImageRepository.getArticleImagesByArticleIdAndIsDeletedOrderByOrderNumber(x.getId(), false) + .stream().map(articleImage -> articleImage.getImageUrl()).collect(Collectors.toList()))) .collect( Collectors.toList()); } From 2a9bb9bc5edec9f5ff2705a9c036f41a6a4e7baf Mon Sep 17 00:00:00 2001 From: minjikim Date: Mon, 7 Aug 2023 23:45:12 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[add]=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=8F=84=20=EA=B0=99=EC=9D=B4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/co/wingle/community/article/ArticleService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java b/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java index 6bd557fd..3b1c9a59 100644 --- a/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java +++ b/wingle/src/main/java/kr/co/wingle/community/article/ArticleService.java @@ -99,6 +99,8 @@ public Long delete(Long forumId, Long articleId) { Article article = getArticleById(articleId); if (isValidMember(article, member) && isExist(article) && isValidForum(article, forumId)) { + articleImageRepository.getArticleImagesByArticleIdAndIsDeletedOrderByOrderNumber(articleId, false) + .forEach(articleImage -> articleImage.softDelete()); article.softDelete(); } return article.getId();