0016_drop_legacy_auth_tables.py
python
sha256:a10adeeb7a0169cb9900f9806ed7a973047258abb6283724fe55e8eb68ff3f0a
init: musehub initial commit
Human
171 days ago
| 1 | """Drop legacy auth tables; migrate profile fields to musehub_identities. |
| 2 | |
| 3 | - Drop muse_users, muse_access_tokens, musehub_profiles |
| 4 | - Add location, twitter_handle, is_verified, cc_license, pinned_repo_ids to musehub_identities |
| 5 | - Drop legacy_user_id from musehub_identities |
| 6 | - Drop FK constraints from musehub_collaborators and musehub_stash to muse_users |
| 7 | |
| 8 | Revision ID: 0016 |
| 9 | Revises: 0015 |
| 10 | """ |
| 11 | from __future__ import annotations |
| 12 | |
| 13 | import sqlalchemy as sa |
| 14 | from alembic import op |
| 15 | |
| 16 | revision = "0016" |
| 17 | down_revision = "0015" |
| 18 | branch_labels = None |
| 19 | depends_on = None |
| 20 | |
| 21 | |
| 22 | def upgrade() -> None: |
| 23 | # 1. Drop FK constraints that reference muse_users |
| 24 | op.drop_constraint("musehub_collaborators_user_id_fkey", "musehub_collaborators", type_="foreignkey") |
| 25 | op.drop_constraint("musehub_collaborators_invited_by_fkey", "musehub_collaborators", type_="foreignkey") |
| 26 | op.drop_constraint("musehub_stash_user_id_fkey", "musehub_stash", type_="foreignkey") |
| 27 | |
| 28 | # 2. Add profile fields to musehub_identities |
| 29 | op.add_column("musehub_identities", sa.Column("location", sa.String(255), nullable=True)) |
| 30 | op.add_column("musehub_identities", sa.Column("twitter_handle", sa.String(64), nullable=True)) |
| 31 | op.add_column("musehub_identities", sa.Column( |
| 32 | "is_verified", sa.Boolean, nullable=False, server_default="false" |
| 33 | )) |
| 34 | op.add_column("musehub_identities", sa.Column("cc_license", sa.String(50), nullable=True)) |
| 35 | op.add_column("musehub_identities", sa.Column( |
| 36 | "pinned_repo_ids", sa.JSON, nullable=False, server_default="[]" |
| 37 | )) |
| 38 | op.create_index("ix_musehub_identities_is_verified", "musehub_identities", ["is_verified"]) |
| 39 | |
| 40 | # 3. Drop legacy_user_id from musehub_identities |
| 41 | op.drop_index("ix_musehub_identities_legacy_user_id", table_name="musehub_identities") |
| 42 | op.drop_column("musehub_identities", "legacy_user_id") |
| 43 | |
| 44 | # 4. Drop legacy tables (order matters: tokens before users, profiles standalone) |
| 45 | op.drop_table("muse_access_tokens") |
| 46 | op.drop_table("musehub_profiles") |
| 47 | op.drop_table("muse_users") |
| 48 | |
| 49 | |
| 50 | def downgrade() -> None: |
| 51 | # Recreate muse_users |
| 52 | op.create_table( |
| 53 | "muse_users", |
| 54 | sa.Column("id", sa.String(36), primary_key=True), |
| 55 | sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), |
| 56 | sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), |
| 57 | ) |
| 58 | |
| 59 | # Recreate muse_access_tokens |
| 60 | op.create_table( |
| 61 | "muse_access_tokens", |
| 62 | sa.Column("id", sa.String(36), primary_key=True), |
| 63 | sa.Column("user_id", sa.String(36), sa.ForeignKey("muse_users.id", ondelete="CASCADE"), nullable=False), |
| 64 | sa.Column("token_hash", sa.String(64), nullable=False, unique=True), |
| 65 | sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False), |
| 66 | sa.Column("revoked", sa.Boolean, nullable=False, server_default="false"), |
| 67 | sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), |
| 68 | ) |
| 69 | # Restore indexes that migration 0001 created on muse_access_tokens |
| 70 | op.create_index("ix_muse_access_tokens_user_id", "muse_access_tokens", ["user_id"]) |
| 71 | op.create_index("ix_muse_access_tokens_token_hash", "muse_access_tokens", ["token_hash"], unique=True) |
| 72 | |
| 73 | # Recreate musehub_profiles |
| 74 | op.create_table( |
| 75 | "musehub_profiles", |
| 76 | sa.Column("user_id", sa.String(36), primary_key=True), |
| 77 | sa.Column("username", sa.String(64), nullable=False), |
| 78 | sa.Column("display_name", sa.String(255), nullable=True), |
| 79 | sa.Column("bio", sa.Text, nullable=True), |
| 80 | sa.Column("avatar_url", sa.String(2048), nullable=True), |
| 81 | sa.Column("location", sa.String(255), nullable=True), |
| 82 | sa.Column("website_url", sa.String(2048), nullable=True), |
| 83 | sa.Column("twitter_handle", sa.String(64), nullable=True), |
| 84 | sa.Column("is_verified", sa.Boolean, nullable=False, server_default="false"), |
| 85 | sa.Column("cc_license", sa.String(50), nullable=True), |
| 86 | sa.Column("pinned_repo_ids", sa.JSON, nullable=False, server_default="[]"), |
| 87 | sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), |
| 88 | sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), |
| 89 | sa.UniqueConstraint("username", name="uq_musehub_profiles_username"), |
| 90 | ) |
| 91 | # Restore indexes that migration 0001 created on musehub_profiles |
| 92 | op.create_index("ix_musehub_profiles_username", "musehub_profiles", ["username"]) |
| 93 | op.create_index("ix_musehub_profiles_is_verified", "musehub_profiles", ["is_verified"]) |
| 94 | |
| 95 | # Restore FK constraints |
| 96 | op.create_foreign_key( |
| 97 | "musehub_collaborators_user_id_fkey", "musehub_collaborators", |
| 98 | "muse_users", ["user_id"], ["id"], ondelete="CASCADE" |
| 99 | ) |
| 100 | op.create_foreign_key( |
| 101 | "musehub_collaborators_invited_by_fkey", "musehub_collaborators", |
| 102 | "muse_users", ["invited_by"], ["id"], ondelete="SET NULL" |
| 103 | ) |
| 104 | op.create_foreign_key( |
| 105 | "musehub_stash_user_id_fkey", "musehub_stash", |
| 106 | "muse_users", ["user_id"], ["id"], ondelete="CASCADE" |
| 107 | ) |
| 108 | |
| 109 | # Restore legacy_user_id |
| 110 | op.add_column("musehub_identities", sa.Column("legacy_user_id", sa.String(36), nullable=True)) |
| 111 | op.create_index("ix_musehub_identities_legacy_user_id", "musehub_identities", ["legacy_user_id"]) |
| 112 | |
| 113 | # Remove profile fields from musehub_identities |
| 114 | op.drop_index("ix_musehub_identities_is_verified", table_name="musehub_identities") |
| 115 | op.drop_column("musehub_identities", "pinned_repo_ids") |
| 116 | op.drop_column("musehub_identities", "cc_license") |
| 117 | op.drop_column("musehub_identities", "is_verified") |
| 118 | op.drop_column("musehub_identities", "twitter_handle") |
| 119 | op.drop_column("musehub_identities", "location") |
File History
1 commit
sha256:a10adeeb7a0169cb9900f9806ed7a973047258abb6283724fe55e8eb68ff3f0a
init: musehub initial commit
Human
171 days ago