From 7bad401402d06277ce88eff6d3f4f38697b9c025 Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Mon, 30 Sep 2024 04:06:50 +0900 Subject: [PATCH 1/4] =?UTF-8?q?:sparkles:=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=88=98=EC=8B=A0=ED=95=9C=20=EB=A1=A4?= =?UTF-8?q?=EB=A7=81=ED=8E=98=EC=9D=B4=ED=8D=BC=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=95=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20(#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/RollingPaperService.java | 25 ++++ .../common/response/ResponseType.java | 1 + .../persistance/RollingPaperRepository.java | 9 ++ .../presentation/RollingPaperController.java | 8 ++ .../application/RollingPaperServiceTest.java | 126 +++++++++++++++++- 5 files changed, 168 insertions(+), 1 deletion(-) diff --git a/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java b/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java index 24763a7..a0c6f05 100644 --- a/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java +++ b/src/main/java/slvtwn/khu/toyouserver/application/RollingPaperService.java @@ -2,6 +2,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import slvtwn.khu.toyouserver.agent.modellabs.ModelLabsAgent; @@ -62,6 +63,15 @@ public RollingPaperResponse findById(Long userId, Long rollingPaperId) { return RollingPaperResponse.from(rollingPaper); } + public List findReceivedRollingPapers(Long userId, Long groupId, + Long targetId, Integer limit) { + List memberIds = getMemberIds(userId, groupId); + PageRequest pageRequest = PageRequest.ofSize(limit); + return rollingPaperRepository.findAllByMembersAfterCursor(memberIds, targetId, pageRequest).stream() + .map(RollingPaperResponse::from) + .toList(); + } + private List parseStickers(RollingPaperRequest request, RollingPaper rollingPaper) { return request.stickers().stream() .map(each -> new Sticker(rollingPaper, each.imageUrl(), each.x(), each.y(), @@ -74,4 +84,19 @@ private void assertUserIsRollingPaperOwner(User user, RollingPaper rollingPaper) throw new ToyouException(ResponseType.UNAUTHORIZED_USER_ACCESS); } } + + private List getMemberIds(Long userId, Long groupId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new ToyouException(ResponseType.USER_NOT_FOUND)); + if (groupId == null) { + List members = memberRepository.findByUser(user); + return members.stream() + .map(Member::getId) + .toList(); + } else { + Member member = memberRepository.findByUserIdAndGroupId(userId, groupId) + .orElseThrow(() -> new ToyouException(ResponseType.MEMBER_NOT_FOUND)); + return List.of(member.getId()); + } + } } diff --git a/src/main/java/slvtwn/khu/toyouserver/common/response/ResponseType.java b/src/main/java/slvtwn/khu/toyouserver/common/response/ResponseType.java index 95ac7f8..f1019bf 100644 --- a/src/main/java/slvtwn/khu/toyouserver/common/response/ResponseType.java +++ b/src/main/java/slvtwn/khu/toyouserver/common/response/ResponseType.java @@ -31,6 +31,7 @@ public enum ResponseType { NOT_FOUND(HttpStatus.NOT_FOUND, "TYU-404", "요청한 자원을 찾을 수 없습니다."), GROUP_NOT_FOUND(HttpStatus.NOT_FOUND, "TYU-4041", "그룹을 찾을 수 없습니다."), USER_NOT_FOUND(HttpStatus.NOT_FOUND, "TYU-4042", "사용자를 찾을 수 없습니다."), + MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "TYU-4043", "가입 기록이 존재하지 않습니다."), // 500 Internal Server Error INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "TYU-500", "서버 내부 오류"); diff --git a/src/main/java/slvtwn/khu/toyouserver/persistance/RollingPaperRepository.java b/src/main/java/slvtwn/khu/toyouserver/persistance/RollingPaperRepository.java index 999bc50..84236ea 100644 --- a/src/main/java/slvtwn/khu/toyouserver/persistance/RollingPaperRepository.java +++ b/src/main/java/slvtwn/khu/toyouserver/persistance/RollingPaperRepository.java @@ -1,7 +1,16 @@ package slvtwn.khu.toyouserver.persistance; +import java.util.List; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import slvtwn.khu.toyouserver.domain.RollingPaper; public interface RollingPaperRepository extends JpaRepository { + + @Query("SELECT r FROM RollingPaper r WHERE r.member.id IN :memberIds AND r.id < :targetId ORDER BY r.id DESC") + List findAllByMembersAfterCursor(@Param("memberIds") List memberIds, + @Param("targetId") Long targetId, + Pageable pageable); } diff --git a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java index e8e1fa5..f5fe136 100644 --- a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java +++ b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java @@ -26,6 +26,14 @@ public ToyouResponse findById(@UserAuthentication Long use return ToyouResponse.from(rollingPaperService.findById(userId, rollingPaperId)); } + @GetMapping("/rollingpapers") + public ToyouResponse> findReceivedRollingPapers(@UserAuthentication Long userId, + @RequestParam Long groupId, + @RequestParam Long targetId, + @RequestParam Integer limit) { + return ToyouResponse.from(rollingPaperService.findReceivedRollingPapers(userId, groupId, targetId, limit)); + } + @PostMapping("/users/{userId}/rollingpapers") public void sendRollingPaper(@UserAuthentication Long RequestUserId, @PathVariable(name = "userId") Long recipientUserId, diff --git a/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java b/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java index af96c43..33d26e4 100644 --- a/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java +++ b/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java @@ -20,7 +20,6 @@ import slvtwn.khu.toyouserver.domain.Group; import slvtwn.khu.toyouserver.domain.Member; import slvtwn.khu.toyouserver.domain.RollingPaper; -import slvtwn.khu.toyouserver.domain.SocialAuthProvider; import slvtwn.khu.toyouserver.domain.User; import slvtwn.khu.toyouserver.dto.CoverRequest; import slvtwn.khu.toyouserver.dto.RollingPaperRequest; @@ -111,4 +110,129 @@ class RollingPaperServiceTest { assertThat(response).usingRecursiveComparison() .isEqualTo(RollingPaperResponse.from(rollingPaper)); } + + @Test + void 사용자는_자신이_수신한_롤링페이퍼를_조회할_수_있다() { + // given + Group group = new Group("name"); + User user = new User("name", LocalDate.now(), "introduction", "profile_picture", null); + Member member = new Member(user, group); + RollingPaper rollingPaper = new RollingPaper(null, "title", "content", 1L, member); + + entityManager.persist(user); + entityManager.persist(group); + entityManager.persist(member); + entityManager.persist(rollingPaper); + + // when + List response = rollingPaperService.findReceivedRollingPapers(user.getId(), group.getId(), + rollingPaper.getId() + 1, 10); + + // then + assertThat(response).usingRecursiveComparison() + .isEqualTo(List.of(RollingPaperResponse.from(rollingPaper))); + } + + @Test + void 수신한_롤링페이퍼_조회는_그룹_식별자가_null인_경우_유저가_수신한_모든_롤링페이퍼를_반환한다() { + // given + User user = new User("name", LocalDate.now(), "introduction", "profile_picture", null); + Group group1 = new Group("group1"); + Group group2 = new Group("group2"); + Member member1 = new Member(user, group1); + Member member2 = new Member(user, group2); + RollingPaper rollingPaper = new RollingPaper(null, "title", "rollingPaper", 1L, member1); + RollingPaper anotherRollingPaper = new RollingPaper(null, "title", "anotherRollingPaper", 1L, member2); + + entityManager.persist(user); + entityManager.persist(group1); + entityManager.persist(group2); + entityManager.persist(member1); + entityManager.persist(member2); + entityManager.persist(rollingPaper); + entityManager.persist(anotherRollingPaper); + + // when + List responseWithoutGroupId = rollingPaperService.findReceivedRollingPapers( + user.getId(), + null, + anotherRollingPaper.getId() + 1, 10); + + // then + assertThat(responseWithoutGroupId).usingRecursiveComparison() + .isEqualTo(List.of( + RollingPaperResponse.from(anotherRollingPaper), + RollingPaperResponse.from(rollingPaper))); + + } + + @Test + void 수신한_롤링페이퍼_조회는_그룹_식별자가_존재할_경우_해당_그룹의_롤링페이퍼만_반환한다() { + // given + User user = new User("name", LocalDate.now(), "introduction", "profile_picture", null); + Group group1 = new Group("group1"); + Group group2 = new Group("group2"); + Member member1 = new Member(user, group1); + Member member2 = new Member(user, group2); + RollingPaper rollingPaper = new RollingPaper(null, "title", "rollingPaper", 1L, member1); + RollingPaper anotherRollingPaper = new RollingPaper(null, "title", "anotherRollingPaper", 1L, member2); + + entityManager.persist(user); + entityManager.persist(group1); + entityManager.persist(group2); + entityManager.persist(member1); + entityManager.persist(member2); + entityManager.persist(rollingPaper); + entityManager.persist(anotherRollingPaper); + + // when + List responseWithGroupId = rollingPaperService.findReceivedRollingPapers( + user.getId(), + group1.getId(), + rollingPaper.getId() + 1, 10); + + // then + assertThat(responseWithGroupId).usingRecursiveComparison() + .isEqualTo(List.of(RollingPaperResponse.from(rollingPaper))); + } + + @Test + void 수신한_롤링페이퍼_조회는_다른_그룹의_커서를_사용해도_해당_그룹의_편지만_조회된다() { + // given + User user = new User("name", LocalDate.now(), "introduction", "profile_picture", null); + Group group1 = new Group("group1"); + Group group2 = new Group("group2"); + Member member1 = new Member(user, group1); + Member member2 = new Member(user, group2); + + RollingPaper rollingPaper1 = new RollingPaper(null, "title1", "rollingPaper1", 1L, member1); + RollingPaper rollingPaper2 = new RollingPaper(null, "title2", "rollingPaper2", 1L, member1); + RollingPaper rollingPaper3 = new RollingPaper(null, "title3", "rollingPaper3", 1L, member2); + + entityManager.persist(user); + entityManager.persist(group1); + entityManager.persist(group2); + entityManager.persist(member1); + entityManager.persist(member2); + entityManager.persist(rollingPaper1); + entityManager.persist(rollingPaper2); + entityManager.persist(rollingPaper3); + + long totalRollingPapersCount = rollingPaper3.getId() + 1; + + // when + List response = rollingPaperService.findReceivedRollingPapers( + user.getId(), + group1.getId(), + totalRollingPapersCount, 10); + + // then + List expectedResponse = List.of( + RollingPaperResponse.from(rollingPaper2), + RollingPaperResponse.from(rollingPaper1) + ); + + assertThat(response).usingRecursiveComparison() + .isEqualTo(expectedResponse); + } } From 1b0bd4ea723ef280a22bde54b90622f89076c596 Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Mon, 30 Sep 2024 04:08:17 +0900 Subject: [PATCH 2/4] =?UTF-8?q?:recycle:=20refactor:=20=EB=8B=A8=EC=9D=BC?= =?UTF-8?q?=20=EB=A1=A4=EB=A7=81=ED=8E=98=EC=9D=B4=ED=8D=BC=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20URI=20PathVariable=20=EB=B0=A9=EC=8B=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../khu/toyouserver/presentation/RollingPaperController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java index f5fe136..7a3b65f 100644 --- a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java +++ b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java @@ -1,5 +1,6 @@ package slvtwn.khu.toyouserver.presentation; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -20,9 +21,9 @@ public class RollingPaperController { private final RollingPaperService rollingPaperService; - @GetMapping("/rollingpapers") + @GetMapping("/rollingpapers/{rollingPaperId}") public ToyouResponse findById(@UserAuthentication Long userId, - @RequestParam Long rollingPaperId) { + @PathVariable Long rollingPaperId) { return ToyouResponse.from(rollingPaperService.findById(userId, rollingPaperId)); } From 76e6f1c76acf7e18a2062b2fcc3fd5039a5c08e7 Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Mon, 30 Sep 2024 04:14:06 +0900 Subject: [PATCH 3/4] =?UTF-8?q?:white=5Fcheck=5Fmark:=20test:=20=EC=88=98?= =?UTF-8?q?=EC=8B=A0=20=EB=A1=A4=EB=A7=81=ED=8E=98=EC=9D=B4=ED=8D=BC=20?= =?UTF-8?q?=EC=B5=9C=EC=8B=A0=EC=88=9C=20=EC=A1=B0=ED=9A=8C=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20(#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/RollingPaperServiceTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java b/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java index 33d26e4..adc6b8c 100644 --- a/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java +++ b/src/test/java/slvtwn/khu/toyouserver/application/RollingPaperServiceTest.java @@ -235,4 +235,39 @@ class RollingPaperServiceTest { assertThat(response).usingRecursiveComparison() .isEqualTo(expectedResponse); } + + @Test + void 수신한_롤링페이퍼_조회는_생성된_시간이_최신인_롤링페이퍼부터_조회된다() { + // given + User user = new User("name", LocalDate.now(), "introduction", "profile_picture", null); + Group group = new Group("group"); + Member member = new Member(user, group); + + RollingPaper rollingPaper1 = new RollingPaper(null, "title1", "rollingPaper1", 1L, member); + RollingPaper rollingPaper2 = new RollingPaper(null, "title2", "rollingPaper2", 1L, member); + RollingPaper rollingPaper3 = new RollingPaper(null, "title3", "rollingPaper3", 1L, member); + + entityManager.persist(user); + entityManager.persist(group); + entityManager.persist(member); + entityManager.persist(rollingPaper1); + entityManager.persist(rollingPaper2); + entityManager.persist(rollingPaper3); + + // when + List response = rollingPaperService.findReceivedRollingPapers( + user.getId(), + group.getId(), + rollingPaper3.getId() + 1, 10); + + // then + List expectedResponse = List.of( + RollingPaperResponse.from(rollingPaper3), + RollingPaperResponse.from(rollingPaper2), + RollingPaperResponse.from(rollingPaper1) + ); + + assertThat(response).usingRecursiveComparison() + .isEqualTo(expectedResponse); + } } From 21994040a24835a26df6e9a658ac625a29ed4a0d Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Mon, 30 Sep 2024 04:17:51 +0900 Subject: [PATCH 4/4] =?UTF-8?q?:sparkles:=20feat:=20=EC=88=98=EC=8B=A0=20?= =?UTF-8?q?=EB=A1=A4=EB=A7=81=ED=8E=98=EC=9D=B4=ED=8D=BC=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B0=9C=EC=88=98=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20(#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toyouserver/presentation/RollingPaperController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java index 38f5db9..36d4bb9 100644 --- a/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java +++ b/src/main/java/slvtwn/khu/toyouserver/presentation/RollingPaperController.java @@ -31,21 +31,22 @@ public ToyouResponse findById(@UserAuthentication Long use public ToyouResponse> findReceivedRollingPapers(@UserAuthentication Long userId, @RequestParam Long groupId, @RequestParam Long targetId, - @RequestParam Integer limit) { + @RequestParam(defaultValue = "10") int limit) { return ToyouResponse.from(rollingPaperService.findReceivedRollingPapers(userId, groupId, targetId, limit)); } @PostMapping("/users/{userId}/rollingpapers") public ToyouResponse sendRollingPaper(@UserAuthentication Long RequestUserId, - @PathVariable(name = "userId") Long recipientUserId, - @RequestBody RollingPaperRequest rollingPaperRequest) { + @PathVariable(name = "userId") Long recipientUserId, + @RequestBody RollingPaperRequest rollingPaperRequest) { rollingPaperService.sendRollingPaper(recipientUserId, rollingPaperRequest); return ToyouResponse.noContent(); } @PostMapping("/rollingpapers/{rollingPaperId}/generate-cover") public ToyouResponse generateCoverImage(@UserAuthentication Long userId, - @PathVariable Long rollingPaperId, @RequestBody CoverRequest request) { + @PathVariable Long rollingPaperId, + @RequestBody CoverRequest request) { rollingPaperService.generateCoverImageAndUpdateRollingPaper(request, rollingPaperId); return ToyouResponse.noContent(); }