From c248dc992a5f7362d83a9e809f2340efa25473e9 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 01:58:13 +0900 Subject: [PATCH 01/10] =?UTF-8?q?chore:=20lombok=EA=B3=BC=20mapstruct=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/core/build.gradle b/backend/core/build.gradle index 4ec647e5..4f334773 100644 --- a/backend/core/build.gradle +++ b/backend/core/build.gradle @@ -45,12 +45,12 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' + testCompileOnly 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final" testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' - testCompileOnly 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('bootBuildImage') { From f2e8f9fedec2008122286c6a3188bb5be9031059 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 01:59:23 +0900 Subject: [PATCH 02/10] =?UTF-8?q?feat:=20=EB=89=B4=EC=8A=A4=20Bookmark=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/bookmark/api/BookmarkApi.java | 27 +++++++++++++++---- .../bookmark/api/BookmarkController.java | 12 +++++++-- .../dto/response/BookmarkResponse.java | 16 +++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/dto/response/BookmarkResponse.java diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkApi.java b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkApi.java index ca710d00..d9673019 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkApi.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkApi.java @@ -1,5 +1,6 @@ package com.rollthedice.backend.domain.bookmark.api; +import com.rollthedice.backend.domain.bookmark.dto.response.BookmarkResponse; import com.rollthedice.backend.domain.news.dto.response.NewsResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -12,24 +13,40 @@ public interface BookmarkApi { @Operation( - summary = "북마크 조회", + summary = "북마크 전체 조회", description = "회원이 북마크한 뉴스를 페이지로 나누어 조회합니다.", security = {@SecurityRequirement(name = "access_token")}, - tags = {"bookmark"} + tags = {"북마크"} ) @ApiResponse( responseCode = "200", description = "OK" ) - List getBookmarked( + List getAllBookmarkedNews( Pageable pageable ); + @Operation( + summary = "뉴스 북마크 여부 조회", + description = "로그인한 회원이 해당 뉴스를 북마크 했는지 여부를 조회합니다.", + security = {@SecurityRequirement(name = "access_token")}, + tags = {"북마크"} + ) + @ApiResponse( + responseCode = "200", + description = "OK" + ) + BookmarkResponse getIsBookmarked( + @Parameter(in = ParameterIn.PATH, description = "뉴스 ID", required = true) + Long newsId + ); + + @Operation( summary = "북마크 저장", description = "뉴스에 대하여 북마크로 저장합니다.", security = {@SecurityRequirement(name = "access_token")}, - tags = {"bookmark"} + tags = {"북마크"} ) @ApiResponse( responseCode = "201", @@ -44,7 +61,7 @@ void saveBookmark( summary = "북마크 삭제", description = "저장된 북마크를 해제합니다.", security = {@SecurityRequirement(name = "access_token")}, - tags = {"bookmark"} + tags = {"북마크"} ) @ApiResponse( responseCode = "204", diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkController.java b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkController.java index 6d4ad706..23dd1b85 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkController.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/api/BookmarkController.java @@ -1,5 +1,6 @@ package com.rollthedice.backend.domain.bookmark.api; +import com.rollthedice.backend.domain.bookmark.dto.response.BookmarkResponse; import com.rollthedice.backend.domain.bookmark.service.BookmarkService; import com.rollthedice.backend.domain.news.dto.response.NewsResponse; import lombok.RequiredArgsConstructor; @@ -18,8 +19,15 @@ public class BookmarkController implements BookmarkApi { @ResponseStatus(HttpStatus.OK) @GetMapping("") @Override - public List getBookmarked(final Pageable pageable) { - return bookmarkService.getBookmarkedNews(pageable); + public List getAllBookmarkedNews(final Pageable pageable) { + return bookmarkService.getAllBookmarkedNews(pageable); + } + + @ResponseStatus(HttpStatus.OK) + @GetMapping("/{newsId}") + @Override + public BookmarkResponse getIsBookmarked(@PathVariable final Long newsId) { + return bookmarkService.getIsBookmarked(newsId); } @ResponseStatus(HttpStatus.CREATED) diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/dto/response/BookmarkResponse.java b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/dto/response/BookmarkResponse.java new file mode 100644 index 00000000..cd5ed0d4 --- /dev/null +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/dto/response/BookmarkResponse.java @@ -0,0 +1,16 @@ +package com.rollthedice.backend.domain.bookmark.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BookmarkResponse { + private Long id; + private Boolean isBookmarked; + +} From d49cd1efd86dcc87a862b716d9210b18e706893c Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 02:00:04 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20existsBookmarkByMemberAndNewsId?= =?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 --- .../backend/domain/bookmark/repository/BookmarkRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/repository/BookmarkRepository.java b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/repository/BookmarkRepository.java index a107402f..e8b9c2e1 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/repository/BookmarkRepository.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/repository/BookmarkRepository.java @@ -12,6 +12,7 @@ @Repository public interface BookmarkRepository extends JpaRepository { Boolean existsBookmarkByMemberAndNews(Member member, News news); + Boolean existsBookmarkByMemberAndNewsId(Member member, Long newsId); List findAllByMemberOrderByCreatedAt(Member member, Pageable pageable); From c15dfe359e50316f5680fa56a3ed52e54265dee2 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 02:00:29 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20=EB=89=B4=EC=8A=A4=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=20=EC=97=AC=EB=B6=80=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/bookmark/service/BookmarkService.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/service/BookmarkService.java b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/service/BookmarkService.java index 8716860f..ecdb5adb 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/service/BookmarkService.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/bookmark/service/BookmarkService.java @@ -1,5 +1,6 @@ package com.rollthedice.backend.domain.bookmark.service; +import com.rollthedice.backend.domain.bookmark.dto.response.BookmarkResponse; import com.rollthedice.backend.domain.bookmark.entity.Bookmark; import com.rollthedice.backend.domain.bookmark.repository.BookmarkRepository; import com.rollthedice.backend.domain.member.entity.Member; @@ -11,14 +12,15 @@ import com.rollthedice.backend.domain.news.repository.NewsRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; -@RequiredArgsConstructor @Service +@RequiredArgsConstructor public class BookmarkService { private final AuthService authService; private final BookmarkRepository bookmarkRepository; @@ -31,7 +33,7 @@ public boolean isBookmarked(Member member, News news) { } @Transactional(readOnly = true) - public List getBookmarkedNews(Pageable pageable) { + public List getAllBookmarkedNews(Pageable pageable) { Member member = authService.getMember(); return bookmarkRepository.findAllByMemberOrderByCreatedAt(member, pageable).stream() .map(bookmark -> newsMapper.toResponse(bookmark.getNews(), true)) @@ -53,5 +55,14 @@ public void saveBookmark(Long newsId) { public void deleteBookmark(Long newsId) { bookmarkRepository.deleteByNewsId(newsId); } + + public BookmarkResponse getIsBookmarked(Long newsId) { + Member member = authService.getMember(); + Boolean isBookmarked = bookmarkRepository.existsBookmarkByMemberAndNewsId(member, newsId); + return BookmarkResponse.builder() + .id(newsId) + .isBookmarked(isBookmarked) + .build(); + } } From e2b07ca6c0cc7db390bd3c9196a2e4153c7fc925 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 17:18:34 +0900 Subject: [PATCH 05/10] =?UTF-8?q?fix:=20swagger=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/rollthedice/backend/global/config/SwaggerConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java index df2e83ef..8efe8fca 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java +++ b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java @@ -28,7 +28,6 @@ public OpenAPI openAPI() { private List getServers() { return List.of(new Server() - .url("/api") .description("백엔드 api 서버") ); } From 2a339e4b5afd6b47394febd8b109bfb625ddbf40 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 17:49:23 +0900 Subject: [PATCH 06/10] =?UTF-8?q?hotFix:=20swagger=20url=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rollthedice/backend/global/config/SwaggerConfig.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java index 8efe8fca..9700fb7e 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java +++ b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java @@ -28,14 +28,15 @@ public OpenAPI openAPI() { private List getServers() { return List.of(new Server() - .description("백엔드 api 서버") + .url("/") + .description("백엔드 api 서버") ); } private Info getInfo() { return new Info() - .title("Roll The Dice API") - .description("요약된 뉴스를 AR로 재미있게 즐기는 서비스") + .title("Scoop API") + .description("ChatGPT기반, 생성형 AI로 요약한 뉴스 학습 어플") .version("demo"); } From dbdfa312e62a4519a98be48d0d51f578042dfb23 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 17:59:55 +0900 Subject: [PATCH 07/10] =?UTF-8?q?hotFix:=20swagger=20access=20token=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rollthedice/backend/global/config/SwaggerConfig.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java index 9700fb7e..e7b34270 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java +++ b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java @@ -15,6 +15,9 @@ public class SwaggerConfig { private final String JWT = "JWT"; private final String BEARER = "Bearer"; + private final String AUTHORIZATION = "Authorization"; + private final String ACCESS_TOKEN = "access_token"; + @Bean public OpenAPI openAPI() { @@ -41,8 +44,9 @@ private Info getInfo() { } private Components getComponents() { - return new Components().addSecuritySchemes(JWT, new SecurityScheme() - .name(JWT) + return new Components().addSecuritySchemes(ACCESS_TOKEN, new SecurityScheme() + .name(AUTHORIZATION) + .in(SecurityScheme.In.HEADER) .type(SecurityScheme.Type.HTTP) .scheme(BEARER) .bearerFormat(JWT) From ae34a67390f1e704b1b59ce470f7a85ce35082f2 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Wed, 15 May 2024 18:08:33 +0900 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20swagger=20=EC=84=A4=EC=A0=95=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 --- .../com/rollthedice/backend/global/config/SwaggerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java index e7b34270..5b539b89 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java +++ b/backend/core/src/main/java/com/rollthedice/backend/global/config/SwaggerConfig.java @@ -14,7 +14,7 @@ @Configuration public class SwaggerConfig { private final String JWT = "JWT"; - private final String BEARER = "Bearer"; + private final String BEARER = "bearer"; private final String AUTHORIZATION = "Authorization"; private final String ACCESS_TOKEN = "access_token"; From 7dec53059ca69188f9b817b9d8aa062a5f82a005 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Thu, 16 May 2024 00:43:31 +0900 Subject: [PATCH 09/10] =?UTF-8?q?refactor:=20=EB=89=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=89=B4=EC=8A=A4=20=EB=82=B4=EC=9A=A9=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 --- .../backend/domain/news/dto/response/NewsResponse.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsResponse.java b/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsResponse.java index c90433e5..268f8eaa 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsResponse.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsResponse.java @@ -12,7 +12,6 @@ public class NewsResponse { private Long id; private String title; - private String content; private String thumbnail; private String postDate; private Boolean isBookmarked; From dbe0f8a65b746344b8ccc61db6bb27012ab98fe4 Mon Sep 17 00:00:00 2001 From: yeonjy Date: Thu, 16 May 2024 00:48:48 +0900 Subject: [PATCH 10/10] =?UTF-8?q?refactor:=20=EB=89=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B6=81=EB=A7=88=ED=81=AC=20=EA=B0=9C=EB=B3=84=20API=EB=A1=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/news/dto/response/NewsDetailResponse.java | 1 - .../com/rollthedice/backend/domain/news/mapper/NewsMapper.java | 2 +- .../rollthedice/backend/domain/news/service/NewsService.java | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsDetailResponse.java b/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsDetailResponse.java index f4325632..f808dc41 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsDetailResponse.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/news/dto/response/NewsDetailResponse.java @@ -16,5 +16,4 @@ public class NewsDetailResponse { private String content; private String thumbnailUrl; private String postDate; - private Boolean isBookmarked; } diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/news/mapper/NewsMapper.java b/backend/core/src/main/java/com/rollthedice/backend/domain/news/mapper/NewsMapper.java index 501ebb2c..f2b10ba6 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/news/mapper/NewsMapper.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/news/mapper/NewsMapper.java @@ -11,5 +11,5 @@ public interface NewsMapper { NewsResponse toResponse(final News news, boolean isBookmarked); - NewsDetailResponse toDetailResponse(final News news, boolean isBookmarked); + NewsDetailResponse toDetailResponse(final News news); } diff --git a/backend/core/src/main/java/com/rollthedice/backend/domain/news/service/NewsService.java b/backend/core/src/main/java/com/rollthedice/backend/domain/news/service/NewsService.java index 5d0efbf3..02fa2878 100644 --- a/backend/core/src/main/java/com/rollthedice/backend/domain/news/service/NewsService.java +++ b/backend/core/src/main/java/com/rollthedice/backend/domain/news/service/NewsService.java @@ -68,8 +68,7 @@ public List getNews(final Pageable pageable) { } public NewsDetailResponse getDetailNews(Long newsId) { - Member member = authService.getMember(); final News news = newsRepository.findById(newsId).orElseThrow(NewsNotFoundException::new); - return newsMapper.toDetailResponse(news, bookmarkService.isBookmarked(member, news)); + return newsMapper.toDetailResponse(news); } }