feat: add asset manifest knowledge ingest
Some checks failed
CI / Backend (lint + tests + compose) (push) Has been cancelled
CI / Frontend (lint + type-check + build) (push) Has been cancelled

This commit is contained in:
Vadim Malanov
2026-06-14 19:22:26 +03:00
parent aa530524a3
commit 9926a4b3fd
10 changed files with 1055 additions and 36 deletions

View File

@@ -0,0 +1,72 @@
"""asset manifest ingest jobs
Revision ID: 0002_asset_ingest_jobs
Revises: 0001_initial
Create Date: 2026-06-14
"""
from __future__ import annotations
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects import postgresql
revision: str = "0002_asset_ingest_jobs"
down_revision: str | None = "0001_initial"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.create_table(
"asset_ingest_jobs",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
sa.Column(
"document_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("documents.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column("asset_id", sa.Text, nullable=False),
sa.Column("manifest_version", sa.String(32), nullable=False),
sa.Column("sha256", sa.String(64), nullable=False),
sa.Column("owner_module", sa.Text, nullable=False),
sa.Column("owner_record_type", sa.Text, nullable=False),
sa.Column("owner_record_id", sa.Text, nullable=False),
sa.Column("status", sa.String(32), nullable=False, server_default="QUEUED"),
sa.Column("idempotency_key", sa.Text, nullable=True),
sa.Column("storage_bucket", sa.Text, nullable=False),
sa.Column("storage_key", sa.Text, nullable=False),
sa.Column("storage_version_id", sa.Text, nullable=True),
sa.Column("manifest", postgresql.JSONB, nullable=False),
sa.Column(
"ingest_options",
postgresql.JSONB,
nullable=False,
server_default=sa.text("'{}'::jsonb"),
),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.UniqueConstraint(
"asset_id",
"sha256",
"manifest_version",
name="uq_asset_ingest_identity",
),
)
op.create_index("ix_asset_ingest_document", "asset_ingest_jobs", ["document_id"])
op.create_index("ix_asset_ingest_asset", "asset_ingest_jobs", ["asset_id"])
op.create_index(
"ix_asset_ingest_owner",
"asset_ingest_jobs",
["owner_module", "owner_record_type", "owner_record_id"],
)
def downgrade() -> None:
op.drop_index("ix_asset_ingest_owner", table_name="asset_ingest_jobs")
op.drop_index("ix_asset_ingest_asset", table_name="asset_ingest_jobs")
op.drop_index("ix_asset_ingest_document", table_name="asset_ingest_jobs")
op.drop_table("asset_ingest_jobs")