diff --git a/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasFindDao.java b/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasFindDao.java index 145b668..d76a53a 100644 --- a/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasFindDao.java +++ b/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasFindDao.java @@ -2,7 +2,10 @@ import com.siliconvalley.domain.canvas.domain.Canvas; import com.siliconvalley.domain.canvas.exception.CanvasNotFoundException; +import com.siliconvalley.global.common.dto.Response; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,4 +24,9 @@ public Canvas findById(Long canvasId){ return canvas.get(); } + public Page findByProfileId(Long profileId, Pageable pageable){ + Page canvases = canvasRepository.findByProfile_Id(profileId, pageable); + return canvases; + } + } diff --git a/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasRepository.java b/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasRepository.java index 8257961..40a0299 100644 --- a/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasRepository.java +++ b/src/main/java/com/siliconvalley/domain/canvas/dao/CanvasRepository.java @@ -1,7 +1,10 @@ package com.siliconvalley.domain.canvas.dao; import com.siliconvalley.domain.canvas.domain.Canvas; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; public interface CanvasRepository extends JpaRepository { + Page findByProfile_Id(Long profileId, Pageable pageable); } diff --git a/src/main/java/com/siliconvalley/domain/canvas/dto/CanvasListResponse.java b/src/main/java/com/siliconvalley/domain/canvas/dto/CanvasListResponse.java new file mode 100644 index 0000000..d53a41b --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/canvas/dto/CanvasListResponse.java @@ -0,0 +1,18 @@ +package com.siliconvalley.domain.canvas.dto; + +import com.siliconvalley.domain.canvas.domain.Canvas; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CanvasListResponse { + private Long canvasId; + private String imageUrl; + + public CanvasListResponse(Canvas canvas){ + this.canvasId = canvas.getId(); + this.imageUrl = canvas.getCanvas(); + } +} diff --git a/src/main/java/com/siliconvalley/domain/post/code/PostCode.java b/src/main/java/com/siliconvalley/domain/post/code/PostCode.java index bf737b1..16a0b64 100644 --- a/src/main/java/com/siliconvalley/domain/post/code/PostCode.java +++ b/src/main/java/com/siliconvalley/domain/post/code/PostCode.java @@ -6,7 +6,8 @@ public enum PostCode implements ResponseCode { POSTING_SUCCESS(201, "게시물 포스팅에 성공하였습니다.", HttpStatus.CREATED), - DELETE_POST_SUCCESS(204, "게시물 삭제에 성공하였습니다.", HttpStatus.NO_CONTENT) + DELETE_POST_SUCCESS(204, "게시물 삭제에 성공하였습니다.", HttpStatus.NO_CONTENT), + POST_RETRIEVE_SUCCESS(200, "게시글 조회에 성공하였습니다.", HttpStatus.OK) ; private final int code; diff --git a/src/main/java/com/siliconvalley/domain/post/controller/PostController.java b/src/main/java/com/siliconvalley/domain/post/controller/PostController.java index e127e3e..a35c8e2 100644 --- a/src/main/java/com/siliconvalley/domain/post/controller/PostController.java +++ b/src/main/java/com/siliconvalley/domain/post/controller/PostController.java @@ -1,15 +1,46 @@ package com.siliconvalley.domain.post.controller; +import com.siliconvalley.domain.post.code.PostCode; +import com.siliconvalley.domain.post.dao.PostFindDao; +import com.siliconvalley.domain.post.domain.Post; +import com.siliconvalley.domain.post.dto.PostResponse; import com.siliconvalley.global.common.dto.Response; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/api/posts") +@RequestMapping("/api") @RequiredArgsConstructor public class PostController { + + private final PostFindDao postFindDao; + + @GetMapping("/posts") + public ResponseEntity getAllPosts( + @RequestParam int page, + @RequestParam int size + ){ + Response response = postFindDao.findAll(PageRequest.of(page, size)); + return ResponseEntity.ok(response); + } + + @GetMapping("/subjects/{subjectId}/posts") + public ResponseEntity getPostsBySubject( + @PathVariable Long subjectId, + @RequestParam int page, + @RequestParam int size){ + Response response = postFindDao.getPostsBySubjectName(subjectId, PageRequest.of(page, size)); + return ResponseEntity.ok(response); + } + + @GetMapping("/posts/{postId}") + public ResponseEntity getPostDetail(@PathVariable Long postId){ + Response response = Response.of(PostCode.POST_RETRIEVE_SUCCESS, new PostResponse(postFindDao.findById(postId))); + return ResponseEntity.ok(response); + } + } diff --git a/src/main/java/com/siliconvalley/domain/post/dao/PostFindDao.java b/src/main/java/com/siliconvalley/domain/post/dao/PostFindDao.java index 15d15d6..33e4426 100644 --- a/src/main/java/com/siliconvalley/domain/post/dao/PostFindDao.java +++ b/src/main/java/com/siliconvalley/domain/post/dao/PostFindDao.java @@ -1,10 +1,17 @@ package com.siliconvalley.domain.post.dao; +import com.siliconvalley.domain.item.subject.dao.SubjectFindDao; +import com.siliconvalley.domain.item.subject.domain.Subject; +import com.siliconvalley.domain.post.code.PostCode; import com.siliconvalley.domain.post.domain.Post; +import com.siliconvalley.domain.post.dto.PostListResponse; import com.siliconvalley.domain.post.exception.PostNotFoundException; +import com.siliconvalley.global.common.dto.Response; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,6 +23,7 @@ public class PostFindDao { private final PostRepository postRepository; + private final SubjectFindDao subjectFindDao; public Post findById(Long targetId){ final Optional post = postRepository.findById(targetId); @@ -23,8 +31,14 @@ public Post findById(Long targetId){ return post.get(); } - public Page findAll(Pageable pageable){ + public Response findAll(Pageable pageable){ final Page posts = postRepository.findAll(pageable); - return posts; + return Response.of(PostCode.POST_RETRIEVE_SUCCESS, posts.map(PostListResponse::new)); + } + + public Response getPostsBySubjectName(Long subjectId, Pageable pageable) { + Subject subject = subjectFindDao.findById(subjectId); + Page posts = postRepository.findByCanvas_Subject_SubjectName(subject.getSubjectName(), pageable); + return Response.of(PostCode.POST_RETRIEVE_SUCCESS, posts.map(PostListResponse::new)); } } diff --git a/src/main/java/com/siliconvalley/domain/post/dao/PostRepository.java b/src/main/java/com/siliconvalley/domain/post/dao/PostRepository.java index ec769e9..0f3d58c 100644 --- a/src/main/java/com/siliconvalley/domain/post/dao/PostRepository.java +++ b/src/main/java/com/siliconvalley/domain/post/dao/PostRepository.java @@ -1,8 +1,10 @@ package com.siliconvalley.domain.post.dao; import com.siliconvalley.domain.post.domain.Post; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -public interface PostRepository extends JpaRepository { - -} +public interface PostRepository extends JpaRepository { + Page findByCanvas_Subject_SubjectName(String subjectName, Pageable pageable); +} \ No newline at end of file diff --git a/src/main/java/com/siliconvalley/domain/post/dto/PostListResponse.java b/src/main/java/com/siliconvalley/domain/post/dto/PostListResponse.java index db544b0..1affc1a 100644 --- a/src/main/java/com/siliconvalley/domain/post/dto/PostListResponse.java +++ b/src/main/java/com/siliconvalley/domain/post/dto/PostListResponse.java @@ -1,5 +1,6 @@ package com.siliconvalley.domain.post.dto; +import com.siliconvalley.domain.post.domain.Post; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -7,5 +8,12 @@ @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class PostListResponse { + private Long postId; + private String canvasUrl; + + public PostListResponse(Post post){ + this.postId = post.getId(); + this.canvasUrl = post.getCanvas().getCanvas(); + } } diff --git a/src/main/java/com/siliconvalley/domain/post/dto/PostResponse.java b/src/main/java/com/siliconvalley/domain/post/dto/PostResponse.java index 197c74c..900c149 100644 --- a/src/main/java/com/siliconvalley/domain/post/dto/PostResponse.java +++ b/src/main/java/com/siliconvalley/domain/post/dto/PostResponse.java @@ -2,7 +2,9 @@ import com.siliconvalley.domain.canvas.domain.Canvas; import com.siliconvalley.domain.post.domain.Emotion; +import com.siliconvalley.domain.post.domain.Post; import com.siliconvalley.domain.profile.domain.Profile; +import com.siliconvalley.domain.profile.dto.ProfileResponse; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,11 +15,13 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class PostResponse { private String canvasUrl; - private Profile profile; + private ProfileResponse profile; private int emotionCount; - public PostResponse(Profile profile, Canvas canvas){ - + public PostResponse(Post post){ + this.canvasUrl = post.getCanvas().getCanvas(); + this.profile = new ProfileResponse(post.getProfile()); + this.emotionCount = post.getEmotions().size(); } } diff --git a/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java b/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java index c1c8b7b..977d199 100644 --- a/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java +++ b/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java @@ -4,6 +4,7 @@ import com.siliconvalley.domain.item.myitem.dao.MyItemFindDao; import com.siliconvalley.domain.point.application.PointManagementService; import com.siliconvalley.domain.profile.application.ProfileManagementService; +import com.siliconvalley.domain.profile.application.ProfilePostingService; import com.siliconvalley.domain.profile.dao.ProfileFindDao; import com.siliconvalley.domain.profile.dto.ProfileCreateOrUpdate; import com.siliconvalley.domain.profile.dto.ProfileResponse; @@ -13,6 +14,7 @@ import javax.validation.Valid; import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.web.bind.annotation.*; @@ -27,6 +29,7 @@ public class ProfileApi { private final MyItemFindDao myItemFindDao; private final MyItemCreateService myItemCreateService; private final PointManagementService pointManagementService; + private final ProfilePostingService profilePostingService; @PostMapping public Response createProfile( @@ -92,4 +95,22 @@ public Response updatePoint( pointManagementService.updatePoint(profileId, newPointValue); return Response.of(CommonCode.SUCCESS_UPDATE); } + @PostMapping("/{profileId}/canvases/{canvasId}/posts") + public ResponseEntity postCanvas( + @PathVariable Long profileId, + @PathVariable Long canvasId + ){ + Response response = profilePostingService.createPostForProfile(profileId, canvasId); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/{profileId}/canvases/{canvasId}/posts") + public ResponseEntity deletePost( + @PathVariable Long profileId, + @PathVariable Long canvasId + ){ + Response response = profilePostingService.deletePostForProfile(profileId, canvasId); + return ResponseEntity.ok(response); + } + }