feat(l1): FlowProposal l1_session_id source linkage (nullable source_session_id + exactly-one check)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-29 15:34:05 -04:00
parent 9a5cbc35ae
commit 0796874376
5 changed files with 113 additions and 7 deletions

View File

@@ -0,0 +1,61 @@
"""flow_proposal l1 source linkage
Revision ID: 1fd88a68b145
Revises: cb9e282267d2
Create Date: 2026-05-29 19:33:09.188681
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = '1fd88a68b145'
down_revision: Union[str, None] = 'cb9e282267d2'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.add_column(
"flow_proposals",
sa.Column("l1_session_id", postgresql.UUID(as_uuid=True), nullable=True),
)
op.create_index(
"ix_flow_proposals_l1_session_id",
"flow_proposals",
["l1_session_id"],
)
op.create_foreign_key(
"fk_flow_proposals_l1_session_id",
"flow_proposals",
"l1_walk_sessions",
["l1_session_id"],
["id"],
ondelete="SET NULL",
)
op.alter_column("flow_proposals", "source_session_id", nullable=True)
op.create_check_constraint(
"ck_flow_proposals_exactly_one_source",
"flow_proposals",
"(source_session_id IS NOT NULL) <> (l1_session_id IS NOT NULL)",
)
def downgrade() -> None:
op.drop_constraint(
"ck_flow_proposals_exactly_one_source",
"flow_proposals",
type_="check",
)
op.alter_column("flow_proposals", "source_session_id", nullable=False)
op.drop_constraint(
"fk_flow_proposals_l1_session_id",
"flow_proposals",
type_="foreignkey",
)
op.drop_index("ix_flow_proposals_l1_session_id", "flow_proposals")
op.drop_column("flow_proposals", "l1_session_id")