Implement FastAPI Temporal MVP pipeline

This commit is contained in:
Codex
2026-03-27 00:10:28 +08:00
commit cc03da8a94
52 changed files with 3619 additions and 0 deletions

83
app/domain/enums.py Normal file
View File

@@ -0,0 +1,83 @@
"""Domain enums shared across the application."""
from enum import Enum
class CustomerLevel(str, Enum):
"""Supported customer tiers."""
LOW = "low"
MID = "mid"
class ServiceMode(str, Enum):
"""Supported service delivery modes."""
AUTO_BASIC = "auto_basic"
SEMI_PRO = "semi_pro"
class OrderStatus(str, Enum):
"""Lifecycle states for an order and workflow run."""
CREATED = "created"
RUNNING = "running"
WAITING_REVIEW = "waiting_review"
SUCCEEDED = "succeeded"
FAILED = "failed"
CANCELLED = "cancelled"
class WorkflowStepName(str, Enum):
"""Canonical workflow step names."""
PREPARE_MODEL = "prepare_model"
TRYON = "tryon"
SCENE = "scene"
TEXTURE = "texture"
FACE = "face"
FUSION = "fusion"
QC = "qc"
EXPORT = "export"
REVIEW = "review"
class ReviewDecision(str, Enum):
"""Supported review decisions for the mid-end workflow."""
APPROVE = "approve"
RERUN_SCENE = "rerun_scene"
RERUN_FACE = "rerun_face"
RERUN_FUSION = "rerun_fusion"
REJECT = "reject"
class StepStatus(str, Enum):
"""Execution status of a single workflow step record."""
PENDING = "pending"
RUNNING = "running"
WAITING = "waiting"
SUCCEEDED = "succeeded"
FAILED = "failed"
class ReviewTaskStatus(str, Enum):
"""Status of a human review task."""
PENDING = "pending"
SUBMITTED = "submitted"
class AssetType(str, Enum):
"""Asset classes produced by the pipeline."""
PREPARED_MODEL = "prepared_model"
TRYON = "tryon"
SCENE = "scene"
TEXTURE = "texture"
FACE = "face"
FUSION = "fusion"
QC_CANDIDATE = "qc_candidate"
FINAL = "final"

View File

@@ -0,0 +1,21 @@
"""Domain asset model."""
from dataclasses import dataclass
from datetime import datetime
from typing import Any
from app.domain.enums import AssetType, WorkflowStepName
@dataclass(slots=True)
class Asset:
"""Business representation of a generated asset."""
id: int
order_id: int
asset_type: AssetType
step_name: WorkflowStepName | None
uri: str
metadata_json: dict[str, Any] | None
created_at: datetime

View File

@@ -0,0 +1,26 @@
"""Domain order model."""
from dataclasses import dataclass
from datetime import datetime
from app.domain.enums import CustomerLevel, OrderStatus, ServiceMode, WorkflowStepName
@dataclass(slots=True)
class Order:
"""Business representation of an image order."""
id: int
customer_level: CustomerLevel
service_mode: ServiceMode
status: OrderStatus
model_id: int
pose_id: int
garment_asset_id: int
scene_ref_asset_id: int
final_asset_id: int | None
workflow_id: str | None
current_step: WorkflowStepName | None
created_at: datetime
updated_at: datetime

View File

@@ -0,0 +1,22 @@
"""Domain review task model."""
from dataclasses import dataclass
from datetime import datetime
from app.domain.enums import ReviewDecision, ReviewTaskStatus
@dataclass(slots=True)
class ReviewTask:
"""Business representation of a review task."""
id: int
order_id: int
status: ReviewTaskStatus
decision: ReviewDecision | None
reviewer_id: int | None
selected_asset_id: int | None
comment: str | None
created_at: datetime
updated_at: datetime

View File

@@ -0,0 +1,21 @@
"""Domain workflow run model."""
from dataclasses import dataclass
from datetime import datetime
from app.domain.enums import OrderStatus, WorkflowStepName
@dataclass(slots=True)
class WorkflowRun:
"""Business representation of a workflow execution."""
id: int
order_id: int
workflow_id: str
workflow_type: str
status: OrderStatus
current_step: WorkflowStepName | None
created_at: datetime
updated_at: datetime

View File

@@ -0,0 +1,23 @@
"""Domain workflow step model."""
from dataclasses import dataclass
from datetime import datetime
from typing import Any
from app.domain.enums import StepStatus, WorkflowStepName
@dataclass(slots=True)
class WorkflowStep:
"""Business representation of a workflow step attempt."""
id: int
workflow_run_id: int
step_name: WorkflowStepName
step_status: StepStatus
input_json: dict[str, Any] | None
output_json: dict[str, Any] | None
error_message: str | None
started_at: datetime
ended_at: datetime | None