Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/com/sofa/linkiving/LinkivingApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

@SpringBootApplication
@EnableJpaAuditing
@EnableFeignClients(basePackages = "com.sofa.linkiving.infra.feign")
@EnableFeignClients
public class LinkivingApplication {

public static void main(String[] args) {
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.sofa.linkiving.domain.link.ai;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

import com.sofa.linkiving.domain.link.dto.response.RagInitialSummaryRes;
import com.sofa.linkiving.domain.link.dto.response.RagRegenerateSummaryRes;

@Component
@Profile("test")
public class MockSummaryClient implements SummaryClient {

@Override
public RagInitialSummaryRes initialSummary(Long linkId, Long userId, String title, String url, String memo) {
return new RagInitialSummaryRes("최초 요약");
}

@Override
public RagRegenerateSummaryRes regenerateSummary(Long linkId, Long userId, String url, String existingSummary) {
return new RagRegenerateSummaryRes("신규 요약", "비교 사항");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.sofa.linkiving.domain.link.ai;

import java.util.List;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

import com.sofa.linkiving.domain.link.dto.request.RagInitialSummaryReq;
import com.sofa.linkiving.domain.link.dto.request.RagRegenerateSummaryReq;
import com.sofa.linkiving.domain.link.dto.response.RagInitialSummaryRes;
import com.sofa.linkiving.domain.link.dto.response.RagRegenerateSummaryRes;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
@Profile("!test")
@RequiredArgsConstructor
public class RagSummaryClient implements SummaryClient {

private final RagSummaryFeign ragSummaryFeign;

@Override
public RagInitialSummaryRes initialSummary(Long linkId, Long userId, String title, String url, String memo) {
try {
RagInitialSummaryReq req = new RagInitialSummaryReq(linkId, userId, title, url, memo);
List<RagInitialSummaryRes> response = ragSummaryFeign.requestInitialSummary(req);

if (response != null && !response.isEmpty()) {
log.info("[AI Server] Initial Summary Requested Success. LinkId: {}", linkId);
return response.get(0);
}
return null;

} catch (Exception e) {
log.error("[AI Server Error] Failed to request initial summary for LinkId: {}. Error: {}", linkId,
e.getMessage());
return null;
}
}

@Override
public RagRegenerateSummaryRes regenerateSummary(Long linkId, Long userId, String url, String existingSummary) {
try {
RagRegenerateSummaryReq req = new RagRegenerateSummaryReq(linkId, userId, url, existingSummary);
List<RagRegenerateSummaryRes> response = ragSummaryFeign.requestRegenerateSummary(req);

if (response != null && !response.isEmpty()) {
log.info("[AI Server] Regenerate Summary Success. LinkId: {}", linkId);
return response.get(0);
}
return null;

} catch (Exception e) {
log.error("[AI Server Error] Failed to regenerate summary for LinkId: {}. Error: {}", linkId,
e.getMessage());
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.sofa.linkiving.domain.link.ai;

import java.util.List;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import com.sofa.linkiving.domain.link.dto.request.RagInitialSummaryReq;
import com.sofa.linkiving.domain.link.dto.request.RagRegenerateSummaryReq;
import com.sofa.linkiving.domain.link.dto.response.RagInitialSummaryRes;
import com.sofa.linkiving.domain.link.dto.response.RagRegenerateSummaryRes;
import com.sofa.linkiving.infra.feign.GlobalFeignConfig;

@FeignClient(name = "ai-summary-client", url = "${ai.server.url}", configuration = GlobalFeignConfig.class)
public interface RagSummaryFeign {
@PostMapping("/webhook/summary-initial")
List<RagInitialSummaryRes> requestInitialSummary(@RequestBody RagInitialSummaryReq req);

@PostMapping("/webhook/summary-resummarize")
List<RagRegenerateSummaryRes> requestRegenerateSummary(@RequestBody RagRegenerateSummaryReq request);
}
26 changes: 26 additions & 0 deletions src/main/java/com/sofa/linkiving/domain/link/ai/SummaryClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.sofa.linkiving.domain.link.ai;

import com.sofa.linkiving.domain.link.dto.response.RagInitialSummaryRes;
import com.sofa.linkiving.domain.link.dto.response.RagRegenerateSummaryRes;

public interface SummaryClient {
/**
* AI 서버에 최초 요약 요청을 보냅니다.
* @param linkId 링크 ID
* @param userId 유저 ID
* @param url 요약할 URL
* @param title 제목
* @param memo 메모
* @return 요약된 텍스트
*/
RagInitialSummaryRes initialSummary(Long linkId, Long userId, String title, String url, String memo);

/**
* 요약 재생성 및 기존 요약과의 차이점 요청을 보냅니다.
* @param linkId 링크 ID
* @param userId 유저 ID
* @param url 요약할 URL
* @return 요약 비교 정보
*/
RagRegenerateSummaryRes regenerateSummary(Long linkId, Long userId, String url, String existingSummary);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,18 @@
import com.sofa.linkiving.domain.link.dto.request.LinkTitleUpdateReq;
import com.sofa.linkiving.domain.link.dto.request.LinkUpdateReq;
import com.sofa.linkiving.domain.link.dto.request.MetaScrapeReq;
import com.sofa.linkiving.domain.link.dto.request.RegenerateSummaryReq;
import com.sofa.linkiving.domain.link.dto.response.LinkCardsRes;
import com.sofa.linkiving.domain.link.dto.response.LinkDetailRes;
import com.sofa.linkiving.domain.link.dto.response.LinkDuplicateCheckRes;
import com.sofa.linkiving.domain.link.dto.response.LinkRes;
import com.sofa.linkiving.domain.link.dto.response.MetaScrapeRes;
import com.sofa.linkiving.domain.link.dto.response.RecreateSummaryResponse;
import com.sofa.linkiving.domain.link.enums.Format;
import com.sofa.linkiving.domain.link.dto.response.RegenerateSummaryRes;
import com.sofa.linkiving.domain.member.entity.Member;
import com.sofa.linkiving.global.common.BaseResponse;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
Expand All @@ -42,7 +41,7 @@ BaseResponse<LinkDuplicateCheckRes> checkDuplicate(
);

@Operation(summary = "링크 생성", description = "새로운 링크를 저장합니다")
BaseResponse<LinkRes> createLink(
BaseResponse<LinkDetailRes> createLink(
@Valid LinkCreateReq request,
Member member
);
Expand Down Expand Up @@ -92,10 +91,9 @@ BaseResponse<LinkRes> updateMemo(
);

@Operation(summary = "요약 재생성", description = "요약을 재생성 하고 신규 요약 기존 요약, 기존 및 신규 요약 비교 정보을 제공합니다.")
BaseResponse<RecreateSummaryResponse> recreateSummary(
BaseResponse<RegenerateSummaryRes> recreateSummary(
Long id,
@Schema(description = "요청 형식(CONCISE: 간결하게, DETAILED:자세하게)")
@Valid Format format,
@Valid RegenerateSummaryReq req,
Member member
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
import com.sofa.linkiving.domain.link.dto.request.LinkTitleUpdateReq;
import com.sofa.linkiving.domain.link.dto.request.LinkUpdateReq;
import com.sofa.linkiving.domain.link.dto.request.MetaScrapeReq;
import com.sofa.linkiving.domain.link.dto.request.RegenerateSummaryReq;
import com.sofa.linkiving.domain.link.dto.response.LinkCardsRes;
import com.sofa.linkiving.domain.link.dto.response.LinkDetailRes;
import com.sofa.linkiving.domain.link.dto.response.LinkDuplicateCheckRes;
import com.sofa.linkiving.domain.link.dto.response.LinkRes;
import com.sofa.linkiving.domain.link.dto.response.MetaScrapeRes;
import com.sofa.linkiving.domain.link.dto.response.RecreateSummaryResponse;
import com.sofa.linkiving.domain.link.enums.Format;
import com.sofa.linkiving.domain.link.dto.response.RegenerateSummaryRes;
import com.sofa.linkiving.domain.link.facade.LinkFacade;
import com.sofa.linkiving.domain.member.entity.Member;
import com.sofa.linkiving.global.common.BaseResponse;
Expand Down Expand Up @@ -59,11 +59,11 @@ public BaseResponse<LinkDuplicateCheckRes> checkDuplicate(

@Override
@PostMapping
public BaseResponse<LinkRes> createLink(
public BaseResponse<LinkDetailRes> createLink(
@RequestBody LinkCreateReq request,
@AuthMember Member member
) {
LinkRes response = linkFacade.createLink(
LinkDetailRes response = linkFacade.createLink(
member,
request.url(),
request.title(),
Expand Down Expand Up @@ -143,13 +143,13 @@ public BaseResponse<LinkRes> updateMemo(
}

@Override
@GetMapping("/{id}/summary")
public BaseResponse<RecreateSummaryResponse> recreateSummary(
@PostMapping("/{id}/summary")
public BaseResponse<RegenerateSummaryRes> recreateSummary(
@PathVariable Long id,
@RequestParam Format format,
@RequestBody RegenerateSummaryReq req,
@AuthMember Member member
) {
RecreateSummaryResponse response = linkFacade.recreateSummary(member, id, format);
RegenerateSummaryRes response = linkFacade.recreateSummary(member, id, req.format());
return BaseResponse.success(response, "요약 재성성 완료");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sofa.linkiving.domain.link.dto.request;

public record RagInitialSummaryReq(
Long linkId,
Long userId,
String title,
String url,
String memo
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.sofa.linkiving.domain.link.dto.request;

public record RagRegenerateSummaryReq(
Long linkId,
Long userId,
String url,
String summary
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.sofa.linkiving.domain.link.dto.request;

import com.sofa.linkiving.domain.link.enums.Format;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

@Builder
public record RegenerateSummaryReq(
@Schema(description = "요청 형식(CONCISE: 간결하게, DETAILED:자세하게)")
Format format
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.sofa.linkiving.domain.link.dto.response;

public record RagInitialSummaryRes(
String summary
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sofa.linkiving.domain.link.dto.response;

public record RagRegenerateSummaryRes(
String summary,
String difference
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import lombok.Builder;

@Builder
public record RecreateSummaryResponse(
public record RegenerateSummaryRes(
@Schema(description = "기존 요약")
String existingSummary,
@Schema(description = "신규 요약")
String newSummary,
@Schema(description = "비교 정보")
String comparison
String difference
) {
}
Loading