117 lines
2.8 KiB
Python
117 lines
2.8 KiB
Python
"""Workflow schemas — create, update, read, instance lifecycle, step history."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class WorkflowStep(BaseModel):
|
|
"""A single step in a workflow definition."""
|
|
|
|
name: str = Field(..., min_length=1, max_length=200)
|
|
type: str = Field(..., pattern="^(action|approval|notification|condition)$")
|
|
config: dict = Field(default_factory=dict)
|
|
description: str | None = None
|
|
|
|
|
|
class WorkflowCreate(BaseModel):
|
|
"""Create a new workflow definition."""
|
|
|
|
name: str = Field(..., min_length=1, max_length=200)
|
|
description: str | None = None
|
|
trigger_event: str | None = None
|
|
steps: list[WorkflowStep] = Field(..., min_length=1)
|
|
is_active: bool = True
|
|
|
|
|
|
class WorkflowUpdate(BaseModel):
|
|
"""Update an existing workflow definition."""
|
|
|
|
name: str | None = Field(None, max_length=200)
|
|
description: str | None = None
|
|
trigger_event: str | None = None
|
|
steps: list[WorkflowStep] | None = None
|
|
is_active: bool | None = None
|
|
|
|
|
|
class WorkflowResponse(BaseModel):
|
|
"""Workflow definition response."""
|
|
|
|
id: str
|
|
name: str
|
|
description: str | None = None
|
|
trigger_event: str | None = None
|
|
steps: list[dict]
|
|
is_active: bool
|
|
created_by: str | None = None
|
|
created_at: str | None = None
|
|
updated_at: str | None = None
|
|
|
|
|
|
class WorkflowListResponse(BaseModel):
|
|
"""Paginated workflow list."""
|
|
|
|
items: list[WorkflowResponse]
|
|
total: int
|
|
page: int
|
|
page_size: int
|
|
|
|
|
|
class InstanceCreate(BaseModel):
|
|
"""Create a new workflow instance."""
|
|
|
|
context: dict = Field(default_factory=dict)
|
|
timeout_hours: int | None = None
|
|
|
|
|
|
class InstanceResponse(BaseModel):
|
|
"""Workflow instance response with current state and history."""
|
|
|
|
id: str
|
|
workflow_id: str
|
|
status: str
|
|
current_step_index: int
|
|
context: dict
|
|
initiated_by: str | None = None
|
|
completed_at: str | None = None
|
|
timeout_hours: int | None = None
|
|
timeout_at: str | None = None
|
|
created_at: str | None = None
|
|
updated_at: str | None = None
|
|
|
|
|
|
class InstanceDetailResponse(InstanceResponse):
|
|
"""Instance with step history."""
|
|
|
|
history: list[dict] = Field(default_factory=list)
|
|
workflow_name: str | None = None
|
|
|
|
|
|
class InstanceListResponse(BaseModel):
|
|
"""Paginated instance list."""
|
|
|
|
items: list[InstanceResponse]
|
|
total: int
|
|
page: int
|
|
page_size: int
|
|
|
|
|
|
class AdvanceRequest(BaseModel):
|
|
"""Advance or reject a workflow instance step."""
|
|
|
|
decision: str = Field(..., pattern="^(approve|reject)$")
|
|
comment: str | None = None
|
|
|
|
|
|
class StepHistoryResponse(BaseModel):
|
|
"""Step history entry."""
|
|
|
|
id: str
|
|
instance_id: str
|
|
step_index: int
|
|
step_type: str
|
|
action: str
|
|
actor_id: str | None = None
|
|
details: dict | None = None
|
|
created_at: str | None = None
|