From 0b3137b416aec9a6fbb091953451adb3e72494fd Mon Sep 17 00:00:00 2001 From: elive7 Date: Thu, 18 Jul 2024 15:57:14 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[fix]=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=9E=91=EB=8F=99=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 3 ++- .../record/controller/RecordController.java | 10 +++++----- .../dto/response/BookmarkedRecord.java | 18 ++++++++++++++++++ .../server/record/service/RecordService.java | 3 ++- .../record/service/impl/RecordServiceImpl.java | 5 ++--- 5 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/recordy/server/record/controller/dto/response/BookmarkedRecord.java diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index c9c90fc8..98bbb95e 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -10,6 +10,7 @@ import org.recordy.server.auth.security.resolver.UserId; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; +import org.recordy.server.record.controller.dto.response.BookmarkedRecord; import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.springframework.data.domain.Slice; import org.springframework.http.MediaType; @@ -408,7 +409,7 @@ ResponseEntity> getTotalRecordInfosWithBookmarks( ) } ) - public ResponseEntity> getBookmarkedRecords( + public ResponseEntity> getBookmarkedRecords( @UserId Long userId, @RequestParam(required = false, defaultValue = "0L") long cursorId, @RequestParam(required = false, defaultValue = "10") int size diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 9d7043b4..a8948b5f 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -1,11 +1,13 @@ package org.recordy.server.record.controller; import lombok.RequiredArgsConstructor; +import org.recordy.server.bookmark.domain.Bookmark; import org.recordy.server.bookmark.service.BookmarkService; import org.recordy.server.common.dto.response.CursorBasePaginatedResponse; import org.recordy.server.common.dto.response.PaginatedResponse; import org.recordy.server.auth.security.resolver.UserId; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; +import org.recordy.server.record.controller.dto.response.BookmarkedRecord; import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; @@ -156,17 +158,15 @@ public ResponseEntity> getTotalRecordInfosWithBookm @Override @GetMapping("/bookmarks") - public ResponseEntity> getBookmarkedRecords( + public ResponseEntity> getBookmarkedRecords( @UserId Long userId, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { - Slice records = recordService.getBookmarkedRecords(userId, cursorId, size); - List bookmarks = bookmarkService.findBookmarks(userId, records.getContent()); + Slice bookmarks = recordService.getBookmarkedRecords(userId, cursorId, size); return ResponseEntity .status(HttpStatus.OK) - .body(CursorBasePaginatedResponse.of(RecordInfoWithBookmark.of(records, bookmarks, userId), recordInfoWithBookmark -> recordInfoWithBookmark.recordInfo() - .id())); + .body(CursorBasePaginatedResponse.of(BookmarkedRecord.of(bookmarks, userId), bookmarkedRecord -> bookmarkedRecord.bookmarkId())); } } diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/BookmarkedRecord.java b/src/main/java/org/recordy/server/record/controller/dto/response/BookmarkedRecord.java new file mode 100644 index 00000000..28eb1d5e --- /dev/null +++ b/src/main/java/org/recordy/server/record/controller/dto/response/BookmarkedRecord.java @@ -0,0 +1,18 @@ +package org.recordy.server.record.controller.dto.response; + +import java.util.List; +import java.util.stream.Collectors; +import org.recordy.server.bookmark.domain.Bookmark; +import org.recordy.server.record.domain.Record; +import org.springframework.data.domain.Slice; + +public record BookmarkedRecord ( + Long bookmarkId, + RecordInfo recordInfo, + Boolean isBookmark +){ + public static Slice of (Slice bookmarks, Long currentUserId) { + return bookmarks.map(bookmark -> new BookmarkedRecord(bookmark.getId(), RecordInfo.from(bookmark.getRecord(), currentUserId), true)); + } +} + diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index f4ccece7..cb343bbb 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -1,5 +1,6 @@ package org.recordy.server.record.service; +import org.recordy.server.bookmark.domain.Bookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; import org.springframework.data.domain.Slice; @@ -18,6 +19,6 @@ public interface RecordService { Slice getRecentRecords(String keywords, Long cursorId, int size); Slice getRecentRecordsByUser(long userId, long cursorId, int size); Slice getSubscribingRecords(long userId, long cursorId, int size); - Slice getBookmarkedRecords(long userId, long cursorId, int size); + Slice getBookmarkedRecords(long userId, long cursorId, int size); List getTotalRecords(int size); } diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index 42f2e577..c73934ed 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -112,9 +112,8 @@ private Slice getRecentRecordsWithKeywords(List keywords, long return recordRepository.findAllByIdAfterAndKeywordsOrderByIdDesc(keywords, cursorId, PageRequest.ofSize(size)); } @Override - public Slice getBookmarkedRecords(long userId, long cursorId, int size) { - return bookmarkRepository.findAllByBookmarksOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)) - .map(Bookmark::getRecord); + public Slice getBookmarkedRecords(long userId, long cursorId, int size) { + return bookmarkRepository.findAllByBookmarksOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); } @Override From 6dcae629cfc9ae4af01f79939be7a66dfb329db5 Mon Sep 17 00:00:00 2001 From: Jin Geonwoo Date: Thu, 18 Jul 2024 16:27:05 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[feat]=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EB=B3=84=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EC=B6=94=EA=B0=80=20(#98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bookmark/controller/BookmarkApi.java | 39 +++++++++++++++++-- .../controller/BookmarkController.java | 9 +++++ .../repository/BookmarkRepository.java | 1 + .../impl/BookmarkQueryDslRepository.java | 9 +++++ .../impl/BookmarkRepositoryImpl.java | 9 ++++- .../bookmark/service/BookmarkService.java | 1 + .../service/impl/BookmarkServiceImpl.java | 5 +++ .../mock/bookmark/FakeBookmarkRepository.java | 13 +++++++ 8 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/recordy/server/bookmark/controller/BookmarkApi.java b/src/main/java/org/recordy/server/bookmark/controller/BookmarkApi.java index 3ae5747d..2324c0d1 100644 --- a/src/main/java/org/recordy/server/bookmark/controller/BookmarkApi.java +++ b/src/main/java/org/recordy/server/bookmark/controller/BookmarkApi.java @@ -5,15 +5,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; -import org.recordy.server.common.dto.response.CursorBasePaginatedResponse; import org.recordy.server.auth.security.resolver.UserId; import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; -import org.springframework.data.domain.Slice; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; @Tag(name = "Bookmark Api") public interface BookmarkApi { @@ -53,4 +49,39 @@ public ResponseEntity bookmark( @UserId Long userId, @PathVariable Long recordId ); + + @Operation( + summary = "사용자의 북마크 개수 조회 API", + description = "사용자가 북마크한 레코드의 개수를 조회합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 사용자 또는 레코드입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity getBookmarkCount( + @UserId Long userId + ); } diff --git a/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java b/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java index 9894e2c3..687c33f7 100644 --- a/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java +++ b/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java @@ -34,4 +34,13 @@ public ResponseEntity bookmark( .status(HttpStatus.OK) .body(bookmarkService.bookmark(userId, recordId)); } + + @Override + public ResponseEntity getBookmarkCount( + @UserId Long userId + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body(bookmarkService.countBookmarks(userId)); + } } diff --git a/src/main/java/org/recordy/server/bookmark/repository/BookmarkRepository.java b/src/main/java/org/recordy/server/bookmark/repository/BookmarkRepository.java index ad739386..95948e4c 100644 --- a/src/main/java/org/recordy/server/bookmark/repository/BookmarkRepository.java +++ b/src/main/java/org/recordy/server/bookmark/repository/BookmarkRepository.java @@ -13,4 +13,5 @@ public interface BookmarkRepository { // query Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, Pageable pageable); boolean existsByUserIdAndRecordId(Long userId, Long recordId); + long countByUserId(Long userId); } diff --git a/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkQueryDslRepository.java b/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkQueryDslRepository.java index ca23297f..1270d4b6 100644 --- a/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkQueryDslRepository.java +++ b/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkQueryDslRepository.java @@ -38,4 +38,13 @@ public Slice findAllByUserOrderByIdDesc(long userId, long cursor return new SliceImpl<>(bookmarkEntities, pageable, QueryDslUtils.hasNext(pageable, bookmarkEntities)); } + + public long countByUserId(long userId) { + return jpaQueryFactory + .select(bookmarkEntity.id.count()) + .from(bookmarkEntity) + .join(bookmarkEntity.user, QUserEntity.userEntity) + .where(QUserEntity.userEntity.id.eq(userId)) + .fetchOne(); + } } diff --git a/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkRepositoryImpl.java b/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkRepositoryImpl.java index 8ea6086a..39864d9d 100644 --- a/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkRepositoryImpl.java +++ b/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkRepositoryImpl.java @@ -28,6 +28,11 @@ public void delete(long userId, long recordId) { bookmarkJpaRepository.deleteAllByUserIdAndRecordId(userId, recordId); } + @Override + public void deleteByUserId(long userId) { + bookmarkJpaRepository.deleteAllByUserId(userId); + } + @Override public Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, Pageable pageable) { return bookmarkQueryDslRepository.findAllByUserOrderByIdDesc(userId, cursor, pageable) @@ -40,7 +45,7 @@ public boolean existsByUserIdAndRecordId(Long userId, Long recordId) { } @Override - public void deleteByUserId(long userId) { - bookmarkJpaRepository.deleteAllByUserId(userId); + public long countByUserId(Long userId) { + return countByUserId(userId); } } diff --git a/src/main/java/org/recordy/server/bookmark/service/BookmarkService.java b/src/main/java/org/recordy/server/bookmark/service/BookmarkService.java index 89acc66a..46c05e5b 100644 --- a/src/main/java/org/recordy/server/bookmark/service/BookmarkService.java +++ b/src/main/java/org/recordy/server/bookmark/service/BookmarkService.java @@ -11,4 +11,5 @@ public interface BookmarkService { // query List findBookmarks(long userId, List records); + Long countBookmarks(long userId); } diff --git a/src/main/java/org/recordy/server/bookmark/service/impl/BookmarkServiceImpl.java b/src/main/java/org/recordy/server/bookmark/service/impl/BookmarkServiceImpl.java index ab0d60e3..89a142e2 100644 --- a/src/main/java/org/recordy/server/bookmark/service/impl/BookmarkServiceImpl.java +++ b/src/main/java/org/recordy/server/bookmark/service/impl/BookmarkServiceImpl.java @@ -51,5 +51,10 @@ public List findBookmarks(long userId, List records) { .map(record -> bookmarkRepository.existsByUserIdAndRecordId(userId, record.getId())) .collect(Collectors.toList()); } + + @Override + public Long countBookmarks(long userId) { + return bookmarkRepository.countByUserId(userId); + } } diff --git a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java index 1d99533c..3c57c271 100644 --- a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java +++ b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java @@ -57,4 +57,17 @@ public boolean existsByUserIdAndRecordId(Long userId, Long recordId) { bookmark.getUser().getId().equals(userId) && bookmark.getRecord().getId().equals(recordId) ); } + + @Override + public void deleteByUserId(long userId) { + bookmarks.values() + .removeIf(bookmark -> bookmark.getUser().getId() == userId); + } + + @Override + public long countByUserId(Long userId) { + return bookmarks.values().stream() + .filter(bookmark -> bookmark.getUser().getId() == userId) + .count(); + } } From 1ac30a428850e2f09194b228d10f0e04a57b260d Mon Sep 17 00:00:00 2001 From: elive7 Date: Thu, 18 Jul 2024 20:11:31 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[fix]=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EB=B3=84=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EC=88=98=EC=A0=95=20(#98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recordy/server/bookmark/controller/BookmarkController.java | 1 + .../server/bookmark/repository/impl/BookmarkJpaRepository.java | 1 + .../server/bookmark/repository/impl/BookmarkRepositoryImpl.java | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java b/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java index 687c33f7..42ef74c0 100644 --- a/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java +++ b/src/main/java/org/recordy/server/bookmark/controller/BookmarkController.java @@ -36,6 +36,7 @@ public ResponseEntity bookmark( } @Override + @GetMapping public ResponseEntity getBookmarkCount( @UserId Long userId ) { diff --git a/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkJpaRepository.java b/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkJpaRepository.java index b0c171ec..2c4b302a 100644 --- a/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkJpaRepository.java +++ b/src/main/java/org/recordy/server/bookmark/repository/impl/BookmarkJpaRepository.java @@ -12,4 +12,5 @@ public interface BookmarkJpaRepository extends JpaRepository