feat(task-021): add admin workflow template api

This commit is contained in:
2026-05-22 03:45:02 +03:00
parent d1ae5c4437
commit cbd24d4a1c
12 changed files with 2131 additions and 15 deletions
+124
View File
@@ -17,6 +17,7 @@ from src.domain.contracts import (
PublishingStatus,
Role,
ScriptConfigVersionStatus,
WorkflowTemplateStatus,
)
@@ -30,6 +31,9 @@ PUBLISHING_STATUS_VALUES = _quoted_values(status.value for status in PublishingS
SCRIPT_CONFIG_STATUS_VALUES = _quoted_values(
status.value for status in ScriptConfigVersionStatus
)
WORKFLOW_TEMPLATE_STATUS_VALUES = _quoted_values(
status.value for status in WorkflowTemplateStatus
)
PLAN_REVIEW_STATUS_VALUES = _quoted_values(status.value for status in PlanReviewStatus)
CLAIM_SUPPORT_STATUS_VALUES = _quoted_values(
status.value for status in ClaimSupportStatus
@@ -94,6 +98,53 @@ POSTGRES_SCHEMA_STATEMENTS: tuple[str, ...] = (
)
""",
f"""
CREATE TABLE IF NOT EXISTS workflow_templates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
description TEXT NOT NULL,
status TEXT NOT NULL CHECK (status IN ({WORKFLOW_TEMPLATE_STATUS_VALUES})),
version INTEGER NOT NULL,
created_by UUID NOT NULL REFERENCES users(id),
updated_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
activated_at TIMESTAMPTZ,
archived_at TIMESTAMPTZ
)
""",
"""
CREATE TABLE IF NOT EXISTS workflow_template_stages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workflow_template_id UUID NOT NULL REFERENCES workflow_templates(id) ON DELETE CASCADE,
stable_key TEXT NOT NULL,
display_name TEXT NOT NULL,
description TEXT NOT NULL,
position INTEGER NOT NULL,
owner_role TEXT NOT NULL CHECK (owner_role IN ('ADMIN', 'EDITOR')),
runner_profile_key TEXT NOT NULL,
required_inputs JSONB NOT NULL DEFAULT '[]'::jsonb,
expected_outputs JSONB NOT NULL DEFAULT '[]'::jsonb,
acceptance_criteria JSONB NOT NULL DEFAULT '[]'::jsonb,
requires_human_approval BOOLEAN NOT NULL DEFAULT false,
retry_policy JSONB NOT NULL DEFAULT '{}'::jsonb,
parts JSONB NOT NULL DEFAULT '[]'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (workflow_template_id, stable_key)
)
""",
f"""
CREATE TABLE IF NOT EXISTS workflow_template_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workflow_template_id UUID NOT NULL REFERENCES workflow_templates(id) ON DELETE CASCADE,
event_type TEXT NOT NULL,
actor_user_id UUID REFERENCES users(id),
payload JSONB NOT NULL DEFAULT '{{}}'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
)
""",
f"""
CREATE TABLE IF NOT EXISTS articles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
target_site_id UUID NOT NULL REFERENCES target_sites(id),
@@ -400,6 +451,19 @@ POSTGRES_SCHEMA_STATEMENTS: tuple[str, ...] = (
)
""",
"CREATE INDEX IF NOT EXISTS idx_target_sites_slug ON target_sites (slug)",
"CREATE INDEX IF NOT EXISTS idx_workflow_templates_slug ON workflow_templates (slug)",
"""
CREATE INDEX IF NOT EXISTS idx_workflow_templates_status_updated
ON workflow_templates (status, updated_at DESC)
""",
"""
CREATE INDEX IF NOT EXISTS idx_workflow_template_stages_order
ON workflow_template_stages (workflow_template_id, position)
""",
"""
CREATE INDEX IF NOT EXISTS idx_workflow_template_events_history
ON workflow_template_events (workflow_template_id, created_at)
""",
"""
CREATE INDEX IF NOT EXISTS idx_articles_dashboard
ON articles (target_site_id, status, publishing_status, updated_at DESC)
@@ -496,6 +560,53 @@ SQLITE_SCHEMA_STATEMENTS: tuple[str, ...] = (
)
""",
"""
CREATE TABLE IF NOT EXISTS workflow_templates (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
description TEXT NOT NULL,
status TEXT NOT NULL,
version INTEGER NOT NULL,
created_by TEXT NOT NULL,
updated_by TEXT,
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
activated_at TEXT,
archived_at TEXT
)
""",
"""
CREATE TABLE IF NOT EXISTS workflow_template_stages (
id TEXT PRIMARY KEY,
workflow_template_id TEXT NOT NULL,
stable_key TEXT NOT NULL,
display_name TEXT NOT NULL,
description TEXT NOT NULL,
position INTEGER NOT NULL,
owner_role TEXT NOT NULL,
runner_profile_key TEXT NOT NULL,
required_inputs TEXT NOT NULL DEFAULT '[]',
expected_outputs TEXT NOT NULL DEFAULT '[]',
acceptance_criteria TEXT NOT NULL DEFAULT '[]',
requires_human_approval INTEGER NOT NULL DEFAULT 0,
retry_policy TEXT NOT NULL DEFAULT '{}',
parts TEXT NOT NULL DEFAULT '[]',
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE (workflow_template_id, stable_key)
)
""",
"""
CREATE TABLE IF NOT EXISTS workflow_template_events (
id TEXT PRIMARY KEY,
workflow_template_id TEXT NOT NULL,
event_type TEXT NOT NULL,
actor_user_id TEXT,
payload TEXT NOT NULL DEFAULT '{}',
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
)
""",
"""
CREATE TABLE IF NOT EXISTS articles (
id TEXT PRIMARY KEY,
target_site_id TEXT NOT NULL,
@@ -767,6 +878,19 @@ SQLITE_SCHEMA_STATEMENTS: tuple[str, ...] = (
)
""",
"CREATE INDEX IF NOT EXISTS idx_target_sites_slug ON target_sites (slug)",
"CREATE INDEX IF NOT EXISTS idx_workflow_templates_slug ON workflow_templates (slug)",
"""
CREATE INDEX IF NOT EXISTS idx_workflow_templates_status_updated
ON workflow_templates (status, updated_at)
""",
"""
CREATE INDEX IF NOT EXISTS idx_workflow_template_stages_order
ON workflow_template_stages (workflow_template_id, position)
""",
"""
CREATE INDEX IF NOT EXISTS idx_workflow_template_events_history
ON workflow_template_events (workflow_template_id, created_at)
""",
"""
CREATE INDEX IF NOT EXISTS idx_articles_dashboard
ON articles (target_site_id, status, publishing_status, updated_at)