From cfb2cd9d878b7b6e0ab14d34dbfa2da1a7564a69 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Fri, 2 Aug 2024 18:15:34 +0900 Subject: [PATCH 01/18] =?UTF-8?q?[fix]=20:=20#26=20OnBoardingService=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homepage/application/user/service/OnBoardingService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java b/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java index 22e8d628..424cbcd1 100644 --- a/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java +++ b/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java @@ -38,7 +38,7 @@ public void saveUserOnBoarding(Long userId, OnBoardingRequest request){ /* TO DO // MemberEntity, GroupEntity 연결 */ - user.updateOnBoardingUser(request); + user.updateOnBoardingUser(request); // 이 메소드 수정 필요 userModifier.save(user); } } \ No newline at end of file From 6e113736772ad6cc11da497f84329bfdcdf069f7 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Sat, 3 Aug 2024 23:57:10 +0900 Subject: [PATCH 02/18] =?UTF-8?q?[feat]=20:=20#26=20PostManageService=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=83=9D=EC=84=B1=201=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/service/PostManageService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/ussum/homepage/application/post/service/PostManageService.java b/src/main/java/ussum/homepage/application/post/service/PostManageService.java index ddc72d23..01f55a4e 100644 --- a/src/main/java/ussum/homepage/application/post/service/PostManageService.java +++ b/src/main/java/ussum/homepage/application/post/service/PostManageService.java @@ -5,12 +5,19 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import ussum.homepage.application.post.service.dto.request.PostCreateRequest; import ussum.homepage.application.post.service.dto.response.postList.*; +import ussum.homepage.application.user.service.UserService; import ussum.homepage.domain.post.Board; +import ussum.homepage.domain.post.Category; import ussum.homepage.domain.post.Post; import ussum.homepage.domain.post.service.BoardReader; +import ussum.homepage.domain.post.service.CategoryReader; +import ussum.homepage.domain.post.service.PostAppender; import ussum.homepage.domain.post.service.PostReader; import ussum.homepage.domain.postlike.service.PostReactionReader; +import ussum.homepage.domain.user.User; +import ussum.homepage.domain.user.service.UserReader; import ussum.homepage.global.common.PageInfo; import java.util.List; @@ -26,7 +33,10 @@ public class PostManageService { private final BoardReader boardReader; private final PostReader postReader; + private final CategoryReader categoryReader; + private final UserReader userReader; private final PostReactionReader postReactionReader; + private final PostAppender postAppender; private final Map> postResponseMap = Map.of( "공지사항게시판", (post, ignored) -> NoticePostResponse.of(post), @@ -61,6 +71,15 @@ public PostListRes getPostList(int page, int take, String boardCode) { return PostListRes.of(responseList, pageInfo); } + + public Long createPost(Long userId, String boardCode, PostCreateRequest postCreateRequest) { + Board board = boardReader.getBoardWithBoardCode(boardCode); + Category category = categoryReader.getCategoryWithCode(postCreateRequest.categoryCode()); + //user도 찾아 와야 하지 않을까 + User user = userReader.getUserWithId(userId); + + + } } //스위치 사용 로직 /* From 469b42869de90e188f17b36627779071dbce3e32 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Tue, 13 Aug 2024 18:03:43 +0900 Subject: [PATCH 03/18] =?UTF-8?q?[feat]=20:=20#48=20PostFileAppender=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/post/service/PostFileAppender.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java diff --git a/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java b/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java new file mode 100644 index 00000000..b92c46f7 --- /dev/null +++ b/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java @@ -0,0 +1,21 @@ +package ussum.homepage.domain.post.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ussum.homepage.domain.post.Post; +import ussum.homepage.domain.post.PostFile; +import ussum.homepage.domain.post.PostFileRepository; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PostFileAppender { + private final PostFileRepository postFileRepository; + + @Transactional + public List saveAllPostFile(List fileList) { + return postFileRepository.saveAll(fileList); + } +} From 1d05ab620ad22cee269825122947db7c87daad02 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Tue, 13 Aug 2024 18:04:16 +0900 Subject: [PATCH 04/18] =?UTF-8?q?[feat]=20:=20#48=20PostManage=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20Response=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/postSave/PostCreateResponse.java | 19 +++++++++++++++++++ .../response/postSave/PostFileResponse.java | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostCreateResponse.java create mode 100644 src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostFileResponse.java diff --git a/src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostCreateResponse.java b/src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostCreateResponse.java new file mode 100644 index 00000000..cc838e83 --- /dev/null +++ b/src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostCreateResponse.java @@ -0,0 +1,19 @@ +package ussum.homepage.application.post.service.dto.response.postSave; + +import lombok.Builder; +import lombok.Getter; +import ussum.homepage.domain.post.Post; + +@Getter +@Builder +public class PostCreateResponse { + private Long post_id; + private String boardCode; + + public static PostCreateResponse of(Long id, String boardCode){ + return PostCreateResponse.builder() + .post_id(id) + .boardCode(boardCode) + .build(); + } +} diff --git a/src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostFileResponse.java b/src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostFileResponse.java new file mode 100644 index 00000000..e237ef49 --- /dev/null +++ b/src/main/java/ussum/homepage/application/post/service/dto/response/postSave/PostFileResponse.java @@ -0,0 +1,18 @@ +package ussum.homepage.application.post.service.dto.response.postSave; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class PostFileResponse { + private Long id; + private String url; + + public static PostFileResponse of(Long id, String url){ + return PostFileResponse.builder() + .id(id) + .url(url) + .build(); + } +} From 4ef97360a644e7f562cdcf0b7819d772d328782e Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Tue, 13 Aug 2024 18:05:15 +0900 Subject: [PATCH 05/18] =?UTF-8?q?[fix]=20:=20#48=20S3utils=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ussum/homepage/infra/utils/S3utils.java | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/main/java/ussum/homepage/infra/utils/S3utils.java b/src/main/java/ussum/homepage/infra/utils/S3utils.java index 384a4f12..a83a9959 100644 --- a/src/main/java/ussum/homepage/infra/utils/S3utils.java +++ b/src/main/java/ussum/homepage/infra/utils/S3utils.java @@ -2,22 +2,25 @@ import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectInputStream; -import com.amazonaws.util.IOUtils; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import ussum.homepage.global.error.exception.GeneralException; +import ussum.homepage.global.error.status.ErrorStatus; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; @RequiredArgsConstructor -@Slf4j @Component public class S3utils { private final AmazonS3 amazonS3; @@ -48,6 +51,40 @@ public String uploadFile(MultipartFile file) { return amazonS3.getUrl(bucket, originalFilename).toString(); } + + public List uploadFileWithPath(Long userId, String boardCode, MultipartFile[] files, String typeName) { + List uploadedFileUrls = new ArrayList<>(); + for (MultipartFile file : files) { + String fileName = file.getOriginalFilename(); + String fileExtension = fileName.substring(fileName.lastIndexOf(".")); + String uniqueFileName = UUID.randomUUID().toString() + fileExtension; + + String folderPath = boardCode + "/" + userId + "/" + typeName + "/"; + String fileKey = folderPath + uniqueFileName; + + try { + File convertedFile = convertMultiPartToFile(file); + amazonS3.putObject(new PutObjectRequest(bucket, fileKey, convertedFile)); + convertedFile.delete(); // 임시 파일 삭제 + + String fileUrl = amazonS3.getUrl(bucket, fileKey).toString(); + uploadedFileUrls.add(fileUrl); + } catch (IOException e) { + throw new GeneralException(ErrorStatus.S3_ERROR); + } + } + + return uploadedFileUrls; + } + + private File convertMultiPartToFile(MultipartFile file) throws IOException { + File convertedFile = new File(file.getOriginalFilename()); + FileOutputStream fos = new FileOutputStream(convertedFile); + fos.write(file.getBytes()); + fos.close(); + return convertedFile; + } + public void getFileToProject(String fileName) { S3Object s3Object = amazonS3.getObject(bucket, fileName); S3ObjectInputStream inputStream = s3Object.getObjectContent(); @@ -70,3 +107,5 @@ private void saveFile(InputStream inputStream, String filePath) throws IOExcepti } } } + + From ba8a2bef8379d329c562516263da647e03bc6166 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Tue, 13 Aug 2024 18:05:39 +0900 Subject: [PATCH 06/18] =?UTF-8?q?[feat]=20:=20#48=20S3=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ussum/homepage/global/error/status/ErrorStatus.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/ussum/homepage/global/error/status/ErrorStatus.java b/src/main/java/ussum/homepage/global/error/status/ErrorStatus.java index 937c9f71..a935f6cd 100644 --- a/src/main/java/ussum/homepage/global/error/status/ErrorStatus.java +++ b/src/main/java/ussum/homepage/global/error/status/ErrorStatus.java @@ -82,6 +82,9 @@ public enum ErrorStatus implements BaseErrorCode { //온보딩에러 INVALID_ONBOARDING_REQUEST(HttpStatus.BAD_REQUEST,"ONBOARDING_001","온보딩 정보가 올바르지 않습니다."), + //S3에러 + S3_ERROR(HttpStatus.INTERNAL_SERVER_ERROR,"S3_001","S3에 파일 저장이 실패했습니다."), + //Body 에러 INVALID_BODY(HttpStatus.BAD_REQUEST, "BODY_ERROR", "Body가 올바르지 않습니다."); From 2f85f6c0f19258eedffe516939ce11cf5d4d74be Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Tue, 13 Aug 2024 18:06:39 +0900 Subject: [PATCH 07/18] [fix] : #48 OnBoardingService --- .../application/user/service/OnBoardingService.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java b/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java index 424cbcd1..e63e4137 100644 --- a/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java +++ b/src/main/java/ussum/homepage/application/user/service/OnBoardingService.java @@ -3,20 +3,13 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; import ussum.homepage.application.user.service.dto.request.OnBoardingRequest; -import ussum.homepage.application.user.service.dto.response.OnBoardingResponse; import ussum.homepage.domain.csv_user.StudentCsv; -import ussum.homepage.domain.csv_user.StudentCsvRepository; -import ussum.homepage.domain.csv_user.service.StudentCsvModifier; import ussum.homepage.domain.csv_user.service.StudentCsvReader; import ussum.homepage.domain.user.User; import ussum.homepage.domain.user.service.UserModifier; import ussum.homepage.domain.user.service.UserReader; import ussum.homepage.global.error.exception.GeneralException; -import ussum.homepage.infra.jpa.csv_user.StudentCsvMapper; - -import java.util.Optional; import static ussum.homepage.global.error.status.ErrorStatus.USER_NOT_FOUND; @@ -27,7 +20,6 @@ public class OnBoardingService { private final UserModifier userModifier; private final UserReader userReader; private final StudentCsvReader studentCsvReader; - private final StudentCsvModifier studentCsvModifier; public void saveUserOnBoarding(Long userId, OnBoardingRequest request){ User user = userReader.getUserWithId(userId); From d8d4ab4bbfe4960f1749db5224a8781fde45ad40 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Tue, 13 Aug 2024 18:07:07 +0900 Subject: [PATCH 08/18] =?UTF-8?q?[fix]=20:=20#48=20createPost=20=EB=A6=AC?= =?UTF-8?q?=ED=84=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ussum/homepage/domain/post/service/PostAppender.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ussum/homepage/domain/post/service/PostAppender.java b/src/main/java/ussum/homepage/domain/post/service/PostAppender.java index c99d6caf..c817e438 100644 --- a/src/main/java/ussum/homepage/domain/post/service/PostAppender.java +++ b/src/main/java/ussum/homepage/domain/post/service/PostAppender.java @@ -20,7 +20,7 @@ public class PostAppender { private final PostAclRepository postAclRepository; @Transactional - public void createPost(Post post) { - postRepository.save(post); + public Post createPost(Post post) { + return postRepository.save(post); } } From e1040467f922c8ce433cd6e1dece2e7f0fd917da Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Wed, 14 Aug 2024 11:12:13 +0900 Subject: [PATCH 09/18] =?UTF-8?q?[fix]=20:=20#48=20PostCreateRequest=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BCid=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=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 --- .../post/service/dto/request/PostCreateRequest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java b/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java index c5200662..bb3e6430 100644 --- a/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java +++ b/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java @@ -1,21 +1,17 @@ package ussum.homepage.application.post.service.dto.request; -import ussum.homepage.domain.acl.PostAcl; import ussum.homepage.domain.post.Board; import ussum.homepage.domain.post.Category; import ussum.homepage.domain.post.Post; import ussum.homepage.domain.user.User; -import ussum.homepage.infra.jpa.post.entity.Status; -import ussum.homepage.infra.jpa.user.entity.MajorCode; - -import java.time.LocalDateTime; import java.util.List; public record PostCreateRequest( String title, String content, String categoryCode, - String thumbNailImage + String thumbNailImage, + List postFileList ) { public Post toDomain(Board board, User user, Category category) { return Post.of( From 3855a89c4b09f0301b023bfbb7d867431328f73e Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Wed, 14 Aug 2024 11:14:01 +0900 Subject: [PATCH 10/18] =?UTF-8?q?[feat]=20:=20#48=20PostFileMapper=20toDom?= =?UTF-8?q?ain,=20toEntity=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/jpa/post/PostFileMapper.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/ussum/homepage/infra/jpa/post/PostFileMapper.java b/src/main/java/ussum/homepage/infra/jpa/post/PostFileMapper.java index 8508804d..195c6a0b 100644 --- a/src/main/java/ussum/homepage/infra/jpa/post/PostFileMapper.java +++ b/src/main/java/ussum/homepage/infra/jpa/post/PostFileMapper.java @@ -4,6 +4,8 @@ import ussum.homepage.domain.post.PostFile; import ussum.homepage.infra.jpa.post.entity.PostFileEntity; +import java.util.List; + @Component public class PostFileMapper { public PostFile toDomain(PostFileEntity postFileEntity) { @@ -12,7 +14,23 @@ public PostFile toDomain(PostFileEntity postFileEntity) { postFileEntity.getTypeName(), postFileEntity.getUrl(), postFileEntity.getSize(), - postFileEntity.getPostEntity().getId() + null + ); + } + + public List toDomain(List postFileEntities) { + return postFileEntities.stream() + .map(this::toDomain) + .toList(); + } + + public PostFileEntity toEntity(PostFile postFile) { + return PostFileEntity.of( + postFile.getId(), + postFile.getTypeName(), + postFile.getUrl(), + null, + null ); } From afaf02ae791dccc1ed181e17a32d7367faa12dcd Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Wed, 14 Aug 2024 11:14:19 +0900 Subject: [PATCH 11/18] =?UTF-8?q?[feat]=20:=20#48=20PostFileEntity=20of=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ussum/homepage/infra/jpa/post/entity/PostFileEntity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/ussum/homepage/infra/jpa/post/entity/PostFileEntity.java b/src/main/java/ussum/homepage/infra/jpa/post/entity/PostFileEntity.java index e73909e8..63daf6a3 100644 --- a/src/main/java/ussum/homepage/infra/jpa/post/entity/PostFileEntity.java +++ b/src/main/java/ussum/homepage/infra/jpa/post/entity/PostFileEntity.java @@ -6,6 +6,7 @@ @Table(name = "post_file") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor public class PostFileEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -18,5 +19,9 @@ public class PostFileEntity { @JoinColumn(name = "post_id") private PostEntity postEntity; + public static PostFileEntity of(Long id, String typeName, String url, String size, PostEntity postEntity) { + return new PostFileEntity(id, typeName, url, size, postEntity); + } + } From d52c793641f77ba3c2f1cb568f881049d0462e38 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Wed, 14 Aug 2024 11:18:07 +0900 Subject: [PATCH 12/18] =?UTF-8?q?[feat]=20:=20#48=20PostFile=20save,=20fin?= =?UTF-8?q?dById,=20saveAll=20=EB=A9=94=EC=86=8C=EB=93=9C=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 --- .../domain/post/PostFileRepository.java | 4 ++++ .../domain/post/service/PostFileAppender.java | 19 ++++++++++++++++++ .../jpa/post/PostFileRepositoryImpl.java | 20 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/src/main/java/ussum/homepage/domain/post/PostFileRepository.java b/src/main/java/ussum/homepage/domain/post/PostFileRepository.java index 20d597bd..b9bc86c3 100644 --- a/src/main/java/ussum/homepage/domain/post/PostFileRepository.java +++ b/src/main/java/ussum/homepage/domain/post/PostFileRepository.java @@ -1,7 +1,11 @@ package ussum.homepage.domain.post; import java.util.List; +import java.util.Optional; public interface PostFileRepository { List findAllByPostId(Long postId); + Optional findById(Long id); + List saveAll(List postFiles); + void save(PostFile postFile); } diff --git a/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java b/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java index b92c46f7..23a2bc5b 100644 --- a/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java +++ b/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java @@ -8,6 +8,7 @@ import ussum.homepage.domain.post.PostFileRepository; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor @@ -18,4 +19,22 @@ public class PostFileAppender { public List saveAllPostFile(List fileList) { return postFileRepository.saveAll(fileList); } + + @Transactional + public void save(List postFileIds, Long postId){ + postFileIds.stream() + .map(postFileRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(postFile -> { + PostFile updatedPostFile = PostFile.of( + postFile.getId(), + postFile.getTypeName(), + postFile.getUrl(), + postFile.getSize(), + postId + ); + postFileRepository.save(updatedPostFile); + }); + } } diff --git a/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java b/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java index 249fc720..74cb8179 100644 --- a/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java +++ b/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java @@ -8,6 +8,7 @@ import ussum.homepage.infra.jpa.post.repository.PostFileJpaRepository; import java.util.List; +import java.util.Optional; import static ussum.homepage.infra.jpa.post.entity.QPostFileEntity.postFileEntity; @@ -28,4 +29,23 @@ public List findAllByPostId(Long postId) { .map(postFileMapper::toDomain).toList(); } + @Override + public Optional findById(Long id) { + return postFileJpaRepository.findById(id).map(postFileMapper::toDomain); + } + + @Override + public List saveAll(List fileList) { + return postFileMapper.toDomain( + postFileJpaRepository.saveAll( + fileList.stream() + .map(file -> postFileMapper.toEntity(file)) + .toList()) + ); + } + + @Override + public void save(PostFile postFile) { + postFileJpaRepository.save(postFileMapper.toEntity(postFile)); + } } From eb7186ef58b709a1df436402a7f4607463ebf5ed Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Wed, 14 Aug 2024 11:18:36 +0900 Subject: [PATCH 13/18] =?UTF-8?q?[feat]=20:=20#48=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EB=AC=BC=20=EC=83=9D=EC=84=B1,=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostManageController.java | 31 +++++++++-- .../post/service/PostManageService.java | 51 +++++++++++++++++-- 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/src/main/java/ussum/homepage/application/post/controller/PostManageController.java b/src/main/java/ussum/homepage/application/post/controller/PostManageController.java index 39fda767..329f7f20 100644 --- a/src/main/java/ussum/homepage/application/post/controller/PostManageController.java +++ b/src/main/java/ussum/homepage/application/post/controller/PostManageController.java @@ -1,14 +1,15 @@ package ussum.homepage.application.post.controller; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; import org.springframework.http.ResponseEntity; +import org.springframework.javapoet.TypeName; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import ussum.homepage.application.post.service.PostManageService; -import ussum.homepage.application.post.service.PostService; -import ussum.homepage.application.post.service.dto.response.PostListResponse; +import ussum.homepage.application.post.service.dto.request.PostCreateRequest; +import ussum.homepage.application.post.service.dto.request.PostUpdateRequest; import ussum.homepage.global.ApiResponse; +import ussum.homepage.global.config.auth.UserId; @RestController @RequiredArgsConstructor @@ -32,4 +33,26 @@ public ResponseEntity> getBoardPost(@PathVariable(name = "boardCo return ApiResponse.success(postManageService.getPost(boardCode, postId)); } + + @PostMapping("/{boardCode}/posts") + public ResponseEntity> createBoardPost(@UserId Long userId, + @PathVariable(name = "boardCode") String boardCode, + @RequestBody PostCreateRequest postCreateRequest){ + return ApiResponse.success(postManageService.createBoardPost(userId, boardCode, postCreateRequest)); + } + + @PostMapping("/{boardCode}/posts/files") + public ResponseEntity> createBoardPostFile(@UserId Long userId, + @PathVariable(name = "boardCode") String boardCode, + @RequestPart(value = "files") MultipartFile[] files, + @RequestParam(value = "type") String typeName){ + return ApiResponse.success(postManageService.createBoardPostFile(userId, boardCode, files, typeName)); + } + + @PatchMapping("/{boardCode}/posts/{postId}") + public ResponseEntity> editBoardPost(@PathVariable(name = "boardCode") String boardCode, + @PathVariable(name = "postId") Long postId, + @RequestBody PostUpdateRequest postUpdateRequest) { + return ApiResponse.success(postManageService.editBoardPost(boardCode, postId, postUpdateRequest)); + } } diff --git a/src/main/java/ussum/homepage/application/post/service/PostManageService.java b/src/main/java/ussum/homepage/application/post/service/PostManageService.java index a9bee351..7b50a1df 100644 --- a/src/main/java/ussum/homepage/application/post/service/PostManageService.java +++ b/src/main/java/ussum/homepage/application/post/service/PostManageService.java @@ -5,16 +5,18 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import ussum.homepage.application.post.service.dto.request.PostCreateRequest; +import ussum.homepage.application.post.service.dto.request.PostUpdateRequest; import ussum.homepage.application.post.service.dto.response.postDetail.*; +import ussum.homepage.application.post.service.dto.response.postSave.PostCreateResponse; +import ussum.homepage.application.post.service.dto.response.postSave.PostFileResponse; import ussum.homepage.application.post.service.dto.response.postList.*; import ussum.homepage.domain.post.Board; import ussum.homepage.domain.post.Category; import ussum.homepage.domain.post.Post; import ussum.homepage.domain.post.PostFile; -import ussum.homepage.domain.post.service.BoardReader; -import ussum.homepage.domain.post.service.CategoryReader; -import ussum.homepage.domain.post.service.PostFileReader; -import ussum.homepage.domain.post.service.PostReader; +import ussum.homepage.domain.post.service.*; import ussum.homepage.domain.post.service.formatter.PostDetailFunction; import ussum.homepage.domain.postlike.service.PostReactionReader; import ussum.homepage.domain.user.User; @@ -22,10 +24,12 @@ import ussum.homepage.global.common.PageInfo; import ussum.homepage.global.error.exception.GeneralException; import ussum.homepage.global.error.status.ErrorStatus; +import ussum.homepage.infra.utils.S3utils; import java.util.List; import java.util.Map; import java.util.function.BiFunction; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -37,6 +41,10 @@ public class PostManageService { private final CategoryReader categoryReader; private final UserReader userReader; private final PostFileReader postFileReader; + private final PostAppender postAppender; + private final PostFileAppender postFileAppender; + private final PostModifier postModifier; + private final S3utils s3utils; private final Map> postResponseMap = Map.of( "공지사항게시판", (post, ignored) -> NoticePostResponse.of(post), @@ -80,7 +88,6 @@ public PostListRes getPostList(int page, int take, String boardCode) { return PostListRes.of(responseList, pageInfo); } - @Transactional public PostDetailRes getPost(String boardCode, Long postId) { Board board = boardReader.getBoardWithBoardCode(boardCode); @@ -117,6 +124,40 @@ public PostDetailRes getPost(String boardCode, Long postId) { return PostDetailRes.of(response); } + + @Transactional + public PostCreateResponse createBoardPost(Long userId, String boardCode, PostCreateRequest postCreateRequest){ + Board board = boardReader.getBoardWithBoardCode(boardCode); + Category category = categoryReader.getCategoryWithCode(postCreateRequest.categoryCode()); + User user = userReader.getUserWithId(userId); + + Post post = postAppender.createPost(postCreateRequest.toDomain(board, user, category)); + postFileAppender.save(postCreateRequest.postFileList(), post.getId()); + return PostCreateResponse.of(post.getId(), boardCode); + } + + @Transactional + public List createBoardPostFile(Long userId, String boardCode, MultipartFile[] files, String typeName){ + List urlList = s3utils.uploadFileWithPath(userId, boardCode, files, typeName); + List postFiles = convertUrlsToPostFiles(urlList, typeName); + List afterSaveList = postFileAppender.saveAllPostFile(postFiles); + + return afterSaveList.stream() + .map(postFile -> PostFileResponse.of(postFile.getId(), postFile.getUrl())) + .collect(Collectors.toList()); + } + + private List convertUrlsToPostFiles(List urlList, String typeName) { + return urlList.stream() + .map(url -> PostFile.of(null, typeName, url, null, null)) + .collect(Collectors.toList()); + } + + @Transactional + public Long editBoardPost(String boardCode, Long postId, PostUpdateRequest postUpdateRequest){ + Post post = postModifier.updatePost(boardCode, postId, postUpdateRequest); + return post.getId(); + } } //스위치 사용 로직 /* From 772d916d1e04dfa2e8f5832326728f88dd380ec7 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Thu, 15 Aug 2024 01:09:49 +0900 Subject: [PATCH 14/18] =?UTF-8?q?[fix]=20:=20#48=20SecurityConfig=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ussum/homepage/global/config/SecurityConfig.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ussum/homepage/global/config/SecurityConfig.java b/src/main/java/ussum/homepage/global/config/SecurityConfig.java index 63700e34..c99cc033 100644 --- a/src/main/java/ussum/homepage/global/config/SecurityConfig.java +++ b/src/main/java/ussum/homepage/global/config/SecurityConfig.java @@ -32,9 +32,9 @@ public class SecurityConfig { "/onboarding/**", "/swagger-ui/**", "/swagger-resources/**", - "/v3/api-docs/**" - ,"/board/{boardCode}/posts/{postId}" - ,"/board/posts/{postId}/comments" + "/v3/api-docs/**", +// "/board/{boardCode}/posts/{postId}", +// "/board/posts/{postId}/comments" }; From c0933d7a5f3e5063c063b2c17864e279c7fb94d9 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Thu, 15 Aug 2024 01:11:59 +0900 Subject: [PATCH 15/18] =?UTF-8?q?[feat]=20:=20#48=20PostCreateRequest=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/service/dto/request/PostCreateRequest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java b/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java index 57a1a8ec..6b3fae0f 100644 --- a/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java +++ b/src/main/java/ussum/homepage/application/post/service/dto/request/PostCreateRequest.java @@ -5,13 +5,16 @@ import ussum.homepage.domain.post.Post; import ussum.homepage.domain.user.User; +import java.util.List; + public record PostCreateRequest( String title, String content, String categoryCode, - String thumbNailImage + String thumbNailImage, + List postFileList ) { - public Post toDomain(Board board, User user, Category category) { + public Post toDomain(Board board, User user, Category category, String OnGoingStatus) { return Post.of( null, title, @@ -19,7 +22,7 @@ public Post toDomain(Board board, User user, Category category) { 1, thumbNailImage, "새로운", - null, + OnGoingStatus, null, null, null, From e2aad85e8ca7f4401993b7629a393069d5e1aa63 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Thu, 15 Aug 2024 01:13:28 +0900 Subject: [PATCH 16/18] =?UTF-8?q?[feat]=20:=20#48=20PostFile=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/post/PostFileRepository.java | 2 +- .../domain/post/service/PostFileAppender.java | 17 ++--------------- .../infra/jpa/post/PostFileRepositoryImpl.java | 8 ++++++-- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/main/java/ussum/homepage/domain/post/PostFileRepository.java b/src/main/java/ussum/homepage/domain/post/PostFileRepository.java index b9bc86c3..e3113a36 100644 --- a/src/main/java/ussum/homepage/domain/post/PostFileRepository.java +++ b/src/main/java/ussum/homepage/domain/post/PostFileRepository.java @@ -7,5 +7,5 @@ public interface PostFileRepository { List findAllByPostId(Long postId); Optional findById(Long id); List saveAll(List postFiles); - void save(PostFile postFile); + void updatePostIdForIds(List postFileIds, Long postId); } diff --git a/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java b/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java index 23a2bc5b..1a99f1f8 100644 --- a/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java +++ b/src/main/java/ussum/homepage/domain/post/service/PostFileAppender.java @@ -21,20 +21,7 @@ public List saveAllPostFile(List fileList) { } @Transactional - public void save(List postFileIds, Long postId){ - postFileIds.stream() - .map(postFileRepository::findById) - .filter(Optional::isPresent) - .map(Optional::get) - .forEach(postFile -> { - PostFile updatedPostFile = PostFile.of( - postFile.getId(), - postFile.getTypeName(), - postFile.getUrl(), - postFile.getSize(), - postId - ); - postFileRepository.save(updatedPostFile); - }); + public void updatePostIdForIds(List postFileIds, Long postId) { + postFileRepository.updatePostIdForIds(postFileIds, postId); } } diff --git a/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java b/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java index 74cb8179..aef971f3 100644 --- a/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java +++ b/src/main/java/ussum/homepage/infra/jpa/post/PostFileRepositoryImpl.java @@ -45,7 +45,11 @@ public List saveAll(List fileList) { } @Override - public void save(PostFile postFile) { - postFileJpaRepository.save(postFileMapper.toEntity(postFile)); + public void updatePostIdForIds(List postFileIds, Long postId) { + queryFactory + .update(postFileEntity) + .set(postFileEntity.postEntity.id, postId) + .where(postFileEntity.id.in(postFileIds)) + .execute(); } } From 6b45144e89f8725c21943af1a8b12c7bcd9af1f1 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Thu, 15 Aug 2024 01:15:08 +0900 Subject: [PATCH 17/18] =?UTF-8?q?[feat]=20:=20#48=20Post=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20=EC=88=98=EC=A0=95=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostManageController.java | 32 +++++++++++++ .../post/service/PostManageService.java | 48 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/src/main/java/ussum/homepage/application/post/controller/PostManageController.java b/src/main/java/ussum/homepage/application/post/controller/PostManageController.java index 70c99dda..48af2dec 100644 --- a/src/main/java/ussum/homepage/application/post/controller/PostManageController.java +++ b/src/main/java/ussum/homepage/application/post/controller/PostManageController.java @@ -3,9 +3,13 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import ussum.homepage.application.post.service.PostManageService; +import ussum.homepage.application.post.service.dto.request.PostCreateRequest; +import ussum.homepage.application.post.service.dto.request.PostUpdateRequest; import ussum.homepage.application.post.service.dto.request.PostUserRequest; import ussum.homepage.global.ApiResponse; +import ussum.homepage.global.config.auth.UserId; @RestController @RequiredArgsConstructor @@ -30,4 +34,32 @@ public ResponseEntity> getBoardPost(@PathVariable(name = "boardCo return ApiResponse.success(postManageService.getPost(postUserRequest, boardCode, postId)); } + @PostMapping("/{boardCode}/posts") + public ResponseEntity> createBoardPost(@UserId Long userId, + @PathVariable(name = "boardCode") String boardCode, + @RequestBody PostCreateRequest postCreateRequest){ + return ApiResponse.success(postManageService.createBoardPost(userId, boardCode, postCreateRequest)); + } + + @PostMapping("/{boardCode}/posts/files") + public ResponseEntity> createBoardPostFile(@UserId Long userId, + @PathVariable(name = "boardCode") String boardCode, + @RequestPart(value = "files") MultipartFile[] files, + @RequestParam(value = "type") String typeName){ + return ApiResponse.success(postManageService.createBoardPostFile(userId, boardCode, files, typeName)); + } + + @PatchMapping("/{boardCode}/posts/{postId}") + public ResponseEntity> editBoardPost(@PathVariable(name = "boardCode") String boardCode, + @PathVariable(name = "postId") Long postId, + @RequestBody PostUpdateRequest postUpdateRequest) { + return ApiResponse.success(postManageService.editBoardPost(boardCode, postId, postUpdateRequest)); + } + + @PostMapping("/userIdTest") + public ResponseEntity> apiTest(@UserId Long userId) { + System.out.println("userId = " + userId);; + return null; + } + } diff --git a/src/main/java/ussum/homepage/application/post/service/PostManageService.java b/src/main/java/ussum/homepage/application/post/service/PostManageService.java index 941f8f29..708033f2 100644 --- a/src/main/java/ussum/homepage/application/post/service/PostManageService.java +++ b/src/main/java/ussum/homepage/application/post/service/PostManageService.java @@ -5,9 +5,14 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import ussum.homepage.application.post.service.dto.request.PostCreateRequest; +import ussum.homepage.application.post.service.dto.request.PostUpdateRequest; import ussum.homepage.application.post.service.dto.request.PostUserRequest; import ussum.homepage.application.post.service.dto.response.postDetail.*; import ussum.homepage.application.post.service.dto.response.postList.*; +import ussum.homepage.application.post.service.dto.response.postSave.PostCreateResponse; +import ussum.homepage.application.post.service.dto.response.postSave.PostFileResponse; import ussum.homepage.domain.post.Board; import ussum.homepage.domain.post.Category; import ussum.homepage.domain.post.Post; @@ -20,10 +25,14 @@ import ussum.homepage.global.common.PageInfo; import ussum.homepage.global.error.exception.GeneralException; import ussum.homepage.global.error.status.ErrorStatus; +import ussum.homepage.infra.jpa.post.entity.OngoingStatus; +import ussum.homepage.infra.utils.S3utils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.BiFunction; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -35,7 +44,11 @@ public class PostManageService { private final CategoryReader categoryReader; private final UserReader userReader; private final PostFileReader postFileReader; + private final PostAppender postAppender; + private final PostFileAppender postFileAppender; + private final PostModifier postModifier; private final PostStatusProcessor postStatusProcessor; + private final S3utils s3utils; private final Map> postResponseMap = Map.of( "공지사항게시판", (post, ignored) -> NoticePostResponse.of(post), @@ -116,6 +129,41 @@ public PostDetailRes getPost(PostUserRequest postUserRequest, String boardCod return PostDetailRes.of(response); } + + @Transactional + public PostCreateResponse createBoardPost(Long userId, String boardCode, PostCreateRequest postCreateRequest){ + Board board = boardReader.getBoardWithBoardCode(boardCode); + Category category = categoryReader.getCategoryWithCode(postCreateRequest.categoryCode()); + User user = userReader.getUserWithId(userId); + String onGoingStatus = Objects.equals(boardCode, "PETITION") ? "IN_PROGRESS" : null; + + Post post = postAppender.createPost(postCreateRequest.toDomain(board, user, category, onGoingStatus)); + postFileAppender.updatePostIdForIds(postCreateRequest.postFileList(), post.getId()); + return PostCreateResponse.of(post.getId(), boardCode); + } + + @Transactional + public List createBoardPostFile(Long userId, String boardCode, MultipartFile[] files, String typeName){ + List urlList = s3utils.uploadFileWithPath(userId, boardCode, files, typeName); + List postFiles = convertUrlsToPostFiles(urlList, typeName); + List afterSaveList = postFileAppender.saveAllPostFile(postFiles); + + return afterSaveList.stream() + .map(postFile -> PostFileResponse.of(postFile.getId(), postFile.getUrl())) + .collect(Collectors.toList()); + } + + private List convertUrlsToPostFiles(List urlList, String typeName) { + return urlList.stream() + .map(url -> PostFile.of(null, typeName, url, null, null)) + .collect(Collectors.toList()); + } + + @Transactional + public Long editBoardPost(String boardCode, Long postId, PostUpdateRequest postUpdateRequest){ + Post post = postModifier.updatePost(boardCode, postId, postUpdateRequest); + return post.getId(); + } } //스위치 사용 로직 /* From c5ef9671c576d61cd31408237fb01f4965ff6840 Mon Sep 17 00:00:00 2001 From: Jeoongu Date: Thu, 15 Aug 2024 01:16:59 +0900 Subject: [PATCH 18/18] =?UTF-8?q?[feat]=20:=20#48=20OnGoingStatus=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ussum/homepage/application/post/service/PostService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ussum/homepage/application/post/service/PostService.java b/src/main/java/ussum/homepage/application/post/service/PostService.java index 431707ea..8dd68f86 100644 --- a/src/main/java/ussum/homepage/application/post/service/PostService.java +++ b/src/main/java/ussum/homepage/application/post/service/PostService.java @@ -62,7 +62,7 @@ public void createPost(Long userId, String boardCode, PostCreateRequest postCrea //user도 찾아 와야 하지 않을까 User user = userReader.getUserWithId(userId); - postAppender.createPost(postCreateRequest.toDomain(board, user, category)); + postAppender.createPost(postCreateRequest.toDomain(board, user, category, null)); } public PostResponse editPost(String boardCode,Long postId, PostUpdateRequest postUpdateRequest) {