diff --git a/alembic/versions/z_add_unique_subdomain_domain_constraints.py b/alembic/versions/z_add_unique_subdomain_domain_constraints.py new file mode 100644 index 00000000..33064bc1 --- /dev/null +++ b/alembic/versions/z_add_unique_subdomain_domain_constraints.py @@ -0,0 +1,33 @@ +"""add unique constraints for custom_subdomain and store domain per platform + +Revision ID: z_unique_subdomain_domain +Revises: a44f4956cfb1 +Create Date: 2026-02-26 +""" +from alembic import op + +revision = "z_unique_subdomain_domain" +down_revision = ("a44f4956cfb1", "tenancy_003") +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # StorePlatform: same custom_subdomain cannot be claimed twice on the same platform + op.create_unique_constraint( + "uq_custom_subdomain_platform", + "store_platforms", + ["custom_subdomain", "platform_id"], + ) + + # StoreDomain: a store can have at most one custom domain per platform + op.create_unique_constraint( + "uq_store_domain_platform", + "store_domains", + ["store_id", "platform_id"], + ) + + +def downgrade() -> None: + op.drop_constraint("uq_store_domain_platform", "store_domains", type_="unique") + op.drop_constraint("uq_custom_subdomain_platform", "store_platforms", type_="unique") diff --git a/app/modules/tenancy/models/store_domain.py b/app/modules/tenancy/models/store_domain.py index 476c1677..49e5a78d 100644 --- a/app/modules/tenancy/models/store_domain.py +++ b/app/modules/tenancy/models/store_domain.py @@ -68,6 +68,8 @@ class StoreDomain(Base, TimestampMixin): # Constraints __table_args__ = ( UniqueConstraint("store_id", "domain", name="uq_store_domain"), + # A store can have at most one custom domain per platform + UniqueConstraint("store_id", "platform_id", name="uq_store_domain_platform"), Index("idx_domain_active", "domain", "is_active"), Index("idx_store_domain_primary", "store_id", "is_primary"), Index("idx_store_domain_platform", "platform_id"), diff --git a/app/modules/tenancy/models/store_platform.py b/app/modules/tenancy/models/store_platform.py index 29a33506..6d53e99c 100644 --- a/app/modules/tenancy/models/store_platform.py +++ b/app/modules/tenancy/models/store_platform.py @@ -152,6 +152,12 @@ class StorePlatform(Base, TimestampMixin): "platform_id", name="uq_store_platform", ), + # Same custom_subdomain cannot be claimed twice on the same platform + UniqueConstraint( + "custom_subdomain", + "platform_id", + name="uq_custom_subdomain_platform", + ), # Performance indexes Index( "idx_store_platform_active",