Implement FastAPI Temporal MVP pipeline
This commit is contained in:
69
app/workers/activities/qc_activities.py
Normal file
69
app/workers/activities/qc_activities.py
Normal file
@@ -0,0 +1,69 @@
|
||||
"""Quality-control mock activity."""
|
||||
|
||||
from temporalio import activity
|
||||
|
||||
from app.domain.enums import AssetType, OrderStatus, StepStatus
|
||||
from app.infra.db.models.asset import AssetORM
|
||||
from app.infra.db.session import get_session_factory
|
||||
from app.workers.activities.tryon_activities import create_step_record, jsonable, load_order_and_run, mock_uri, utc_now
|
||||
from app.workers.workflows.types import MockActivityResult, StepActivityInput
|
||||
|
||||
|
||||
@activity.defn
|
||||
async def run_qc_activity(payload: StepActivityInput) -> MockActivityResult:
|
||||
"""Mock automated quality control."""
|
||||
|
||||
async with get_session_factory()() as session:
|
||||
order, workflow_run = await load_order_and_run(session, payload.order_id, payload.workflow_run_id)
|
||||
step = create_step_record(payload)
|
||||
session.add(step)
|
||||
|
||||
order.status = OrderStatus.RUNNING
|
||||
workflow_run.status = OrderStatus.RUNNING
|
||||
workflow_run.current_step = payload.step_name
|
||||
await session.flush()
|
||||
|
||||
try:
|
||||
passed = not payload.metadata.get("force_fail", False)
|
||||
candidate_asset_ids: list[int] = []
|
||||
candidate_uri: str | None = None
|
||||
|
||||
if passed:
|
||||
candidate = AssetORM(
|
||||
order_id=payload.order_id,
|
||||
asset_type=AssetType.QC_CANDIDATE,
|
||||
step_name=payload.step_name,
|
||||
uri=mock_uri(payload.order_id, payload.step_name.value, "candidate.png"),
|
||||
metadata_json=jsonable({"source_asset_id": payload.source_asset_id}),
|
||||
)
|
||||
session.add(candidate)
|
||||
await session.flush()
|
||||
candidate_asset_ids = [candidate.id]
|
||||
candidate_uri = candidate.uri
|
||||
|
||||
result = MockActivityResult(
|
||||
step_name=payload.step_name,
|
||||
success=True,
|
||||
asset_id=candidate_asset_ids[0] if candidate_asset_ids else None,
|
||||
uri=candidate_uri,
|
||||
score=0.95 if passed else 0.35,
|
||||
passed=passed,
|
||||
message="mock success" if passed else "mock qc rejected",
|
||||
candidate_asset_ids=candidate_asset_ids,
|
||||
metadata={"source_asset_id": payload.source_asset_id},
|
||||
)
|
||||
|
||||
step.step_status = StepStatus.SUCCEEDED if passed else StepStatus.FAILED
|
||||
step.output_json = jsonable(result)
|
||||
step.error_message = None if passed else "QC rejected the asset"
|
||||
step.ended_at = utc_now()
|
||||
await session.commit()
|
||||
return result
|
||||
except Exception as exc:
|
||||
step.step_status = StepStatus.FAILED
|
||||
step.error_message = str(exc)
|
||||
step.ended_at = utc_now()
|
||||
order.status = OrderStatus.FAILED
|
||||
workflow_run.status = OrderStatus.FAILED
|
||||
await session.commit()
|
||||
raise
|
||||
Reference in New Issue
Block a user