diff --git a/src/main/java/umc/kkijuk/server/career/controller/CareerSearchController.java b/src/main/java/umc/kkijuk/server/career/controller/CareerSearchController.java index 47a4cf75..a60e327d 100644 --- a/src/main/java/umc/kkijuk/server/career/controller/CareerSearchController.java +++ b/src/main/java/umc/kkijuk/server/career/controller/CareerSearchController.java @@ -12,6 +12,7 @@ import umc.kkijuk.server.member.service.MemberService; import java.util.List; +import umc.kkijuk.server.tag.dto.TagUsageResponseDto; @Tag(name="Search Career", description = "활동 조회 및 검색 관련 API") @RestController @@ -92,6 +93,20 @@ public CareerResponse findTag( ); } + @GetMapping("/find/taglist/count") + @Operation( + summary = "활동 검색 - 태그 ( 사용량이 많은 태그 순으로 조회 )", + description = "특정 사용자의 활동 태그들을 사용량 순으로 조회합니다. ") + public CareerResponse> findTagWithCount( + @RequestHeader("Authorization") String token + ) { + Member requestMember = loginUser.extractMemberId(token); + return CareerResponse.success( + CareerResponseMessage.CAREER_SEARCH_SUCCESS, + careerSearchService.findAllTagWithCount(requestMember) + ); + } + @GetMapping("/find/tag") @Operation( summary = "활동 검색 - 태그 ( 선택한 태그에 대한 활동 기록 조회 )", diff --git a/src/main/java/umc/kkijuk/server/career/service/CareerSearchService.java b/src/main/java/umc/kkijuk/server/career/service/CareerSearchService.java index c69a9d82..834bb099 100644 --- a/src/main/java/umc/kkijuk/server/career/service/CareerSearchService.java +++ b/src/main/java/umc/kkijuk/server/career/service/CareerSearchService.java @@ -1,10 +1,12 @@ package umc.kkijuk.server.career.service; import umc.kkijuk.server.career.controller.response.*; +import umc.kkijuk.server.career.controller.response.FindTagResponse.SearchTagResponse; import umc.kkijuk.server.member.domain.Member; import java.util.List; import java.util.Map; +import umc.kkijuk.server.tag.dto.TagUsageResponseDto; public interface CareerSearchService { List findCareerForTimeline(Member requestMember); @@ -21,4 +23,6 @@ public interface CareerSearchService { List findCareerWithKeyword(Member requestMember, String keyword, String sort); List findCareerForNewDetail(Member requestMember); + + List findAllTagWithCount(Member requestMember); } diff --git a/src/main/java/umc/kkijuk/server/career/service/CareerSearchServiceImpl.java b/src/main/java/umc/kkijuk/server/career/service/CareerSearchServiceImpl.java index 5bc73e5a..0dfc3c27 100644 --- a/src/main/java/umc/kkijuk/server/career/service/CareerSearchServiceImpl.java +++ b/src/main/java/umc/kkijuk/server/career/service/CareerSearchServiceImpl.java @@ -2,9 +2,11 @@ import lombok.Builder; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import umc.kkijuk.server.career.controller.response.*; +import umc.kkijuk.server.career.controller.response.FindTagResponse.SearchTagResponse; import umc.kkijuk.server.career.domain.*; import umc.kkijuk.server.career.dto.converter.BaseCareerConverter; import umc.kkijuk.server.career.repository.*; @@ -16,6 +18,7 @@ import umc.kkijuk.server.detail.repository.CareerDetailRepository; import umc.kkijuk.server.member.domain.Member; import umc.kkijuk.server.tag.domain.Tag; +import umc.kkijuk.server.tag.dto.TagUsageResponseDto; import umc.kkijuk.server.tag.repository.TagRepository; import java.time.LocalDate; @@ -334,6 +337,12 @@ public List findCareerForNewDetail(Member requestMember) { .collect(Collectors.toList()); } + @Override + public List findAllTagWithCount(Member requestMember) { + List tags = tagRepository.findTopPopularTagsByMember(requestMember.getId(), PageRequest.of(0, 10)); + return tags; + } + //타임라인 쪽에서 데이터 구별 하기 위함 private CareerType resolveCareerType(BaseCareer career) { diff --git a/src/main/java/umc/kkijuk/server/tag/dto/TagUsageResponseDto.java b/src/main/java/umc/kkijuk/server/tag/dto/TagUsageResponseDto.java new file mode 100644 index 00000000..37ec0e12 --- /dev/null +++ b/src/main/java/umc/kkijuk/server/tag/dto/TagUsageResponseDto.java @@ -0,0 +1,13 @@ +package umc.kkijuk.server.tag.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class TagUsageResponseDto { + private Long id; + private String name; + private long usageCount; + +} diff --git a/src/main/java/umc/kkijuk/server/tag/repository/TagJpaRepository.java b/src/main/java/umc/kkijuk/server/tag/repository/TagJpaRepository.java index 1f893206..619a9ba2 100644 --- a/src/main/java/umc/kkijuk/server/tag/repository/TagJpaRepository.java +++ b/src/main/java/umc/kkijuk/server/tag/repository/TagJpaRepository.java @@ -1,5 +1,6 @@ package umc.kkijuk.server.tag.repository; +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; @@ -8,6 +9,7 @@ import java.util.List; import java.util.Optional; +import umc.kkijuk.server.tag.dto.TagUsageResponseDto; public interface TagJpaRepository extends JpaRepository { boolean existsByNameAndMemberId(String name, Long memberId); @@ -18,4 +20,24 @@ public interface TagJpaRepository extends JpaRepository { "ORDER BY CASE WHEN tag.name = :keyword THEN 0 ELSE 1 END, tag.name ASC") List findByKeywordAndMemberId(@Param("keyword") String keyword, @Param("memberId") Long memberId); Optional findById(Long Id); + + @Query(""" + select new umc.kkijuk.server.tag.dto.TagUsageResponseDto( + t.id, t.name, count(cdt.id) + ) + from Tag t + left join CareerDetailTag cdt on cdt.tag = t + left join cdt.baseCareerDetail bcd + where t.memberId = :memberId + and (bcd is null or bcd.memberId = :memberId) + group by t.id, t.name + order by count(cdt.id) desc, t.name asc + """) + List findTopPopularTagsByMember( + @Param("memberId") Long memberId, + Pageable pageable + ); + + + } diff --git a/src/main/java/umc/kkijuk/server/tag/repository/TagRepository.java b/src/main/java/umc/kkijuk/server/tag/repository/TagRepository.java index f689ebba..32d09561 100644 --- a/src/main/java/umc/kkijuk/server/tag/repository/TagRepository.java +++ b/src/main/java/umc/kkijuk/server/tag/repository/TagRepository.java @@ -1,9 +1,11 @@ package umc.kkijuk.server.tag.repository; +import org.springframework.data.domain.Pageable; import umc.kkijuk.server.tag.domain.Tag; import java.util.List; import java.util.Optional; +import umc.kkijuk.server.tag.dto.TagUsageResponseDto; public interface TagRepository { boolean existsByNameAndMemberId(String tagName, Long memberId); @@ -17,4 +19,5 @@ public interface TagRepository { void delete(Tag deleteTag); List findByKeywordAndMemberId(String keyword, Long id); + List findTopPopularTagsByMember(Long memberId, Pageable pageable); } diff --git a/src/main/java/umc/kkijuk/server/tag/repository/TagRepositoryImpl.java b/src/main/java/umc/kkijuk/server/tag/repository/TagRepositoryImpl.java index e6285d5b..301aa1f3 100644 --- a/src/main/java/umc/kkijuk/server/tag/repository/TagRepositoryImpl.java +++ b/src/main/java/umc/kkijuk/server/tag/repository/TagRepositoryImpl.java @@ -1,11 +1,14 @@ package umc.kkijuk.server.tag.repository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; import umc.kkijuk.server.tag.domain.Tag; import java.util.List; import java.util.Optional; +import umc.kkijuk.server.tag.dto.TagUsageResponseDto; @Repository @RequiredArgsConstructor @@ -41,4 +44,9 @@ public void delete(Tag deleteTag) { public List findByKeywordAndMemberId(String keyword, Long id) { return tagJpaRepository.findByKeywordAndMemberId(keyword,id); } + + @Override + public List findTopPopularTagsByMember(Long memberId, Pageable pageable) { + return tagJpaRepository.findTopPopularTagsByMember(memberId, pageable); + } }