"""Create connection_requests and user_connections tables. Revision ID: 042 Revises: 041 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects.postgresql import JSONB revision = "042" down_revision = "041" branch_labels = None depends_on = None def upgrade() -> None: # ── connection_requests ────────────────────────────────────────── op.create_table( "connection_requests", sa.Column("id", sa.Integer, primary_key=True, index=True), sa.Column( "sender_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False, ), sa.Column( "receiver_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False, ), sa.Column( "status", sa.String(20), nullable=False, server_default="pending", ), sa.Column( "created_at", sa.DateTime, nullable=False, server_default=sa.func.now(), ), sa.Column("resolved_at", sa.DateTime, nullable=True), sa.CheckConstraint( "status IN ('pending', 'accepted', 'rejected', 'cancelled')", name="ck_connection_requests_status", ), ) # Only one pending request per sender→receiver pair op.execute( 'CREATE UNIQUE INDEX "ix_connection_requests_pending" ' "ON connection_requests (sender_id, receiver_id) " "WHERE status = 'pending'" ) # Incoming request listing op.create_index( "ix_connection_requests_receiver_status", "connection_requests", ["receiver_id", "status"], ) # Outgoing request listing op.create_index( "ix_connection_requests_sender_status", "connection_requests", ["sender_id", "status"], ) # ── user_connections ───────────────────────────────────────────── op.create_table( "user_connections", sa.Column("id", sa.Integer, primary_key=True, index=True), sa.Column( "user_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False, ), sa.Column( "connected_user_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False, ), sa.Column( "person_id", sa.Integer, sa.ForeignKey("people.id", ondelete="SET NULL"), nullable=True, ), sa.Column("sharing_overrides", JSONB, nullable=True), sa.Column( "created_at", sa.DateTime, nullable=False, server_default=sa.func.now(), ), sa.UniqueConstraint("user_id", "connected_user_id", name="uq_user_connections"), ) def downgrade() -> None: op.drop_table("user_connections") op.drop_index("ix_connection_requests_sender_status", table_name="connection_requests") op.drop_index("ix_connection_requests_receiver_status", table_name="connection_requests") op.execute('DROP INDEX IF EXISTS "ix_connection_requests_pending"') op.drop_table("connection_requests")