From 2e8e9423f5eab25f46309b9a9307e22770be5cb1 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 9 Jul 2024 01:26:24 +0900 Subject: [PATCH 01/37] =?UTF-8?q?Feat:=20=EA=B8=B0=EB=B3=B8=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0(post)=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 8 --- .../leets/weeth/domain/user/dto/PostDTO.java | 24 ++++++++ .../leets/weeth/domain/user/entity/Post.java | 60 +++++++++++++++++++ 3 files changed, 84 insertions(+), 8 deletions(-) delete mode 100644 .idea/modules.xml create mode 100644 src/main/java/leets/weeth/domain/user/dto/PostDTO.java create mode 100644 src/main/java/leets/weeth/domain/user/entity/Post.java diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7aff3474..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/user/dto/PostDTO.java b/src/main/java/leets/weeth/domain/user/dto/PostDTO.java new file mode 100644 index 00000000..59fe8265 --- /dev/null +++ b/src/main/java/leets/weeth/domain/user/dto/PostDTO.java @@ -0,0 +1,24 @@ +package leets.weeth.domain.user.dto; + +import jakarta.validation.constraints.NotBlank; +import leets.weeth.domain.user.entity.Post; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; + +@AllArgsConstructor +@Getter +@ToString +public class PostDTO { + @NotBlank + private Long id; + @NotBlank + private String title; + @NotBlank + private String content; + + public PostDTO createPostDTO(Post post) { + return new PostDTO(post.getId(), post.getTitle(), post.getContent()); + } + +} diff --git a/src/main/java/leets/weeth/domain/user/entity/Post.java b/src/main/java/leets/weeth/domain/user/entity/Post.java new file mode 100644 index 00000000..2289718c --- /dev/null +++ b/src/main/java/leets/weeth/domain/user/entity/Post.java @@ -0,0 +1,60 @@ +package leets.weeth.domain.user.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotEmpty; +import leets.weeth.domain.user.dto.PostDTO; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@AllArgsConstructor +@NoArgsConstructor +@ToString +@Entity +@Getter +@Table(name = "posts") +public class Post { + @Id //엔티티의 대푯값 지정 + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotEmpty + @Column + @ManyToOne + @JoinColumn(name = "user_id") + private User user; + + @NotEmpty + @Column + private String title; + + @NotEmpty + @Column //content 필드 선언, DB 테이블의 content와 연결 + private String content; + + public static Post createPost(PostDTO dto, User user){ + //exception occurs + if (dto.getId() != null) + throw new IllegalArgumentException("failed to add comments. it should not have an id"); + + return new Post( + dto.getId(), + user, + dto.getTitle(), + dto.getContent() + ); + } + + + public void patch(PostDTO dto) { + if (this.id != dto.getId()) + throw new IllegalArgumentException("failed to edit the comment. wrong id"); + // 예외 발생 + if (dto.getTitle()!= null) //수정할 제목 데이터가 있다면 + this.title = dto.getTitle(); + if (dto.getContent() != null) //수정할 본문 데이터가 있다면 + this.content = dto.getContent(); + // 객체 갱신 + } +} From 34a983b1cf7f8f69dd3d2588b0a5da8e38ea4bb4 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 9 Jul 2024 16:16:23 +0900 Subject: [PATCH 02/37] =?UTF-8?q?Feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/service/PostService.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/leets/weeth/domain/user/service/PostService.java diff --git a/src/main/java/leets/weeth/domain/user/service/PostService.java b/src/main/java/leets/weeth/domain/user/service/PostService.java new file mode 100644 index 00000000..ad0f9fd9 --- /dev/null +++ b/src/main/java/leets/weeth/domain/user/service/PostService.java @@ -0,0 +1,38 @@ +package leets.weeth.domain.user.service; + +import jakarta.transaction.Transactional; +import leets.weeth.domain.user.dto.PostDTO; +import leets.weeth.domain.user.entity.Post; +import leets.weeth.domain.user.entity.User; +import leets.weeth.domain.user.repository.PostRepository; +import leets.weeth.domain.user.repository.UserRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service //서비스 객체 생성 +public class PostService { + @Autowired + private PostRepository postRepository; // 게시글 레파지터리 객체 + @Autowired + private UserRepository userRepository; + + public List index() { + return postRepository.findAll(); + } + + + public PostDTO create(Long userId, PostDTO dto) { + User user = userRepository.findById(userId).orElseThrow(()->new + IllegalArgumentException("failed to add comments! no such article")); + Post post = Post.createPost(dto, user); + if(post.getId()!=null){ + return null; //post 객체에 id가 존재한다면 + } + Post created = postRepository.save(post); + return PostDTO.createPostDTO(created); + } +} From 9a42c9b55ec93af1508db37457980e4b61a83fcc Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 9 Jul 2024 16:17:25 +0900 Subject: [PATCH 03/37] =?UTF-8?q?Feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/weeth/domain/user/service/PostService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/leets/weeth/domain/user/service/PostService.java b/src/main/java/leets/weeth/domain/user/service/PostService.java index ad0f9fd9..889be741 100644 --- a/src/main/java/leets/weeth/domain/user/service/PostService.java +++ b/src/main/java/leets/weeth/domain/user/service/PostService.java @@ -35,4 +35,16 @@ public PostDTO create(Long userId, PostDTO dto) { Post created = postRepository.save(post); return PostDTO.createPostDTO(created); } + + @Transactional + public PostDTO update(Long postid, PostDTO dto) { + Post target = postRepository.findById(postid) + .orElseThrow(()->new IllegalArgumentException("failed to edit the comment. so such comment.")); + target.patch(dto); + // 2. post 수정 + Post updated = postRepository.save(target); + // 3. DB로 갱신 + return PostDTO.createPostDTO(updated); + + } } From fe08a962fc55c3f4ffad0293773f5769407ec177 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 9 Jul 2024 16:18:17 +0900 Subject: [PATCH 04/37] =?UTF-8?q?Feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weeth/domain/user/repository/PostRepository.java | 11 +++++++++++ .../leets/weeth/domain/user/service/PostService.java | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/main/java/leets/weeth/domain/user/repository/PostRepository.java diff --git a/src/main/java/leets/weeth/domain/user/repository/PostRepository.java b/src/main/java/leets/weeth/domain/user/repository/PostRepository.java new file mode 100644 index 00000000..ee81a91a --- /dev/null +++ b/src/main/java/leets/weeth/domain/user/repository/PostRepository.java @@ -0,0 +1,11 @@ +package leets.weeth.domain.user.repository; + +import leets.weeth.domain.user.entity.Post; +import org.springframework.data.repository.CrudRepository; + +import java.util.ArrayList; + +public interface PostRepository extends CrudRepository { + @Override + ArrayList findAll(); +} diff --git a/src/main/java/leets/weeth/domain/user/service/PostService.java b/src/main/java/leets/weeth/domain/user/service/PostService.java index 889be741..c83d4d1f 100644 --- a/src/main/java/leets/weeth/domain/user/service/PostService.java +++ b/src/main/java/leets/weeth/domain/user/service/PostService.java @@ -39,7 +39,7 @@ public PostDTO create(Long userId, PostDTO dto) { @Transactional public PostDTO update(Long postid, PostDTO dto) { Post target = postRepository.findById(postid) - .orElseThrow(()->new IllegalArgumentException("failed to edit the comment. so such comment.")); + .orElseThrow(()->new IllegalArgumentException("failed to edit the Post. so such post.")); target.patch(dto); // 2. post 수정 Post updated = postRepository.save(target); @@ -47,4 +47,11 @@ public PostDTO update(Long postid, PostDTO dto) { return PostDTO.createPostDTO(updated); } + @Transactional + public PostDTO delete(Long postid) { + Post target = postRepository.findById(postid) + .orElseThrow(()->new IllegalArgumentException("no such post")); + postRepository.delete(target); + return PostDTO.createPostDTO(target); + } } From 75278731fbf0907582cdae34a54f63a3b5a77fca Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 9 Jul 2024 16:31:11 +0900 Subject: [PATCH 05/37] =?UTF-8?q?Feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20api=20=EB=B0=8F=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=EB=A1=9C=20=EC=B0=BE=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/PostController.java | 40 +++++++++++++++++++ .../leets/weeth/domain/user/dto/PostDTO.java | 2 +- .../domain/user/service/PostService.java | 6 +-- 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 src/main/java/leets/weeth/domain/user/controller/PostController.java diff --git a/src/main/java/leets/weeth/domain/user/controller/PostController.java b/src/main/java/leets/weeth/domain/user/controller/PostController.java new file mode 100644 index 00000000..57b0ab9b --- /dev/null +++ b/src/main/java/leets/weeth/domain/user/controller/PostController.java @@ -0,0 +1,40 @@ +package leets.weeth.domain.user.controller; + +import jakarta.validation.Valid; +import leets.weeth.domain.user.dto.PostDTO; +import leets.weeth.domain.user.dto.UserDTO; +import leets.weeth.domain.user.entity.Post; +import leets.weeth.domain.user.service.PostService; +import leets.weeth.domain.user.service.UserService; +import leets.weeth.global.auth.jwt.service.JwtService; +import leets.weeth.global.common.response.CommonResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/posts") +public class PostController { + @Autowired + private final PostService postService; + @Autowired + private JwtService tokenProvider; + @PostMapping("/new") + public ResponseEntity create(@RequestBody PostDTO dto, @RequestHeader("Authorization") String token){ + String jwtToken = token.substring(7); + System.out.println("token : " + jwtToken); + String userEmail = String.valueOf(tokenProvider.extractEmail(jwtToken)); + Post created = postService.create(userEmail, dto); + return (created != null)? + ResponseEntity.status(HttpStatus.OK).body(created): + ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + } + + + +} diff --git a/src/main/java/leets/weeth/domain/user/dto/PostDTO.java b/src/main/java/leets/weeth/domain/user/dto/PostDTO.java index 59fe8265..30097775 100644 --- a/src/main/java/leets/weeth/domain/user/dto/PostDTO.java +++ b/src/main/java/leets/weeth/domain/user/dto/PostDTO.java @@ -17,7 +17,7 @@ public class PostDTO { @NotBlank private String content; - public PostDTO createPostDTO(Post post) { + public static PostDTO createPostDTO(Post post) { return new PostDTO(post.getId(), post.getTitle(), post.getContent()); } diff --git a/src/main/java/leets/weeth/domain/user/service/PostService.java b/src/main/java/leets/weeth/domain/user/service/PostService.java index c83d4d1f..293e6d7c 100644 --- a/src/main/java/leets/weeth/domain/user/service/PostService.java +++ b/src/main/java/leets/weeth/domain/user/service/PostService.java @@ -25,15 +25,15 @@ public List index() { } - public PostDTO create(Long userId, PostDTO dto) { - User user = userRepository.findById(userId).orElseThrow(()->new + public Post create(String userEmail, PostDTO dto) { + User user = userRepository.findByEmail(userEmail).orElseThrow(()->new IllegalArgumentException("failed to add comments! no such article")); Post post = Post.createPost(dto, user); if(post.getId()!=null){ return null; //post 객체에 id가 존재한다면 } Post created = postRepository.save(post); - return PostDTO.createPostDTO(created); + return created; } @Transactional From 19af70cae0b48b303645d86762376cdf4972db6f Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 9 Jul 2024 16:40:24 +0900 Subject: [PATCH 06/37] =?UTF-8?q?Refactor:=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/weeth/domain/user/service/PostService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/leets/weeth/domain/user/service/PostService.java b/src/main/java/leets/weeth/domain/user/service/PostService.java index 293e6d7c..bc0b853b 100644 --- a/src/main/java/leets/weeth/domain/user/service/PostService.java +++ b/src/main/java/leets/weeth/domain/user/service/PostService.java @@ -27,7 +27,7 @@ public List index() { public Post create(String userEmail, PostDTO dto) { User user = userRepository.findByEmail(userEmail).orElseThrow(()->new - IllegalArgumentException("failed to add comments! no such article")); + IllegalArgumentException("failed to add post! no such user")); Post post = Post.createPost(dto, user); if(post.getId()!=null){ return null; //post 객체에 id가 존재한다면 From abe420641a3856fedd21bb876c930abef8646b5b Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 9 Jul 2024 16:55:47 +0900 Subject: [PATCH 07/37] =?UTF-8?q?Refactor:=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/weeth/domain/user/entity/Post.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/leets/weeth/domain/user/entity/Post.java b/src/main/java/leets/weeth/domain/user/entity/Post.java index 2289718c..4bfe6654 100644 --- a/src/main/java/leets/weeth/domain/user/entity/Post.java +++ b/src/main/java/leets/weeth/domain/user/entity/Post.java @@ -20,7 +20,6 @@ public class Post { private Long id; @NotEmpty - @Column @ManyToOne @JoinColumn(name = "user_id") private User user; From 50a06e4a31131cf50f8341112b5bfb467b936c56 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 10 Jul 2024 22:21:14 +0900 Subject: [PATCH 08/37] =?UTF-8?q?Refactor:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PostController.java | 25 ++++++------------- .../domain/{user => post}/dto/PostDTO.java | 6 ++--- .../domain/{user => post}/entity/Post.java | 7 +++--- .../repository/PostRepository.java | 4 +-- .../{user => post}/service/PostService.java | 11 +++----- 5 files changed, 21 insertions(+), 32 deletions(-) rename src/main/java/leets/weeth/domain/{user => post}/controller/PostController.java (53%) rename src/main/java/leets/weeth/domain/{user => post}/dto/PostDTO.java (82%) rename src/main/java/leets/weeth/domain/{user => post}/entity/Post.java (86%) rename src/main/java/leets/weeth/domain/{user => post}/repository/PostRepository.java (70%) rename src/main/java/leets/weeth/domain/{user => post}/service/PostService.java (84%) diff --git a/src/main/java/leets/weeth/domain/user/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java similarity index 53% rename from src/main/java/leets/weeth/domain/user/controller/PostController.java rename to src/main/java/leets/weeth/domain/post/controller/PostController.java index 57b0ab9b..07885dc5 100644 --- a/src/main/java/leets/weeth/domain/user/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -1,21 +1,17 @@ -package leets.weeth.domain.user.controller; +package leets.weeth.domain.post.controller; -import jakarta.validation.Valid; -import leets.weeth.domain.user.dto.PostDTO; -import leets.weeth.domain.user.dto.UserDTO; -import leets.weeth.domain.user.entity.Post; -import leets.weeth.domain.user.service.PostService; -import leets.weeth.domain.user.service.UserService; +import leets.weeth.domain.post.dto.PostDTO; +import leets.weeth.domain.post.entity.Post; +import leets.weeth.domain.post.service.PostService; import leets.weeth.global.auth.jwt.service.JwtService; -import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.User; import org.springframework.web.bind.annotation.*; -import java.util.List; - @RestController @RequiredArgsConstructor @RequestMapping("/posts") @@ -25,16 +21,11 @@ public class PostController { @Autowired private JwtService tokenProvider; @PostMapping("/new") - public ResponseEntity create(@RequestBody PostDTO dto, @RequestHeader("Authorization") String token){ - String jwtToken = token.substring(7); - System.out.println("token : " + jwtToken); - String userEmail = String.valueOf(tokenProvider.extractEmail(jwtToken)); - Post created = postService.create(userEmail, dto); + public ResponseEntity create(@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ + Post created = postService.create(user.getUsername(), dto); return (created != null)? ResponseEntity.status(HttpStatus.OK).body(created): ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } - - } diff --git a/src/main/java/leets/weeth/domain/user/dto/PostDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostDTO.java similarity index 82% rename from src/main/java/leets/weeth/domain/user/dto/PostDTO.java rename to src/main/java/leets/weeth/domain/post/dto/PostDTO.java index 30097775..fe960e10 100644 --- a/src/main/java/leets/weeth/domain/user/dto/PostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/PostDTO.java @@ -1,7 +1,7 @@ -package leets.weeth.domain.user.dto; +package leets.weeth.domain.post.dto; import jakarta.validation.constraints.NotBlank; -import leets.weeth.domain.user.entity.Post; +import leets.weeth.domain.post.entity.Post; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; @@ -10,7 +10,7 @@ @Getter @ToString public class PostDTO { - @NotBlank + private Long id; @NotBlank private String title; diff --git a/src/main/java/leets/weeth/domain/user/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java similarity index 86% rename from src/main/java/leets/weeth/domain/user/entity/Post.java rename to src/main/java/leets/weeth/domain/post/entity/Post.java index 4bfe6654..8085fa90 100644 --- a/src/main/java/leets/weeth/domain/user/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -1,8 +1,9 @@ -package leets.weeth.domain.user.entity; +package leets.weeth.domain.post.entity; import jakarta.persistence.*; import jakarta.validation.constraints.NotEmpty; -import leets.weeth.domain.user.dto.PostDTO; +import leets.weeth.domain.post.dto.PostDTO; +import leets.weeth.domain.user.entity.User; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -35,7 +36,7 @@ public class Post { public static Post createPost(PostDTO dto, User user){ //exception occurs if (dto.getId() != null) - throw new IllegalArgumentException("failed to add comments. it should not have an id"); + throw new IllegalArgumentException("failed to add post. it should not have an id"); return new Post( dto.getId(), diff --git a/src/main/java/leets/weeth/domain/user/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java similarity index 70% rename from src/main/java/leets/weeth/domain/user/repository/PostRepository.java rename to src/main/java/leets/weeth/domain/post/repository/PostRepository.java index ee81a91a..58849a73 100644 --- a/src/main/java/leets/weeth/domain/user/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java @@ -1,6 +1,6 @@ -package leets.weeth.domain.user.repository; +package leets.weeth.domain.post.repository; -import leets.weeth.domain.user.entity.Post; +import leets.weeth.domain.post.entity.Post; import org.springframework.data.repository.CrudRepository; import java.util.ArrayList; diff --git a/src/main/java/leets/weeth/domain/user/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java similarity index 84% rename from src/main/java/leets/weeth/domain/user/service/PostService.java rename to src/main/java/leets/weeth/domain/post/service/PostService.java index bc0b853b..e8451b6e 100644 --- a/src/main/java/leets/weeth/domain/user/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -1,10 +1,10 @@ -package leets.weeth.domain.user.service; +package leets.weeth.domain.post.service; import jakarta.transaction.Transactional; -import leets.weeth.domain.user.dto.PostDTO; -import leets.weeth.domain.user.entity.Post; +import leets.weeth.domain.post.dto.PostDTO; +import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.user.entity.User; -import leets.weeth.domain.user.repository.PostRepository; +import leets.weeth.domain.post.repository.PostRepository; import leets.weeth.domain.user.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,9 +29,6 @@ public Post create(String userEmail, PostDTO dto) { User user = userRepository.findByEmail(userEmail).orElseThrow(()->new IllegalArgumentException("failed to add post! no such user")); Post post = Post.createPost(dto, user); - if(post.getId()!=null){ - return null; //post 객체에 id가 존재한다면 - } Post created = postRepository.save(post); return created; } From e3b706be4e4c8ba52b848a57c7b232342640ac72 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 10 Jul 2024 22:40:52 +0900 Subject: [PATCH 09/37] =?UTF-8?q?Fix:=20post=20entity=EC=99=80=20dto=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/weeth/domain/post/dto/PostDTO.java | 2 ++ src/main/java/leets/weeth/domain/post/entity/Post.java | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/leets/weeth/domain/post/dto/PostDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostDTO.java index fe960e10..2eb3768c 100644 --- a/src/main/java/leets/weeth/domain/post/dto/PostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/PostDTO.java @@ -4,9 +4,11 @@ import leets.weeth.domain.post.entity.Post; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.ToString; @AllArgsConstructor +@NoArgsConstructor @Getter @ToString public class PostDTO { diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index 8085fa90..cb7eef36 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -20,7 +20,6 @@ public class Post { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @NotEmpty @ManyToOne @JoinColumn(name = "user_id") private User user; From f9d585f332c2657f0287e6330ec7a3422bcea052 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 10 Jul 2024 23:26:01 +0900 Subject: [PATCH 10/37] =?UTF-8?q?refactor:=20BaseEntity=20=EC=83=81?= =?UTF-8?q?=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/weeth/domain/post/entity/Post.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index cb7eef36..b13c875e 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotEmpty; import leets.weeth.domain.post.dto.PostDTO; import leets.weeth.domain.user.entity.User; +import leets.weeth.global.common.entity.BaseEntity; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,7 +16,7 @@ @Entity @Getter @Table(name = "posts") -public class Post { +public class Post extends BaseEntity { @Id //엔티티의 대푯값 지정 @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; From 229695799cc4850fa431e8485bf9416e3ef35b5e Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 11 Jul 2024 00:52:50 +0900 Subject: [PATCH 11/37] =?UTF-8?q?Feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=9D=BD=EA=B8=B0,=20=EC=82=AD=EC=A0=9C,=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 31 ++++++++++++++++++- .../leets/weeth/domain/post/entity/Post.java | 9 +----- .../domain/post/service/PostService.java | 26 +++++++++++----- 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 07885dc5..728184fd 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -9,8 +9,10 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.userdetails.User; import org.springframework.web.bind.annotation.*; +import org.springframework.security.core.userdetails.User; + +import java.util.List; @RestController @RequiredArgsConstructor @@ -28,4 +30,31 @@ public ResponseEntity create(@RequestBody PostDTO dto, @AuthenticationPrin ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } + @GetMapping("") + public List index(){ + return postService.index(); + } + + @GetMapping("/{postId}") + public Post show(@PathVariable Long postId){ + return postService.show(postId); + } + + @PatchMapping("/{postId}") + public ResponseEntity edit(@PathVariable Long postId,@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ + Post edited = postService.update(postId, dto, user.getUsername()); + return (edited != null)? + ResponseEntity.status(HttpStatus.OK).body(edited): + ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + } + + @DeleteMapping("/{postId}") + public ResponseEntity delete(@PathVariable Long postId, @AuthenticationPrincipal User user){ + Post deleted = postService.delete(postId, user.getUsername()); + return (deleted != null)? + ResponseEntity.status(HttpStatus.OK).body(deleted): + ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + + } + } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index b13c875e..23adfd80 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -34,10 +34,6 @@ public class Post extends BaseEntity { private String content; public static Post createPost(PostDTO dto, User user){ - //exception occurs - if (dto.getId() != null) - throw new IllegalArgumentException("failed to add post. it should not have an id"); - return new Post( dto.getId(), user, @@ -48,13 +44,10 @@ public static Post createPost(PostDTO dto, User user){ public void patch(PostDTO dto) { - if (this.id != dto.getId()) - throw new IllegalArgumentException("failed to edit the comment. wrong id"); - // 예외 발생 + if (dto.getTitle()!= null) //수정할 제목 데이터가 있다면 this.title = dto.getTitle(); if (dto.getContent() != null) //수정할 본문 데이터가 있다면 this.content = dto.getContent(); - // 객체 갱신 } } diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index e8451b6e..4f360e2b 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -3,11 +3,12 @@ import jakarta.transaction.Transactional; import leets.weeth.domain.post.dto.PostDTO; import leets.weeth.domain.post.entity.Post; -import leets.weeth.domain.user.entity.User; import leets.weeth.domain.post.repository.PostRepository; +import leets.weeth.domain.user.entity.User; import leets.weeth.domain.user.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Service; import java.util.List; @@ -24,9 +25,13 @@ public List index() { return postRepository.findAll(); } + public Post show(Long postId) { + return postRepository.findById(postId).orElse(null); + } - public Post create(String userEmail, PostDTO dto) { - User user = userRepository.findByEmail(userEmail).orElseThrow(()->new + + public Post create(String email, PostDTO dto) { + User user = userRepository.findByEmail(email).orElseThrow(()->new IllegalArgumentException("failed to add post! no such user")); Post post = Post.createPost(dto, user); Post created = postRepository.save(post); @@ -34,21 +39,28 @@ public Post create(String userEmail, PostDTO dto) { } @Transactional - public PostDTO update(Long postid, PostDTO dto) { + public Post update(Long postid, PostDTO dto, String currentEmail) { + Post target = postRepository.findById(postid) .orElseThrow(()->new IllegalArgumentException("failed to edit the Post. so such post.")); + if (!target.getUser().getEmail().equals(currentEmail)) { + throw new AccessDeniedException("You do not have permission to edit this post"); + } target.patch(dto); // 2. post 수정 Post updated = postRepository.save(target); // 3. DB로 갱신 - return PostDTO.createPostDTO(updated); + return updated; } @Transactional - public PostDTO delete(Long postid) { + public Post delete(Long postid, String currentEmail) { Post target = postRepository.findById(postid) .orElseThrow(()->new IllegalArgumentException("no such post")); + if(!target.getUser().getEmail().equals(currentEmail)){ + throw new AccessDeniedException("You do not have permission to delete this post"); + } postRepository.delete(target); - return PostDTO.createPostDTO(target); + return target; } } From 5f7071e508ba2f279d48d67430f30e1ecd46ccf3 Mon Sep 17 00:00:00 2001 From: jj Date: Fri, 12 Jul 2024 12:57:01 +0900 Subject: [PATCH 12/37] =?UTF-8?q?Refactor:=20CommonResponse=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 27 +++++++------------ .../domain/post/service/PostService.java | 13 ++++----- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 728184fd..f7ad4270 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -4,6 +4,7 @@ import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.post.service.PostService; import leets.weeth.global.auth.jwt.service.JwtService; +import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -20,14 +21,10 @@ public class PostController { @Autowired private final PostService postService; - @Autowired - private JwtService tokenProvider; @PostMapping("/new") - public ResponseEntity create(@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ - Post created = postService.create(user.getUsername(), dto); - return (created != null)? - ResponseEntity.status(HttpStatus.OK).body(created): - ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + public CommonResponse create(@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ + postService.create(user.getUsername(), dto); + return CommonResponse.createSuccess(); } @GetMapping("") @@ -41,19 +38,15 @@ public Post show(@PathVariable Long postId){ } @PatchMapping("/{postId}") - public ResponseEntity edit(@PathVariable Long postId,@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ - Post edited = postService.update(postId, dto, user.getUsername()); - return (edited != null)? - ResponseEntity.status(HttpStatus.OK).body(edited): - ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + public CommonResponse edit(@PathVariable Long postId,@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ + postService.update(postId, dto, user.getUsername()); + return CommonResponse.createSuccess(); } @DeleteMapping("/{postId}") - public ResponseEntity delete(@PathVariable Long postId, @AuthenticationPrincipal User user){ - Post deleted = postService.delete(postId, user.getUsername()); - return (deleted != null)? - ResponseEntity.status(HttpStatus.OK).body(deleted): - ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + public CommonResponse delete(@PathVariable Long postId, @AuthenticationPrincipal User user){ + postService.delete(postId, user.getUsername()); + return CommonResponse.createSuccess(); } diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 4f360e2b..e33a3db3 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -30,16 +30,15 @@ public Post show(Long postId) { } - public Post create(String email, PostDTO dto) { + public void create(String email, PostDTO dto) { User user = userRepository.findByEmail(email).orElseThrow(()->new IllegalArgumentException("failed to add post! no such user")); Post post = Post.createPost(dto, user); - Post created = postRepository.save(post); - return created; + postRepository.save(post); } @Transactional - public Post update(Long postid, PostDTO dto, String currentEmail) { + public void update(Long postid, PostDTO dto, String currentEmail) { Post target = postRepository.findById(postid) .orElseThrow(()->new IllegalArgumentException("failed to edit the Post. so such post.")); @@ -48,19 +47,17 @@ public Post update(Long postid, PostDTO dto, String currentEmail) { } target.patch(dto); // 2. post 수정 - Post updated = postRepository.save(target); + postRepository.save(target); // 3. DB로 갱신 - return updated; } @Transactional - public Post delete(Long postid, String currentEmail) { + public void delete(Long postid, String currentEmail) { Post target = postRepository.findById(postid) .orElseThrow(()->new IllegalArgumentException("no such post")); if(!target.getUser().getEmail().equals(currentEmail)){ throw new AccessDeniedException("You do not have permission to delete this post"); } postRepository.delete(target); - return target; } } From 581865bcf0cad4472e81c1eba6a8503bbe6a9a15 Mon Sep 17 00:00:00 2001 From: jj Date: Fri, 12 Jul 2024 13:06:30 +0900 Subject: [PATCH 13/37] =?UTF-8?q?Refactor:=20CommonResponse=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=B4=20Post=20=EA=B0=9D=EC=B2=B4=EB=8F=84=20?= =?UTF-8?q?=EB=A6=AC=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weeth/domain/post/controller/PostController.java | 11 +++++++---- .../leets/weeth/domain/post/service/PostService.java | 8 ++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index f7ad4270..78760fd4 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -28,13 +28,16 @@ public CommonResponse create(@RequestBody PostDTO dto, @AuthenticationPr } @GetMapping("") - public List index(){ - return postService.index(); + public CommonResponse> index(){ + + List posts = postService.index(); + return CommonResponse.createSuccess(posts); } @GetMapping("/{postId}") - public Post show(@PathVariable Long postId){ - return postService.show(postId); + public CommonResponse show(@PathVariable Long postId){ + Post newPost = postService.show(postId); + return CommonResponse.createSuccess(newPost); } @PatchMapping("/{postId}") diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index e33a3db3..213b3660 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; @Slf4j @Service //서비스 객체 생성 @@ -21,8 +22,11 @@ public class PostService { @Autowired private UserRepository userRepository; - public List index() { - return postRepository.findAll(); + public List index() { + List posts = postRepository.findAll(); + return posts.stream() + .map(PostDTO::createPostDTO) + .collect(Collectors.toList()); } public Post show(Long postId) { From da66250acff4a248a98548d5d5373ed52f905dd6 Mon Sep 17 00:00:00 2001 From: jj Date: Fri, 12 Jul 2024 13:53:09 +0900 Subject: [PATCH 14/37] =?UTF-8?q?Refactor:=20Post=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=AC=20=EB=95=8C=EC=9D=98=20exception=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/weeth/domain/post/entity/Post.java | 3 +-- .../domain/post/service/PostService.java | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index 23adfd80..89232d26 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -19,6 +19,7 @@ public class Post extends BaseEntity { @Id //엔티티의 대푯값 지정 @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "post_id") private Long id; @ManyToOne @@ -26,11 +27,9 @@ public class Post extends BaseEntity { private User user; @NotEmpty - @Column private String title; @NotEmpty - @Column //content 필드 선언, DB 테이블의 content와 연결 private String content; public static Post createPost(PostDTO dto, User user){ diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 213b3660..8576575c 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -9,11 +9,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; - +import jakarta.persistence.EntityNotFoundException; import java.util.List; import java.util.stream.Collectors; + @Slf4j @Service //서비스 객체 생성 public class PostService { @@ -30,22 +32,24 @@ public List index() { } public Post show(Long postId) { - return postRepository.findById(postId).orElse(null); + Post target = postRepository.findById(postId) + .orElseThrow(()->new EntityNotFoundException("Failed to edit the Post. no such post.")); + return target; } public void create(String email, PostDTO dto) { - User user = userRepository.findByEmail(email).orElseThrow(()->new - IllegalArgumentException("failed to add post! no such user")); + User user = userRepository.findByEmail(email) + .orElseThrow(()->new UsernameNotFoundException("failed to add post! no such user")); Post post = Post.createPost(dto, user); postRepository.save(post); } @Transactional - public void update(Long postid, PostDTO dto, String currentEmail) { + public void update(Long postId, PostDTO dto, String currentEmail) { - Post target = postRepository.findById(postid) - .orElseThrow(()->new IllegalArgumentException("failed to edit the Post. so such post.")); + Post target = postRepository.findById(postId) + .orElseThrow(()->new EntityNotFoundException("Failed to edit the Post. no such post.")); if (!target.getUser().getEmail().equals(currentEmail)) { throw new AccessDeniedException("You do not have permission to edit this post"); } @@ -58,7 +62,7 @@ public void update(Long postid, PostDTO dto, String currentEmail) { @Transactional public void delete(Long postid, String currentEmail) { Post target = postRepository.findById(postid) - .orElseThrow(()->new IllegalArgumentException("no such post")); + .orElseThrow(()->new EntityNotFoundException("Failed to delete the Post. no such post")); if(!target.getUser().getEmail().equals(currentEmail)){ throw new AccessDeniedException("You do not have permission to delete this post"); } From 746ae474e9b60f887aa5bc9f97a82aaecbe20284 Mon Sep 17 00:00:00 2001 From: jj Date: Fri, 12 Jul 2024 13:55:31 +0900 Subject: [PATCH 15/37] =?UTF-8?q?Refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9E=84=ED=8F=AC=ED=8A=B8=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 --- .../leets/weeth/domain/post/controller/PostController.java | 3 --- .../leets/weeth/domain/post/repository/PostRepository.java | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 78760fd4..8ff882ab 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -3,12 +3,9 @@ import leets.weeth.domain.post.dto.PostDTO; import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.post.service.PostService; -import leets.weeth.global.auth.jwt.service.JwtService; import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.security.core.userdetails.User; diff --git a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java index 58849a73..275c9adf 100644 --- a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java @@ -1,11 +1,11 @@ package leets.weeth.domain.post.repository; import leets.weeth.domain.post.entity.Post; -import org.springframework.data.repository.CrudRepository; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.ArrayList; -public interface PostRepository extends CrudRepository { +public interface PostRepository extends JpaRepository { @Override ArrayList findAll(); } From c3c0312e5badea9cff6bbf59dc0e4b4849e711e9 Mon Sep 17 00:00:00 2001 From: jj Date: Fri, 12 Jul 2024 14:12:37 +0900 Subject: [PATCH 16/37] =?UTF-8?q?Refactor:=20Post=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/weeth/domain/post/entity/Post.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index 89232d26..3858d7cb 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -15,7 +15,7 @@ @ToString @Entity @Getter -@Table(name = "posts") +@Table public class Post extends BaseEntity { @Id //엔티티의 대푯값 지정 @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -42,7 +42,7 @@ public static Post createPost(PostDTO dto, User user){ } - public void patch(PostDTO dto) { + public void updatePost(PostDTO dto) { if (dto.getTitle()!= null) //수정할 제목 데이터가 있다면 this.title = dto.getTitle(); From 3e56211ecf0c2f28e64e03675017226fe41750b2 Mon Sep 17 00:00:00 2001 From: jj Date: Fri, 12 Jul 2024 14:19:11 +0900 Subject: [PATCH 17/37] =?UTF-8?q?Refactor:=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=AA=A8=EB=93=A0=20post?= =?UTF-8?q?=20=EB=B6=88=EB=9F=AC=EC=98=AC=E3=85=87=20=EB=95=8C=20id?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/post/service/PostService.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 8576575c..d48ca46a 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -8,6 +8,7 @@ import leets.weeth.domain.user.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @@ -24,8 +25,9 @@ public class PostService { @Autowired private UserRepository userRepository; + //모든 게시물 가져오기 public List index() { - List posts = postRepository.findAll(); + List posts = postRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); return posts.stream() .map(PostDTO::createPostDTO) .collect(Collectors.toList()); @@ -41,31 +43,31 @@ public Post show(Long postId) { public void create(String email, PostDTO dto) { User user = userRepository.findByEmail(email) .orElseThrow(()->new UsernameNotFoundException("failed to add post! no such user")); - Post post = Post.createPost(dto, user); - postRepository.save(post); + Post newPost = Post.createPost(dto, user); + postRepository.save(newPost); } @Transactional public void update(Long postId, PostDTO dto, String currentEmail) { - Post target = postRepository.findById(postId) + Post updated = postRepository.findById(postId) .orElseThrow(()->new EntityNotFoundException("Failed to edit the Post. no such post.")); - if (!target.getUser().getEmail().equals(currentEmail)) { + if (!updated.getUser().getEmail().equals(currentEmail)) { throw new AccessDeniedException("You do not have permission to edit this post"); } - target.patch(dto); + updated.updatePost(dto); // 2. post 수정 - postRepository.save(target); + postRepository.save(updated); // 3. DB로 갱신 } @Transactional public void delete(Long postid, String currentEmail) { - Post target = postRepository.findById(postid) + Post deleted = postRepository.findById(postid) .orElseThrow(()->new EntityNotFoundException("Failed to delete the Post. no such post")); - if(!target.getUser().getEmail().equals(currentEmail)){ + if(!deleted.getUser().getEmail().equals(currentEmail)){ throw new AccessDeniedException("You do not have permission to delete this post"); } - postRepository.delete(target); + postRepository.delete(deleted); } } From 975cf9a116cbd1e4a571a9246a7fc12d83cf4904 Mon Sep 17 00:00:00 2001 From: jj Date: Mon, 15 Jul 2024 23:45:51 +0900 Subject: [PATCH 18/37] =?UTF-8?q?Refactor:=20RequestPostDTO=EC=99=80=20Res?= =?UTF-8?q?ponsePostDTO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weeth/domain/post/dto/RequestPostDTO.java | 16 ++++++++++++++++ .../weeth/domain/post/dto/ResponsePostDTO.java | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java create mode 100644 src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java new file mode 100644 index 00000000..86daa3f9 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java @@ -0,0 +1,16 @@ +package leets.weeth.domain.post.dto; + +import jakarta.validation.constraints.NotBlank; +import leets.weeth.domain.post.entity.Post; +import leets.weeth.global.common.entity.BaseEntity; + +public class RequestPostDTO extends BaseEntity { + @NotBlank + private String title; + @NotBlank + private String content; + + public static PostDTO createReqeustPostDTO(Post post) { + return new PostDTO(post.getId(), post.getTitle(), post.getContent()); + } +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java new file mode 100644 index 00000000..a3a328cd --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -0,0 +1,18 @@ +package leets.weeth.domain.post.dto; + +import jakarta.validation.constraints.NotBlank; +import leets.weeth.domain.post.entity.Post; +import leets.weeth.global.common.entity.BaseEntity; + +public class ResponsePostDTO extends BaseEntity { + + private Long id; + @NotBlank + private String title; + @NotBlank + private String content; + + public static PostDTO createResponsePostDTO(Post post) { + return new PostDTO(post.getId(), post.getTitle(), post.getContent()); + } +} From 672b6856abf611ecd46eed96cf46a02ac43c4a91 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 16 Jul 2024 00:40:09 +0900 Subject: [PATCH 19/37] =?UTF-8?q?Refactor:=20RequestPostDTO=EC=99=80=20Res?= =?UTF-8?q?ponsePostDTO=EC=9D=84=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 15 ++++++----- .../leets/weeth/domain/post/dto/PostDTO.java | 26 ------------------- .../weeth/domain/post/dto/RequestPostDTO.java | 12 ++++++--- .../domain/post/dto/ResponsePostDTO.java | 12 +++++++-- .../leets/weeth/domain/post/entity/Post.java | 8 +++--- .../domain/post/service/PostService.java | 15 ++++++----- 6 files changed, 38 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/leets/weeth/domain/post/dto/PostDTO.java diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 8ff882ab..ce1531f1 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -1,6 +1,7 @@ package leets.weeth.domain.post.controller; -import leets.weeth.domain.post.dto.PostDTO; +import leets.weeth.domain.post.dto.RequestPostDTO; +import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.post.service.PostService; import leets.weeth.global.common.response.CommonResponse; @@ -19,15 +20,15 @@ public class PostController { @Autowired private final PostService postService; @PostMapping("/new") - public CommonResponse create(@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ - postService.create(user.getUsername(), dto); + public CommonResponse create(@RequestBody RequestPostDTO requestPostDTO, @AuthenticationPrincipal User user){ + postService.create(user.getUsername(), requestPostDTO); return CommonResponse.createSuccess(); } @GetMapping("") - public CommonResponse> index(){ + public CommonResponse> index(){ - List posts = postService.index(); + List posts = postService.index(); return CommonResponse.createSuccess(posts); } @@ -38,8 +39,8 @@ public CommonResponse show(@PathVariable Long postId){ } @PatchMapping("/{postId}") - public CommonResponse edit(@PathVariable Long postId,@RequestBody PostDTO dto, @AuthenticationPrincipal User user){ - postService.update(postId, dto, user.getUsername()); + public CommonResponse edit(@PathVariable Long postId, @RequestBody RequestPostDTO requestPostDTO, @AuthenticationPrincipal User user){ + postService.update(postId, requestPostDTO, user.getUsername()); return CommonResponse.createSuccess(); } diff --git a/src/main/java/leets/weeth/domain/post/dto/PostDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostDTO.java deleted file mode 100644 index 2eb3768c..00000000 --- a/src/main/java/leets/weeth/domain/post/dto/PostDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package leets.weeth.domain.post.dto; - -import jakarta.validation.constraints.NotBlank; -import leets.weeth.domain.post.entity.Post; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@ToString -public class PostDTO { - - private Long id; - @NotBlank - private String title; - @NotBlank - private String content; - - public static PostDTO createPostDTO(Post post) { - return new PostDTO(post.getId(), post.getTitle(), post.getContent()); - } - -} diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java index 86daa3f9..0e0faa10 100644 --- a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java @@ -3,14 +3,18 @@ import jakarta.validation.constraints.NotBlank; import leets.weeth.domain.post.entity.Post; import leets.weeth.global.common.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +@AllArgsConstructor +@NoArgsConstructor +@Getter +@ToString public class RequestPostDTO extends BaseEntity { @NotBlank private String title; @NotBlank private String content; - - public static PostDTO createReqeustPostDTO(Post post) { - return new PostDTO(post.getId(), post.getTitle(), post.getContent()); - } } \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index a3a328cd..4f7bc179 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -3,7 +3,15 @@ import jakarta.validation.constraints.NotBlank; import leets.weeth.domain.post.entity.Post; import leets.weeth.global.common.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +@AllArgsConstructor +@NoArgsConstructor +@Getter +@ToString public class ResponsePostDTO extends BaseEntity { private Long id; @@ -12,7 +20,7 @@ public class ResponsePostDTO extends BaseEntity { @NotBlank private String content; - public static PostDTO createResponsePostDTO(Post post) { - return new PostDTO(post.getId(), post.getTitle(), post.getContent()); + public static ResponsePostDTO createResponsePostDTO(Post post) { + return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent()); } } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index 3858d7cb..fc9fac20 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -2,7 +2,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotEmpty; -import leets.weeth.domain.post.dto.PostDTO; +import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.user.entity.User; import leets.weeth.global.common.entity.BaseEntity; import lombok.AllArgsConstructor; @@ -32,9 +32,9 @@ public class Post extends BaseEntity { @NotEmpty private String content; - public static Post createPost(PostDTO dto, User user){ + public static Post createPost(RequestPostDTO dto, User user){ return new Post( - dto.getId(), + null, user, dto.getTitle(), dto.getContent() @@ -42,7 +42,7 @@ public static Post createPost(PostDTO dto, User user){ } - public void updatePost(PostDTO dto) { + public void updatePost(RequestPostDTO dto) { if (dto.getTitle()!= null) //수정할 제목 데이터가 있다면 this.title = dto.getTitle(); diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index d48ca46a..141f15ff 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -1,7 +1,8 @@ package leets.weeth.domain.post.service; import jakarta.transaction.Transactional; -import leets.weeth.domain.post.dto.PostDTO; +import leets.weeth.domain.post.dto.RequestPostDTO; +import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.post.repository.PostRepository; import leets.weeth.domain.user.entity.User; @@ -26,10 +27,10 @@ public class PostService { private UserRepository userRepository; //모든 게시물 가져오기 - public List index() { + public List index() { List posts = postRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); return posts.stream() - .map(PostDTO::createPostDTO) + .map(ResponsePostDTO::createResponsePostDTO) .collect(Collectors.toList()); } @@ -40,22 +41,22 @@ public Post show(Long postId) { } - public void create(String email, PostDTO dto) { + public void create(String email, RequestPostDTO requestPostDTO) { User user = userRepository.findByEmail(email) .orElseThrow(()->new UsernameNotFoundException("failed to add post! no such user")); - Post newPost = Post.createPost(dto, user); + Post newPost = Post.createPost(requestPostDTO, user); postRepository.save(newPost); } @Transactional - public void update(Long postId, PostDTO dto, String currentEmail) { + public void update(Long postId, RequestPostDTO requestPostDTO, String currentEmail) { Post updated = postRepository.findById(postId) .orElseThrow(()->new EntityNotFoundException("Failed to edit the Post. no such post.")); if (!updated.getUser().getEmail().equals(currentEmail)) { throw new AccessDeniedException("You do not have permission to edit this post"); } - updated.updatePost(dto); + updated.updatePost(requestPostDTO); // 2. post 수정 postRepository.save(updated); // 3. DB로 갱신 From 926ce386272952c3d3e05df1f41ce0a510542588 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 16 Jul 2024 01:15:27 +0900 Subject: [PATCH 20/37] =?UTF-8?q?Refactor:=20=ED=95=98=EB=82=98=EC=9D=98?= =?UTF-8?q?=20post=EB=A5=BC=20=EB=B3=B4=EC=97=AC=EC=A4=84=20=EB=95=8C=20Re?= =?UTF-8?q?questPostDTO=EC=99=80=20ResponsePostDTO=EC=9D=84=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/weeth/domain/post/controller/PostController.java | 4 ++-- .../java/leets/weeth/domain/post/dto/ResponsePostDTO.java | 7 ++++++- .../java/leets/weeth/domain/post/service/PostService.java | 5 +++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index ce1531f1..0f373130 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -33,8 +33,8 @@ public CommonResponse> index(){ } @GetMapping("/{postId}") - public CommonResponse show(@PathVariable Long postId){ - Post newPost = postService.show(postId); + public CommonResponse show(@PathVariable Long postId){ + ResponsePostDTO newPost = postService.show(postId); return CommonResponse.createSuccess(newPost); } diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index 4f7bc179..cbe14190 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -8,6 +8,8 @@ import lombok.NoArgsConstructor; import lombok.ToString; +import java.time.LocalDateTime; + @AllArgsConstructor @NoArgsConstructor @Getter @@ -19,8 +21,11 @@ public class ResponsePostDTO extends BaseEntity { private String title; @NotBlank private String content; + private LocalDateTime createdAt; + private LocalDateTime modifiedAt; public static ResponsePostDTO createResponsePostDTO(Post post) { - return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent()); + return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent(), + post.getCreatedAt(), post.getModifiedAt()); } } diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 141f15ff..0ee30740 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -34,10 +34,11 @@ public List index() { .collect(Collectors.toList()); } - public Post show(Long postId) { + public ResponsePostDTO show(Long postId) { Post target = postRepository.findById(postId) .orElseThrow(()->new EntityNotFoundException("Failed to edit the Post. no such post.")); - return target; + + return ResponsePostDTO.createResponsePostDTO(target); } From cbd9322e91dd29390882d4b5ec91c4d680bb912e Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 16 Jul 2024 01:35:58 +0900 Subject: [PATCH 21/37] =?UTF-8?q?Feat:=20=ED=8A=B9=EC=A0=95=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EC=9D=98=20=EA=B8=80=EB=A7=8C=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weeth/domain/post/controller/PostController.java | 8 ++++++-- .../weeth/domain/post/repository/PostRepository.java | 6 ++++++ .../leets/weeth/domain/post/service/PostService.java | 9 +++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 0f373130..e516c4aa 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -27,11 +27,16 @@ public CommonResponse create(@RequestBody RequestPostDTO requestPostDTO, @GetMapping("") public CommonResponse> index(){ - List posts = postService.index(); return CommonResponse.createSuccess(posts); } + @GetMapping("/myPosts") + public CommonResponse> show(@AuthenticationPrincipal User user){ + List myPost = postService.myPosts(user.getUsername()); + return CommonResponse.createSuccess(myPost); + } + @GetMapping("/{postId}") public CommonResponse show(@PathVariable Long postId){ ResponsePostDTO newPost = postService.show(postId); @@ -48,7 +53,6 @@ public CommonResponse edit(@PathVariable Long postId, @RequestBody Reque public CommonResponse delete(@PathVariable Long postId, @AuthenticationPrincipal User user){ postService.delete(postId, user.getUsername()); return CommonResponse.createSuccess(); - } } diff --git a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java index 275c9adf..d27060f4 100644 --- a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java @@ -1,11 +1,17 @@ package leets.weeth.domain.post.repository; +import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.ArrayList; +import java.util.List; public interface PostRepository extends JpaRepository { @Override ArrayList findAll(); + + List findByUserEmail(String email, Sort sort); } diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 0ee30740..d0fb9a8c 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -41,6 +41,15 @@ public ResponsePostDTO show(Long postId) { return ResponsePostDTO.createResponsePostDTO(target); } + public List myPosts(String email){ + List myPosts = postRepository.findByUserEmail(email, Sort.by(Sort.Direction.ASC, "id")); + + // Post 리스트를 ResponsePostDTO 리스트로 변환 + return myPosts.stream() + .map(ResponsePostDTO::createResponsePostDTO) // Post -> ResponsePostDTO 변환 + .collect(Collectors.toList()); + } + public void create(String email, RequestPostDTO requestPostDTO) { User user = userRepository.findByEmail(email) From 2beda59a27fab8ab83f4c428380f3ae37a965884 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 16 Jul 2024 13:16:42 +0900 Subject: [PATCH 22/37] =?UTF-8?q?Refactor:=20Post=EB=A7=8C=20BaseEntity=20?= =?UTF-8?q?=EC=83=81=EC=86=8D,=20=EB=82=A0=EC=A7=9C=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EB=B0=8F=20DTO=EC=9D=98=20=ED=95=84=EB=93=9C=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 --- .../weeth/domain/post/dto/RequestPostDTO.java | 2 +- .../domain/post/dto/ResponsePostDTO.java | 13 +++++++---- .../leets/weeth/domain/post/entity/Post.java | 22 +++++++++++++++++-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java index 0e0faa10..4cc93b98 100644 --- a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java @@ -12,7 +12,7 @@ @NoArgsConstructor @Getter @ToString -public class RequestPostDTO extends BaseEntity { +public class RequestPostDTO { @NotBlank private String title; @NotBlank diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index cbe14190..12994651 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -7,25 +7,30 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; +import leets.weeth.domain.post.entity.PostImage; import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; @AllArgsConstructor @NoArgsConstructor @Getter @ToString -public class ResponsePostDTO extends BaseEntity { +public class ResponsePostDTO { private Long id; @NotBlank private String title; @NotBlank private String content; - private LocalDateTime createdAt; - private LocalDateTime modifiedAt; + private LocalDateTime time; + private List imageUrls; public static ResponsePostDTO createResponsePostDTO(Post post) { return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent(), - post.getCreatedAt(), post.getModifiedAt()); + post.getTime(), post.getPostImages().stream() + .map(PostImage::getUrl) + .collect(Collectors.toList())); } } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index fc9fac20..ced1aba2 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -10,6 +10,9 @@ import lombok.NoArgsConstructor; import lombok.ToString; +import java.time.LocalDateTime; +import java.util.List; + @AllArgsConstructor @NoArgsConstructor @ToString @@ -32,15 +35,29 @@ public class Post extends BaseEntity { @NotEmpty private String content; + LocalDateTime time; + + @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY) + @OrderBy("id asc") + private List postImages; + public static Post createPost(RequestPostDTO dto, User user){ - return new Post( + Post newPost = new Post( null, user, dto.getTitle(), - dto.getContent() + dto.getContent(), + null, + null ); + newPost.setTime(); + return newPost; + } + public void setTime() { + this.time = this.getModifiedAt() == null ? this.getCreatedAt() : this.getModifiedAt(); + } public void updatePost(RequestPostDTO dto) { @@ -48,5 +65,6 @@ public void updatePost(RequestPostDTO dto) { this.title = dto.getTitle(); if (dto.getContent() != null) //수정할 본문 데이터가 있다면 this.content = dto.getContent(); + this.setTime(); } } From aa76e312192bfe4e2ce91ccf4d3ad5ff25bb0f6f Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 16 Jul 2024 19:18:08 +0900 Subject: [PATCH 23/37] =?UTF-8?q?Feat:=20Post=EC=97=90=20=EC=97=AC?= =?UTF-8?q?=EB=9F=AC=20=ED=8C=8C=EC=9D=BC=20=EC=B2=A8=EB=B6=80=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8A=94=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 --- .../weeth/domain/post/config/WebConfig.java | 23 ++++++++++ .../post/controller/PostController.java | 18 +++++--- ...MultipartJackson2HttpMessageConverter.java | 34 ++++++++++++++ .../domain/post/dto/PostFileUploadDTO.java | 11 +++++ .../domain/post/dto/ResponsePostDTO.java | 9 ++-- .../leets/weeth/domain/post/entity/Post.java | 10 +++-- .../weeth/domain/post/entity/PostFile.java | 27 ++++++++++++ .../post/repository/PostFileRepository.java | 7 +++ .../domain/post/service/PostService.java | 44 +++++++++++++++++-- src/main/resources/application-local.yml | 2 + src/main/resources/application.yml | 5 +++ 11 files changed, 172 insertions(+), 18 deletions(-) create mode 100644 src/main/java/leets/weeth/domain/post/config/WebConfig.java create mode 100644 src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java create mode 100644 src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java create mode 100644 src/main/java/leets/weeth/domain/post/entity/PostFile.java create mode 100644 src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java diff --git a/src/main/java/leets/weeth/domain/post/config/WebConfig.java b/src/main/java/leets/weeth/domain/post/config/WebConfig.java new file mode 100644 index 00000000..408a4f72 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/config/WebConfig.java @@ -0,0 +1,23 @@ +package leets.weeth.domain.post.config; + +import leets.weeth.domain.post.converter.MultipartJackson2HttpMessageConverter; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + private final MultipartJackson2HttpMessageConverter multipartJackson2HttpMessageConverter; + + public WebConfig(MultipartJackson2HttpMessageConverter multipartJackson2HttpMessageConverter) { + this.multipartJackson2HttpMessageConverter = multipartJackson2HttpMessageConverter; + } + + @Override + public void configureMessageConverters(List> converters) { + converters.add(multipartJackson2HttpMessageConverter); + } +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index e516c4aa..686af5a6 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -1,15 +1,17 @@ package leets.weeth.domain.post.controller; +import leets.weeth.domain.post.dto.PostFileUploadDTO; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; -import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.post.service.PostService; import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.security.core.userdetails.User; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -19,15 +21,19 @@ public class PostController { @Autowired private final PostService postService; - @PostMapping("/new") - public CommonResponse create(@RequestBody RequestPostDTO requestPostDTO, @AuthenticationPrincipal User user){ - postService.create(user.getUsername(), requestPostDTO); + @PostMapping(value = "/new", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public CommonResponse create(@RequestPart("requestPostDTO") RequestPostDTO requestPostDTO, + @RequestPart("files") List files, + @AuthenticationPrincipal User user){ + PostFileUploadDTO postFileUploadDTO = new PostFileUploadDTO(); + postFileUploadDTO.setFiles(files); + postService.create(user.getUsername(), requestPostDTO, postFileUploadDTO); return CommonResponse.createSuccess(); } @GetMapping("") - public CommonResponse> index(){ - List posts = postService.index(); + public CommonResponse> findAllPosts(){ + List posts = postService.findAllPosts(); return CommonResponse.createSuccess(posts); } diff --git a/src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java b/src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java new file mode 100644 index 00000000..739c5056 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java @@ -0,0 +1,34 @@ +package leets.weeth.domain.post.converter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Type; + +@Component +public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter { + + /** + * "Content-Type: multipart/form-data" 헤더를 지원하는 HTTP 요청 변환기 + */ + public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) { + super(objectMapper, MediaType.APPLICATION_OCTET_STREAM); + } + + @Override + public boolean canWrite(Class clazz, MediaType mediaType) { + return false; + } + + @Override + public boolean canWrite(Type type, Class clazz, MediaType mediaType) { + return false; + } + + @Override + protected boolean canWrite(MediaType mediaType) { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java new file mode 100644 index 00000000..fc60a7e6 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java @@ -0,0 +1,11 @@ +package leets.weeth.domain.post.dto; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@Data +public class PostFileUploadDTO { + private List files; +} diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index 12994651..bc456659 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -2,12 +2,11 @@ import jakarta.validation.constraints.NotBlank; import leets.weeth.domain.post.entity.Post; -import leets.weeth.global.common.entity.BaseEntity; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; -import leets.weeth.domain.post.entity.PostImage; +import leets.weeth.domain.post.entity.PostFile; import java.time.LocalDateTime; import java.util.List; @@ -25,12 +24,12 @@ public class ResponsePostDTO { @NotBlank private String content; private LocalDateTime time; - private List imageUrls; + private List fileUrls; public static ResponsePostDTO createResponsePostDTO(Post post) { return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent(), - post.getTime(), post.getPostImages().stream() - .map(PostImage::getUrl) + post.getTime(), post.getPostFiles().stream() + .map(PostFile::getUrl) .collect(Collectors.toList())); } } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index ced1aba2..0d341b1b 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -11,6 +11,7 @@ import lombok.ToString; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; @AllArgsConstructor @@ -39,22 +40,23 @@ public class Post extends BaseEntity { @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY) @OrderBy("id asc") - private List postImages; + private List postFiles; public static Post createPost(RequestPostDTO dto, User user){ + Post newPost = new Post( null, user, dto.getTitle(), dto.getContent(), null, - null + new ArrayList<>() ); - newPost.setTime(); return newPost; - } + @PrePersist + @PreUpdate public void setTime() { this.time = this.getModifiedAt() == null ? this.getCreatedAt() : this.getModifiedAt(); } diff --git a/src/main/java/leets/weeth/domain/post/entity/PostFile.java b/src/main/java/leets/weeth/domain/post/entity/PostFile.java new file mode 100644 index 00000000..8cd0746b --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/entity/PostFile.java @@ -0,0 +1,27 @@ +package leets.weeth.domain.post.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "postFile") +public class PostFile { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String url; + + @ManyToOne + @JoinColumn(name = "post_id") + private Post post; +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java new file mode 100644 index 00000000..e7f78eec --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java @@ -0,0 +1,7 @@ +package leets.weeth.domain.post.repository; + +import leets.weeth.domain.post.entity.PostFile; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostFileRepository extends JpaRepository { +} diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index d0fb9a8c..62709c92 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -1,20 +1,29 @@ package leets.weeth.domain.post.service; import jakarta.transaction.Transactional; +import leets.weeth.domain.post.dto.PostFileUploadDTO; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; +import leets.weeth.domain.post.entity.PostFile; +import leets.weeth.domain.post.repository.PostFileRepository; import leets.weeth.domain.post.repository.PostRepository; import leets.weeth.domain.user.entity.User; import leets.weeth.domain.user.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Sort; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import jakarta.persistence.EntityNotFoundException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @@ -25,9 +34,14 @@ public class PostService { private PostRepository postRepository; // 게시글 레파지터리 객체 @Autowired private UserRepository userRepository; + @Autowired + private PostFileRepository postFileRepository; + @Value("${file.upload-dir}") + private String uploadDir; + //모든 게시물 가져오기 - public List index() { + public List findAllPosts() { List posts = postRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); return posts.stream() .map(ResponsePostDTO::createResponsePostDTO) @@ -50,12 +64,36 @@ public List myPosts(String email){ .collect(Collectors.toList()); } - - public void create(String email, RequestPostDTO requestPostDTO) { + @Transactional + public void create(String email, RequestPostDTO requestPostDTO, PostFileUploadDTO imageDTO) { User user = userRepository.findByEmail(email) .orElseThrow(()->new UsernameNotFoundException("failed to add post! no such user")); Post newPost = Post.createPost(requestPostDTO, user); postRepository.save(newPost); + + if (imageDTO.getFiles() != null && !imageDTO.getFiles().isEmpty()) { + for (MultipartFile file : imageDTO.getFiles()) { + UUID uuid = UUID.randomUUID(); + String imageFileName = uuid + "_" + file.getOriginalFilename(); + + File destinationFile = new File(uploadDir + imageFileName); + + try { + file.transferTo(destinationFile); + } catch (IOException e) { + throw new RuntimeException(e); + } + + PostFile image = PostFile.builder() + .url("/postFiles/" + imageFileName) + .post(newPost) + .build(); + + postFileRepository.save(image); + newPost.getPostFiles().add(image); + + } + } } @Transactional diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 90205be1..f11fe03a 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -27,3 +27,5 @@ weeth: refresh: expiration: ${REFRESH_EXP} header: ${REFRESH_HEAD} +file: + upload-dir: ${DIR_ADDRESS} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5a28705a..2d953afa 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,11 @@ spring: profiles: active: local + servlet: + multipart: + enabled: true + max-file-size: 10MB + max-request-size: 10MB springdoc: swagger-ui: From 79f58b5d0ef57882a9d30bb195ad8c47e1bf0fd4 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 17 Jul 2024 02:03:09 +0900 Subject: [PATCH 24/37] =?UTF-8?q?Feat:=20=EB=8C=93=EA=B8=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/CommentController.java | 32 ++++++++++ .../domain/post/dto/RequestCommentDTO.java | 19 ++++++ .../domain/post/dto/ResponseCommentDTO.java | 25 ++++++++ .../weeth/domain/post/entity/Comment.java | 59 +++++++++++++++++++ .../post/repository/CommentRepository.java | 13 ++++ .../post/repository/PostRepository.java | 1 - .../domain/post/service/CommentService.java | 43 ++++++++++++++ 7 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 src/main/java/leets/weeth/domain/post/controller/CommentController.java create mode 100644 src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java create mode 100644 src/main/java/leets/weeth/domain/post/dto/ResponseCommentDTO.java create mode 100644 src/main/java/leets/weeth/domain/post/entity/Comment.java create mode 100644 src/main/java/leets/weeth/domain/post/repository/CommentRepository.java create mode 100644 src/main/java/leets/weeth/domain/post/service/CommentService.java diff --git a/src/main/java/leets/weeth/domain/post/controller/CommentController.java b/src/main/java/leets/weeth/domain/post/controller/CommentController.java new file mode 100644 index 00000000..b8225dc5 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/controller/CommentController.java @@ -0,0 +1,32 @@ +package leets.weeth.domain.post.controller; + +import leets.weeth.domain.post.dto.RequestCommentDTO; +import leets.weeth.domain.post.dto.ResponseCommentDTO; +import leets.weeth.domain.post.service.CommentService; +import leets.weeth.global.common.response.CommonResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.User; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/articles/{articleId}/comments") +public class CommentController { + @Autowired + private CommentService commentService; + @PostMapping() + public CommonResponse create(@PathVariable Long articleId, @RequestBody RequestCommentDTO dto, + @AuthenticationPrincipal User user){ + commentService.create(user.getUsername(), articleId, dto); + return CommonResponse.createSuccess(); + } + @GetMapping() + public CommonResponse> show(@PathVariable Long articleId){ + List comments = commentService.comments(articleId); + return CommonResponse.createSuccess(comments); + } +} diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java new file mode 100644 index 00000000..9a6e2205 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java @@ -0,0 +1,19 @@ +package leets.weeth.domain.post.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@ToString +public class RequestCommentDTO { + + @NotBlank + private String content; + + +} diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponseCommentDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponseCommentDTO.java new file mode 100644 index 00000000..a0295b8e --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/dto/ResponseCommentDTO.java @@ -0,0 +1,25 @@ +package leets.weeth.domain.post.dto; + +import jakarta.validation.constraints.NotBlank; +import leets.weeth.domain.post.entity.Comment; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import java.time.LocalDateTime; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@ToString +public class ResponseCommentDTO { + private Long id; + @NotBlank + private String content; + private LocalDateTime time; + + public static ResponseCommentDTO createResponseCommentDto(Comment comment) { + return new ResponseCommentDTO(comment.getId(), comment.getContent(), + comment.getTime()); + } +} diff --git a/src/main/java/leets/weeth/domain/post/entity/Comment.java b/src/main/java/leets/weeth/domain/post/entity/Comment.java new file mode 100644 index 00000000..bca7bd53 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/entity/Comment.java @@ -0,0 +1,59 @@ +package leets.weeth.domain.post.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotEmpty; +import leets.weeth.domain.post.dto.RequestCommentDTO; +import leets.weeth.domain.user.entity.User; +import leets.weeth.global.common.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.time.LocalDateTime; + + +@AllArgsConstructor +@NoArgsConstructor +@ToString +@Entity +@Getter +@Table +public class Comment extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "comment_id") + private Long id; + + @ManyToOne + @JoinColumn(name="post_id") + private Post post; + + @ManyToOne + @JoinColumn(name = "user_id") + private User user; + + @NotEmpty + @Column + private String content; + LocalDateTime time; + public static Comment createComment(RequestCommentDTO dto, Post post, User user){ + + Comment newComment = new Comment( + null, + post, + user, + dto.getContent(), + null + ); + return newComment; + } + + @PrePersist + @PreUpdate + public void setTime() { + this.time = this.getModifiedAt() == null ? this.getCreatedAt() : this.getModifiedAt(); + } + + +} diff --git a/src/main/java/leets/weeth/domain/post/repository/CommentRepository.java b/src/main/java/leets/weeth/domain/post/repository/CommentRepository.java new file mode 100644 index 00000000..050343e6 --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/repository/CommentRepository.java @@ -0,0 +1,13 @@ +package leets.weeth.domain.post.repository; + +import leets.weeth.domain.post.entity.Comment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface CommentRepository extends JpaRepository { + + @Query(value = "SELECT * FROM comment WHERE post_id = :postId", nativeQuery = true) + List findByPostId(Long postId); +} diff --git a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java index d27060f4..3e5a2272 100644 --- a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java @@ -10,7 +10,6 @@ import java.util.List; public interface PostRepository extends JpaRepository { - @Override ArrayList findAll(); List findByUserEmail(String email, Sort sort); diff --git a/src/main/java/leets/weeth/domain/post/service/CommentService.java b/src/main/java/leets/weeth/domain/post/service/CommentService.java new file mode 100644 index 00000000..15e07ebe --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/service/CommentService.java @@ -0,0 +1,43 @@ +package leets.weeth.domain.post.service; + +import jakarta.persistence.EntityNotFoundException; +import leets.weeth.domain.post.dto.RequestCommentDTO; +import leets.weeth.domain.post.dto.ResponseCommentDTO; +import leets.weeth.domain.post.entity.Comment; +import leets.weeth.domain.post.entity.Post; +import leets.weeth.domain.post.repository.CommentRepository; +import leets.weeth.domain.post.repository.PostRepository; +import leets.weeth.domain.user.entity.User; +import leets.weeth.domain.user.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class CommentService { + @Autowired + private PostRepository postRepository; + @Autowired + private UserRepository userRepository; + @Autowired + private CommentRepository commentRepository; + + public List comments(Long articleId) { + return commentRepository.findByPostId(articleId) + .stream() + .map(ResponseCommentDTO::createResponseCommentDto) + .collect(Collectors.toList()); + } + + public void create(String email, Long articleId, RequestCommentDTO requestCommentDTO) { + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new UsernameNotFoundException("failed to add post! no such user")); + Post targetPost = postRepository.findById(articleId).orElseThrow(()->new EntityNotFoundException("failed to add post! no such post")); + + Comment newComment = Comment.createComment(requestCommentDTO, targetPost, user); + commentRepository.save(newComment); + } +} From 77ab2c5f6c80629eadf9a61df41fe6c7ab8b58d9 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 17 Jul 2024 16:42:38 +0900 Subject: [PATCH 25/37] =?UTF-8?q?RollBack:=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EB=A1=9C=EC=BB=AC=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weeth/domain/post/config/WebConfig.java | 23 ----------- .../post/controller/PostController.java | 11 ++---- ...MultipartJackson2HttpMessageConverter.java | 34 ----------------- .../domain/post/dto/PostFileUploadDTO.java | 11 ------ .../domain/post/dto/ResponsePostDTO.java | 8 +--- .../leets/weeth/domain/post/entity/Post.java | 7 +--- .../weeth/domain/post/entity/PostFile.java | 27 ------------- .../post/repository/PostFileRepository.java | 7 ---- .../domain/post/service/PostService.java | 38 +------------------ 9 files changed, 6 insertions(+), 160 deletions(-) delete mode 100644 src/main/java/leets/weeth/domain/post/config/WebConfig.java delete mode 100644 src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java delete mode 100644 src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java delete mode 100644 src/main/java/leets/weeth/domain/post/entity/PostFile.java delete mode 100644 src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java diff --git a/src/main/java/leets/weeth/domain/post/config/WebConfig.java b/src/main/java/leets/weeth/domain/post/config/WebConfig.java deleted file mode 100644 index 408a4f72..00000000 --- a/src/main/java/leets/weeth/domain/post/config/WebConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package leets.weeth.domain.post.config; - -import leets.weeth.domain.post.converter.MultipartJackson2HttpMessageConverter; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.List; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - - private final MultipartJackson2HttpMessageConverter multipartJackson2HttpMessageConverter; - - public WebConfig(MultipartJackson2HttpMessageConverter multipartJackson2HttpMessageConverter) { - this.multipartJackson2HttpMessageConverter = multipartJackson2HttpMessageConverter; - } - - @Override - public void configureMessageConverters(List> converters) { - converters.add(multipartJackson2HttpMessageConverter); - } -} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 686af5a6..64ee6689 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -1,6 +1,5 @@ package leets.weeth.domain.post.controller; -import leets.weeth.domain.post.dto.PostFileUploadDTO; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.service.PostService; @@ -11,7 +10,6 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.security.core.userdetails.User; -import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -21,13 +19,10 @@ public class PostController { @Autowired private final PostService postService; - @PostMapping(value = "/new", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public CommonResponse create(@RequestPart("requestPostDTO") RequestPostDTO requestPostDTO, - @RequestPart("files") List files, + @PostMapping("/new") + public CommonResponse create(@RequestBody RequestPostDTO requestPostDTO, @AuthenticationPrincipal User user){ - PostFileUploadDTO postFileUploadDTO = new PostFileUploadDTO(); - postFileUploadDTO.setFiles(files); - postService.create(user.getUsername(), requestPostDTO, postFileUploadDTO); + postService.create(user.getUsername(), requestPostDTO); return CommonResponse.createSuccess(); } diff --git a/src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java b/src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java deleted file mode 100644 index 739c5056..00000000 --- a/src/main/java/leets/weeth/domain/post/converter/MultipartJackson2HttpMessageConverter.java +++ /dev/null @@ -1,34 +0,0 @@ -package leets.weeth.domain.post.converter; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; -import org.springframework.stereotype.Component; - -import java.lang.reflect.Type; - -@Component -public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter { - - /** - * "Content-Type: multipart/form-data" 헤더를 지원하는 HTTP 요청 변환기 - */ - public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) { - super(objectMapper, MediaType.APPLICATION_OCTET_STREAM); - } - - @Override - public boolean canWrite(Class clazz, MediaType mediaType) { - return false; - } - - @Override - public boolean canWrite(Type type, Class clazz, MediaType mediaType) { - return false; - } - - @Override - protected boolean canWrite(MediaType mediaType) { - return false; - } -} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java deleted file mode 100644 index fc60a7e6..00000000 --- a/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package leets.weeth.domain.post.dto; - -import lombok.Data; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -@Data -public class PostFileUploadDTO { - private List files; -} diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index bc456659..6cfd5d6c 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -6,11 +6,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; -import leets.weeth.domain.post.entity.PostFile; import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; @AllArgsConstructor @NoArgsConstructor @@ -24,12 +21,9 @@ public class ResponsePostDTO { @NotBlank private String content; private LocalDateTime time; - private List fileUrls; public static ResponsePostDTO createResponsePostDTO(Post post) { return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent(), - post.getTime(), post.getPostFiles().stream() - .map(PostFile::getUrl) - .collect(Collectors.toList())); + post.getTime()); } } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index 0d341b1b..bbd9ab4b 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -38,10 +38,6 @@ public class Post extends BaseEntity { LocalDateTime time; - @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY) - @OrderBy("id asc") - private List postFiles; - public static Post createPost(RequestPostDTO dto, User user){ Post newPost = new Post( @@ -49,8 +45,7 @@ public static Post createPost(RequestPostDTO dto, User user){ user, dto.getTitle(), dto.getContent(), - null, - new ArrayList<>() + null ); return newPost; } diff --git a/src/main/java/leets/weeth/domain/post/entity/PostFile.java b/src/main/java/leets/weeth/domain/post/entity/PostFile.java deleted file mode 100644 index 8cd0746b..00000000 --- a/src/main/java/leets/weeth/domain/post/entity/PostFile.java +++ /dev/null @@ -1,27 +0,0 @@ -package leets.weeth.domain.post.entity; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Entity -@Table(name = "postFile") -public class PostFile { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String url; - - @ManyToOne - @JoinColumn(name = "post_id") - private Post post; -} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java deleted file mode 100644 index e7f78eec..00000000 --- a/src/main/java/leets/weeth/domain/post/repository/PostFileRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package leets.weeth.domain.post.repository; - -import leets.weeth.domain.post.entity.PostFile; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface PostFileRepository extends JpaRepository { -} diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 62709c92..5c6f348a 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -1,29 +1,21 @@ package leets.weeth.domain.post.service; import jakarta.transaction.Transactional; -import leets.weeth.domain.post.dto.PostFileUploadDTO; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; -import leets.weeth.domain.post.entity.PostFile; -import leets.weeth.domain.post.repository.PostFileRepository; import leets.weeth.domain.post.repository.PostRepository; import leets.weeth.domain.user.entity.User; import leets.weeth.domain.user.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Sort; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import jakarta.persistence.EntityNotFoundException; -import org.springframework.web.multipart.MultipartFile; -import java.io.File; -import java.io.IOException; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; @@ -34,10 +26,6 @@ public class PostService { private PostRepository postRepository; // 게시글 레파지터리 객체 @Autowired private UserRepository userRepository; - @Autowired - private PostFileRepository postFileRepository; - @Value("${file.upload-dir}") - private String uploadDir; //모든 게시물 가져오기 @@ -65,35 +53,11 @@ public List myPosts(String email){ } @Transactional - public void create(String email, RequestPostDTO requestPostDTO, PostFileUploadDTO imageDTO) { + public void create(String email, RequestPostDTO requestPostDTO) { User user = userRepository.findByEmail(email) .orElseThrow(()->new UsernameNotFoundException("failed to add post! no such user")); Post newPost = Post.createPost(requestPostDTO, user); postRepository.save(newPost); - - if (imageDTO.getFiles() != null && !imageDTO.getFiles().isEmpty()) { - for (MultipartFile file : imageDTO.getFiles()) { - UUID uuid = UUID.randomUUID(); - String imageFileName = uuid + "_" + file.getOriginalFilename(); - - File destinationFile = new File(uploadDir + imageFileName); - - try { - file.transferTo(destinationFile); - } catch (IOException e) { - throw new RuntimeException(e); - } - - PostFile image = PostFile.builder() - .url("/postFiles/" + imageFileName) - .post(newPost) - .build(); - - postFileRepository.save(image); - newPost.getPostFiles().add(image); - - } - } } @Transactional From 9ec5555bfeadcedda0d452c333d52aeb5df3f1a5 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 17 Jul 2024 23:56:04 +0900 Subject: [PATCH 26/37] =?UTF-8?q?Feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=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 --- build.gradle | 1 + .../domain/file/service/FileService.java | 103 ++++++++++++++++++ .../post/controller/PostController.java | 9 +- .../domain/post/dto/PostFileUploadDTO.java | 11 ++ .../weeth/domain/post/dto/RequestPostDTO.java | 9 +- .../domain/post/dto/ResponsePostDTO.java | 8 +- .../leets/weeth/domain/post/entity/Post.java | 5 +- .../weeth/domain/post/entity/PostFile.java | 27 +++++ .../post/s3/controller/AwsS3Controller.java | 4 + .../post/s3/controller/TestController.java | 61 +++++++++++ .../domain/post/service/PostService.java | 3 +- .../weeth/global/config/AwsS3Config.java | 32 ++++++ src/main/resources/application-local.yml | 20 +++- 13 files changed, 282 insertions(+), 11 deletions(-) create mode 100644 src/main/java/leets/weeth/domain/file/service/FileService.java create mode 100644 src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java create mode 100644 src/main/java/leets/weeth/domain/post/entity/PostFile.java create mode 100644 src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java create mode 100644 src/main/java/leets/weeth/domain/post/s3/controller/TestController.java create mode 100644 src/main/java/leets/weeth/global/config/AwsS3Config.java diff --git a/build.gradle b/build.gradle index 0429a66b..c2a2ef2e 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,7 @@ dependencies { // Swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' } tasks.named('test') { diff --git a/src/main/java/leets/weeth/domain/file/service/FileService.java b/src/main/java/leets/weeth/domain/file/service/FileService.java new file mode 100644 index 00000000..861c753e --- /dev/null +++ b/src/main/java/leets/weeth/domain/file/service/FileService.java @@ -0,0 +1,103 @@ +package leets.weeth.domain.file.service; + +import com.amazonaws.services.s3.AmazonS3; +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 java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +@Slf4j +@Component +@RequiredArgsConstructor +public class FileService { + //cloud: + // aws: + // s3: + // bucket + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + private final AmazonS3 s3Client; + + public String uploadFile(MultipartFile file) { + + if(file == null || file.isEmpty()) + return ""; + File fileObj = convertMultiPartFileToFile(file); + String originalFilename = file.getOriginalFilename(); + String extension = getFileExtension(originalFilename); + String fileName = UUID.randomUUID() + "." + extension; + + log.info("uploadFile fileName: {}", fileName); + s3Client.putObject(new PutObjectRequest(bucketName, fileName, fileObj)); + fileObj.delete(); + return s3Client.getUrl(bucketName, fileName).toString(); + } + + public String uploadFiles(List files) { + // 다중 업로드 && 리스트 ","을 기준으로 하나의 문자열 반환 + // files 갯수 0 이면 반환 "" + if(files == null || files.size() == 0) + return ""; + + StringBuilder mergedUrl = new StringBuilder(); + for (int i = 0; i < files.size(); i++) { + mergedUrl.append(uploadFile(files.get(i))); + if(i < files.size() - 1) { + mergedUrl.append(","); + } + } + log.info("uploadFiles mergedUrl: {}", mergedUrl); + return mergedUrl.toString(); + } + + + public byte[] downloadFile(String image) { + + String filename = image.substring(image.lastIndexOf('/') + 1); + + S3Object s3Object = s3Client.getObject(bucketName, filename); + S3ObjectInputStream inputStream = s3Object.getObjectContent(); + try { + byte[] content = IOUtils.toByteArray(inputStream); + return content; + } catch (IOException e) { + // e.printStackTrace(); + throw new IllegalStateException("aws s3 다운로드 error"); + } + } + + + public String deleteFile(String fileName) { + s3Client.deleteObject(bucketName, fileName); + return fileName + " removed ..."; + } + + + private File convertMultiPartFileToFile(MultipartFile file) { + File convertedFile = new File(file.getOriginalFilename()); + try (FileOutputStream fos = new FileOutputStream(convertedFile)) { + fos.write(file.getBytes()); + } catch (IOException e) { + log.error("Error converting multipartFile to file", e); + } + return convertedFile; + } + + private static String getFileExtension(String originalFileName) { + return originalFileName.substring(originalFileName.lastIndexOf(".") + 1); + } + +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 64ee6689..111ebadb 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -1,5 +1,6 @@ package leets.weeth.domain.post.controller; +import leets.weeth.domain.post.dto.PostFileUploadDTO; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.service.PostService; @@ -10,6 +11,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.security.core.userdetails.User; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -20,9 +22,12 @@ public class PostController { @Autowired private final PostService postService; @PostMapping("/new") - public CommonResponse create(@RequestBody RequestPostDTO requestPostDTO, + public CommonResponse create(@RequestPart(value = "requestPostDTO") RequestPostDTO requestPostDTO, + @RequestPart(value = "files", required = false) List files, @AuthenticationPrincipal User user){ - postService.create(user.getUsername(), requestPostDTO); + PostFileUploadDTO postFileUploadDTO = new PostFileUploadDTO(); + postFileUploadDTO.setFiles(files); + postService.create(user.getUsername(), requestPostDTO, postFileUploadDTO); return CommonResponse.createSuccess(); } diff --git a/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java new file mode 100644 index 00000000..6cda521c --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java @@ -0,0 +1,11 @@ +package leets.weeth.domain.post.dto; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@Data +public class PostFileUploadDTO { + private List files; +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java index 4cc93b98..7c189545 100644 --- a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java @@ -3,15 +3,16 @@ import jakarta.validation.constraints.NotBlank; import leets.weeth.domain.post.entity.Post; import leets.weeth.global.common.entity.BaseEntity; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; @AllArgsConstructor @NoArgsConstructor @Getter @ToString +@Setter public class RequestPostDTO { @NotBlank private String title; diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index 6cfd5d6c..2552d4ec 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -8,6 +8,9 @@ import lombok.ToString; import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; +import leets.weeth.domain.post.entity.PostFile; @AllArgsConstructor @NoArgsConstructor @@ -21,9 +24,12 @@ public class ResponsePostDTO { @NotBlank private String content; private LocalDateTime time; + private List fileUrls; public static ResponsePostDTO createResponsePostDTO(Post post) { return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent(), - post.getTime()); + post.getTime(), post.getPostFiles().stream() + .map(PostFile::getUrl) + .collect(Collectors.toList())); } } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index bbd9ab4b..85ce8044 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -38,6 +38,8 @@ public class Post extends BaseEntity { LocalDateTime time; + private List url; + public static Post createPost(RequestPostDTO dto, User user){ Post newPost = new Post( @@ -45,7 +47,8 @@ public static Post createPost(RequestPostDTO dto, User user){ user, dto.getTitle(), dto.getContent(), - null + null, + new ArrayList<>() ); return newPost; } diff --git a/src/main/java/leets/weeth/domain/post/entity/PostFile.java b/src/main/java/leets/weeth/domain/post/entity/PostFile.java new file mode 100644 index 00000000..8cd0746b --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/entity/PostFile.java @@ -0,0 +1,27 @@ +package leets.weeth.domain.post.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "postFile") +public class PostFile { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String url; + + @ManyToOne + @JoinColumn(name = "post_id") + private Post post; +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java b/src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java new file mode 100644 index 00000000..84ff4ada --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java @@ -0,0 +1,4 @@ +package leets.weeth.domain.post.s3.controller; + +public class AwsS3Controller { +} diff --git a/src/main/java/leets/weeth/domain/post/s3/controller/TestController.java b/src/main/java/leets/weeth/domain/post/s3/controller/TestController.java new file mode 100644 index 00000000..21d237aa --- /dev/null +++ b/src/main/java/leets/weeth/domain/post/s3/controller/TestController.java @@ -0,0 +1,61 @@ +package leets.weeth.domain.post.s3.controller; + +import leets.weeth.domain.file.service.FileService; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@Log4j2 +@RestController +@RequestMapping("/test") +@RequiredArgsConstructor +public class TestController { + + private final FileService awsS3Util; + + @PostMapping("/upload") + public ResponseEntity uploadFile( + @RequestParam(value = "file") MultipartFile file + ) { + return new ResponseEntity<>(awsS3Util.uploadFile(file), HttpStatus.OK); + } + + + // 다중 업로드 + @PostMapping("/uploads") + public ResponseEntity uploadFiles( + @RequestParam(value = "files") List files + ) { + return new ResponseEntity<>(awsS3Util.uploadFiles(files), HttpStatus.OK); + } + + // 다운로드 + @GetMapping("/download") + public ResponseEntity downloadFile(@RequestParam(value = "image") String image) { + + // ex. image=https://board-example.s3.ap-northeast-2.amazonaws.com/2b8359b2-de59-4765-8da0-51f5d4e556c3.jpg + + byte[] data = awsS3Util.downloadFile(image); + ByteArrayResource resource = new ByteArrayResource(data); + return ResponseEntity + .ok() + .contentLength(data.length) + .header("Content-type", "application/octet-stream") + .header("Content-disposition", "attachment; filename=\"" + image + "\"") + .body(resource); + } + + + + @DeleteMapping("/delete") + public ResponseEntity deleteFile(@RequestParam String image) { + return new ResponseEntity<>(awsS3Util.deleteFile(image), HttpStatus.OK); + } + +} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 5c6f348a..90e7c4f0 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -1,6 +1,7 @@ package leets.weeth.domain.post.service; import jakarta.transaction.Transactional; +import leets.weeth.domain.post.dto.PostFileUploadDTO; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; @@ -53,7 +54,7 @@ public List myPosts(String email){ } @Transactional - public void create(String email, RequestPostDTO requestPostDTO) { + public void create(String email, RequestPostDTO requestPostDTO, PostFileUploadDTO postFileUploadDTO) { User user = userRepository.findByEmail(email) .orElseThrow(()->new UsernameNotFoundException("failed to add post! no such user")); Post newPost = Post.createPost(requestPostDTO, user); diff --git a/src/main/java/leets/weeth/global/config/AwsS3Config.java b/src/main/java/leets/weeth/global/config/AwsS3Config.java new file mode 100644 index 00000000..51787d9c --- /dev/null +++ b/src/main/java/leets/weeth/global/config/AwsS3Config.java @@ -0,0 +1,32 @@ +package leets.weeth.global.config; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class AwsS3Config { + + @Value("${cloud.aws.credentials.access-key}") + private String accessKey; + + @Value("${cloud.aws.credentials.secret-key}") + private String accessSecret; + @Value("${cloud.aws.region.static}") + private String region; + + @Bean + public AmazonS3 s3Client() { + AWSCredentials credentials = new BasicAWSCredentials(accessKey, accessSecret); + return AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withRegion(region).build(); + } +} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index f11fe03a..8a4b854d 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -11,6 +11,11 @@ spring: dialect: org.hibernate.dialect.MySQLDialect hibernate: ddl-auto: update + servlet: + multipart: + max-file-size: 5MB + max-request-size: 10MB + resolve-lazily: true # MySQL 유저 생성 및 스키마 생성 터미널 명령어 # 터미널 혹은 프로그램으로 루트 사용자 접속 후, @@ -27,5 +32,16 @@ weeth: refresh: expiration: ${REFRESH_EXP} header: ${REFRESH_HEAD} -file: - upload-dir: ${DIR_ADDRESS} \ No newline at end of file + +cloud: + aws: + s3: + bucket: ${S3_BUCKET} + credentials: + access-key: ${S3_ACCESS_KEY} + secret-key: ${S3_SECRET_KEY} + region: + static: ap-northeast-2 + auto: false + stack: + auto: false \ No newline at end of file From 33b9b9539861571c40990aff666b84aaaa8615f0 Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 01:28:48 +0900 Subject: [PATCH 27/37] =?UTF-8?q?Refactor:=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/weeth/domain/file/entity/File.java | 24 +++++++ .../file/repository/FileRepository.java | 9 +++ .../domain/file/service/FileService.java | 66 ++++++++----------- .../post/controller/PostController.java | 14 ++-- .../domain/post/dto/PostFileUploadDTO.java | 11 ---- .../domain/post/dto/ResponsePostDTO.java | 10 ++- .../leets/weeth/domain/post/entity/Post.java | 23 +++++-- .../weeth/domain/post/entity/PostFile.java | 27 -------- .../post/s3/controller/AwsS3Controller.java | 4 -- .../post/s3/controller/TestController.java | 61 ----------------- .../domain/post/service/PostService.java | 35 ++++++---- .../custom/PostNotFoundException.java | 9 +++ 12 files changed, 119 insertions(+), 174 deletions(-) create mode 100644 src/main/java/leets/weeth/domain/file/entity/File.java create mode 100644 src/main/java/leets/weeth/domain/file/repository/FileRepository.java delete mode 100644 src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java delete mode 100644 src/main/java/leets/weeth/domain/post/entity/PostFile.java delete mode 100644 src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java delete mode 100644 src/main/java/leets/weeth/domain/post/s3/controller/TestController.java create mode 100644 src/main/java/leets/weeth/global/common/error/exception/custom/PostNotFoundException.java diff --git a/src/main/java/leets/weeth/domain/file/entity/File.java b/src/main/java/leets/weeth/domain/file/entity/File.java new file mode 100644 index 00000000..ef6653df --- /dev/null +++ b/src/main/java/leets/weeth/domain/file/entity/File.java @@ -0,0 +1,24 @@ +package leets.weeth.domain.file.entity; + +import jakarta.persistence.*; +import lombok.*; + +@AllArgsConstructor +@NoArgsConstructor +@ToString +@Entity +@Getter +public class File { + public File(String url) { + this.url = url; + } + + @Id //엔티티의 대푯값 지정 + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "post_id") + private Long id; + + private String url; + + +} diff --git a/src/main/java/leets/weeth/domain/file/repository/FileRepository.java b/src/main/java/leets/weeth/domain/file/repository/FileRepository.java new file mode 100644 index 00000000..6f9f12e9 --- /dev/null +++ b/src/main/java/leets/weeth/domain/file/repository/FileRepository.java @@ -0,0 +1,9 @@ +package leets.weeth.domain.file.repository; + +import leets.weeth.domain.file.entity.File; +import org.springframework.data.jpa.repository.JpaRepository; + + +public interface FileRepository extends JpaRepository { + +} diff --git a/src/main/java/leets/weeth/domain/file/service/FileService.java b/src/main/java/leets/weeth/domain/file/service/FileService.java index 861c753e..b1b00ec5 100644 --- a/src/main/java/leets/weeth/domain/file/service/FileService.java +++ b/src/main/java/leets/weeth/domain/file/service/FileService.java @@ -5,26 +5,26 @@ import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectInputStream; import com.amazonaws.util.IOUtils; +import leets.weeth.domain.file.repository.FileRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import java.io.File; +import leets.weeth.domain.file.entity.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.UUID; @Slf4j -@Component +@Service @RequiredArgsConstructor public class FileService { - //cloud: - // aws: - // s3: - // bucket + + private final FileRepository fileRepository; @Value("${cloud.aws.s3.bucket}") private String bucketName; @@ -35,7 +35,7 @@ public String uploadFile(MultipartFile file) { if(file == null || file.isEmpty()) return ""; - File fileObj = convertMultiPartFileToFile(file); + java.io.File fileObj = convertMultiPartFileToFile(file); String originalFilename = file.getOriginalFilename(); String extension = getFileExtension(originalFilename); String fileName = UUID.randomUUID() + "." + extension; @@ -46,48 +46,34 @@ public String uploadFile(MultipartFile file) { return s3Client.getUrl(bucketName, fileName).toString(); } - public String uploadFiles(List files) { + public List uploadFiles(List files) { // 다중 업로드 && 리스트 ","을 기준으로 하나의 문자열 반환 // files 갯수 0 이면 반환 "" - if(files == null || files.size() == 0) - return ""; + if(files == null || files.isEmpty()) + return List.of(); - StringBuilder mergedUrl = new StringBuilder(); - for (int i = 0; i < files.size(); i++) { - mergedUrl.append(uploadFile(files.get(i))); - if(i < files.size() - 1) { - mergedUrl.append(","); - } - } - log.info("uploadFiles mergedUrl: {}", mergedUrl); - return mergedUrl.toString(); - } + List results = new ArrayList<>(); + for (MultipartFile file : files) { + java.io.File fileObj = convertMultiPartFileToFile(file); + String originalFilename = file.getOriginalFilename(); + String extension = getFileExtension(originalFilename); + String fileName = UUID.randomUUID() + "." + extension; - public byte[] downloadFile(String image) { + log.info("uploadFile fileName: {}", fileName); + s3Client.putObject(new PutObjectRequest(bucketName, fileName, fileObj)); + fileObj.delete(); + File newFile = new File(s3Client.getUrl(bucketName, fileName).toString()); - String filename = image.substring(image.lastIndexOf('/') + 1); - S3Object s3Object = s3Client.getObject(bucketName, filename); - S3ObjectInputStream inputStream = s3Object.getObjectContent(); - try { - byte[] content = IOUtils.toByteArray(inputStream); - return content; - } catch (IOException e) { - // e.printStackTrace(); - throw new IllegalStateException("aws s3 다운로드 error"); + fileRepository.save(newFile); + results.add(newFile); } + return results; } - - public String deleteFile(String fileName) { - s3Client.deleteObject(bucketName, fileName); - return fileName + " removed ..."; - } - - - private File convertMultiPartFileToFile(MultipartFile file) { - File convertedFile = new File(file.getOriginalFilename()); + private java.io.File convertMultiPartFileToFile(MultipartFile file) { + java.io.File convertedFile = new java.io.File(file.getOriginalFilename()); try (FileOutputStream fos = new FileOutputStream(convertedFile)) { fos.write(file.getBytes()); } catch (IOException e) { diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index 111ebadb..ae3bcc61 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -1,13 +1,12 @@ package leets.weeth.domain.post.controller; -import leets.weeth.domain.post.dto.PostFileUploadDTO; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.service.PostService; +import leets.weeth.global.auth.annotation.CurrentUser; import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.security.core.userdetails.User; @@ -21,13 +20,12 @@ public class PostController { @Autowired private final PostService postService; - @PostMapping("/new") - public CommonResponse create(@RequestPart(value = "requestPostDTO") RequestPostDTO requestPostDTO, + @PostMapping(value = {"/{postId}",""}) + public CommonResponse createOrUpdate(@RequestPart(value = "requestPostDTO") RequestPostDTO requestPostDTO, @RequestPart(value = "files", required = false) List files, - @AuthenticationPrincipal User user){ - PostFileUploadDTO postFileUploadDTO = new PostFileUploadDTO(); - postFileUploadDTO.setFiles(files); - postService.create(user.getUsername(), requestPostDTO, postFileUploadDTO); + @CurrentUser Long userId, @PathVariable(required = false) Long postId){ + + postService.create(userId, requestPostDTO, files, postId); return CommonResponse.createSuccess(); } diff --git a/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java b/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java deleted file mode 100644 index 6cda521c..00000000 --- a/src/main/java/leets/weeth/domain/post/dto/PostFileUploadDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package leets.weeth.domain.post.dto; - -import lombok.Data; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -@Data -public class PostFileUploadDTO { - private List files; -} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index 2552d4ec..e7cba66e 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -1,6 +1,7 @@ package leets.weeth.domain.post.dto; import jakarta.validation.constraints.NotBlank; +import leets.weeth.domain.file.entity.File; import leets.weeth.domain.post.entity.Post; import lombok.AllArgsConstructor; import lombok.Getter; @@ -9,8 +10,6 @@ import java.time.LocalDateTime; import java.util.List; -import java.util.stream.Collectors; -import leets.weeth.domain.post.entity.PostFile; @AllArgsConstructor @NoArgsConstructor @@ -24,12 +23,11 @@ public class ResponsePostDTO { @NotBlank private String content; private LocalDateTime time; - private List fileUrls; + private List fileUrls; public static ResponsePostDTO createResponsePostDTO(Post post) { return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent(), - post.getTime(), post.getPostFiles().stream() - .map(PostFile::getUrl) - .collect(Collectors.toList())); + post.getTime(), + post.getFileUrls()); } } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index 85ce8044..b367c8c9 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotEmpty; +import leets.weeth.domain.file.entity.File; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.user.entity.User; import leets.weeth.global.common.entity.BaseEntity; @@ -9,9 +10,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; +import org.hibernate.Remove; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.List; @AllArgsConstructor @@ -37,10 +38,10 @@ public class Post extends BaseEntity { private String content; LocalDateTime time; + @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true) + private List fileUrls; - private List url; - - public static Post createPost(RequestPostDTO dto, User user){ + public static Post createPost(RequestPostDTO dto, User user, List urls){ Post newPost = new Post( null, @@ -48,7 +49,19 @@ public static Post createPost(RequestPostDTO dto, User user){ dto.getTitle(), dto.getContent(), null, - new ArrayList<>() + urls + ); + return newPost; + } + + public static Post updatePost(RequestPostDTO dto, User user, List urls, Long postId) { + Post newPost = new Post( + postId, + user, + dto.getTitle(), + dto.getContent(), + null, + urls ); return newPost; } diff --git a/src/main/java/leets/weeth/domain/post/entity/PostFile.java b/src/main/java/leets/weeth/domain/post/entity/PostFile.java deleted file mode 100644 index 8cd0746b..00000000 --- a/src/main/java/leets/weeth/domain/post/entity/PostFile.java +++ /dev/null @@ -1,27 +0,0 @@ -package leets.weeth.domain.post.entity; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Entity -@Table(name = "postFile") -public class PostFile { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String url; - - @ManyToOne - @JoinColumn(name = "post_id") - private Post post; -} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java b/src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java deleted file mode 100644 index 84ff4ada..00000000 --- a/src/main/java/leets/weeth/domain/post/s3/controller/AwsS3Controller.java +++ /dev/null @@ -1,4 +0,0 @@ -package leets.weeth.domain.post.s3.controller; - -public class AwsS3Controller { -} diff --git a/src/main/java/leets/weeth/domain/post/s3/controller/TestController.java b/src/main/java/leets/weeth/domain/post/s3/controller/TestController.java deleted file mode 100644 index 21d237aa..00000000 --- a/src/main/java/leets/weeth/domain/post/s3/controller/TestController.java +++ /dev/null @@ -1,61 +0,0 @@ -package leets.weeth.domain.post.s3.controller; - -import leets.weeth.domain.file.service.FileService; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -@Log4j2 -@RestController -@RequestMapping("/test") -@RequiredArgsConstructor -public class TestController { - - private final FileService awsS3Util; - - @PostMapping("/upload") - public ResponseEntity uploadFile( - @RequestParam(value = "file") MultipartFile file - ) { - return new ResponseEntity<>(awsS3Util.uploadFile(file), HttpStatus.OK); - } - - - // 다중 업로드 - @PostMapping("/uploads") - public ResponseEntity uploadFiles( - @RequestParam(value = "files") List files - ) { - return new ResponseEntity<>(awsS3Util.uploadFiles(files), HttpStatus.OK); - } - - // 다운로드 - @GetMapping("/download") - public ResponseEntity downloadFile(@RequestParam(value = "image") String image) { - - // ex. image=https://board-example.s3.ap-northeast-2.amazonaws.com/2b8359b2-de59-4765-8da0-51f5d4e556c3.jpg - - byte[] data = awsS3Util.downloadFile(image); - ByteArrayResource resource = new ByteArrayResource(data); - return ResponseEntity - .ok() - .contentLength(data.length) - .header("Content-type", "application/octet-stream") - .header("Content-disposition", "attachment; filename=\"" + image + "\"") - .body(resource); - } - - - - @DeleteMapping("/delete") - public ResponseEntity deleteFile(@RequestParam String image) { - return new ResponseEntity<>(awsS3Util.deleteFile(image), HttpStatus.OK); - } - -} \ No newline at end of file diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 90e7c4f0..dfa6efa2 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -1,13 +1,17 @@ package leets.weeth.domain.post.service; import jakarta.transaction.Transactional; -import leets.weeth.domain.post.dto.PostFileUploadDTO; +import leets.weeth.domain.file.entity.File; +import leets.weeth.domain.file.service.FileService; import leets.weeth.domain.post.dto.RequestPostDTO; import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; import leets.weeth.domain.post.repository.PostRepository; import leets.weeth.domain.user.entity.User; import leets.weeth.domain.user.repository.UserRepository; +import leets.weeth.global.common.error.exception.custom.PostNotFoundException; +import leets.weeth.global.common.error.exception.custom.UserNotFoundException; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; @@ -15,19 +19,18 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import jakarta.persistence.EntityNotFoundException; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.stream.Collectors; - +@RequiredArgsConstructor @Slf4j @Service //서비스 객체 생성 public class PostService { - @Autowired - private PostRepository postRepository; // 게시글 레파지터리 객체 - @Autowired - private UserRepository userRepository; - + private final PostRepository postRepository; + private final UserRepository userRepository; + private final FileService fileService; //모든 게시물 가져오기 public List findAllPosts() { @@ -54,11 +57,19 @@ public List myPosts(String email){ } @Transactional - public void create(String email, RequestPostDTO requestPostDTO, PostFileUploadDTO postFileUploadDTO) { - User user = userRepository.findByEmail(email) - .orElseThrow(()->new UsernameNotFoundException("failed to add post! no such user")); - Post newPost = Post.createPost(requestPostDTO, user); - postRepository.save(newPost); + public void create(Long userId, RequestPostDTO requestPostDTO, List files, Long postId) { + User user = userRepository.findById(userId) + .orElseThrow(UserNotFoundException::new); + List fileUrls = fileService.uploadFiles(files); + Post newPost; + if(postId!=null){ + newPost = Post.updatePost(requestPostDTO, user, fileUrls, postId); + } + else { + newPost = Post.createPost(requestPostDTO, user, fileUrls); + } + Post save = postRepository.save(newPost); + System.out.println("save.getFileUrls() = " + save.getFileUrls()); } @Transactional diff --git a/src/main/java/leets/weeth/global/common/error/exception/custom/PostNotFoundException.java b/src/main/java/leets/weeth/global/common/error/exception/custom/PostNotFoundException.java new file mode 100644 index 00000000..4f195af2 --- /dev/null +++ b/src/main/java/leets/weeth/global/common/error/exception/custom/PostNotFoundException.java @@ -0,0 +1,9 @@ +package leets.weeth.global.common.error.exception.custom; + +import jakarta.persistence.EntityNotFoundException; + +public class PostNotFoundException extends EntityNotFoundException { + public PostNotFoundException() { + super("존재하지 않는 게시물입니다."); + } +} \ No newline at end of file From c5299803587b76660fc635082b53bd7790788c57 Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 02:16:54 +0900 Subject: [PATCH 28/37] =?UTF-8?q?Refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EB=B0=8F=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=EC=9D=84=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EC=9D=98=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=EC=97=90=EC=84=9C=20userId=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EA=B2=8C=EC=8B=9C=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=97=86=EC=9D=84=20=EB=95=8C=EC=9D=98=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 21 ++++------ .../post/repository/PostRepository.java | 2 +- .../domain/post/service/PostService.java | 40 +++++++++---------- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index ae3bcc61..eff747f1 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -4,12 +4,11 @@ import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.service.PostService; import leets.weeth.global.auth.annotation.CurrentUser; +import leets.weeth.global.common.error.exception.custom.InvalidAccessException; import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import org.springframework.security.core.userdetails.User; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -23,7 +22,7 @@ public class PostController { @PostMapping(value = {"/{postId}",""}) public CommonResponse createOrUpdate(@RequestPart(value = "requestPostDTO") RequestPostDTO requestPostDTO, @RequestPart(value = "files", required = false) List files, - @CurrentUser Long userId, @PathVariable(required = false) Long postId){ + @CurrentUser Long userId, @PathVariable(required = false) Long postId) throws InvalidAccessException { postService.create(userId, requestPostDTO, files, postId); return CommonResponse.createSuccess(); @@ -36,26 +35,20 @@ public CommonResponse> findAllPosts(){ } @GetMapping("/myPosts") - public CommonResponse> show(@AuthenticationPrincipal User user){ - List myPost = postService.myPosts(user.getUsername()); + public CommonResponse> showMyPost(@CurrentUser Long userId){ + List myPost = postService.myPosts(userId); return CommonResponse.createSuccess(myPost); } @GetMapping("/{postId}") - public CommonResponse show(@PathVariable Long postId){ + public CommonResponse showPost(@PathVariable Long postId){ ResponsePostDTO newPost = postService.show(postId); return CommonResponse.createSuccess(newPost); } - @PatchMapping("/{postId}") - public CommonResponse edit(@PathVariable Long postId, @RequestBody RequestPostDTO requestPostDTO, @AuthenticationPrincipal User user){ - postService.update(postId, requestPostDTO, user.getUsername()); - return CommonResponse.createSuccess(); - } - @DeleteMapping("/{postId}") - public CommonResponse delete(@PathVariable Long postId, @AuthenticationPrincipal User user){ - postService.delete(postId, user.getUsername()); + public CommonResponse delete(@PathVariable Long postId, @CurrentUser Long userId) throws InvalidAccessException { + postService.delete(postId, userId); return CommonResponse.createSuccess(); } diff --git a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java index 3e5a2272..4e992148 100644 --- a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java @@ -11,6 +11,6 @@ public interface PostRepository extends JpaRepository { ArrayList findAll(); + List findByUserId(Long userId, Sort sort); - List findByUserEmail(String email, Sort sort); } diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index dfa6efa2..41c985de 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -9,6 +9,7 @@ import leets.weeth.domain.post.repository.PostRepository; import leets.weeth.domain.user.entity.User; import leets.weeth.domain.user.repository.UserRepository; +import leets.weeth.global.common.error.exception.custom.InvalidAccessException; import leets.weeth.global.common.error.exception.custom.PostNotFoundException; import leets.weeth.global.common.error.exception.custom.UserNotFoundException; import lombok.RequiredArgsConstructor; @@ -22,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @RequiredArgsConstructor @@ -42,13 +44,13 @@ public List findAllPosts() { public ResponsePostDTO show(Long postId) { Post target = postRepository.findById(postId) - .orElseThrow(()->new EntityNotFoundException("Failed to edit the Post. no such post.")); + .orElseThrow(EntityNotFoundException::new); return ResponsePostDTO.createResponsePostDTO(target); } - public List myPosts(String email){ - List myPosts = postRepository.findByUserEmail(email, Sort.by(Sort.Direction.ASC, "id")); + public List myPosts(Long userId){ + List myPosts = postRepository.findByUserId(userId, Sort.by(Sort.Direction.ASC, "id")); // Post 리스트를 ResponsePostDTO 리스트로 변환 return myPosts.stream() @@ -57,12 +59,16 @@ public List myPosts(String email){ } @Transactional - public void create(Long userId, RequestPostDTO requestPostDTO, List files, Long postId) { + public void create(Long userId, RequestPostDTO requestPostDTO, List files, Long postId) throws InvalidAccessException { User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); List fileUrls = fileService.uploadFiles(files); Post newPost; if(postId!=null){ + Optional targetPost = postRepository.findById(postId); + if (!targetPost.isPresent()){ + throw new PostNotFoundException(); + } newPost = Post.updatePost(requestPostDTO, user, fileUrls, postId); } else { @@ -73,25 +79,15 @@ public void create(Long userId, RequestPostDTO requestPostDTO, Listnew EntityNotFoundException("Failed to edit the Post. no such post.")); - if (!updated.getUser().getEmail().equals(currentEmail)) { - throw new AccessDeniedException("You do not have permission to edit this post"); + public void delete(Long postId, Long userId) throws InvalidAccessException { + Post deleted = postRepository.findById(postId) + .orElseThrow(EntityNotFoundException::new); + if(!(deleted.getUser().getId() == userId)){ + throw new InvalidAccessException(); } - updated.updatePost(requestPostDTO); - // 2. post 수정 - postRepository.save(updated); - // 3. DB로 갱신 - - } - @Transactional - public void delete(Long postid, String currentEmail) { - Post deleted = postRepository.findById(postid) - .orElseThrow(()->new EntityNotFoundException("Failed to delete the Post. no such post")); - if(!deleted.getUser().getEmail().equals(currentEmail)){ - throw new AccessDeniedException("You do not have permission to delete this post"); + Optional targetPost = postRepository.findById(postId); + if (!targetPost.isPresent()){ + throw new PostNotFoundException(); } postRepository.delete(deleted); } From 5f1bfb6f827dde2d219acc2ac5dbb2eb10dc236f Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 02:24:18 +0900 Subject: [PATCH 29/37] =?UTF-8?q?Refactor:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=97=86=EC=9D=84=20=EB=95=8C=EC=9D=98=20exception?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/weeth/domain/post/service/PostService.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index 41c985de..edbddb5c 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -14,12 +14,8 @@ import leets.weeth.global.common.error.exception.custom.UserNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; -import jakarta.persistence.EntityNotFoundException; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -44,7 +40,7 @@ public List findAllPosts() { public ResponsePostDTO show(Long postId) { Post target = postRepository.findById(postId) - .orElseThrow(EntityNotFoundException::new); + .orElseThrow(PostNotFoundException::new); return ResponsePostDTO.createResponsePostDTO(target); } @@ -81,14 +77,10 @@ public void create(Long userId, RequestPostDTO requestPostDTO, List targetPost = postRepository.findById(postId); - if (!targetPost.isPresent()){ - throw new PostNotFoundException(); - } postRepository.delete(deleted); } } From 4ba37fd57dcb1fe2699e54da1196ade97e3c1f4a Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 02:40:17 +0900 Subject: [PATCH 30/37] =?UTF-8?q?Refactor:=20File=EC=9D=98=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/weeth/domain/file/entity/File.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/leets/weeth/domain/file/entity/File.java b/src/main/java/leets/weeth/domain/file/entity/File.java index ef6653df..9312f72a 100644 --- a/src/main/java/leets/weeth/domain/file/entity/File.java +++ b/src/main/java/leets/weeth/domain/file/entity/File.java @@ -15,7 +15,7 @@ public File(String url) { @Id //엔티티의 대푯값 지정 @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "post_id") + @Column(name = "file_id") private Long id; private String url; From 8d61a6b20e0fa51ca80647885787f45f3b69d779 Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 12:15:09 +0900 Subject: [PATCH 31/37] =?UTF-8?q?!HOTFIX:=20=EC=8A=A4=ED=82=A4=EB=A7=88=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=EB=A5=BC=20=EC=9C=84=ED=95=B4=20ddl?= =?UTF-8?q?-auto=EB=A5=BC=20create-drop=EC=9C=BC=EB=A1=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 809066e2..4b3c312c 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -10,7 +10,7 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQLDialect hibernate: - ddl-auto: update + ddl-auto: create-drop weeth: jwt: key: ${JWT_KEY} From cd7a5a6a350e5b97d453487d58570513615e4411 Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 12:26:03 +0900 Subject: [PATCH 32/37] =?UTF-8?q?!HOTFIX:=20=EC=8A=A4=ED=82=A4=EB=A7=88=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=EB=A5=BC=20=EC=9C=84=ED=95=B4=20ddl?= =?UTF-8?q?-auto=EB=A5=BC=20update=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 4b3c312c..809066e2 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -10,7 +10,7 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQLDialect hibernate: - ddl-auto: create-drop + ddl-auto: update weeth: jwt: key: ${JWT_KEY} From af7bfbc7e479843ff679d286993872f5ae07057d Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 12:38:22 +0900 Subject: [PATCH 33/37] =?UTF-8?q?Chore:=20AWS=20S3=20=EC=84=A4=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 --- src/main/resources/application-prod.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 809066e2..c2f619a2 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -19,4 +19,16 @@ weeth: header: ${ACCESS_HEAD} refresh: expiration: ${REFRESH_EXP} - header: ${REFRESH_HEAD} \ No newline at end of file + header: ${REFRESH_HEAD} +cloud: + aws: + s3: + bucket: ${S3_BUCKET} + credentials: + access-key: ${S3_ACCESS_KEY} + secret-key: ${S3_SECRET_KEY} + region: + static: ap-northeast-2 + auto: false + stack: + auto: false \ No newline at end of file From d179f834c3ffe35867021a1db29963054add29f7 Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 18 Jul 2024 15:41:34 +0900 Subject: [PATCH 34/37] =?UTF-8?q?Refactor:=20Post=20=EC=9D=91=EB=8B=B5=20D?= =?UTF-8?q?TO=EC=97=90=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/file/repository/FileRepository.java | 1 - .../weeth/domain/file/service/FileService.java | 18 ------------------ .../domain/post/controller/PostController.java | 1 - .../domain/post/dto/RequestCommentDTO.java | 1 - .../weeth/domain/post/dto/RequestPostDTO.java | 5 ----- .../weeth/domain/post/dto/ResponsePostDTO.java | 7 ++++--- .../leets/weeth/domain/post/entity/Post.java | 5 ++--- .../domain/post/repository/PostRepository.java | 3 --- .../weeth/domain/post/service/PostService.java | 3 +-- 9 files changed, 7 insertions(+), 37 deletions(-) diff --git a/src/main/java/leets/weeth/domain/file/repository/FileRepository.java b/src/main/java/leets/weeth/domain/file/repository/FileRepository.java index 6f9f12e9..d3b91032 100644 --- a/src/main/java/leets/weeth/domain/file/repository/FileRepository.java +++ b/src/main/java/leets/weeth/domain/file/repository/FileRepository.java @@ -3,7 +3,6 @@ import leets.weeth.domain.file.entity.File; import org.springframework.data.jpa.repository.JpaRepository; - public interface FileRepository extends JpaRepository { } diff --git a/src/main/java/leets/weeth/domain/file/service/FileService.java b/src/main/java/leets/weeth/domain/file/service/FileService.java index b1b00ec5..5485b12e 100644 --- a/src/main/java/leets/weeth/domain/file/service/FileService.java +++ b/src/main/java/leets/weeth/domain/file/service/FileService.java @@ -2,9 +2,6 @@ import com.amazonaws.services.s3.AmazonS3; 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 leets.weeth.domain.file.repository.FileRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -31,21 +28,6 @@ public class FileService { private final AmazonS3 s3Client; - public String uploadFile(MultipartFile file) { - - if(file == null || file.isEmpty()) - return ""; - java.io.File fileObj = convertMultiPartFileToFile(file); - String originalFilename = file.getOriginalFilename(); - String extension = getFileExtension(originalFilename); - String fileName = UUID.randomUUID() + "." + extension; - - log.info("uploadFile fileName: {}", fileName); - s3Client.putObject(new PutObjectRequest(bucketName, fileName, fileObj)); - fileObj.delete(); - return s3Client.getUrl(bucketName, fileName).toString(); - } - public List uploadFiles(List files) { // 다중 업로드 && 리스트 ","을 기준으로 하나의 문자열 반환 // files 갯수 0 이면 반환 "" diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java index eff747f1..26f6ff49 100644 --- a/src/main/java/leets/weeth/domain/post/controller/PostController.java +++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; - import java.util.List; @RestController diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java index 9a6e2205..ac040f39 100644 --- a/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java @@ -15,5 +15,4 @@ public class RequestCommentDTO { @NotBlank private String content; - } diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java index 7c189545..6edea8bc 100644 --- a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java @@ -1,12 +1,7 @@ package leets.weeth.domain.post.dto; import jakarta.validation.constraints.NotBlank; -import leets.weeth.domain.post.entity.Post; -import leets.weeth.global.common.entity.BaseEntity; import lombok.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; @AllArgsConstructor @NoArgsConstructor diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java index e7cba66e..b9a48c9c 100644 --- a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java +++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java @@ -7,7 +7,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; - import java.time.LocalDateTime; import java.util.List; @@ -19,14 +18,16 @@ public class ResponsePostDTO { private Long id; @NotBlank + private String name; + @NotBlank private String title; @NotBlank private String content; private LocalDateTime time; - private List fileUrls; + private List fileUrls;; public static ResponsePostDTO createResponsePostDTO(Post post) { - return new ResponsePostDTO(post.getId(), post.getTitle(), post.getContent(), + return new ResponsePostDTO(post.getId(), post.getUser().getName(), post.getTitle(), post.getContent(), post.getTime(), post.getFileUrls()); } diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java index b367c8c9..0987a779 100644 --- a/src/main/java/leets/weeth/domain/post/entity/Post.java +++ b/src/main/java/leets/weeth/domain/post/entity/Post.java @@ -10,9 +10,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; -import org.hibernate.Remove; - import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; @AllArgsConstructor @@ -39,7 +38,7 @@ public class Post extends BaseEntity { LocalDateTime time; @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true) - private List fileUrls; + private List fileUrls = new ArrayList<>(); public static Post createPost(RequestPostDTO dto, User user, List urls){ diff --git a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java index 4e992148..2d333e02 100644 --- a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java @@ -1,11 +1,8 @@ package leets.weeth.domain.post.repository; -import leets.weeth.domain.post.dto.ResponsePostDTO; import leets.weeth.domain.post.entity.Post; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java index edbddb5c..ddb3aa2f 100644 --- a/src/main/java/leets/weeth/domain/post/service/PostService.java +++ b/src/main/java/leets/weeth/domain/post/service/PostService.java @@ -70,8 +70,7 @@ public void create(Long userId, RequestPostDTO requestPostDTO, List myPosts(Long userId){ + // 특정 유저의 모든 게시물을 오름차순으로 조회 List myPosts = postRepository.findByUserId(userId, Sort.by(Sort.Direction.ASC, "id")); // Post 리스트를 ResponsePostDTO 리스트로 변환 @@ -55,19 +59,32 @@ public List myPosts(Long userId){ @Transactional public void create(Long userId, RequestPostDTO requestPostDTO, List files, Long postId) throws InvalidAccessException { + // 사용자가 존재하지 않는 경우 User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); - List fileUrls = fileService.uploadFiles(files); + // + List fileUrls; Post newPost; if(postId!=null){ - Optional targetPost = postRepository.findById(postId); - if (!targetPost.isPresent()){ + Post targetPost = postRepository.findById(postId).orElse(null); + // 대상 게시물이 존재하지 않는 경우 + if (targetPost==null){ throw new PostNotFoundException(); } + // 게시글을 수정하려는 유저가 원래의 게시글 작성자와 다를 경우 + if(!(targetPost.getUser().getId() == userId)){ + throw new InvalidAccessException(); + } + // 파일 첨부 + fileUrls = fileService.uploadFiles(files); newPost = postRepository.findById(postId).orElse(null); + // 게시물 수정 newPost.updatePost(requestPostDTO, fileUrls); } else { + // 파일 첨부 + fileUrls = fileService.uploadFiles(files); + // 게시물 생성 newPost = Post.createPost(requestPostDTO, user, fileUrls); } postRepository.save(newPost); @@ -75,8 +92,10 @@ public void create(Long userId, RequestPostDTO requestPostDTO, List