From f9c217d4857d9e4a58a75c7421506368db1bd9ae Mon Sep 17 00:00:00 2001 From: kdomo Date: Tue, 24 Oct 2023 16:27:07 +0900 Subject: [PATCH] =?UTF-8?q?[#131]=20feat:=20User=20Tag=20History=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adpater/UserTagHistoryQueryAdapter.java | 12 +++++++- .../usertaghistory/domain/UserTagHistory.java | 3 +- .../port/UserTagHistoryQueryPort.java | 7 ++++- .../repository/UserTagHistoryRepository.java | 5 +++- .../todaysfail/api/web/tag/TagController.java | 8 +++++ .../usecase/UserTagHistoryQueryUseCase.java | 29 +++++++++++++++++++ 6 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/usecase/UserTagHistoryQueryUseCase.java diff --git a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/adpater/UserTagHistoryQueryAdapter.java b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/adpater/UserTagHistoryQueryAdapter.java index 3c58fa5..ac1c24e 100644 --- a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/adpater/UserTagHistoryQueryAdapter.java +++ b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/adpater/UserTagHistoryQueryAdapter.java @@ -1,9 +1,19 @@ package com.todaysfail.domains.usertaghistory.adpater; import com.todaysfail.common.annotation.Adapter; +import com.todaysfail.domains.usertaghistory.domain.UserTagHistory; import com.todaysfail.domains.usertaghistory.port.UserTagHistoryQueryPort; +import com.todaysfail.domains.usertaghistory.repository.UserTagHistoryRepository; +import java.util.List; import lombok.RequiredArgsConstructor; @Adapter @RequiredArgsConstructor -public class UserTagHistoryQueryAdapter implements UserTagHistoryQueryPort {} +public class UserTagHistoryQueryAdapter implements UserTagHistoryQueryPort { + private final UserTagHistoryRepository userTagHistoryRepository; + + @Override + public List queryUserTagHistory(Long userId) { + return userTagHistoryRepository.findTop5ByUserIdOrderByCreatedAtDesc(userId); + } +} diff --git a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/domain/UserTagHistory.java b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/domain/UserTagHistory.java index 983b2fb..273c7de 100644 --- a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/domain/UserTagHistory.java +++ b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/domain/UserTagHistory.java @@ -1,5 +1,6 @@ package com.todaysfail.domains.usertaghistory.domain; +import com.todaysfail.common.BaseTimeEntity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -16,7 +17,7 @@ @Entity(name = "tbl_user_tag_history") @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class UserTagHistory { +public class UserTagHistory extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/port/UserTagHistoryQueryPort.java b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/port/UserTagHistoryQueryPort.java index f4d4256..a22ce4c 100644 --- a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/port/UserTagHistoryQueryPort.java +++ b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/port/UserTagHistoryQueryPort.java @@ -1,3 +1,8 @@ package com.todaysfail.domains.usertaghistory.port; -public interface UserTagHistoryQueryPort {} +import com.todaysfail.domains.usertaghistory.domain.UserTagHistory; +import java.util.List; + +public interface UserTagHistoryQueryPort { + List queryUserTagHistory(Long userId); +} diff --git a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/repository/UserTagHistoryRepository.java b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/repository/UserTagHistoryRepository.java index a8afd5b..b827d8e 100644 --- a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/repository/UserTagHistoryRepository.java +++ b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/usertaghistory/repository/UserTagHistoryRepository.java @@ -1,6 +1,9 @@ package com.todaysfail.domains.usertaghistory.repository; import com.todaysfail.domains.usertaghistory.domain.UserTagHistory; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -public interface UserTagHistoryRepository extends JpaRepository {} +public interface UserTagHistoryRepository extends JpaRepository { + List findTop5ByUserIdOrderByCreatedAtDesc(Long userId); +} diff --git a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/TagController.java b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/TagController.java index 32d8bf1..9c5eeaa 100644 --- a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/TagController.java +++ b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/TagController.java @@ -3,6 +3,7 @@ import com.todaysfail.api.web.tag.dto.response.TagResponse; import com.todaysfail.api.web.tag.usecase.TagPopularUseCase; import com.todaysfail.api.web.tag.usecase.TagSearchUseCase; +import com.todaysfail.api.web.tag.usecase.UserTagHistoryQueryUseCase; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -21,6 +22,7 @@ public class TagController { private final TagSearchUseCase tagSearchUseCase; private final TagPopularUseCase tagPopularUseCase; + private final UserTagHistoryQueryUseCase userTagHistoryQueryUseCase; @Operation(summary = "태그를 검색합니다. (5개)") @GetMapping("/search") @@ -37,4 +39,10 @@ public List popular() { // @Operation(summary = "추천 태그를 조회합니다.") // @GetMapping("/recommend") // TODO: 추천 태그 조회 API 구현 + + @Operation(summary = "유저 태그 히스토리를 조회합니다. (5개)") + @GetMapping("/history") + public List userTagHistory() { + return userTagHistoryQueryUseCase.execute(); + } } diff --git a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/usecase/UserTagHistoryQueryUseCase.java b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/usecase/UserTagHistoryQueryUseCase.java new file mode 100644 index 0000000..7d9c8df --- /dev/null +++ b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/tag/usecase/UserTagHistoryQueryUseCase.java @@ -0,0 +1,29 @@ +package com.todaysfail.api.web.tag.usecase; + +import com.todaysfail.api.web.tag.dto.response.TagResponse; +import com.todaysfail.api.web.tag.mapper.TagMapper; +import com.todaysfail.common.annotation.UseCase; +import com.todaysfail.config.security.SecurityUtils; +import com.todaysfail.domains.tag.domain.Tag; +import com.todaysfail.domains.tag.port.TagQueryPort; +import com.todaysfail.domains.usertaghistory.domain.UserTagHistory; +import com.todaysfail.domains.usertaghistory.port.UserTagHistoryQueryPort; +import java.util.List; +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +public class UserTagHistoryQueryUseCase { + private final TagMapper tagMapper; + private final UserTagHistoryQueryPort userTagHistoryQueryPort; + private final TagQueryPort tagQueryPort; + + public List execute() { + final Long userId = SecurityUtils.getCurrentUserId(); + List userTagHistories = userTagHistoryQueryPort.queryUserTagHistory(userId); + List tags = + tagQueryPort.queryAllByIds( + userTagHistories.stream().map(UserTagHistory::getTagId).toList()); + return tagMapper.toTagResponseList(tags); + } +}