From fb28c648390464c75ba4903b0e1e0ff2642c8ffb Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Thu, 2 Jul 2026 18:34:39 +0200 Subject: Added users and migrations --- ...202607021740-fc6608d3f9cc_added_oauth_models.py | 104 +++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py (limited to 'db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py') diff --git a/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py b/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py new file mode 100644 index 0000000..5498291 --- /dev/null +++ b/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py @@ -0,0 +1,104 @@ +"""Added oauth models + +Revision ID: fc6608d3f9cc +Revises: 115caa5a76d0 +Create Date: 2026-07-02 17:40:58.968553 + +""" +import json +import os +from datetime import datetime, UTC +from secrets import token_hex +from random import randbytes +from typing import Sequence, Union +from uuid import uuid4, uuid7 + +from alembic import op +import sqlalchemy as sa +import sqlmodel +from authlib.integrations.sqla_oauth2 import OAuth2ClientMixin + +# revision identifiers, used by Alembic. +revision: str = 'fc6608d3f9cc' +down_revision: Union[str, Sequence[str], None] = '115caa5a76d0' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + client_application = op.create_table('clientapplication', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('client_id', sa.String(length=48), nullable=True), + sa.Column('client_secret', sa.String(length=120), nullable=True), + sa.Column('client_id_issued_at', sa.Integer(), nullable=False), + sa.Column('client_secret_expires_at', sa.Integer(), nullable=False), + sa.Column('client_metadata', sa.Text(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_clientapplication_client_id'), 'clientapplication', ['client_id'], unique=False) + op.create_table('authcode', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('user_id', sa.Uuid(), nullable=False), + sa.Column('code', sa.String(length=120), nullable=False), + sa.Column('client_id', sa.String(length=48), nullable=True), + sa.Column('redirect_uri', sa.Text(), nullable=True), + sa.Column('response_type', sa.Text(), nullable=True), + sa.Column('scope', sa.Text(), nullable=True), + sa.Column('nonce', sa.Text(), nullable=True), + sa.Column('auth_time', sa.Integer(), nullable=False), + sa.Column('acr', sa.Text(), nullable=True), + sa.Column('amr', sa.Text(), nullable=True), + sa.Column('code_challenge', sa.Text(), nullable=True), + sa.Column('code_challenge_method', sa.String(length=48), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('code') + ) + op.create_table('authtoken', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('user_id', sa.Uuid(), nullable=False), + sa.Column('client_id', sa.String(length=48), nullable=True), + sa.Column('token_type', sa.String(length=40), nullable=True), + sa.Column('access_token', sa.String(length=255), nullable=False), + sa.Column('refresh_token', sa.String(length=255), nullable=True), + sa.Column('scope', sa.Text(), nullable=True), + sa.Column('issued_at', sa.Integer(), nullable=False), + sa.Column('access_token_revoked_at', sa.Integer(), nullable=False), + sa.Column('refresh_token_revoked_at', sa.Integer(), nullable=False), + sa.Column('expires_in', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('access_token') + ) + op.create_index(op.f('ix_authtoken_refresh_token'), 'authtoken', ['refresh_token'], unique=False) + + op.bulk_insert(client_application, [ + { + 'id': uuid7(), + 'name': 'TTUN', + 'client_id': uuid4().hex, + 'client_secret': token_hex(32), + 'client_id_issued_at': datetime.now(tz=UTC).timestamp(), + 'client_secret_expires_at': datetime.now(tz=UTC).timestamp() + 3600, + 'client_metadata': json.dumps({ + 'redirect_uris': [ + f'//{os.environ['TUNNEL_DOMAIN']}/oauth/callback' + ], + }) + } + ]) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_authtoken_refresh_token'), table_name='authtoken') + op.drop_table('authtoken') + op.drop_table('authcode') + op.drop_index(op.f('ix_clientapplication_client_id'), table_name='clientapplication') + op.drop_table('clientapplication') + # ### end Alembic commands ### -- cgit v1.2.3