aboutsummaryrefslogtreecommitdiffstats
path: root/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py
diff options
context:
space:
mode:
Diffstat (limited to 'db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py')
-rw-r--r--db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py160
1 files changed, 88 insertions, 72 deletions
diff --git a/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py b/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py
index 5498291..b94ffb8 100644
--- a/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py
+++ b/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py
@@ -5,100 +5,116 @@ Revises: 115caa5a76d0
5Create Date: 2026-07-02 17:40:58.968553 5Create Date: 2026-07-02 17:40:58.968553
6 6
7""" 7"""
8
8import json 9import json
9import os 10import os
10from datetime import datetime, UTC 11from collections.abc import Sequence
12from datetime import UTC, datetime
11from secrets import token_hex 13from secrets import token_hex
12from random import randbytes
13from typing import Sequence, Union
14from uuid import uuid4, uuid7 14from uuid import uuid4, uuid7
15 15
16from alembic import op
17import sqlalchemy as sa 16import sqlalchemy as sa
18import sqlmodel 17import sqlmodel
19from authlib.integrations.sqla_oauth2 import OAuth2ClientMixin 18from alembic import op
20 19
21# revision identifiers, used by Alembic. 20# revision identifiers, used by Alembic.
22revision: str = 'fc6608d3f9cc' 21revision: str = "fc6608d3f9cc"
23down_revision: Union[str, Sequence[str], None] = '115caa5a76d0' 22down_revision: str | Sequence[str] | None = "115caa5a76d0"
24branch_labels: Union[str, Sequence[str], None] = None 23branch_labels: str | Sequence[str] | None = None
25depends_on: Union[str, Sequence[str], None] = None 24depends_on: str | Sequence[str] | None = None
26 25
27 26
28def upgrade() -> None: 27def upgrade() -> None:
29 """Upgrade schema.""" 28 """Upgrade schema."""
30 # ### commands auto generated by Alembic - please adjust! ### 29 # ### commands auto generated by Alembic - please adjust! ###
31 client_application = op.create_table('clientapplication', 30 client_application = op.create_table(
32 sa.Column('id', sa.Uuid(), nullable=False), 31 "clientapplication",
33 sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), 32 sa.Column("id", sa.Uuid(), nullable=False),
34 sa.Column('client_id', sa.String(length=48), nullable=True), 33 sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
35 sa.Column('client_secret', sa.String(length=120), nullable=True), 34 sa.Column("client_id", sa.String(length=48), nullable=True),
36 sa.Column('client_id_issued_at', sa.Integer(), nullable=False), 35 sa.Column("client_secret", sa.String(length=120), nullable=True),
37 sa.Column('client_secret_expires_at', sa.Integer(), nullable=False), 36 sa.Column("client_id_issued_at", sa.Integer(), nullable=False),
38 sa.Column('client_metadata', sa.Text(), nullable=True), 37 sa.Column("client_secret_expires_at", sa.Integer(), nullable=False),
39 sa.PrimaryKeyConstraint('id') 38 sa.Column("client_metadata", sa.Text(), nullable=True),
39 sa.PrimaryKeyConstraint("id"),
40 )
41 op.create_index(
42 op.f("ix_clientapplication_client_id"),
43 "clientapplication",
44 ["client_id"],
45 unique=False,
40 ) 46 )
41 op.create_index(op.f('ix_clientapplication_client_id'), 'clientapplication', ['client_id'], unique=False) 47 op.create_table(
42 op.create_table('authcode', 48 "authcode",
43 sa.Column('id', sa.Uuid(), nullable=False), 49 sa.Column("id", sa.Uuid(), nullable=False),
44 sa.Column('user_id', sa.Uuid(), nullable=False), 50 sa.Column("user_id", sa.Uuid(), nullable=False),
45 sa.Column('code', sa.String(length=120), nullable=False), 51 sa.Column("code", sa.String(length=120), nullable=False),
46 sa.Column('client_id', sa.String(length=48), nullable=True), 52 sa.Column("client_id", sa.String(length=48), nullable=True),
47 sa.Column('redirect_uri', sa.Text(), nullable=True), 53 sa.Column("redirect_uri", sa.Text(), nullable=True),
48 sa.Column('response_type', sa.Text(), nullable=True), 54 sa.Column("response_type", sa.Text(), nullable=True),
49 sa.Column('scope', sa.Text(), nullable=True), 55 sa.Column("scope", sa.Text(), nullable=True),
50 sa.Column('nonce', sa.Text(), nullable=True), 56 sa.Column("nonce", sa.Text(), nullable=True),
51 sa.Column('auth_time', sa.Integer(), nullable=False), 57 sa.Column("auth_time", sa.Integer(), nullable=False),
52 sa.Column('acr', sa.Text(), nullable=True), 58 sa.Column("acr", sa.Text(), nullable=True),
53 sa.Column('amr', sa.Text(), nullable=True), 59 sa.Column("amr", sa.Text(), nullable=True),
54 sa.Column('code_challenge', sa.Text(), nullable=True), 60 sa.Column("code_challenge", sa.Text(), nullable=True),
55 sa.Column('code_challenge_method', sa.String(length=48), nullable=True), 61 sa.Column("code_challenge_method", sa.String(length=48), nullable=True),
56 sa.ForeignKeyConstraint(['user_id'], ['user.id'], ondelete='CASCADE'), 62 sa.ForeignKeyConstraint(["user_id"], ["user.id"], ondelete="CASCADE"),
57 sa.PrimaryKeyConstraint('id'), 63 sa.PrimaryKeyConstraint("id"),
58 sa.UniqueConstraint('code') 64 sa.UniqueConstraint("code"),
59 ) 65 )
60 op.create_table('authtoken', 66 op.create_table(
61 sa.Column('id', sa.Uuid(), nullable=False), 67 "authtoken",
62 sa.Column('user_id', sa.Uuid(), nullable=False), 68 sa.Column("id", sa.Uuid(), nullable=False),
63 sa.Column('client_id', sa.String(length=48), nullable=True), 69 sa.Column("user_id", sa.Uuid(), nullable=False),
64 sa.Column('token_type', sa.String(length=40), nullable=True), 70 sa.Column("client_id", sa.String(length=48), nullable=True),
65 sa.Column('access_token', sa.String(length=255), nullable=False), 71 sa.Column("token_type", sa.String(length=40), nullable=True),
66 sa.Column('refresh_token', sa.String(length=255), nullable=True), 72 sa.Column("access_token", sa.String(length=255), nullable=False),
67 sa.Column('scope', sa.Text(), nullable=True), 73 sa.Column("refresh_token", sa.String(length=255), nullable=True),
68 sa.Column('issued_at', sa.Integer(), nullable=False), 74 sa.Column("scope", sa.Text(), nullable=True),
69 sa.Column('access_token_revoked_at', sa.Integer(), nullable=False), 75 sa.Column("issued_at", sa.Integer(), nullable=False),
70 sa.Column('refresh_token_revoked_at', sa.Integer(), nullable=False), 76 sa.Column("access_token_revoked_at", sa.Integer(), nullable=False),
71 sa.Column('expires_in', sa.Integer(), nullable=False), 77 sa.Column("refresh_token_revoked_at", sa.Integer(), nullable=False),
72 sa.ForeignKeyConstraint(['user_id'], ['user.id'], ondelete='CASCADE'), 78 sa.Column("expires_in", sa.Integer(), nullable=False),
73 sa.PrimaryKeyConstraint('id'), 79 sa.ForeignKeyConstraint(["user_id"], ["user.id"], ondelete="CASCADE"),
74 sa.UniqueConstraint('access_token') 80 sa.PrimaryKeyConstraint("id"),
81 sa.UniqueConstraint("access_token"),
82 )
83 op.create_index(
84 op.f("ix_authtoken_refresh_token"), "authtoken", ["refresh_token"], unique=False
75 ) 85 )
76 op.create_index(op.f('ix_authtoken_refresh_token'), 'authtoken', ['refresh_token'], unique=False)
77 86
78 op.bulk_insert(client_application, [ 87 op.bulk_insert(
79 { 88 client_application,
80 'id': uuid7(), 89 [
81 'name': 'TTUN', 90 {
82 'client_id': uuid4().hex, 91 "id": uuid7(),
83 'client_secret': token_hex(32), 92 "name": "TTUN",
84 'client_id_issued_at': datetime.now(tz=UTC).timestamp(), 93 "client_id": uuid4().hex,
85 'client_secret_expires_at': datetime.now(tz=UTC).timestamp() + 3600, 94 "client_secret": token_hex(32),
86 'client_metadata': json.dumps({ 95 "client_id_issued_at": datetime.now(tz=UTC).timestamp(),
87 'redirect_uris': [ 96 "client_secret_expires_at": datetime.now(tz=UTC).timestamp() + 3600,
88 f'//{os.environ['TUNNEL_DOMAIN']}/oauth/callback' 97 "client_metadata": json.dumps(
89 ], 98 {
90 }) 99 "redirect_uris": [
91 } 100 f"//{os.environ['TUNNEL_DOMAIN']}/oauth/callback"
92 ]) 101 ],
102 }
103 ),
104 }
105 ],
106 )
93 # ### end Alembic commands ### 107 # ### end Alembic commands ###
94 108
95 109
96def downgrade() -> None: 110def downgrade() -> None:
97 """Downgrade schema.""" 111 """Downgrade schema."""
98 # ### commands auto generated by Alembic - please adjust! ### 112 # ### commands auto generated by Alembic - please adjust! ###
99 op.drop_index(op.f('ix_authtoken_refresh_token'), table_name='authtoken') 113 op.drop_index(op.f("ix_authtoken_refresh_token"), table_name="authtoken")
100 op.drop_table('authtoken') 114 op.drop_table("authtoken")
101 op.drop_table('authcode') 115 op.drop_table("authcode")
102 op.drop_index(op.f('ix_clientapplication_client_id'), table_name='clientapplication') 116 op.drop_index(
103 op.drop_table('clientapplication') 117 op.f("ix_clientapplication_client_id"), table_name="clientapplication"
118 )
119 op.drop_table("clientapplication")
104 # ### end Alembic commands ### 120 # ### end Alembic commands ###