refactor: refactor api project with ruff

This commit is contained in:
Vladislav Syrochkin 2025-06-09 12:12:48 +05:00
parent 2e4e9d1113
commit 787dc0e8f8
15 changed files with 100 additions and 112 deletions

View File

@ -18,17 +18,19 @@ async def get_user_accaunt_page(connection: AsyncConnection, page, limit) -> Opt
Получает список ползовелей заданных значениями page, limit. Получает список ползовелей заданных значениями page, limit.
""" """
first_user = page*limit-(limit) first_user = page * limit - (limit)
query = ( query = (
select(account_table.c.id, select(
account_table.c.name, account_table.c.id,
account_table.c.login, account_table.c.name,
account_table.c.email, account_table.c.login,
account_table.c.bind_tenant_id, account_table.c.email,
account_table.c.role, account_table.c.bind_tenant_id,
account_table.c.created_at, account_table.c.role,
account_table.c.status) account_table.c.created_at,
account_table.c.status,
)
.order_by(account_table.c.id) .order_by(account_table.c.id)
.offset(first_user) .offset(first_user)
.limit(limit) .limit(limit)
@ -45,11 +47,7 @@ async def get_user_accaunt_page(connection: AsyncConnection, page, limit) -> Opt
validated_users = all_user_adapter.validate_python(users_data) validated_users = all_user_adapter.validate_python(users_data)
return AllUserResponse( return AllUserResponse(users=validated_users, amount_count=total_count, amount_pages=total_pages)
users=validated_users,
amount_count=total_count,
amount_pages=total_pages
)
async def get_user_by_id(connection: AsyncConnection, id: int) -> Optional[User]: async def get_user_by_id(connection: AsyncConnection, id: int) -> Optional[User]:

View File

@ -10,8 +10,6 @@ from api.db.tables.account import account_keyring_table
from api.schemas.account.account_keyring import AccountKeyring from api.schemas.account.account_keyring import AccountKeyring
async def get_key_by_id(connection: AsyncConnection, key_id: str) -> Optional[AccountKeyring]: async def get_key_by_id(connection: AsyncConnection, key_id: str) -> Optional[AccountKeyring]:
""" """
Получает key по key_id. Получает key по key_id.

View File

@ -7,17 +7,18 @@ from api.db.sql_types import UnsignedInt
from api.db import metadata from api.db import metadata
class AccountRole(str,Enum): class AccountRole(str, Enum):
OWNER = 'OWNER' OWNER = "OWNER"
ADMIN = 'ADMIN' ADMIN = "ADMIN"
EDITOR = 'EDITOR' EDITOR = "EDITOR"
VIEWER = 'VIEWER' VIEWER = "VIEWER"
class AccountStatus(str,Enum):
ACTIVE = 'ACTIVE' class AccountStatus(str, Enum):
DISABLED = 'DISABLED' ACTIVE = "ACTIVE"
BLOCKED = 'BLOCKED' DISABLED = "DISABLED"
DELETED = 'DELETED' BLOCKED = "BLOCKED"
DELETED = "DELETED"
account_table = Table( account_table = Table(
@ -38,13 +39,14 @@ account_table = Table(
) )
class KeyType(str,Enum): class KeyType(str, Enum):
PASSWORD = "PASSWORD" PASSWORD = "PASSWORD"
ACCESS_TOKEN = "ACCESS_TOKEN" ACCESS_TOKEN = "ACCESS_TOKEN"
REFRESH_TOKEN = "REFRESH_TOKEN" REFRESH_TOKEN = "REFRESH_TOKEN"
API_KEY = "API_KEY" API_KEY = "API_KEY"
class KeyStatus(str,Enum):
class KeyStatus(str, Enum):
ACTIVE = "ACTIVE" ACTIVE = "ACTIVE"
EXPIRED = "EXPIRED" EXPIRED = "EXPIRED"
DELETED = "DELETED" DELETED = "DELETED"

View File

@ -10,47 +10,51 @@ from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.connection.session import get_connection_dep from api.db.connection.session import get_connection_dep
from api.db.logic.account import get_user_by_id, update_user_by_id, create_user,get_user_by_login,get_user_accaunt_page from api.db.logic.account import (
get_user_by_id,
update_user_by_id,
create_user,
get_user_by_login,
get_user_accaunt_page,
)
from api.schemas.account.account import User from api.schemas.account.account import User
from api.db.tables.account import AccountStatus from api.db.tables.account import AccountStatus
from api.schemas.base import bearer_schema from api.schemas.base import bearer_schema
from api.schemas.endpoints.account import UserUpdate,AllUserResponse from api.schemas.endpoints.account import UserUpdate, AllUserResponse
from api.services.auth import get_current_user from api.services.auth import get_current_user
from api.services.user_role_validation import db_user_role_validation from api.services.user_role_validation import db_user_role_validation
from api.services.update_data_validation import update_user_data_changes from api.services.update_data_validation import update_user_data_changes
api_router = APIRouter( api_router = APIRouter(
prefix="/account", prefix="/account",
tags=["User accountModel"], tags=["User accountModel"],
) )
@api_router.get("",dependencies=[Depends(bearer_schema)],response_model=AllUserResponse)
@api_router.get("", dependencies=[Depends(bearer_schema)], response_model=AllUserResponse)
async def get_all_account( async def get_all_account(
page: int = 1, page: int = 1,
limit: int = 10, limit: int = 10,
connection: AsyncConnection = Depends(get_connection_dep), connection: AsyncConnection = Depends(get_connection_dep),
current_user = Depends(get_current_user) current_user=Depends(get_current_user),
): ):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
user_list = await get_user_accaunt_page(connection,page,limit) user_list = await get_user_accaunt_page(connection, page, limit)
if user_list is None: if user_list is None:
raise HTTPException( raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Accounts not found")
status_code=status.HTTP_404_NOT_FOUND,
detail="Accounts not found")
return user_list return user_list
@api_router.get("/{user_id}",dependencies=[Depends(bearer_schema)], response_model=User) @api_router.get("/{user_id}", dependencies=[Depends(bearer_schema)], response_model=User)
async def get_account(user_id: int, connection: AsyncConnection = Depends(get_connection_dep), current_user = Depends(get_current_user)): async def get_account(
user_id: int, connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user)
):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
user = await get_user_by_id(connection, user_id) user = await get_user_by_id(connection, user_id)
@ -61,22 +65,16 @@ async def get_account(user_id: int, connection: AsyncConnection = Depends(get_co
return user return user
@api_router.post("", dependencies=[Depends(bearer_schema)], response_model=User)
@api_router.post("", dependencies=[Depends(bearer_schema)],response_model=User)
async def create_account( async def create_account(
user: UserUpdate, user: UserUpdate, connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user)
connection: AsyncConnection = Depends(get_connection_dep), ):
current_user = Depends(get_current_user)
):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
user_validation = await get_user_by_login(connection, user.login) user_validation = await get_user_by_login(connection, user.login)
if user_validation is None: if user_validation is None:
await create_user(connection, user, authorize_user.id)
await create_user(connection,user,authorize_user.id)
user_new = await get_user_by_login(connection, user.login) user_new = await get_user_by_login(connection, user.login)
return user_new return user_new
@ -86,11 +84,13 @@ async def create_account(
) )
@api_router.put("/{user_id}",dependencies=[Depends(bearer_schema)], response_model=User) @api_router.put("/{user_id}", dependencies=[Depends(bearer_schema)], response_model=User)
async def update_account( async def update_account(
user_id: int, user_update: UserUpdate, connection: AsyncConnection = Depends(get_connection_dep), current_user = Depends(get_current_user) user_id: int,
user_update: UserUpdate,
connection: AsyncConnection = Depends(get_connection_dep),
current_user=Depends(get_current_user),
): ):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
user = await get_user_by_id(connection, user_id) user = await get_user_by_id(connection, user_id)
@ -106,20 +106,15 @@ async def update_account(
await update_user_by_id(connection, update_values, user) await update_user_by_id(connection, update_values, user)
user = await get_user_by_id(connection, user_id) user = await get_user_by_id(connection, user_id)
return user return user
@api_router.delete("/{user_id}", dependencies=[Depends(bearer_schema)],response_model=User)
@api_router.delete("/{user_id}", dependencies=[Depends(bearer_schema)], response_model=User)
async def delete_account( async def delete_account(
user_id: int, user_id: int, connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user)
connection: AsyncConnection = Depends(get_connection_dep), ):
current_user = Depends(get_current_user)
):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
user = await get_user_by_id(connection, user_id) user = await get_user_by_id(connection, user_id)
@ -133,10 +128,8 @@ async def delete_account(
if update_values is None: if update_values is None:
return user return user
await update_user_by_id(connection, update_values, user) await update_user_by_id(connection, update_values, user)
user = await get_user_by_id(connection, user_id) user = await get_user_by_id(connection, user_id)
return user return user

View File

@ -86,8 +86,7 @@ async def login_for_access_token(
return Access(access_token=access_token) return Access(access_token=access_token)
@api_router.post("/refresh", response_model=Access)
@api_router.post("/refresh",response_model=Access)
async def refresh( async def refresh(
request: Request, connection: AsyncConnection = Depends(get_connection_dep), Authorize: AuthJWT = Depends() request: Request, connection: AsyncConnection = Depends(get_connection_dep), Authorize: AuthJWT = Depends()
): ):

View File

@ -13,8 +13,7 @@ from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.connection.session import get_connection_dep from api.db.connection.session import get_connection_dep
from api.db.logic.keyring import get_key_by_id,create_key,update_key_by_id from api.db.logic.keyring import get_key_by_id, create_key, update_key_by_id
from api.db.tables.account import KeyStatus from api.db.tables.account import KeyStatus
@ -34,14 +33,10 @@ api_router = APIRouter(
) )
@api_router.get("/{user_id}/{key_id}",dependencies=[Depends(bearer_schema)], response_model=AccountKeyring) @api_router.get("/{user_id}/{key_id}", dependencies=[Depends(bearer_schema)], response_model=AccountKeyring)
async def get_keyring( async def get_keyring(
key_id: str, key_id: str, connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user)
connection: AsyncConnection = Depends(get_connection_dep), ):
current_user = Depends(get_current_user)
):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
keyring = await get_key_by_id(connection, key_id) keyring = await get_key_by_id(connection, key_id)
@ -58,15 +53,18 @@ async def create_keyring(
key_id: str, key_id: str,
key: AccountKeyringUpdate, key: AccountKeyringUpdate,
connection: AsyncConnection = Depends(get_connection_dep), connection: AsyncConnection = Depends(get_connection_dep),
current_user = Depends(get_current_user) current_user=Depends(get_current_user),
): ):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
keyring = await get_key_by_id(connection, key_id) keyring = await get_key_by_id(connection, key_id)
if keyring is None: if keyring is None:
keyring_new = await create_key(connection,key, key_id, ) keyring_new = await create_key(
connection,
key,
key_id,
)
return keyring_new return keyring_new
else: else:
@ -75,15 +73,14 @@ async def create_keyring(
) )
@api_router.put("/{user_id}/{key_id}", dependencies=[Depends(bearer_schema)],response_model=AccountKeyring) @api_router.put("/{user_id}/{key_id}", dependencies=[Depends(bearer_schema)], response_model=AccountKeyring)
async def update_keyring( async def update_keyring(
user_id: int, user_id: int,
key_id: str, key_id: str,
keyring_update: AccountKeyringUpdate, keyring_update: AccountKeyringUpdate,
connection: AsyncConnection = Depends(get_connection_dep), connection: AsyncConnection = Depends(get_connection_dep),
current_user = Depends(get_current_user) current_user=Depends(get_current_user),
): ):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
keyring = await get_key_by_id(connection, key_id) keyring = await get_key_by_id(connection, key_id)
@ -99,16 +96,18 @@ async def update_keyring(
await update_key_by_id(connection, update_values, keyring) await update_key_by_id(connection, update_values, keyring)
keyring = await get_key_by_id(connection, key_id) keyring = await get_key_by_id(connection, key_id)
return keyring return keyring
@api_router.delete("/{user_id}/{key_id}",dependencies=[Depends(bearer_schema)], response_model=AccountKeyring)
async def delete_keyring(
user_id: int, key_id: str, connection: AsyncConnection = Depends(get_connection_dep), current_user = Depends(get_current_user)
):
@api_router.delete("/{user_id}/{key_id}", dependencies=[Depends(bearer_schema)], response_model=AccountKeyring)
async def delete_keyring(
user_id: int,
key_id: str,
connection: AsyncConnection = Depends(get_connection_dep),
current_user=Depends(get_current_user),
):
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
keyring = await get_key_by_id(connection, key_id) keyring = await get_key_by_id(connection, key_id)
@ -124,7 +123,6 @@ async def delete_keyring(
await update_key_by_id(connection, update_values, keyring) await update_key_by_id(connection, update_values, keyring)
keyring = await get_key_by_id(connection, key_id) keyring = await get_key_by_id(connection, key_id)
return keyring return keyring

View File

@ -13,7 +13,7 @@ from fastapi import (
from sqlalchemy.ext.asyncio import AsyncConnection from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.connection.session import get_connection_dep from api.db.connection.session import get_connection_dep
from api.db.logic.account import get_user_by_id, update_user_by_id,get_user_by_login from api.db.logic.account import get_user_by_id, update_user_by_id, get_user_by_login
from api.schemas.base import bearer_schema from api.schemas.base import bearer_schema
from api.services.auth import get_current_user from api.services.auth import get_current_user
from api.services.update_data_validation import update_user_data_changes from api.services.update_data_validation import update_user_data_changes
@ -28,12 +28,10 @@ api_router = APIRouter(
) )
@api_router.get("",dependencies=[Depends(bearer_schema)],response_model=User) @api_router.get("", dependencies=[Depends(bearer_schema)], response_model=User)
async def get_profile( async def get_profile(
connection: AsyncConnection = Depends(get_connection_dep), connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user)
current_user = Depends(get_current_user)
): ):
user = await get_user_by_login(connection, current_user) user = await get_user_by_login(connection, current_user)
if user is None: if user is None:
@ -42,13 +40,12 @@ async def get_profile(
return user return user
@api_router.put("", dependencies=[Depends(bearer_schema)],response_model=User) @api_router.put("", dependencies=[Depends(bearer_schema)], response_model=User)
async def update_profile( async def update_profile(
user_updata: UserUpdate, user_updata: UserUpdate,
connection: AsyncConnection = Depends(get_connection_dep), connection: AsyncConnection = Depends(get_connection_dep),
current_user = Depends(get_current_user) current_user=Depends(get_current_user),
): ):
user = await get_user_by_login(connection, current_user) user = await get_user_by_login(connection, current_user)
if user is None: if user is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Account not found") raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Account not found")

View File

@ -2,10 +2,11 @@ import datetime
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
from pydantic import EmailStr, Field from pydantic import EmailStr, Field
from api.db.tables.account import AccountRole,AccountStatus from api.db.tables.account import AccountRole, AccountStatus
from api.schemas.base import Base from api.schemas.base import Base
class User(Base): class User(Base):
id: Optional[int] = None id: Optional[int] = None
name: str = Field(..., max_length=100) name: str = Field(..., max_length=100)

View File

@ -2,10 +2,11 @@ import datetime
from typing import Optional from typing import Optional
from pydantic import Field from pydantic import Field
from datetime import datetime from datetime import datetime
from api.db.tables.account import KeyType,KeyStatus from api.db.tables.account import KeyType, KeyStatus
from api.schemas.base import Base from api.schemas.base import Base
class AccountKeyring(Base): class AccountKeyring(Base):
owner_id: int owner_id: int
key_type: KeyType key_type: KeyType

View File

@ -3,7 +3,7 @@ from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
bearer_schema = HTTPBearer() # схема для авторизации в swagger bearer_schema = HTTPBearer() # схема для авторизации в swagger
class Base(BaseModel): class Base(BaseModel):

View File

@ -2,7 +2,7 @@ from typing import Optional, List
from datetime import datetime from datetime import datetime
from pydantic import EmailStr, Field, TypeAdapter from pydantic import EmailStr, Field, TypeAdapter
from api.db.tables.account import AccountRole,AccountStatus from api.db.tables.account import AccountRole, AccountStatus
from api.schemas.base import Base from api.schemas.base import Base
@ -19,6 +19,7 @@ class UserUpdate(Base):
created_at: Optional[datetime] = None created_at: Optional[datetime] = None
status: Optional[AccountStatus] = None status: Optional[AccountStatus] = None
class AllUser(Base): class AllUser(Base):
id: int id: int
name: str name: str
@ -35,4 +36,5 @@ class AllUserResponse(Base):
amount_count: int amount_count: int
amount_pages: int amount_pages: int
all_user_adapter = TypeAdapter(List[AllUser]) all_user_adapter = TypeAdapter(List[AllUser])

View File

@ -2,10 +2,11 @@ import datetime
from typing import Optional from typing import Optional
from pydantic import Field from pydantic import Field
from datetime import datetime from datetime import datetime
from api.db.tables.account import KeyType,KeyStatus from api.db.tables.account import KeyType, KeyStatus
from api.schemas.base import Base from api.schemas.base import Base
class AccountKeyringUpdate(Base): class AccountKeyringUpdate(Base):
owner_id: Optional[int] = None owner_id: Optional[int] = None
key_type: Optional[KeyType] = None key_type: Optional[KeyType] = None

View File

@ -7,8 +7,10 @@ class Auth(Base):
login: str login: str
password: str password: str
class Refresh(Base): class Refresh(Base):
refresh_token: str refresh_token: str
class Access(Base): class Access(Base):
access_token: str access_token: str

View File

@ -1,9 +1,9 @@
from enum import Enum from enum import Enum
from typing import Optional from typing import Optional
from api.schemas.endpoints.account import UserUpdate from api.schemas.endpoints.account import UserUpdate
from api.db.tables.account import KeyType,KeyStatus from api.db.tables.account import KeyType, KeyStatus
from api.schemas.endpoints.account_keyring import AccountKeyringUpdate from api.schemas.endpoints.account_keyring import AccountKeyringUpdate
from api.db.tables.account import AccountRole,AccountStatus from api.db.tables.account import AccountRole, AccountStatus
def update_user_data_changes(update_data: UserUpdate, user) -> Optional[dict]: def update_user_data_changes(update_data: UserUpdate, user) -> Optional[dict]:

View File

@ -6,12 +6,8 @@ from api.db.logic.account import get_user_by_login
from api.db.tables.account import AccountRole from api.db.tables.account import AccountRole
async def db_user_role_validation(connection, current_user): async def db_user_role_validation(connection, current_user):
authorize_user = await get_user_by_login(connection, current_user) authorize_user = await get_user_by_login(connection, current_user)
if authorize_user.role not in {AccountRole.OWNER, AccountRole.ADMIN}: if authorize_user.role not in {AccountRole.OWNER, AccountRole.ADMIN}:
raise HTTPException( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="You do not have enough permissions")
status_code=status.HTTP_403_FORBIDDEN,
detail="You do not have enough permissions")
return authorize_user return authorize_user