Split databases and Redis — prepare infrastructure for per-domain isolation
Redis: per-app DB index (0-5) with shared auth DB 15 for SSO keys; flushdb replaces flushall so deploys don't wipe cross-app auth state. Postgres: drop 13 cross-domain FK constraints (migration v2t0p8q9r0), remove dead ORM relationships, add explicit joins for 4 live ones. Multi-engine sessions (account + federation) ready for per-domain DBs via DATABASE_URL_ACCOUNT / DATABASE_URL_FEDERATION env vars. All URLs initially point to the same appdb — zero behaviour change until split-databases.sh is run to migrate data to per-domain DBs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
59
shared/alembic/versions/v2t0p8q9r0_drop_cross_domain_fks.py
Normal file
59
shared/alembic/versions/v2t0p8q9r0_drop_cross_domain_fks.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""Drop cross-domain foreign key constraints.
|
||||
|
||||
Columns and indexes remain — only the FK constraints are removed.
|
||||
This prepares for per-domain databases where cross-DB FKs can't exist.
|
||||
|
||||
Revision ID: v2t0p8q9r0
|
||||
Revises: u1s9o5p7q8
|
||||
"""
|
||||
from alembic import op
|
||||
|
||||
revision = "v2t0p8q9r0"
|
||||
down_revision = "u1s9o5p7q8"
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# blog → account
|
||||
op.drop_constraint("posts_user_id_fkey", "posts", type_="foreignkey")
|
||||
op.drop_constraint("post_likes_user_id_fkey", "post_likes", type_="foreignkey")
|
||||
|
||||
# market → account
|
||||
op.drop_constraint("product_likes_user_id_fkey", "product_likes", type_="foreignkey")
|
||||
|
||||
# cart → account
|
||||
op.drop_constraint("cart_items_user_id_fkey", "cart_items", type_="foreignkey")
|
||||
op.drop_constraint("orders_user_id_fkey", "orders", type_="foreignkey")
|
||||
|
||||
# cart → market
|
||||
op.drop_constraint("cart_items_product_id_fkey", "cart_items", type_="foreignkey")
|
||||
op.drop_constraint("cart_items_market_place_id_fkey", "cart_items", type_="foreignkey")
|
||||
op.drop_constraint("order_items_product_id_fkey", "order_items", type_="foreignkey")
|
||||
|
||||
# cart → events
|
||||
op.drop_constraint("orders_page_config_id_fkey", "orders", type_="foreignkey")
|
||||
|
||||
# events → account
|
||||
op.drop_constraint("calendar_entries_user_id_fkey", "calendar_entries", type_="foreignkey")
|
||||
op.drop_constraint("tickets_user_id_fkey", "tickets", type_="foreignkey")
|
||||
|
||||
# federation → account
|
||||
op.drop_constraint("ap_actor_profiles_user_id_fkey", "ap_actor_profiles", type_="foreignkey")
|
||||
|
||||
# shared (blog-internal but cross-concern)
|
||||
op.drop_constraint("menu_items_post_id_fkey", "menu_items", type_="foreignkey")
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.create_foreign_key("posts_user_id_fkey", "posts", "users", ["user_id"], ["id"], ondelete="SET NULL")
|
||||
op.create_foreign_key("post_likes_user_id_fkey", "post_likes", "users", ["user_id"], ["id"], ondelete="CASCADE")
|
||||
op.create_foreign_key("product_likes_user_id_fkey", "product_likes", "users", ["user_id"], ["id"], ondelete="CASCADE")
|
||||
op.create_foreign_key("cart_items_user_id_fkey", "cart_items", "users", ["user_id"], ["id"], ondelete="CASCADE")
|
||||
op.create_foreign_key("cart_items_product_id_fkey", "cart_items", "products", ["product_id"], ["id"], ondelete="CASCADE")
|
||||
op.create_foreign_key("cart_items_market_place_id_fkey", "cart_items", "market_places", ["market_place_id"], ["id"], ondelete="SET NULL")
|
||||
op.create_foreign_key("orders_user_id_fkey", "orders", "users", ["user_id"], ["id"])
|
||||
op.create_foreign_key("orders_page_config_id_fkey", "orders", "page_configs", ["page_config_id"], ["id"], ondelete="SET NULL")
|
||||
op.create_foreign_key("order_items_product_id_fkey", "order_items", "products", ["product_id"], ["id"])
|
||||
op.create_foreign_key("calendar_entries_user_id_fkey", "calendar_entries", "users", ["user_id"], ["id"])
|
||||
op.create_foreign_key("tickets_user_id_fkey", "tickets", "users", ["user_id"], ["id"])
|
||||
op.create_foreign_key("ap_actor_profiles_user_id_fkey", "ap_actor_profiles", "users", ["user_id"], ["id"], ondelete="CASCADE")
|
||||
op.create_foreign_key("menu_items_post_id_fkey", "menu_items", "posts", ["post_id"], ["id"], ondelete="CASCADE")
|
||||
Reference in New Issue
Block a user