260710_1
This commit is contained in:
@@ -47,6 +47,12 @@ from B03_FileInput.B03_FileInput_Schema import (
|
||||
from common_util.common_util_json import atomic_write_json
|
||||
from common_util.common_util_storage import resolve_stored_project_path
|
||||
from common_util.common_util_workflow import load_project_workflow
|
||||
from common_util.common_util_workflow_state import (
|
||||
complete_stage,
|
||||
fail_stage,
|
||||
get_workflow_state,
|
||||
start_stage,
|
||||
)
|
||||
from config.config_db import get_db_pool
|
||||
from config.config_system import (
|
||||
SEND_ANALYSIS_COMPLETION_EMAIL,
|
||||
@@ -155,8 +161,20 @@ async def trigger_wf1_analysis_and_email(
|
||||
pool = get_db_pool()
|
||||
project_info: dict[str, Any] | None = None
|
||||
try:
|
||||
await _update_project_status(project_id, "WF1_ANALYZING")
|
||||
source_filters = list(SURFACE_MODEL_SOURCE_FILTERS)
|
||||
methods = list(SURFACE_MODEL_PRECOMPUTE)
|
||||
params = {
|
||||
"input_file_id": str(input_file_id),
|
||||
"source_filters": source_filters,
|
||||
"methods": methods,
|
||||
"force": False,
|
||||
}
|
||||
|
||||
async with pool.acquire() as connection:
|
||||
async with connection.cursor() as cursor:
|
||||
await start_stage(cursor, str(project_id), 1, params)
|
||||
await connection.commit()
|
||||
|
||||
stored_path = await get_project_storage_relative_path(connection, project_id)
|
||||
project_info = await _get_project_notification_info(connection, project_id)
|
||||
if not project_info or not project_info.get("user_email"):
|
||||
@@ -176,8 +194,6 @@ async def trigger_wf1_analysis_and_email(
|
||||
project_id,
|
||||
input_file_id,
|
||||
)
|
||||
source_filters = list(SURFACE_MODEL_SOURCE_FILTERS)
|
||||
methods = list(SURFACE_MODEL_PRECOMPUTE)
|
||||
|
||||
from B04_wf1_Surface.B04_wf1_Surface_Engine import run_surface_analysis
|
||||
from B04_wf1_Surface.B04_wf1_Surface_Router import save_surface_analysis_to_db
|
||||
@@ -195,8 +211,6 @@ async def trigger_wf1_analysis_and_email(
|
||||
|
||||
logger.info("WF1 분석 결과 DB 저장 시작: project_id=%s", project_id)
|
||||
async with pool.acquire() as connection:
|
||||
# save_surface_analysis_to_db는 트랜잭션을 열지 않는다.
|
||||
# 호출자가 begin/commit/rollback을 한 번만 책임진다.
|
||||
await connection.begin()
|
||||
try:
|
||||
await save_surface_analysis_to_db(
|
||||
@@ -206,8 +220,9 @@ async def trigger_wf1_analysis_and_email(
|
||||
analysis_result=analysis_result,
|
||||
source_filters=source_filters,
|
||||
)
|
||||
async with connection.cursor() as cursor:
|
||||
await complete_stage(cursor, str(project_id), 1)
|
||||
await connection.commit()
|
||||
await _update_project_status(project_id, "WF1_COMPLETE")
|
||||
logger.info("WF1 분석 결과 DB 저장 완료: project_id=%s", project_id)
|
||||
except Exception as e:
|
||||
logger.exception("WF1 분석 결과 DB 저장 실패: %s", e)
|
||||
@@ -237,7 +252,9 @@ async def trigger_wf1_analysis_and_email(
|
||||
logger.info("WF1 백그라운드 분석 완료: project_id=%s", project_id)
|
||||
except Exception as exc:
|
||||
logger.exception("WF1 백그라운드 분석 실패: project_id=%s", project_id)
|
||||
await _update_project_status(project_id, "WF1_FAILED")
|
||||
async with pool.acquire() as connection, connection.cursor() as cursor:
|
||||
await fail_stage(cursor, str(project_id), 1, str(exc))
|
||||
await connection.commit()
|
||||
if project_info and project_info.get("user_email"):
|
||||
await send_analysis_error_email(
|
||||
project_id=project_id,
|
||||
@@ -326,6 +343,8 @@ async def upload_project_files(
|
||||
metadata=metadata,
|
||||
)
|
||||
)
|
||||
async with connection.cursor() as cursor:
|
||||
await complete_stage(cursor, str(project_id), 0)
|
||||
await connection.commit()
|
||||
except Exception:
|
||||
await connection.rollback()
|
||||
@@ -547,6 +566,8 @@ async def finalize_project_upload(
|
||||
metadata=metadata,
|
||||
)
|
||||
await mark_upload_session_completed(connection, session_id=payload.session_id)
|
||||
async with connection.cursor() as cursor:
|
||||
await complete_stage(cursor, str(project_id), 0)
|
||||
await connection.commit()
|
||||
except Exception:
|
||||
await connection.rollback()
|
||||
@@ -641,3 +662,11 @@ async def get_project_upload_status(
|
||||
status_code=500,
|
||||
content={"status": "error", "message": "업로드 상태 조회 중 오류가 발생했습니다."},
|
||||
)
|
||||
|
||||
|
||||
@router.get("/{project_id}/workflow-state")
|
||||
async def get_project_workflow_state(project_id: str):
|
||||
pool = get_db_pool()
|
||||
async with pool.acquire() as connection, connection.cursor(aiomysql.DictCursor) as cursor:
|
||||
state = await get_workflow_state(cursor, project_id)
|
||||
return {"status": "success", "workflow_state": state}
|
||||
|
||||
Reference in New Issue
Block a user