Skip to content

Commit

Permalink
feat: 버블차트 API
Browse files Browse the repository at this point in the history
  • Loading branch information
eojinny committed Nov 22, 2023
1 parent 0b43ed1 commit 40c4c0e
Show file tree
Hide file tree
Showing 34 changed files with 219 additions and 156 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gwangjang.server.domain.morpheme.application.dto.req;
package gwangjang.server.domain.contents.application.dto.req;

import lombok.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package gwangjang.server.domain.contents.application.dto.res;


import lombok.*;

@Getter
@Builder
@Setter
@NoArgsConstructor
public class BubbleChartRes {
String issueTitle;
String keyword;
String date;
Long rank;

public BubbleChartRes(String issueTitle, String keyword, String date, Long rank) {
this.issueTitle = issueTitle;
this.keyword = keyword;
this.date = date;
this.rank = rank;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gwangjang.server.domain.morpheme.application.dto.res;
package gwangjang.server.domain.contents.application.dto.res;

import gwangjang.server.domain.morpheme.domain.entity.constant.ApiType;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import lombok.*;

@Getter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gwangjang.server.domain.morpheme.application.dto.res;
package gwangjang.server.domain.contents.application.dto.res;


import lombok.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package gwangjang.server.domain.morpheme.application.dto.res;
package gwangjang.server.domain.contents.application.dto.res;

import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.morpheme.domain.entity.constant.ApiType;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import lombok.*;

@Getter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gwangjang.server.domain.morpheme.application.dto.res;
package gwangjang.server.domain.contents.application.dto.res;


import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.contents.domain.entity.Contents;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package gwangjang.server.domain.morpheme.application.mapper;
package gwangjang.server.domain.contents.application.mapper;


import gwangjang.server.domain.morpheme.application.dto.res.ContentsRes;
import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.contents.application.dto.res.ContentsRes;
import gwangjang.server.domain.contents.domain.entity.Contents;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package gwangjang.server.domain.morpheme.application.service;
package gwangjang.server.domain.contents.application.service;

import gwangjang.server.domain.morpheme.application.dto.res.ContentsDataRes;
import gwangjang.server.domain.morpheme.domain.service.ContentsQueryService;
import gwangjang.server.domain.contents.application.dto.res.BubbleChartRes;
import gwangjang.server.domain.contents.application.dto.res.ContentsDataRes;
import gwangjang.server.domain.contents.domain.service.ContentsQueryService;
import gwangjang.server.global.feign.client.FindMemberFeignClient;
import gwangjang.server.global.feign.dto.SubscribeIssueFeignRes;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -26,4 +26,8 @@ public List<ContentsDataRes> getContentsByIssue(String issue) {

return contentsQueryService.getContentsByIssue(issue);
}

public List<BubbleChartRes> getBubbleChart(String issueTitle) {
return contentsQueryService.getBubbleChart(issueTitle);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package gwangjang.server.domain.morpheme.domain.entity;
package gwangjang.server.domain.contents.domain.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import gwangjang.server.domain.like.domain.entity.ContentLike;
import gwangjang.server.domain.morpheme.application.dto.res.ContentsRes;
import gwangjang.server.domain.morpheme.domain.entity.constant.ApiType;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import gwangjang.server.global.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gwangjang.server.domain.morpheme.domain.entity;
package gwangjang.server.domain.contents.domain.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gwangjang.server.domain.morpheme.domain.entity;
package gwangjang.server.domain.contents.domain.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gwangjang.server.domain.morpheme.domain.entity.constant;
package gwangjang.server.domain.contents.domain.entity.constant;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package gwangjang.server.domain.morpheme.domain.repository;
package gwangjang.server.domain.contents.domain.repository;

import gwangjang.server.domain.morpheme.application.dto.res.ContentsDataRes;
import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.contents.application.dto.res.BubbleChartRes;
import gwangjang.server.domain.contents.application.dto.res.ContentsDataRes;
import gwangjang.server.domain.contents.domain.entity.Contents;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
package gwangjang.server.domain.morpheme.domain.repository;
package gwangjang.server.domain.contents.domain.repository;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.EntityPath;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberTemplate;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import gwangjang.server.domain.contents.application.dto.res.BubbleChartRes;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import gwangjang.server.domain.like.domain.entity.QContentLike;
import gwangjang.server.domain.morpheme.application.dto.res.ContentLikeCountRes;
import gwangjang.server.domain.morpheme.application.dto.res.ContentsDataRes;
import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.morpheme.domain.entity.QContents;
import gwangjang.server.domain.contents.application.dto.res.ContentsDataRes;
import gwangjang.server.domain.contents.domain.entity.Contents;
import gwangjang.server.domain.contents.domain.entity.QContents;
import jakarta.persistence.EntityManager;

import com.querydsl.core.types.dsl.StringTemplate;
import com.querydsl.core.types.dsl.StringExpression;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import static gwangjang.server.domain.morpheme.domain.entity.QContents.contents;
import static com.querydsl.core.types.Projections.fields;
import static gwangjang.server.domain.contents.domain.entity.QContents.contents;


public class ContentsCustomRepositoryImpl implements ContentsCustomRepository {
Expand Down Expand Up @@ -86,5 +92,10 @@ public void updateContentsImageUrl(Integer contentsId, String newImageUrl) {
.execute();
}






}

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package gwangjang.server.domain.contents.domain.repository;

import gwangjang.server.domain.contents.application.dto.res.BubbleChartRes;
import gwangjang.server.domain.contents.domain.entity.Contents;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ContentsRepository extends JpaRepository<Contents, Integer>,ContentsCustomRepository{

List<Contents> findByType(ApiType type);
List<Contents> findByIssueTitleLike(String issue);
List<Contents> findByKeywordLikeAndTypeOrderByPubDateDesc(String issueTitle, ApiType type);

@Query(
value = "SELECT issue_title, keyword, MAX(month) AS max_occurrence_date, MAX(occurrences) AS max_occurrences\n" +
"FROM (\n" +
" SELECT issue_title, keyword, SUBSTRING(pub_date, 1, 7) AS month, COUNT(*) AS occurrences\n" +
" FROM contents\n" +
" WHERE TYPE = 'YOUTUBE'\n" +
" GROUP BY issue_title, keyword, month\n" +
") AS subquery\n" +
"GROUP BY issue_title, keyword\n" +
"ORDER BY max_occurrences DESC",
nativeQuery = true)
List<Object[]> findMaxOccurrencesByIssueAndKeyword();


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package gwangjang.server.domain.contents.domain.service;

import gwangjang.server.domain.contents.application.dto.req.TotalReq;
import gwangjang.server.domain.contents.application.dto.res.BubbleChartRes;
import gwangjang.server.domain.contents.application.dto.res.ContentsDataRes;
import gwangjang.server.domain.contents.domain.repository.ContentsRepository;
import gwangjang.server.global.annotation.DomainService;
import gwangjang.server.global.feign.client.FindKeywordFeignClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@DomainService
@RequiredArgsConstructor
public class ContentsQueryService {
private final ContentsRepository contentsRepository;
private final FindKeywordFeignClient findKeywordFeignClient;

public List<ContentsDataRes> getContentsByIssue(String issue) {
return contentsRepository.getContentsByIssueId(issue);
}
public List<BubbleChartRes> getBubbleChart(String issue) {
List<TotalReq> keywordList = findKeywordFeignClient.getAll().getBody().getData();
Map<String, Long> keywordIdMap = keywordList.stream()
.collect(Collectors.toMap(keyword -> keyword.getIssueTitle() + " " + keyword.getKeyword(), TotalReq::getKeywordId));

return contentsRepository.findMaxOccurrencesByIssueAndKeyword().stream()
.filter(objects -> {
String issueTitle = (String) objects[0];
return issueTitle.contains(issue);
})
.map(objects -> {
String issueTitle = (String) objects[0];
String keyword = (String) objects[1];
String date = (String) objects[2];
Long count = (Long) objects[3];

// Construct the key to look up keywordId in the map
String key = issueTitle + keyword;
Long keywordId = keywordIdMap.getOrDefault(key, null);

return new BubbleChartRes(issueTitle, keyword, date, keywordId != null ? keywordId : count);
})
.collect(Collectors.toList());
}





}
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package gwangjang.server.domain.morpheme.domain.service;
import gwangjang.server.domain.morpheme.application.dto.res.ContentsRes;
import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.morpheme.domain.entity.constant.ApiType;
package gwangjang.server.domain.contents.domain.service;
import gwangjang.server.domain.contents.application.dto.res.ContentsRes;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import gwangjang.server.global.annotation.DomainService;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package gwangjang.server.domain.morpheme.domain.service;
package gwangjang.server.domain.contents.domain.service;

import gwangjang.server.domain.like.domain.entity.ContentLike;
import gwangjang.server.domain.like.domain.repository.LikeRepository;
import gwangjang.server.domain.morpheme.application.dto.res.ContentLikeCountRes;
import gwangjang.server.domain.morpheme.application.dto.res.ContentsRes;
import gwangjang.server.domain.morpheme.application.mapper.ContentsMapper;
import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.morpheme.domain.entity.constant.ApiType;
import gwangjang.server.domain.morpheme.domain.repository.ContentsRepository;
import gwangjang.server.domain.morpheme.domain.service.ContentsService;
import gwangjang.server.domain.contents.application.dto.res.ContentsRes;
import gwangjang.server.domain.contents.application.mapper.ContentsMapper;
import gwangjang.server.domain.contents.domain.entity.Contents;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import gwangjang.server.domain.contents.domain.repository.ContentsRepository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.json.JSONArray;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package gwangjang.server.domain.morpheme.domain.service;
package gwangjang.server.domain.contents.domain.service;

import gwangjang.server.domain.morpheme.application.dto.res.ContentsRes;
import gwangjang.server.domain.morpheme.application.mapper.ContentsMapper;
import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.morpheme.domain.repository.ContentsRepository;
import gwangjang.server.domain.contents.application.dto.res.ContentsRes;
import gwangjang.server.domain.contents.application.mapper.ContentsMapper;
import gwangjang.server.domain.contents.domain.entity.Contents;
import gwangjang.server.domain.contents.domain.repository.ContentsRepository;
import jakarta.transaction.Transactional;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package gwangjang.server.domain.morpheme.domain.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import gwangjang.server.domain.morpheme.application.dto.res.ContentsRes;
import gwangjang.server.domain.morpheme.application.mapper.ContentsMapper;
import gwangjang.server.domain.morpheme.domain.entity.Contents;
import gwangjang.server.domain.morpheme.domain.entity.constant.ApiType;
import gwangjang.server.domain.morpheme.domain.repository.ContentsRepository;
package gwangjang.server.domain.contents.domain.service;

import gwangjang.server.domain.contents.application.dto.res.ContentsRes;
import gwangjang.server.domain.contents.application.mapper.ContentsMapper;
import gwangjang.server.domain.contents.domain.entity.constant.ApiType;
import gwangjang.server.domain.contents.domain.repository.ContentsRepository;
import gwangjang.server.global.annotation.DomainService;
import jakarta.transaction.Transactional;
import org.json.simple.JSONArray;
Expand All @@ -14,7 +12,6 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package gwangjang.server.domain.morpheme.domain.service;
package gwangjang.server.domain.contents.domain.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import gwangjang.server.domain.morpheme.application.dto.req.TotalReq;
import gwangjang.server.domain.morpheme.application.service.ContentsSubscribeUseCase;
import gwangjang.server.domain.contents.application.dto.req.TotalReq;
import gwangjang.server.global.annotation.DomainService;
import gwangjang.server.global.feign.client.FindKeywordFeignClient;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

import java.util.List;
Expand Down
Loading

0 comments on commit 40c4c0e

Please sign in to comment.