gabriel / musehub public
0016_drop_legacy_auth_tables.py python
119 lines 5.7 KB
Raw
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