From bff37789c8f9d8957d9ee5c9a11fd664f4c9ea03 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Wed, 14 Jan 2026 15:19:00 -0800 Subject: [PATCH] fix: migrations --- ..._allow_multiple_connectors_with_unique_.py | 50 ---------- ...r_type.py => 62_add_mcp_connector_type.py} | 4 +- ..._allow_multiple_connectors_with_unique_.py | 96 +++++++++++++++++++ ...umns.py => 64_add_user_profile_columns.py} | 8 +- ...thor_id.py => 65_add_message_author_id.py} | 8 +- 5 files changed, 106 insertions(+), 60 deletions(-) delete mode 100644 surfsense_backend/alembic/versions/5263aa4e7f94_allow_multiple_connectors_with_unique_.py rename surfsense_backend/alembic/versions/{a1b2c3d4e5f6_add_mcp_connector_type.py => 62_add_mcp_connector_type.py} (94%) create mode 100644 surfsense_backend/alembic/versions/63_allow_multiple_connectors_with_unique_.py rename surfsense_backend/alembic/versions/{62_add_user_profile_columns.py => 64_add_user_profile_columns.py} (95%) rename surfsense_backend/alembic/versions/{63_add_message_author_id.py => 65_add_message_author_id.py} (93%) diff --git a/surfsense_backend/alembic/versions/5263aa4e7f94_allow_multiple_connectors_with_unique_.py b/surfsense_backend/alembic/versions/5263aa4e7f94_allow_multiple_connectors_with_unique_.py deleted file mode 100644 index de9505e3a..000000000 --- a/surfsense_backend/alembic/versions/5263aa4e7f94_allow_multiple_connectors_with_unique_.py +++ /dev/null @@ -1,50 +0,0 @@ -"""allow_multiple_connectors_with_unique_names - -Revision ID: 5263aa4e7f94 -Revises: a1b2c3d4e5f6 -Create Date: 2026-01-13 12:23:31.481643 - -""" -from collections.abc import Sequence - -from alembic import op - -# revision identifiers, used by Alembic. -revision: str = '5263aa4e7f94' -down_revision: str | None = 'a1b2c3d4e5f6' -branch_labels: str | Sequence[str] | None = None -depends_on: str | Sequence[str] | None = None - - -def upgrade() -> None: - """Upgrade schema.""" - # Drop the old unique constraint - op.drop_constraint( - 'uq_searchspace_user_connector_type', - 'search_source_connectors', - type_='unique' - ) - - # Create new unique constraint that includes name - op.create_unique_constraint( - 'uq_searchspace_user_connector_type_name', - 'search_source_connectors', - ['search_space_id', 'user_id', 'connector_type', 'name'] - ) - - -def downgrade() -> None: - """Downgrade schema.""" - # Drop the new constraint - op.drop_constraint( - 'uq_searchspace_user_connector_type_name', - 'search_source_connectors', - type_='unique' - ) - - # Restore the old constraint - op.create_unique_constraint( - 'uq_searchspace_user_connector_type', - 'search_source_connectors', - ['search_space_id', 'user_id', 'connector_type'] - ) diff --git a/surfsense_backend/alembic/versions/a1b2c3d4e5f6_add_mcp_connector_type.py b/surfsense_backend/alembic/versions/62_add_mcp_connector_type.py similarity index 94% rename from surfsense_backend/alembic/versions/a1b2c3d4e5f6_add_mcp_connector_type.py rename to surfsense_backend/alembic/versions/62_add_mcp_connector_type.py index e47bb2fa3..ed0ee4848 100644 --- a/surfsense_backend/alembic/versions/a1b2c3d4e5f6_add_mcp_connector_type.py +++ b/surfsense_backend/alembic/versions/62_add_mcp_connector_type.py @@ -1,6 +1,6 @@ """Add MCP connector type -Revision ID: a1b2c3d4e5f6 +Revision ID: 62 Revises: 61 Create Date: 2026-01-09 15:19:51.827647 @@ -10,7 +10,7 @@ from collections.abc import Sequence from alembic import op # revision identifiers, used by Alembic. -revision: str = 'a1b2c3d4e5f6' +revision: str = '62' down_revision: str | None = '61' branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None diff --git a/surfsense_backend/alembic/versions/63_allow_multiple_connectors_with_unique_.py b/surfsense_backend/alembic/versions/63_allow_multiple_connectors_with_unique_.py new file mode 100644 index 000000000..5e61f29bc --- /dev/null +++ b/surfsense_backend/alembic/versions/63_allow_multiple_connectors_with_unique_.py @@ -0,0 +1,96 @@ +"""allow_multiple_connectors_with_unique_names + +Revision ID: 63 +Revises: 62 +Create Date: 2026-01-13 12:23:31.481643 + +""" +from collections.abc import Sequence + +from sqlalchemy import text + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = '63' +down_revision: str | None = '62' +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + """Upgrade schema.""" + connection = op.get_bind() + + # Check if old constraint exists before trying to drop it + old_constraint_exists = connection.execute( + text(""" + SELECT 1 FROM information_schema.table_constraints + WHERE table_name='search_source_connectors' + AND constraint_type='UNIQUE' + AND constraint_name='uq_searchspace_user_connector_type' + """) + ).scalar() + + if old_constraint_exists: + op.drop_constraint( + 'uq_searchspace_user_connector_type', + 'search_source_connectors', + type_='unique' + ) + + # Check if new constraint already exists before creating it + new_constraint_exists = connection.execute( + text(""" + SELECT 1 FROM information_schema.table_constraints + WHERE table_name='search_source_connectors' + AND constraint_type='UNIQUE' + AND constraint_name='uq_searchspace_user_connector_type_name' + """) + ).scalar() + + if not new_constraint_exists: + op.create_unique_constraint( + 'uq_searchspace_user_connector_type_name', + 'search_source_connectors', + ['search_space_id', 'user_id', 'connector_type', 'name'] + ) + + +def downgrade() -> None: + """Downgrade schema.""" + connection = op.get_bind() + + # Check if new constraint exists before trying to drop it + new_constraint_exists = connection.execute( + text(""" + SELECT 1 FROM information_schema.table_constraints + WHERE table_name='search_source_connectors' + AND constraint_type='UNIQUE' + AND constraint_name='uq_searchspace_user_connector_type_name' + """) + ).scalar() + + if new_constraint_exists: + op.drop_constraint( + 'uq_searchspace_user_connector_type_name', + 'search_source_connectors', + type_='unique' + ) + + # Check if old constraint already exists before creating it + old_constraint_exists = connection.execute( + text(""" + SELECT 1 FROM information_schema.table_constraints + WHERE table_name='search_source_connectors' + AND constraint_type='UNIQUE' + AND constraint_name='uq_searchspace_user_connector_type' + """) + ).scalar() + + if not old_constraint_exists: + op.create_unique_constraint( + 'uq_searchspace_user_connector_type', + 'search_source_connectors', + ['search_space_id', 'user_id', 'connector_type'] + ) diff --git a/surfsense_backend/alembic/versions/62_add_user_profile_columns.py b/surfsense_backend/alembic/versions/64_add_user_profile_columns.py similarity index 95% rename from surfsense_backend/alembic/versions/62_add_user_profile_columns.py rename to surfsense_backend/alembic/versions/64_add_user_profile_columns.py index a6fef0c5b..db45982d8 100644 --- a/surfsense_backend/alembic/versions/62_add_user_profile_columns.py +++ b/surfsense_backend/alembic/versions/64_add_user_profile_columns.py @@ -4,8 +4,8 @@ This migration adds: - display_name column for user's full name from OAuth - avatar_url column for user's profile picture URL from OAuth -Revision ID: 62 -Revises: 61 +Revision ID: 64 +Revises: 63 """ from collections.abc import Sequence @@ -13,8 +13,8 @@ from collections.abc import Sequence from alembic import op # revision identifiers, used by Alembic. -revision: str = "62" -down_revision: str | None = "61" +revision: str = "64" +down_revision: str | None = "63" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None diff --git a/surfsense_backend/alembic/versions/63_add_message_author_id.py b/surfsense_backend/alembic/versions/65_add_message_author_id.py similarity index 93% rename from surfsense_backend/alembic/versions/63_add_message_author_id.py rename to surfsense_backend/alembic/versions/65_add_message_author_id.py index 2fc3f0b4c..dcae91e37 100644 --- a/surfsense_backend/alembic/versions/63_add_message_author_id.py +++ b/surfsense_backend/alembic/versions/65_add_message_author_id.py @@ -1,15 +1,15 @@ """Add author_id column to new_chat_messages table -Revision ID: 63 -Revises: 62 +Revision ID: 65 +Revises: 64 """ from collections.abc import Sequence from alembic import op -revision: str = "63" -down_revision: str | None = "62" +revision: str = "65" +down_revision: str | None = "64" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None