Skip to content
Merged
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package site.icebang.domain.workflow.runner;

import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import lombok.RequiredArgsConstructor;

import site.icebang.domain.execution.model.TaskRun;
import site.icebang.domain.workflow.model.Task;
import site.icebang.external.fastapi.adapter.FastApiAdapter;

@Component("fastapiTaskRunner")
@RequiredArgsConstructor
public class FastApiTaskRunner implements TaskRunner {

private final FastApiAdapter fastApiAdapter;

@Override
public TaskExecutionResult execute(Task task, TaskRun taskRun, ObjectNode requestBody) {
JsonNode params = task.getParameters();
String endpoint = params.path("endpoint").asText();
HttpMethod method = HttpMethod.valueOf(params.path("method").asText("POST").toUpperCase());

String responseBody = fastApiAdapter.call(endpoint, method, requestBody.toString());

if (responseBody == null) {
return TaskExecutionResult.failure("FastApiAdapter 호출에 실패했습니다.");
}
return TaskExecutionResult.success(responseBody);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package site.icebang.domain.workflow.runner.body;

import java.util.Map;
import java.util.Set;

import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import lombok.RequiredArgsConstructor;

import site.icebang.domain.workflow.model.Task;

@Component
@RequiredArgsConstructor
public class EmptyBodyBuilder implements TaskBodyBuilder {

private final ObjectMapper objectMapper;
private static final Set<String> SUPPORTED_TASKS =
Set.of("상품 유사도 분석 태스크", "상품 정보 크롤링 태스크", "블로그 RAG 생성 태스크", "블로그 발행 태스크");

@Override
public boolean supports(String taskName) {
return SUPPORTED_TASKS.contains(taskName);
}

@Override
public ObjectNode build(Task task, Map<String, JsonNode> workflowContext) {
// 이 Task들은 Body가 필요 없으므로 빈 객체를 반환합니다.
// TODO: 나중에 이 Task들이 이전 단계의 결과값을 필요로 하게 되면,
// 다른 빌더들처럼 workflowContext에서 데이터를 꺼내 Body를 구성하도록 수정합니다.
return objectMapper.createObjectNode();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package site.icebang.domain.workflow.runner.body;

import java.util.Map;

import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import lombok.RequiredArgsConstructor;

import site.icebang.domain.workflow.model.Task;

@Component
@RequiredArgsConstructor
public class KeywordSearchBodyBuilder implements TaskBodyBuilder {

private final ObjectMapper objectMapper;
private static final String TASK_NAME = "키워드 검색 태스크";

@Override
public boolean supports(String taskName) {
return TASK_NAME.equals(taskName);
}

@Override
public ObjectNode build(Task task, Map<String, JsonNode> workflowContext) {
// 이 Task는 항상 정적인 Body를 가집니다.
return objectMapper.createObjectNode().put("tag", "naver");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package site.icebang.domain.workflow.runner.body;

import java.util.Map;
import java.util.Optional;

import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import lombok.RequiredArgsConstructor;

import site.icebang.domain.workflow.model.Task;

@Component
@RequiredArgsConstructor
public class ProductMatchBodyBuilder implements TaskBodyBuilder {

private final ObjectMapper objectMapper;
private static final String TASK_NAME = "상품 매칭 태스크";
private static final String KEYWORD_SOURCE_TASK = "키워드 검색 태스크";
private static final String SEARCH_SOURCE_TASK = "상품 검색 태스크";

@Override
public boolean supports(String taskName) {
return TASK_NAME.equals(taskName);
}

@Override
public ObjectNode build(Task task, Map<String, JsonNode> workflowContext) {
ObjectNode body = objectMapper.createObjectNode();

// 키워드 정보 가져오기
Optional.ofNullable(workflowContext.get(KEYWORD_SOURCE_TASK))
.map(node -> node.path("keyword"))
.ifPresent(keywordNode -> body.set("keyword", keywordNode));

// 상품 검색 결과 정보 가져오기
Optional.ofNullable(workflowContext.get(SEARCH_SOURCE_TASK))
.map(node -> node.path("search_results"))
.ifPresent(resultsNode -> body.set("search_results", resultsNode));

return body;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package site.icebang.domain.workflow.runner.body;

import java.util.Map;

import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import lombok.RequiredArgsConstructor;

import site.icebang.domain.workflow.model.Task;

@Component
@RequiredArgsConstructor
public class ProductSearchBodyBuilder implements TaskBodyBuilder {

private final ObjectMapper objectMapper;
private static final String TASK_NAME = "상품 검색 태스크";
private static final String SOURCE_TASK_NAME = "키워드 검색 태스크";

@Override
public boolean supports(String taskName) {
return TASK_NAME.equals(taskName);
}

@Override
public ObjectNode build(Task task, Map<String, JsonNode> workflowContext) {
JsonNode sourceResult = workflowContext.get(SOURCE_TASK_NAME);
String keyword = sourceResult != null ? sourceResult.path("keyword").asText("") : "";
return objectMapper.createObjectNode().put("keyword", keyword);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package site.icebang.domain.workflow.runner.body;

import java.util.Map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import site.icebang.domain.workflow.model.Task;

public interface TaskBodyBuilder {

/**
* 이 빌더가 어떤 Task를 지원하는지 식별합니다.
*
* @param taskName Task의 고유한 이름
* @return 지원하면 true, 아니면 false
*/
boolean supports(String taskName);

/**
* 실제 API 요청에 사용될 Body를 생성합니다.
*
* @param task DB에 저장된 Task의 원본 정의
* @param workflowContext 이전 Task들의 결과가 담긴 컨텍스트
* @return 생성된 JSON Body
*/
ObjectNode build(Task task, Map<String, JsonNode> workflowContext);
}
Loading
Loading