|
|
|
|
@@ -5,6 +5,7 @@ Revises:
|
|
|
|
|
Create Date: 2025-11-27 09:08:09.464506
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from collections.abc import Sequence
|
|
|
|
|
|
|
|
|
|
import sqlalchemy as sa
|
|
|
|
|
@@ -12,7 +13,7 @@ from alembic import op
|
|
|
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
|
|
|
revision: str = '0001'
|
|
|
|
|
revision: str = "0001"
|
|
|
|
|
down_revision: str | None = None
|
|
|
|
|
branch_labels: str | Sequence[str] | None = None
|
|
|
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
@@ -20,243 +21,426 @@ depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
|
|
|
|
def upgrade() -> None:
|
|
|
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
|
|
|
op.create_table('oauth_states',
|
|
|
|
|
sa.Column('state', sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column('code_verifier', sa.String(length=128), nullable=True),
|
|
|
|
|
sa.Column('nonce', sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column('provider', sa.String(length=50), nullable=False),
|
|
|
|
|
sa.Column('redirect_uri', sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column('user_id', sa.UUID(), nullable=True),
|
|
|
|
|
sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_table(
|
|
|
|
|
"oauth_states",
|
|
|
|
|
sa.Column("state", sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column("code_verifier", sa.String(length=128), nullable=True),
|
|
|
|
|
sa.Column("nonce", sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column("provider", sa.String(length=50), nullable=False),
|
|
|
|
|
sa.Column("redirect_uri", sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column("user_id", sa.UUID(), nullable=True),
|
|
|
|
|
sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_oauth_states_state'), 'oauth_states', ['state'], unique=True)
|
|
|
|
|
op.create_table('organizations',
|
|
|
|
|
sa.Column('name', sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column('slug', sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column('description', sa.Text(), nullable=True),
|
|
|
|
|
sa.Column('is_active', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('settings', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_states_state"), "oauth_states", ["state"], unique=True
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_organizations_is_active'), 'organizations', ['is_active'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_organizations_name'), 'organizations', ['name'], unique=False)
|
|
|
|
|
op.create_index('ix_organizations_name_active', 'organizations', ['name', 'is_active'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_organizations_slug'), 'organizations', ['slug'], unique=True)
|
|
|
|
|
op.create_index('ix_organizations_slug_active', 'organizations', ['slug', 'is_active'], unique=False)
|
|
|
|
|
op.create_table('users',
|
|
|
|
|
sa.Column('email', sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column('password_hash', sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column('first_name', sa.String(length=100), nullable=False),
|
|
|
|
|
sa.Column('last_name', sa.String(length=100), nullable=True),
|
|
|
|
|
sa.Column('phone_number', sa.String(length=20), nullable=True),
|
|
|
|
|
sa.Column('is_active', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('is_superuser', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('preferences', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
|
|
|
|
|
sa.Column('locale', sa.String(length=10), nullable=True),
|
|
|
|
|
sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_table(
|
|
|
|
|
"organizations",
|
|
|
|
|
sa.Column("name", sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column("slug", sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
|
|
|
sa.Column("is_active", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column("settings", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_users_deleted_at'), 'users', ['deleted_at'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True)
|
|
|
|
|
op.create_index(op.f('ix_users_is_active'), 'users', ['is_active'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_users_is_superuser'), 'users', ['is_superuser'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_users_locale'), 'users', ['locale'], unique=False)
|
|
|
|
|
op.create_table('oauth_accounts',
|
|
|
|
|
sa.Column('user_id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('provider', sa.String(length=50), nullable=False),
|
|
|
|
|
sa.Column('provider_user_id', sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column('provider_email', sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column('access_token_encrypted', sa.String(length=2048), nullable=True),
|
|
|
|
|
sa.Column('refresh_token_encrypted', sa.String(length=2048), nullable=True),
|
|
|
|
|
sa.Column('token_expires_at', sa.DateTime(timezone=True), nullable=True),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
|
|
|
|
|
sa.PrimaryKeyConstraint('id'),
|
|
|
|
|
sa.UniqueConstraint('provider', 'provider_user_id', name='uq_oauth_provider_user')
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_organizations_is_active"), "organizations", ["is_active"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_oauth_accounts_provider'), 'oauth_accounts', ['provider'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_oauth_accounts_provider_email'), 'oauth_accounts', ['provider_email'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_oauth_accounts_user_id'), 'oauth_accounts', ['user_id'], unique=False)
|
|
|
|
|
op.create_index('ix_oauth_accounts_user_provider', 'oauth_accounts', ['user_id', 'provider'], unique=False)
|
|
|
|
|
op.create_table('oauth_clients',
|
|
|
|
|
sa.Column('client_id', sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column('client_secret_hash', sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column('client_name', sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column('client_description', sa.String(length=1000), nullable=True),
|
|
|
|
|
sa.Column('client_type', sa.String(length=20), nullable=False),
|
|
|
|
|
sa.Column('redirect_uris', postgresql.JSONB(astext_type=sa.Text()), nullable=False),
|
|
|
|
|
sa.Column('allowed_scopes', postgresql.JSONB(astext_type=sa.Text()), nullable=False),
|
|
|
|
|
sa.Column('access_token_lifetime', sa.String(length=10), nullable=False),
|
|
|
|
|
sa.Column('refresh_token_lifetime', sa.String(length=10), nullable=False),
|
|
|
|
|
sa.Column('is_active', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('owner_user_id', sa.UUID(), nullable=True),
|
|
|
|
|
sa.Column('mcp_server_url', sa.String(length=2048), nullable=True),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['owner_user_id'], ['users.id'], ondelete='SET NULL'),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_organizations_name"), "organizations", ["name"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_oauth_clients_client_id'), 'oauth_clients', ['client_id'], unique=True)
|
|
|
|
|
op.create_index(op.f('ix_oauth_clients_is_active'), 'oauth_clients', ['is_active'], unique=False)
|
|
|
|
|
op.create_table('user_organizations',
|
|
|
|
|
sa.Column('user_id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('organization_id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('role', sa.Enum('OWNER', 'ADMIN', 'MEMBER', 'GUEST', name='organizationrole'), nullable=False),
|
|
|
|
|
sa.Column('is_active', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('custom_permissions', sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ondelete='CASCADE'),
|
|
|
|
|
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
|
|
|
|
|
sa.PrimaryKeyConstraint('user_id', 'organization_id')
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_organizations_name_active",
|
|
|
|
|
"organizations",
|
|
|
|
|
["name", "is_active"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index('ix_user_org_org_active', 'user_organizations', ['organization_id', 'is_active'], unique=False)
|
|
|
|
|
op.create_index('ix_user_org_role', 'user_organizations', ['role'], unique=False)
|
|
|
|
|
op.create_index('ix_user_org_user_active', 'user_organizations', ['user_id', 'is_active'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_user_organizations_is_active'), 'user_organizations', ['is_active'], unique=False)
|
|
|
|
|
op.create_table('user_sessions',
|
|
|
|
|
sa.Column('user_id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('refresh_token_jti', sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column('device_name', sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column('device_id', sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column('ip_address', sa.String(length=45), nullable=True),
|
|
|
|
|
sa.Column('user_agent', sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column('last_used_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('is_active', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('location_city', sa.String(length=100), nullable=True),
|
|
|
|
|
sa.Column('location_country', sa.String(length=100), nullable=True),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_organizations_slug"), "organizations", ["slug"], unique=True
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_user_sessions_is_active'), 'user_sessions', ['is_active'], unique=False)
|
|
|
|
|
op.create_index('ix_user_sessions_jti_active', 'user_sessions', ['refresh_token_jti', 'is_active'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_user_sessions_refresh_token_jti'), 'user_sessions', ['refresh_token_jti'], unique=True)
|
|
|
|
|
op.create_index('ix_user_sessions_user_active', 'user_sessions', ['user_id', 'is_active'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_user_sessions_user_id'), 'user_sessions', ['user_id'], unique=False)
|
|
|
|
|
op.create_table('oauth_authorization_codes',
|
|
|
|
|
sa.Column('code', sa.String(length=128), nullable=False),
|
|
|
|
|
sa.Column('client_id', sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column('user_id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('redirect_uri', sa.String(length=2048), nullable=False),
|
|
|
|
|
sa.Column('scope', sa.String(length=1000), nullable=False),
|
|
|
|
|
sa.Column('code_challenge', sa.String(length=128), nullable=True),
|
|
|
|
|
sa.Column('code_challenge_method', sa.String(length=10), nullable=True),
|
|
|
|
|
sa.Column('state', sa.String(length=256), nullable=True),
|
|
|
|
|
sa.Column('nonce', sa.String(length=256), nullable=True),
|
|
|
|
|
sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('used', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['client_id'], ['oauth_clients.client_id'], ondelete='CASCADE'),
|
|
|
|
|
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_organizations_slug_active",
|
|
|
|
|
"organizations",
|
|
|
|
|
["slug", "is_active"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index('ix_oauth_authorization_codes_client_user', 'oauth_authorization_codes', ['client_id', 'user_id'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_oauth_authorization_codes_code'), 'oauth_authorization_codes', ['code'], unique=True)
|
|
|
|
|
op.create_index('ix_oauth_authorization_codes_expires_at', 'oauth_authorization_codes', ['expires_at'], unique=False)
|
|
|
|
|
op.create_table('oauth_consents',
|
|
|
|
|
sa.Column('user_id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('client_id', sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column('granted_scopes', sa.String(length=1000), nullable=False),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['client_id'], ['oauth_clients.client_id'], ondelete='CASCADE'),
|
|
|
|
|
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_table(
|
|
|
|
|
"users",
|
|
|
|
|
sa.Column("email", sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column("password_hash", sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column("first_name", sa.String(length=100), nullable=False),
|
|
|
|
|
sa.Column("last_name", sa.String(length=100), nullable=True),
|
|
|
|
|
sa.Column("phone_number", sa.String(length=20), nullable=True),
|
|
|
|
|
sa.Column("is_active", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column("is_superuser", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column(
|
|
|
|
|
"preferences", postgresql.JSONB(astext_type=sa.Text()), nullable=True
|
|
|
|
|
),
|
|
|
|
|
sa.Column("locale", sa.String(length=10), nullable=True),
|
|
|
|
|
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index('ix_oauth_consents_user_client', 'oauth_consents', ['user_id', 'client_id'], unique=True)
|
|
|
|
|
op.create_table('oauth_provider_refresh_tokens',
|
|
|
|
|
sa.Column('token_hash', sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column('jti', sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column('client_id', sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column('user_id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('scope', sa.String(length=1000), nullable=False),
|
|
|
|
|
sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('revoked', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column('last_used_at', sa.DateTime(timezone=True), nullable=True),
|
|
|
|
|
sa.Column('device_info', sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column('ip_address', sa.String(length=45), nullable=True),
|
|
|
|
|
sa.Column('id', sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['client_id'], ['oauth_clients.client_id'], ondelete='CASCADE'),
|
|
|
|
|
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
op.create_index(op.f("ix_users_deleted_at"), "users", ["deleted_at"], unique=False)
|
|
|
|
|
op.create_index(op.f("ix_users_email"), "users", ["email"], unique=True)
|
|
|
|
|
op.create_index(op.f("ix_users_is_active"), "users", ["is_active"], unique=False)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_users_is_superuser"), "users", ["is_superuser"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f("ix_users_locale"), "users", ["locale"], unique=False)
|
|
|
|
|
op.create_table(
|
|
|
|
|
"oauth_accounts",
|
|
|
|
|
sa.Column("user_id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("provider", sa.String(length=50), nullable=False),
|
|
|
|
|
sa.Column("provider_user_id", sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column("provider_email", sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column("access_token_encrypted", sa.String(length=2048), nullable=True),
|
|
|
|
|
sa.Column("refresh_token_encrypted", sa.String(length=2048), nullable=True),
|
|
|
|
|
sa.Column("token_expires_at", sa.DateTime(timezone=True), nullable=True),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
sa.UniqueConstraint(
|
|
|
|
|
"provider", "provider_user_id", name="uq_oauth_provider_user"
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_accounts_provider"), "oauth_accounts", ["provider"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_accounts_provider_email"),
|
|
|
|
|
"oauth_accounts",
|
|
|
|
|
["provider_email"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_accounts_user_id"), "oauth_accounts", ["user_id"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_oauth_accounts_user_provider",
|
|
|
|
|
"oauth_accounts",
|
|
|
|
|
["user_id", "provider"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_table(
|
|
|
|
|
"oauth_clients",
|
|
|
|
|
sa.Column("client_id", sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column("client_secret_hash", sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column("client_name", sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column("client_description", sa.String(length=1000), nullable=True),
|
|
|
|
|
sa.Column("client_type", sa.String(length=20), nullable=False),
|
|
|
|
|
sa.Column(
|
|
|
|
|
"redirect_uris", postgresql.JSONB(astext_type=sa.Text()), nullable=False
|
|
|
|
|
),
|
|
|
|
|
sa.Column(
|
|
|
|
|
"allowed_scopes", postgresql.JSONB(astext_type=sa.Text()), nullable=False
|
|
|
|
|
),
|
|
|
|
|
sa.Column("access_token_lifetime", sa.String(length=10), nullable=False),
|
|
|
|
|
sa.Column("refresh_token_lifetime", sa.String(length=10), nullable=False),
|
|
|
|
|
sa.Column("is_active", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column("owner_user_id", sa.UUID(), nullable=True),
|
|
|
|
|
sa.Column("mcp_server_url", sa.String(length=2048), nullable=True),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(["owner_user_id"], ["users.id"], ondelete="SET NULL"),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_clients_client_id"), "oauth_clients", ["client_id"], unique=True
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_clients_is_active"), "oauth_clients", ["is_active"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_table(
|
|
|
|
|
"user_organizations",
|
|
|
|
|
sa.Column("user_id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("organization_id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column(
|
|
|
|
|
"role",
|
|
|
|
|
sa.Enum("OWNER", "ADMIN", "MEMBER", "GUEST", name="organizationrole"),
|
|
|
|
|
nullable=False,
|
|
|
|
|
),
|
|
|
|
|
sa.Column("is_active", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column("custom_permissions", sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(
|
|
|
|
|
["organization_id"], ["organizations.id"], ondelete="CASCADE"
|
|
|
|
|
),
|
|
|
|
|
sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"),
|
|
|
|
|
sa.PrimaryKeyConstraint("user_id", "organization_id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_user_org_org_active",
|
|
|
|
|
"user_organizations",
|
|
|
|
|
["organization_id", "is_active"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index("ix_user_org_role", "user_organizations", ["role"], unique=False)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_user_org_user_active",
|
|
|
|
|
"user_organizations",
|
|
|
|
|
["user_id", "is_active"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_user_organizations_is_active"),
|
|
|
|
|
"user_organizations",
|
|
|
|
|
["is_active"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_table(
|
|
|
|
|
"user_sessions",
|
|
|
|
|
sa.Column("user_id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("refresh_token_jti", sa.String(length=255), nullable=False),
|
|
|
|
|
sa.Column("device_name", sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column("device_id", sa.String(length=255), nullable=True),
|
|
|
|
|
sa.Column("ip_address", sa.String(length=45), nullable=True),
|
|
|
|
|
sa.Column("user_agent", sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column("last_used_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("is_active", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column("location_city", sa.String(length=100), nullable=True),
|
|
|
|
|
sa.Column("location_country", sa.String(length=100), nullable=True),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_user_sessions_is_active"), "user_sessions", ["is_active"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_user_sessions_jti_active",
|
|
|
|
|
"user_sessions",
|
|
|
|
|
["refresh_token_jti", "is_active"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_user_sessions_refresh_token_jti"),
|
|
|
|
|
"user_sessions",
|
|
|
|
|
["refresh_token_jti"],
|
|
|
|
|
unique=True,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_user_sessions_user_active",
|
|
|
|
|
"user_sessions",
|
|
|
|
|
["user_id", "is_active"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_user_sessions_user_id"), "user_sessions", ["user_id"], unique=False
|
|
|
|
|
)
|
|
|
|
|
op.create_table(
|
|
|
|
|
"oauth_authorization_codes",
|
|
|
|
|
sa.Column("code", sa.String(length=128), nullable=False),
|
|
|
|
|
sa.Column("client_id", sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column("user_id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("redirect_uri", sa.String(length=2048), nullable=False),
|
|
|
|
|
sa.Column("scope", sa.String(length=1000), nullable=False),
|
|
|
|
|
sa.Column("code_challenge", sa.String(length=128), nullable=True),
|
|
|
|
|
sa.Column("code_challenge_method", sa.String(length=10), nullable=True),
|
|
|
|
|
sa.Column("state", sa.String(length=256), nullable=True),
|
|
|
|
|
sa.Column("nonce", sa.String(length=256), nullable=True),
|
|
|
|
|
sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("used", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(
|
|
|
|
|
["client_id"], ["oauth_clients.client_id"], ondelete="CASCADE"
|
|
|
|
|
),
|
|
|
|
|
sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_oauth_authorization_codes_client_user",
|
|
|
|
|
"oauth_authorization_codes",
|
|
|
|
|
["client_id", "user_id"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_authorization_codes_code"),
|
|
|
|
|
"oauth_authorization_codes",
|
|
|
|
|
["code"],
|
|
|
|
|
unique=True,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_oauth_authorization_codes_expires_at",
|
|
|
|
|
"oauth_authorization_codes",
|
|
|
|
|
["expires_at"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_table(
|
|
|
|
|
"oauth_consents",
|
|
|
|
|
sa.Column("user_id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("client_id", sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column("granted_scopes", sa.String(length=1000), nullable=False),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(
|
|
|
|
|
["client_id"], ["oauth_clients.client_id"], ondelete="CASCADE"
|
|
|
|
|
),
|
|
|
|
|
sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_oauth_consents_user_client",
|
|
|
|
|
"oauth_consents",
|
|
|
|
|
["user_id", "client_id"],
|
|
|
|
|
unique=True,
|
|
|
|
|
)
|
|
|
|
|
op.create_table(
|
|
|
|
|
"oauth_provider_refresh_tokens",
|
|
|
|
|
sa.Column("token_hash", sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column("jti", sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column("client_id", sa.String(length=64), nullable=False),
|
|
|
|
|
sa.Column("user_id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("scope", sa.String(length=1000), nullable=False),
|
|
|
|
|
sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("revoked", sa.Boolean(), nullable=False),
|
|
|
|
|
sa.Column("last_used_at", sa.DateTime(timezone=True), nullable=True),
|
|
|
|
|
sa.Column("device_info", sa.String(length=500), nullable=True),
|
|
|
|
|
sa.Column("ip_address", sa.String(length=45), nullable=True),
|
|
|
|
|
sa.Column("id", sa.UUID(), nullable=False),
|
|
|
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(
|
|
|
|
|
["client_id"], ["oauth_clients.client_id"], ondelete="CASCADE"
|
|
|
|
|
),
|
|
|
|
|
sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"),
|
|
|
|
|
sa.PrimaryKeyConstraint("id"),
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_oauth_provider_refresh_tokens_client_user",
|
|
|
|
|
"oauth_provider_refresh_tokens",
|
|
|
|
|
["client_id", "user_id"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_oauth_provider_refresh_tokens_expires_at",
|
|
|
|
|
"oauth_provider_refresh_tokens",
|
|
|
|
|
["expires_at"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_provider_refresh_tokens_jti"),
|
|
|
|
|
"oauth_provider_refresh_tokens",
|
|
|
|
|
["jti"],
|
|
|
|
|
unique=True,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_provider_refresh_tokens_revoked"),
|
|
|
|
|
"oauth_provider_refresh_tokens",
|
|
|
|
|
["revoked"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
op.f("ix_oauth_provider_refresh_tokens_token_hash"),
|
|
|
|
|
"oauth_provider_refresh_tokens",
|
|
|
|
|
["token_hash"],
|
|
|
|
|
unique=True,
|
|
|
|
|
)
|
|
|
|
|
op.create_index(
|
|
|
|
|
"ix_oauth_provider_refresh_tokens_user_revoked",
|
|
|
|
|
"oauth_provider_refresh_tokens",
|
|
|
|
|
["user_id", "revoked"],
|
|
|
|
|
unique=False,
|
|
|
|
|
)
|
|
|
|
|
op.create_index('ix_oauth_provider_refresh_tokens_client_user', 'oauth_provider_refresh_tokens', ['client_id', 'user_id'], unique=False)
|
|
|
|
|
op.create_index('ix_oauth_provider_refresh_tokens_expires_at', 'oauth_provider_refresh_tokens', ['expires_at'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_oauth_provider_refresh_tokens_jti'), 'oauth_provider_refresh_tokens', ['jti'], unique=True)
|
|
|
|
|
op.create_index(op.f('ix_oauth_provider_refresh_tokens_revoked'), 'oauth_provider_refresh_tokens', ['revoked'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_oauth_provider_refresh_tokens_token_hash'), 'oauth_provider_refresh_tokens', ['token_hash'], unique=True)
|
|
|
|
|
op.create_index('ix_oauth_provider_refresh_tokens_user_revoked', 'oauth_provider_refresh_tokens', ['user_id', 'revoked'], unique=False)
|
|
|
|
|
# ### end Alembic commands ###
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def downgrade() -> None:
|
|
|
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
|
|
|
op.drop_index('ix_oauth_provider_refresh_tokens_user_revoked', table_name='oauth_provider_refresh_tokens')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_provider_refresh_tokens_token_hash'), table_name='oauth_provider_refresh_tokens')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_provider_refresh_tokens_revoked'), table_name='oauth_provider_refresh_tokens')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_provider_refresh_tokens_jti'), table_name='oauth_provider_refresh_tokens')
|
|
|
|
|
op.drop_index('ix_oauth_provider_refresh_tokens_expires_at', table_name='oauth_provider_refresh_tokens')
|
|
|
|
|
op.drop_index('ix_oauth_provider_refresh_tokens_client_user', table_name='oauth_provider_refresh_tokens')
|
|
|
|
|
op.drop_table('oauth_provider_refresh_tokens')
|
|
|
|
|
op.drop_index('ix_oauth_consents_user_client', table_name='oauth_consents')
|
|
|
|
|
op.drop_table('oauth_consents')
|
|
|
|
|
op.drop_index('ix_oauth_authorization_codes_expires_at', table_name='oauth_authorization_codes')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_authorization_codes_code'), table_name='oauth_authorization_codes')
|
|
|
|
|
op.drop_index('ix_oauth_authorization_codes_client_user', table_name='oauth_authorization_codes')
|
|
|
|
|
op.drop_table('oauth_authorization_codes')
|
|
|
|
|
op.drop_index(op.f('ix_user_sessions_user_id'), table_name='user_sessions')
|
|
|
|
|
op.drop_index('ix_user_sessions_user_active', table_name='user_sessions')
|
|
|
|
|
op.drop_index(op.f('ix_user_sessions_refresh_token_jti'), table_name='user_sessions')
|
|
|
|
|
op.drop_index('ix_user_sessions_jti_active', table_name='user_sessions')
|
|
|
|
|
op.drop_index(op.f('ix_user_sessions_is_active'), table_name='user_sessions')
|
|
|
|
|
op.drop_table('user_sessions')
|
|
|
|
|
op.drop_index(op.f('ix_user_organizations_is_active'), table_name='user_organizations')
|
|
|
|
|
op.drop_index('ix_user_org_user_active', table_name='user_organizations')
|
|
|
|
|
op.drop_index('ix_user_org_role', table_name='user_organizations')
|
|
|
|
|
op.drop_index('ix_user_org_org_active', table_name='user_organizations')
|
|
|
|
|
op.drop_table('user_organizations')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_clients_is_active'), table_name='oauth_clients')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_clients_client_id'), table_name='oauth_clients')
|
|
|
|
|
op.drop_table('oauth_clients')
|
|
|
|
|
op.drop_index('ix_oauth_accounts_user_provider', table_name='oauth_accounts')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_accounts_user_id'), table_name='oauth_accounts')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_accounts_provider_email'), table_name='oauth_accounts')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_accounts_provider'), table_name='oauth_accounts')
|
|
|
|
|
op.drop_table('oauth_accounts')
|
|
|
|
|
op.drop_index(op.f('ix_users_locale'), table_name='users')
|
|
|
|
|
op.drop_index(op.f('ix_users_is_superuser'), table_name='users')
|
|
|
|
|
op.drop_index(op.f('ix_users_is_active'), table_name='users')
|
|
|
|
|
op.drop_index(op.f('ix_users_email'), table_name='users')
|
|
|
|
|
op.drop_index(op.f('ix_users_deleted_at'), table_name='users')
|
|
|
|
|
op.drop_table('users')
|
|
|
|
|
op.drop_index('ix_organizations_slug_active', table_name='organizations')
|
|
|
|
|
op.drop_index(op.f('ix_organizations_slug'), table_name='organizations')
|
|
|
|
|
op.drop_index('ix_organizations_name_active', table_name='organizations')
|
|
|
|
|
op.drop_index(op.f('ix_organizations_name'), table_name='organizations')
|
|
|
|
|
op.drop_index(op.f('ix_organizations_is_active'), table_name='organizations')
|
|
|
|
|
op.drop_table('organizations')
|
|
|
|
|
op.drop_index(op.f('ix_oauth_states_state'), table_name='oauth_states')
|
|
|
|
|
op.drop_table('oauth_states')
|
|
|
|
|
op.drop_index(
|
|
|
|
|
"ix_oauth_provider_refresh_tokens_user_revoked",
|
|
|
|
|
table_name="oauth_provider_refresh_tokens",
|
|
|
|
|
)
|
|
|
|
|
op.drop_index(
|
|
|
|
|
op.f("ix_oauth_provider_refresh_tokens_token_hash"),
|
|
|
|
|
table_name="oauth_provider_refresh_tokens",
|
|
|
|
|
)
|
|
|
|
|
op.drop_index(
|
|
|
|
|
op.f("ix_oauth_provider_refresh_tokens_revoked"),
|
|
|
|
|
table_name="oauth_provider_refresh_tokens",
|
|
|
|
|
)
|
|
|
|
|
op.drop_index(
|
|
|
|
|
op.f("ix_oauth_provider_refresh_tokens_jti"),
|
|
|
|
|
table_name="oauth_provider_refresh_tokens",
|
|
|
|
|
)
|
|
|
|
|
op.drop_index(
|
|
|
|
|
"ix_oauth_provider_refresh_tokens_expires_at",
|
|
|
|
|
table_name="oauth_provider_refresh_tokens",
|
|
|
|
|
)
|
|
|
|
|
op.drop_index(
|
|
|
|
|
"ix_oauth_provider_refresh_tokens_client_user",
|
|
|
|
|
table_name="oauth_provider_refresh_tokens",
|
|
|
|
|
)
|
|
|
|
|
op.drop_table("oauth_provider_refresh_tokens")
|
|
|
|
|
op.drop_index("ix_oauth_consents_user_client", table_name="oauth_consents")
|
|
|
|
|
op.drop_table("oauth_consents")
|
|
|
|
|
op.drop_index(
|
|
|
|
|
"ix_oauth_authorization_codes_expires_at",
|
|
|
|
|
table_name="oauth_authorization_codes",
|
|
|
|
|
)
|
|
|
|
|
op.drop_index(
|
|
|
|
|
op.f("ix_oauth_authorization_codes_code"),
|
|
|
|
|
table_name="oauth_authorization_codes",
|
|
|
|
|
)
|
|
|
|
|
op.drop_index(
|
|
|
|
|
"ix_oauth_authorization_codes_client_user",
|
|
|
|
|
table_name="oauth_authorization_codes",
|
|
|
|
|
)
|
|
|
|
|
op.drop_table("oauth_authorization_codes")
|
|
|
|
|
op.drop_index(op.f("ix_user_sessions_user_id"), table_name="user_sessions")
|
|
|
|
|
op.drop_index("ix_user_sessions_user_active", table_name="user_sessions")
|
|
|
|
|
op.drop_index(
|
|
|
|
|
op.f("ix_user_sessions_refresh_token_jti"), table_name="user_sessions"
|
|
|
|
|
)
|
|
|
|
|
op.drop_index("ix_user_sessions_jti_active", table_name="user_sessions")
|
|
|
|
|
op.drop_index(op.f("ix_user_sessions_is_active"), table_name="user_sessions")
|
|
|
|
|
op.drop_table("user_sessions")
|
|
|
|
|
op.drop_index(
|
|
|
|
|
op.f("ix_user_organizations_is_active"), table_name="user_organizations"
|
|
|
|
|
)
|
|
|
|
|
op.drop_index("ix_user_org_user_active", table_name="user_organizations")
|
|
|
|
|
op.drop_index("ix_user_org_role", table_name="user_organizations")
|
|
|
|
|
op.drop_index("ix_user_org_org_active", table_name="user_organizations")
|
|
|
|
|
op.drop_table("user_organizations")
|
|
|
|
|
op.drop_index(op.f("ix_oauth_clients_is_active"), table_name="oauth_clients")
|
|
|
|
|
op.drop_index(op.f("ix_oauth_clients_client_id"), table_name="oauth_clients")
|
|
|
|
|
op.drop_table("oauth_clients")
|
|
|
|
|
op.drop_index("ix_oauth_accounts_user_provider", table_name="oauth_accounts")
|
|
|
|
|
op.drop_index(op.f("ix_oauth_accounts_user_id"), table_name="oauth_accounts")
|
|
|
|
|
op.drop_index(op.f("ix_oauth_accounts_provider_email"), table_name="oauth_accounts")
|
|
|
|
|
op.drop_index(op.f("ix_oauth_accounts_provider"), table_name="oauth_accounts")
|
|
|
|
|
op.drop_table("oauth_accounts")
|
|
|
|
|
op.drop_index(op.f("ix_users_locale"), table_name="users")
|
|
|
|
|
op.drop_index(op.f("ix_users_is_superuser"), table_name="users")
|
|
|
|
|
op.drop_index(op.f("ix_users_is_active"), table_name="users")
|
|
|
|
|
op.drop_index(op.f("ix_users_email"), table_name="users")
|
|
|
|
|
op.drop_index(op.f("ix_users_deleted_at"), table_name="users")
|
|
|
|
|
op.drop_table("users")
|
|
|
|
|
op.drop_index("ix_organizations_slug_active", table_name="organizations")
|
|
|
|
|
op.drop_index(op.f("ix_organizations_slug"), table_name="organizations")
|
|
|
|
|
op.drop_index("ix_organizations_name_active", table_name="organizations")
|
|
|
|
|
op.drop_index(op.f("ix_organizations_name"), table_name="organizations")
|
|
|
|
|
op.drop_index(op.f("ix_organizations_is_active"), table_name="organizations")
|
|
|
|
|
op.drop_table("organizations")
|
|
|
|
|
op.drop_index(op.f("ix_oauth_states_state"), table_name="oauth_states")
|
|
|
|
|
op.drop_table("oauth_states")
|
|
|
|
|
# ### end Alembic commands ###
|
|
|
|
|
|