From 8271737ce2cf3d666b411d7efa52693c290e9b35 Mon Sep 17 00:00:00 2001 From: TheNoxium Date: Wed, 23 Apr 2025 15:36:49 +0300 Subject: [PATCH] fix: makefile:install, auth token logic --- Makefile | 2 +- api/api/db/alembic/versions/f1b06efacec0_.py | 138 +++++++++++++++++++ api/api/endpoints/auth.py | 23 ++-- 3 files changed, 154 insertions(+), 9 deletions(-) create mode 100644 api/api/db/alembic/versions/f1b06efacec0_.py diff --git a/Makefile b/Makefile index a19eae4..0956d15 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ venv-api: install: make migrate head && \ cd api && \ - poetry run python3 api/utils/init.py + poetry run python3 -m api.utils.init %:: echo $(MESSAGE) diff --git a/api/api/db/alembic/versions/f1b06efacec0_.py b/api/api/db/alembic/versions/f1b06efacec0_.py new file mode 100644 index 0000000..0bd0ed6 --- /dev/null +++ b/api/api/db/alembic/versions/f1b06efacec0_.py @@ -0,0 +1,138 @@ +"""empty message + +Revision ID: f1b06efacec0 +Revises: +Create Date: 2025-04-23 15:09:14.833213 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision: str = 'f1b06efacec0' +down_revision: Union[str, None] = None +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('account', + sa.Column('id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), autoincrement=True, nullable=False), + sa.Column('name', sa.String(length=100), nullable=False), + sa.Column('login', sa.String(length=100), nullable=False), + sa.Column('email', sa.String(length=100), nullable=True), + sa.Column('bind_tenant_id', sa.String(length=40), nullable=True), + sa.Column('role', sa.Enum('OWNER', 'ADMIN', 'EDITOR', 'VIEWER', name='accountrole'), nullable=False), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('creator_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('status', sa.Enum('ACTIVE', 'DISABLED', 'BLOCKED', 'DELETED', name='accountstatus'), nullable=False), + sa.ForeignKeyConstraint(['creator_id'], ['account.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_login', 'account', ['login'], unique=False) + op.create_index('idx_name', 'account', ['name'], unique=False) + op.create_table('account_keyring', + sa.Column('owner_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('key_type', sa.Enum('PASSWORD', 'ACCESS_TOKEN', 'REFRESH_TOKEN', 'API_KEY', name='keytype'), nullable=False), + sa.Column('key_id', sa.String(length=40), nullable=False), + sa.Column('key_value', sa.String(length=255), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('expiry', sa.DateTime(timezone=True), nullable=True), + sa.Column('status', sa.Enum('ACTIVE', 'EXPIRED', 'DELETED', name='keystatus'), nullable=False), + sa.ForeignKeyConstraint(['owner_id'], ['account.id'], ), + sa.PrimaryKeyConstraint('owner_id', 'key_type', 'key_id') + ) + op.create_table('list_events', + sa.Column('id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), autoincrement=True, nullable=False), + sa.Column('name', sa.String(length=40, collation='latin1_bin'), nullable=False), + sa.Column('title', sa.String(length=64), nullable=False), + sa.Column('creator_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('schema', sa.JSON(), nullable=True), + sa.Column('state', sa.Enum('AUTO', 'DESCRIPTED', name='eventstate'), nullable=False), + sa.Column('status', sa.Enum('ACTIVE', 'DISABLED', 'DELETED', name='eventstatus'), nullable=False), + sa.ForeignKeyConstraint(['creator_id'], ['account.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name') + ) + op.create_table('process_schema', + sa.Column('id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), autoincrement=True, nullable=False), + sa.Column('title', sa.String(length=100), nullable=False), + sa.Column('description', sa.Text(), nullable=False), + sa.Column('owner_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('creator_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('settings', sa.JSON(), nullable=True), + sa.Column('status', sa.Enum('ACTIVE', 'STOPPING', 'STOPPED', 'DELETED', name='processstatus'), nullable=False), + sa.ForeignKeyConstraint(['creator_id'], ['account.id'], ), + sa.ForeignKeyConstraint(['owner_id'], ['account.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_owner_id', 'process_schema', ['owner_id'], unique=False) + op.create_table('process_version_archive', + sa.Column('id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), autoincrement=True, nullable=False), + sa.Column('ps_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('version', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('snapshot', sa.JSON(), nullable=True), + sa.Column('owner_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('is_last', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=True), + sa.ForeignKeyConstraint(['owner_id'], ['account.id'], ), + sa.ForeignKeyConstraint(['ps_id'], ['process_schema.id'], ), + sa.PrimaryKeyConstraint('id', 'version') + ) + op.create_table('ps_node', + sa.Column('id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), autoincrement=True, nullable=False), + sa.Column('ps_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('node_type', sa.Enum('TYPE1', 'TYPE2', 'TYPE3', name='nodetype'), nullable=False), + sa.Column('settings', sa.JSON(), nullable=True), + sa.Column('creator_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('status', sa.Enum('ACTIVE', 'DISABLED', 'DELETED', name='nodestatus'), nullable=False), + sa.ForeignKeyConstraint(['creator_id'], ['account.id'], ), + sa.ForeignKeyConstraint(['ps_id'], ['process_schema.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_ps_id', 'ps_node', ['ps_id'], unique=False) + op.create_table('node_link', + sa.Column('id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), autoincrement=True, nullable=False), + sa.Column('link_name', sa.String(length=20), nullable=False), + sa.Column('node_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('next_node_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('settings', sa.JSON(), nullable=True), + sa.Column('creator_id', sa.Integer().with_variant(mysql.INTEGER(unsigned=True), 'mysql'), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('status', sa.Enum('ACTIVE', 'STOPPING', 'STOPPED', 'DELETED', name='nodelinkstatus'), nullable=False), + sa.ForeignKeyConstraint(['creator_id'], ['account.id'], ), + sa.ForeignKeyConstraint(['next_node_id'], ['ps_node.id'], ), + sa.ForeignKeyConstraint(['node_id'], ['ps_node.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_next_node_id', 'node_link', ['next_node_id'], unique=False) + op.create_index('idx_node_id', 'node_link', ['node_id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index('idx_node_id', table_name='node_link') + op.drop_index('idx_next_node_id', table_name='node_link') + op.drop_table('node_link') + op.drop_index('idx_ps_id', table_name='ps_node') + op.drop_table('ps_node') + op.drop_table('process_version_archive') + op.drop_index('idx_owner_id', table_name='process_schema') + op.drop_table('process_schema') + op.drop_table('list_events') + op.drop_table('account_keyring') + op.drop_index('idx_name', table_name='account') + op.drop_index('idx_login', table_name='account') + op.drop_table('account') + # ### end Alembic commands ### diff --git a/api/api/endpoints/auth.py b/api/api/endpoints/auth.py index 2cf8e14..76e147b 100644 --- a/api/api/endpoints/auth.py +++ b/api/api/endpoints/auth.py @@ -26,6 +26,8 @@ from api.services.auth import authenticate_user from api.db.logic.auth import add_new_refresh_token,upgrade_old_refresh_token +from api.db.logic.account import get_user_login + from api.schemas.endpoints.auth import Auth api_router = APIRouter( @@ -91,7 +93,6 @@ async def login_for_access_token( refresh_token_expires_time = datetime.now(timezone.utc) + refresh_token_expires - await upgrade_old_refresh_token(connection,user) await add_new_refresh_token(connection,refresh_token,refresh_token_expires_time,user) @@ -107,8 +108,9 @@ async def login_for_access_token( @api_router.post("/refresh") -def refresh( +async def refresh( request: Request, + connection: AsyncConnection = Depends(get_connection_dep), Authorize: AuthJWT = Depends()): """Обновляет access токен.""" @@ -122,22 +124,27 @@ def refresh( try: Authorize.jwt_refresh_token_required() + current_user = Authorize.get_jwt_subject() + print(current_user) except Exception as e: + + await upgrade_old_refresh_token(connection,current_user) + raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid refresh token", ) - - current_user = Authorize.get_jwt_subject() - access_token_expires = timedelta(minutes=get_settings().ACCESS_TOKEN_EXPIRE_MINUTES) new_access_token = Authorize.create_access_token( subject=current_user, expires_time=access_token_expires ) - Authorize.set_access_cookies(new_access_token) - - return {"msg": "The token has been refresh"} + return { + "access_token": new_access_token, + # "access_token_expires": access_token_expires_time, + # "refresh_token": refresh_token, + # "refresh_token_expires": refresh_token_expires_time + }