Skip to content
Merged
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ dependencies {
// AOP
implementation 'org.springframework.boot:spring-boot-starter-aop'

// prometheus
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'



}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import DiffLens.back_end.domain.library.dto.LibraryRequestDto;
import DiffLens.back_end.domain.library.dto.LibraryResponseDTO;
import DiffLens.back_end.domain.library.dto.LibraryCompareRequestDTO;
import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO;
import DiffLens.back_end.domain.library.service.LibraryService;
import DiffLens.back_end.domain.members.entity.Member;
import DiffLens.back_end.domain.members.service.auth.CurrentUserService;
Expand Down Expand Up @@ -148,4 +150,59 @@ public ApiResponse<LibraryResponseDTO.CreateResult> addSearchHistoryToLibrary(
createResult.getPanelCount());
return ApiResponse.onSuccess(result);
}

@PostMapping("/compare")
@Operation(summary = "라이브러리 비교", description = """
## 개요
두 개의 라이브러리를 비교하여 특성, 차트, 기본 통계를 제공하는 API입니다.

## Request Body
- libraryId1 : 첫 번째 라이브러리 ID (필수)
- libraryId2 : 두 번째 라이브러리 ID (필수)

## 응답 데이터
- group1, group2 : 각 라이브러리 기본 정보
- keyCharacteristics : 주요 특성 비교 (차이점 포함)
- comparisonCharts : 비교 차트 데이터 (Chart.js 형식)
- basicComparison : 기본 통계 비교

## 권한
본인이 생성한 라이브러리만 비교할 수 있습니다.

## 제약사항
- 동일한 라이브러리는 비교할 수 없습니다.
- 두 라이브러리 모두 존재해야 합니다.

""")
public ApiResponse<LibraryCompareResponseDTO.CompareResult> compareLibraries(
@RequestBody @Valid LibraryCompareRequestDTO.Compare request) {
Member member = currentUserService.getCurrentUser();
LibraryCompareResponseDTO.CompareResult result = libraryService.compareLibraries(request, member);
return ApiResponse.onSuccess(result);
}

@PostMapping("/compare/test")
@Operation(summary = "라이브러리 비교 (테스트용)", description = """
## 개요
AI 서버 연동 없이 하드코딩된 테스트 데이터로 라이브러리 비교를 제공하는 API입니다.
개발 및 테스트 목적으로 사용됩니다.

## Request Body
- libraryId1 : 첫 번째 라이브러리 ID (필수)
- libraryId2 : 두 번째 라이브러리 ID (필수)

## 응답 데이터
- 하드코딩된 테스트 데이터 반환
- 실제 라이브러리 데이터는 사용하지 않음

## 권한
인증된 사용자만 접근 가능합니다.

""")
public ApiResponse<LibraryCompareResponseDTO.CompareResult> compareLibrariesTest(
@RequestBody @Valid LibraryCompareRequestDTO.Compare request) {
Member member = currentUserService.getCurrentUser();
LibraryCompareResponseDTO.CompareResult result = libraryService.compareLibrariesTest(request, member);
return ApiResponse.onSuccess(result);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package DiffLens.back_end.domain.library.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

public class LibraryCompareRequestDTO {

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Compare {

@NotNull(message = "첫 번째 라이브러리 ID는 필수입니다")
@JsonProperty("libraryId1")
private Long libraryId1;

@NotNull(message = "두 번째 라이브러리 ID는 필수입니다")
@JsonProperty("libraryId2")
private Long libraryId2;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package DiffLens.back_end.domain.library.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;

public class LibraryCompareResponseDTO {

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class CompareResult {

@JsonProperty("group1")
private GroupInfo group1;

@JsonProperty("group2")
private GroupInfo group2;

@JsonProperty("keyCharacteristics")
private List<KeyCharacteristic> keyCharacteristics;

@JsonProperty("comparisonCharts")
private List<ComparisonChart> comparisonCharts;

@JsonProperty("basicComparison")
private List<BasicComparison> basicComparison;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class GroupInfo {

@JsonProperty("libraryId")
private Long libraryId;

@JsonProperty("libraryName")
private String libraryName;

@JsonProperty("totalCount")
private Integer totalCount;

@JsonProperty("color")
private String color;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class KeyCharacteristic {

@JsonProperty("characteristic")
private String characteristic;

@JsonProperty("description")
private String description;

@JsonProperty("group1Percentage")
private Integer group1Percentage;

@JsonProperty("group2Percentage")
private Integer group2Percentage;

@JsonProperty("difference")
private Integer difference;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ComparisonChart {

@JsonProperty("chartType")
private String chartType;

@JsonProperty("title")
private String title;

@JsonProperty("data")
private Map<String, Object> data;

@JsonProperty("options")
private Map<String, Object> options;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class BasicComparison {

@JsonProperty("metric")
private String metric;

@JsonProperty("group1Value")
private String group1Value;

@JsonProperty("group2Value")
private String group2Value;
}
}
Loading
Loading