Skip to content

Commit

Permalink
Merge pull request #224 from BudgetBuddiesTeam/feat/#206
Browse files Browse the repository at this point in the history
[feat] 비교분석 AI 멘트 Async 비동기 처리 + Cache 기능 추가
  • Loading branch information
m3k0813 authored Nov 25, 2024
2 parents 41dad67 + 71255ab commit 1d7d2f7
Show file tree
Hide file tree
Showing 18 changed files with 362 additions and 474 deletions.
78 changes: 40 additions & 38 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,43 +1,45 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.7'
id 'io.spring.dependency-management' version '1.1.5'
id 'com.google.cloud.tools.jib' version '3.4.3'
id 'java'
id 'org.springframework.boot' version '3.2.7'
id 'io.spring.dependency-management' version '1.1.5'
id 'com.google.cloud.tools.jib' version '3.4.3'
}

group = 'com.bbteam'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security' // security
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' //Swagger
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security' // security
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' //Swagger

implementation 'net.nurigo:sdk:4.2.7' // 문자메시지 대행 서비스
implementation 'net.nurigo:sdk:4.2.7' // 문자메시지 대행 서비스

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.springframework.boot:spring-boot-starter-cache' // cache

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
Expand All @@ -51,23 +53,23 @@ dependencies {
}

tasks.named('test') {
useJUnitPlatform()
useJUnitPlatform()
}

