From 7784c60c03ec277b456db6e2709383e302d9382b Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Fri, 3 Jul 2026 15:49:08 +0200 Subject: Added basic oauth flow --- ...0-69d8b4938a12_added_more_fields_and_session.py | 56 ++++++++++++++++++++++ db/models.py | 20 +++++++- db/session.py | 2 +- 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 db/migrations/versions/202607031440-69d8b4938a12_added_more_fields_and_session.py (limited to 'db') diff --git a/db/migrations/versions/202607031440-69d8b4938a12_added_more_fields_and_session.py b/db/migrations/versions/202607031440-69d8b4938a12_added_more_fields_and_session.py new file mode 100644 index 0000000..ec5031b --- /dev/null +++ b/db/migrations/versions/202607031440-69d8b4938a12_added_more_fields_and_session.py @@ -0,0 +1,56 @@ +"""Added more fields and session + +Revision ID: 69d8b4938a12 +Revises: ac4fbf1fea31 +Create Date: 2026-07-03 14:40:55.628816 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +import sqlmodel + + +# revision identifiers, used by Alembic. +revision: str = '69d8b4938a12' +down_revision: Union[str, Sequence[str], None] = 'ac4fbf1fea31' +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! ### + op.create_table('session', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('created', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('now()')), + sa.Column('updated', sa.DateTime(timezone=True), nullable=True), + sa.Column('user_id', sa.Uuid(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.add_column('authcode', sa.Column('created', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('now()'))) + op.add_column('authcode', sa.Column('updated', sa.DateTime(timezone=True), nullable=True)) + op.add_column('authtoken', sa.Column('created', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('now()'))) + op.add_column('authtoken', sa.Column('updated', sa.DateTime(timezone=True), nullable=True)) + op.add_column('clientapplication', sa.Column('created', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('now()'))) + op.add_column('clientapplication', sa.Column('updated', sa.DateTime(timezone=True), nullable=True)) + op.add_column('user', sa.Column('created', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('now()'))) + op.add_column('user', sa.Column('updated', sa.DateTime(timezone=True), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user', 'updated') + op.drop_column('user', 'created') + op.drop_column('clientapplication', 'updated') + op.drop_column('clientapplication', 'created') + op.drop_column('authtoken', 'updated') + op.drop_column('authtoken', 'created') + op.drop_column('authcode', 'updated') + op.drop_column('authcode', 'created') + op.drop_table('session') + # ### end Alembic commands ### diff --git a/db/models.py b/db/models.py index e758671..7e0afb0 100644 --- a/db/models.py +++ b/db/models.py @@ -1,6 +1,8 @@ +from datetime import datetime, UTC from uuid import uuid4, UUID, uuid7 -from sqlmodel import SQLModel, Field +from sqlalchemy import DateTime +from sqlmodel import SQLModel, Field, Relationship from authlib.integrations.sqla_oauth2 import OAuth2ClientMixin, OAuth2AuthorizationCodeMixin, OAuth2TokenMixin from authentication.utils import bcrypt_sha256_hash @@ -8,6 +10,19 @@ from authentication.utils import bcrypt_sha256_hash class BaseModel(SQLModel): id: UUID | None = Field(primary_key=True, default_factory=uuid7) + created: datetime = Field( + default_factory=lambda: datetime.now(tz=UTC), + sa_type=DateTime(timezone=True), + ) + updated: datetime = Field( + default=None, + nullable=True, + sa_column_kwargs={ + 'onupdate': lambda: datetime.now(tz=UTC), + }, + sa_type=DateTime(timezone=True), + ) + class User(BaseModel, table=True): username: str = Field(unique=True, index=True) @@ -18,6 +33,9 @@ class User(BaseModel, table=True): def set_password(self, value): self.password = bcrypt_sha256_hash(value) +class Session(BaseModel, table=True): + user_id: UUID = Field(foreign_key='user.id', exclude=True) + user: User = Relationship() class ClientApplication(BaseModel, OAuth2ClientMixin, table=True): name: str diff --git a/db/session.py b/db/session.py index ec700bd..82c0211 100644 --- a/db/session.py +++ b/db/session.py @@ -1,7 +1,7 @@ from contextlib import contextmanager -from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session +from sqlmodel import create_engine from sqlmodel import Session from conf import DATABASE_URL -- cgit v1.2.3