diff --git a/backend/alembic/versions/78fc200abac1_add_account_id_script_tables.py b/backend/alembic/versions/78fc200abac1_add_account_id_script_tables.py index 21cf8f2b..74116db6 100644 --- a/backend/alembic/versions/78fc200abac1_add_account_id_script_tables.py +++ b/backend/alembic/versions/78fc200abac1_add_account_id_script_tables.py @@ -13,8 +13,24 @@ down_revision: Union[str, None] = '7f136778f5a8' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None +PLATFORM_ACCOUNT_ID = '00000000-0000-0000-0000-000000000001' + def upgrade() -> None: + # Ensure the platform sentinel account exists before any fallback assignments. + # Migration 3a40fe11b427 also inserts this with ON CONFLICT DO NOTHING — safe. + op.execute(f""" + INSERT INTO accounts (id, name, display_code, created_at, updated_at) + VALUES ( + '{PLATFORM_ACCOUNT_ID}', + 'ResolutionFlow Platform', + 'PLATFORM', + NOW(), + NOW() + ) + ON CONFLICT (id) DO NOTHING + """) + for table in ('script_builder_sessions', 'script_templates', 'script_generations'): op.add_column(table, sa.Column('account_id', sa.UUID(), nullable=True)) op.create_foreign_key( @@ -39,7 +55,7 @@ def upgrade() -> None: WHERE st.created_by = u.id AND st.account_id IS NULL """) - # Fallback for script_templates with NULL created_by: team_id → team admin user + # Fallback: team_id → team admin user op.execute(""" UPDATE script_templates st SET account_id = u.account_id @@ -49,6 +65,13 @@ def upgrade() -> None: AND u.account_id IS NOT NULL AND st.account_id IS NULL """) + # Final fallback: platform-seeded templates with NULL team_id AND NULL created_by + # (e.g. the 6 AD templates inserted by migration 057) → platform sentinel account + op.execute(f""" + UPDATE script_templates + SET account_id = '{PLATFORM_ACCOUNT_ID}' + WHERE account_id IS NULL + """) # script_generations: user_id → users.account_id op.execute("""