jib {
from {
image = 'openjdk:17-alpine'
platforms {
platform {
architecture = 'amd64'
os = 'linux'
}
}
}
to {
image = 'binjumeoniz1/binjumeoniz:latest'
}
container {
jvmFlags = ['-Dspring.profiles.active=dev']
}
from {
image = 'openjdk:17-alpine'
platforms {
platform {
architecture = 'amd64'
os = 'linux'
}
}
}
to {
image = 'binjumeoniz1/binjumeoniz:latest'
}
container {
jvmFlags = ['-Dspring.profiles.active=dev']
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableJpaAuditing
@EnableAsync
@EnableCaching
public class BudgetbuddiesApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

import java.time.LocalDate;
import java.util.List;
import java.util.concurrent.ExecutionException;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;

import com.bbteam.budgetbuddies.apiPayload.ApiResponse;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.AllConsumptionCategoryResponseDto;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.ConsumptionAnalysisResponseDto;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.ConsumptionGoalListRequestDto;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.ConsumptionGoalResponseListDto;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.MonthReportResponseDto;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.PeerInfoResponseDto;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.TopCategoryConsumptionDto;
import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.TopGoalCategoryResponseDto;
Expand All @@ -26,31 +27,33 @@ public interface ConsumptionGoalApi {
@Operation(summary = "[User] 또래들이 가장 큰 계획을 세운 카테고리 조회 Top4", description = "특정 사용자의 소비 목표 카테고리별 소비 목표 금액을 조회하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
@Parameters({@Parameter(name = "userId", description = "로그인 한 유저 아이디"),
@Parameters({
@Parameter(name = "peerAgeStart", description = "또래나이 시작 범위"),
@Parameter(name = "peerAgeEnd", description = "또래나이 끝 범위"),
@Parameter(name = "peerGender", description = "또래 성별")})
ApiResponse<List<TopGoalCategoryResponseDto>> getTopConsumptionGoalCategories(
Long userId, int peerAgeStart, int peerAgeEnd, String peerGender);
UserDto.AuthUserDto user, int peerAgeStart, int peerAgeEnd, String peerGender);

@Operation(summary = "[User] 또래들이 가장 많이 계획한 카테고리와 평균 금액 및 내 목표금액 차이 조회", description = "특정 사용자의 또래 소비 카테고리별 평균 목표 금액을 조회하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
@Parameters({@Parameter(name = "userId", description = "로그인 한 유저 아이디"),
@Parameters({
@Parameter(name = "peerAgeStart", description = "또래나이 시작 범위"),
@Parameter(name = "peerAgeEnd", description = "또래나이 끝 범위"),
@Parameter(name = "peerGender", description = "또래 성별")})
ApiResponse<List<AllConsumptionCategoryResponseDto>> getAllConsumptionGoalCategories(Long userId, int peerAgeStart,
ApiResponse<List<AllConsumptionCategoryResponseDto>> getAllConsumptionGoalCategories(UserDto.AuthUserDto user,
int peerAgeStart,
int peerAgeEnd, String peerGender);

@Operation(summary = "[User] 또래나이와 성별 조회", description = "또래나이와 성별을 조회하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
@Parameters({@Parameter(name = "userId", description = "로그인 한 유저 아이디"),
@Parameters({
@Parameter(name = "peerAgeStart", description = "또래나이 시작 범위"),
@Parameter(name = "peerAgeEnd", description = "또래나이 끝 범위"),
@Parameter(name = "peerGender", description = "또래 성별")})
ApiResponse<PeerInfoResponseDto> getPeerInfo(Long userId, int peerAgeStart, int peerAgeEnd, String peerGender);
ApiResponse<PeerInfoResponseDto> getPeerInfo(UserDto.AuthUserDto user, int peerAgeStart, int peerAgeEnd,
String peerGender);

@Operation(summary = "[User] 소비 목표 조회", description = "date={yyyy-MM-dd} 형식의 query string을 통해서 사용자의 목표 달을 조회하는 API 입니다.")
@Parameters({@Parameter(name = "date", description = "yyyy-MM-dd 형식으로 목표 달의 소비를 조회")})
Expand All @@ -63,25 +66,36 @@ ResponseEntity<ConsumptionGoalResponseListDto> updateOrElseGenerateConsumptionGo
@Operation(summary = "[User] 또래들이 가장 많이한 소비 카테고리 조회 Top3", description = "특정 사용자의 또래 소비 카테고리별 소비 건 수을 조회하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
@Parameters({@Parameter(name = "userId", description = "로그인 한 유저 아이디"),
@Parameters({
@Parameter(name = "peerAgeStart", description = "또래나이 시작 범위"),
@Parameter(name = "peerAgeEnd", description = "또래나이 끝 범위"),
@Parameter(name = "peerGender", description = "또래 성별")})
ApiResponse<List<TopCategoryConsumptionDto>> getTopConsumptionCategories(Long userId, int peerAgeStart,
ApiResponse<List<TopCategoryConsumptionDto>> getTopConsumptionCategories(UserDto.AuthUserDto user, int peerAgeStart,
int peerAgeEnd, String peerGender);

@Operation(summary = "[User] 또래들이 가장 많이한 소비 카테고리와 평균 금액 및 내 소비금액 차이 조회", description = "특정 사용자의 또래 소비 카테고리별 평균 소비 금액을 조회하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
@Parameters({@Parameter(name = "userId", description = "로그인 한 유저 아이디"),
@Parameters({
@Parameter(name = "peerAgeStart", description = "또래나이 시작 범위"),
@Parameter(name = "peerAgeEnd", description = "또래나이 끝 범위"),
@Parameter(name = "peerGender", description = "또래 성별")})
ApiResponse<List<AllConsumptionCategoryResponseDto>> getAllConsumptionCategories(Long userId, int peerAgeStart,
ApiResponse<List<AllConsumptionCategoryResponseDto>> getAllConsumptionCategories(UserDto.AuthUserDto user,
int peerAgeStart,
int peerAgeEnd, String peerGender);

@Operation(summary = "[User] 또래들이 가장 큰 목표로 세운 카테고리와 그 카테고리에서 이번주 사용한 금액 조회", description = "특정 사용자의 또래 소비 카테고리별 이번주 소비 금액을 조회하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
ApiResponse<ConsumptionAnalysisResponseDto> getTopCategoryAndConsumptionAmount(@PathVariable Long userId);
ApiResponse<ConsumptionAnalysisResponseDto> getTopCategoryAndConsumptionAmount(UserDto.AuthUserDto user);

@Operation(summary = "[User] 이번 달 레포트 표정, 멘트 조회 ", description = "특정 사용자의 이번 달 레포트 표정, 멘트를 조회하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
ApiResponse<MonthReportResponseDto> getMonthReport(UserDto.AuthUserDto user);

@Operation(summary = "[User] 소비 분석 멘트 생성", description = "특정 사용자의 소비 분석 멘트를 생성 하는 API 입니다.")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공")})
ApiResponse<String> getConsumptionMention(UserDto.AuthUserDto user) throws ExecutionException, InterruptedException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import java.time.LocalDate;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand Down Expand Up @@ -37,34 +40,37 @@ public class ConsumptionGoalController implements ConsumptionGoalApi {
@Override
@GetMapping("/categories/top-goals/top-4")
public ApiResponse<List<TopGoalCategoryResponseDto>> getTopConsumptionGoalCategories(
@RequestParam(name = "userId") Long userId,
@AuthUser UserDto.AuthUserDto user,
@RequestParam(name = "peerAgeStart", defaultValue = "0") int peerAgeStart,
@RequestParam(name = "peerAgeEnd", defaultValue = "0") int peerAgeEnd,
@RequestParam(name = "peerGender", defaultValue = "none") String peerGender) {
List<TopGoalCategoryResponseDto> response = consumptionGoalService.getTopConsumptionGoalCategories(
userId, peerAgeStart, peerAgeEnd, peerGender);
user.getId(), peerAgeStart, peerAgeEnd, peerGender);
return ApiResponse.onSuccess(response);
}

@Override
@GetMapping("/categories/top-goals")
public ApiResponse<List<AllConsumptionCategoryResponseDto>> getAllConsumptionGoalCategories(
@RequestParam(name = "userId") Long userId,
@AuthUser UserDto.AuthUserDto user,
@RequestParam(name = "peerAgeStart", defaultValue = "0") int peerAgeStart,
@RequestParam(name = "peerAgeEnd", defaultValue = "0") int peerAgeEnd,
@RequestParam(name = "peerGender", defaultValue = "none") String peerGender) {
List<AllConsumptionCategoryResponseDto> response = consumptionGoalService.getAllConsumptionGoalCategories(
userId,
user.getId(),
peerAgeStart, peerAgeEnd, peerGender);
return ApiResponse.onSuccess(response);
}

@Override
@GetMapping("/peer-info")
public ApiResponse<PeerInfoResponseDto> getPeerInfo(@RequestParam(name = "userId") Long userId,
public ApiResponse<PeerInfoResponseDto> getPeerInfo(
@AuthUser UserDto.AuthUserDto user,
@RequestParam(name = "peerAgeStart", defaultValue = "0") int peerAgeStart,
@RequestParam(name = "peerAgeEnd", defaultValue = "0") int peerAgeEnd,
@RequestParam(name = "peerGender", defaultValue = "none") String peerGender) {
PeerInfoResponseDto response = consumptionGoalService.getPeerInfo(userId, peerAgeStart, peerAgeEnd, peerGender);
PeerInfoResponseDto response = consumptionGoalService.getPeerInfo(user.getId(), peerAgeStart, peerAgeEnd,
peerGender);
return ApiResponse.onSuccess(response);
}

Expand All @@ -85,44 +91,53 @@ public ResponseEntity<ConsumptionGoalResponseListDto> updateOrElseGenerateConsum
.body(consumptionGoalService.updateConsumptionGoals(user.getId(), consumptionGoalListRequestDto));
}

@Override
@GetMapping("/categories/top-consumptions/top-3")
public ApiResponse<List<TopCategoryConsumptionDto>> getTopConsumptionCategories(
@RequestParam(name = "userId") Long userId,
@AuthUser UserDto.AuthUserDto user,
@RequestParam(name = "peerAgeStart", defaultValue = "0") int peerAgeStart,
@RequestParam(name = "peerAgeEnd", defaultValue = "0") int peerAgeEnd,
@RequestParam(name = "peerGender", defaultValue = "none") String peerGender) {
List<TopCategoryConsumptionDto> response = consumptionGoalService.getTopConsumptionCategories(userId,
List<TopCategoryConsumptionDto> response = consumptionGoalService.getTopConsumptionCategories(user.getId(),
peerAgeStart, peerAgeEnd, peerGender);
return ApiResponse.onSuccess(response);
}

@Override
@GetMapping("/categories/top-consumptions")
public ApiResponse<List<AllConsumptionCategoryResponseDto>> getAllConsumptionCategories(
@RequestParam(name = "userId") Long userId,
@AuthUser UserDto.AuthUserDto user,
@RequestParam(name = "peerAgeStart", defaultValue = "0") int peerAgeStart,
@RequestParam(name = "peerAgeEnd", defaultValue = "0") int peerAgeEnd,
@RequestParam(name = "peerGender", defaultValue = "none") String peerGender) {
List<AllConsumptionCategoryResponseDto> response = consumptionGoalService.getAllConsumptionCategories(userId,
List<AllConsumptionCategoryResponseDto> response = consumptionGoalService.getAllConsumptionCategories(
user.getId(),
peerAgeStart, peerAgeEnd, peerGender);
return ApiResponse.onSuccess(response);
}

@Override
@GetMapping("/category/top-goals")
public ApiResponse<ConsumptionAnalysisResponseDto> getTopCategoryAndConsumptionAmount(
@RequestParam(name = "userId") Long userId) {
ConsumptionAnalysisResponseDto response = consumptionGoalService.getTopCategoryAndConsumptionAmount(userId);
@AuthUser UserDto.AuthUserDto user) {
ConsumptionAnalysisResponseDto response = consumptionGoalService.getTopCategoryAndConsumptionAmount(
user.getId());
return ApiResponse.onSuccess(response);
}

@GetMapping("/facialExpressions")
public ApiResponse<MonthReportResponseDto> getMonthReport(@RequestParam(name = "userId") Long userId) {
MonthReportResponseDto response = consumptionGoalService.getMonthReport(userId);
@Override
@GetMapping("/month-report")
public ApiResponse<MonthReportResponseDto> getMonthReport(
@AuthUser UserDto.AuthUserDto user) {
MonthReportResponseDto response = consumptionGoalService.getMonthReport(user.getId());
return ApiResponse.onSuccess(response);
}

@GetMapping("/cosnumption-ment")
public ApiResponse<String> getConsumptionMention(@RequestParam(name = "userId") Long userId) {
String response = consumptionGoalService.getConsumptionMention(userId);
return ApiResponse.onSuccess(response);
@Override
@GetMapping("/consumption-ment")
public ApiResponse<String> getConsumptionMention(
@AuthUser UserDto.AuthUserDto user) throws ExecutionException, InterruptedException {
CompletableFuture<String> response = consumptionGoalService.getConsumptionMention(user.getId());
return ApiResponse.onSuccess(response.get());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.time.LocalDate;
import java.util.List;
import java.util.concurrent.CompletableFuture;

import org.springframework.stereotype.Service;

Expand Down Expand Up @@ -52,7 +53,7 @@ List<AllConsumptionCategoryResponseDto> getAllConsumptionCategories(Long userId,

MonthReportResponseDto getMonthReport(Long userId);

String getConsumptionMention(Long userId);
CompletableFuture<String> getConsumptionMention(Long userId);

ConsumptionGoal getUserConsumptionGoal(User user, Category category, LocalDate goalDate);
}
Loading

0 comments on commit 1d7d2f7

Please sign in to comment.