From c60d19262ec53ec3f53a18b6efe78e47453170e9 Mon Sep 17 00:00:00 2001 From: TheNoxium Date: Tue, 3 Jun 2025 13:01:10 +0500 Subject: [PATCH] fix: model, name --- api/api/db/logic/account.py | 19 +++---------- api/api/db/tables/account.py | 30 ++++++++++---------- api/api/endpoints/account.py | 9 +++--- api/api/endpoints/auth.py | 2 -- api/api/endpoints/keyring.py | 5 ++-- api/api/schemas/account/account.py | 19 ++----------- api/api/schemas/account/account_keyring.py | 23 ++++----------- api/api/schemas/endpoints/account.py | 25 +++++----------- api/api/schemas/endpoints/account_keyring.py | 19 ++----------- api/api/services/auth.py | 6 ++-- api/api/services/update_data_validation.py | 10 ++++--- api/api/services/user_role_validation.py | 6 ++-- 12 files changed, 59 insertions(+), 114 deletions(-) diff --git a/api/api/db/logic/account.py b/api/api/db/logic/account.py index d4ad466..e1cba7f 100644 --- a/api/api/db/logic/account.py +++ b/api/api/db/logic/account.py @@ -13,9 +13,9 @@ from api.schemas.account.account import User from api.schemas.endpoints.account import AllUserResponse, all_user_adapter -async def get_all_users_login_and_id(connection: AsyncConnection, page, limit) -> Optional[User]: +async def get_user_accaunt_page(connection: AsyncConnection, page, limit) -> Optional[User]: """ - Получает id и login всех юзеров + Получает список ползовелей заданных значениями page, limit. """ first_user = page*limit-(limit) @@ -39,22 +39,11 @@ async def get_all_users_login_and_id(connection: AsyncConnection, page, limit) - result = await connection.execute(query) count_result = await connection.execute(count_query) - users_data = result.fetchall() + users_data = result.mappings().all() total_count = count_result.scalar() total_pages = math.ceil(total_count / limit) - - print(users_data) - validated_users = all_user_adapter.validate_python( - [{"id": u.id, - "name": u.name, - "login": u.login, - "email": u.email, - "bind_tenant_id": u.bind_tenant_id, - "role": u.role.name, - "created_at": u.created_at, - "status": u.status.name} for u in users_data] - ) + validated_users = all_user_adapter.validate_python(users_data) return AllUserResponse( users=validated_users, diff --git a/api/api/db/tables/account.py b/api/api/db/tables/account.py index d2fe3a2..f7c5c61 100644 --- a/api/api/db/tables/account.py +++ b/api/api/db/tables/account.py @@ -8,16 +8,16 @@ from api.db import metadata class AccountRole(str,Enum): - OWNER = auto() - ADMIN = auto() - EDITOR = auto() - VIEWER = auto() + OWNER = 'OWNER' + ADMIN = 'ADMIN' + EDITOR = 'EDITOR' + VIEWER = 'VIEWER' class AccountStatus(str,Enum): - ACTIVE = auto() - DISABLED = auto() - BLOCKED = auto() - DELETED = auto() + ACTIVE = 'ACTIVE' + DISABLED = 'DISABLED' + BLOCKED = 'BLOCKED' + DELETED = 'DELETED' account_table = Table( @@ -38,15 +38,15 @@ account_table = Table( ) class KeyType(str,Enum): - PASSWORD = auto() - ACCESS_TOKEN = auto() - REFRESH_TOKEN = auto() - API_KEY = auto() + PASSWORD = "PASSWORD" + ACCESS_TOKEN = "ACCESS_TOKEN" + REFRESH_TOKEN = "REFRESH_TOKEN" + API_KEY = "API_KEY" class KeyStatus(str,Enum): - ACTIVE = auto() - EXPIRED = auto() - DELETED = auto() + ACTIVE = "ACTIVE" + EXPIRED = "EXPIRED" + DELETED = "DELETED" account_keyring_table = Table( 'account_keyring', metadata, diff --git a/api/api/endpoints/account.py b/api/api/endpoints/account.py index f1a6ddd..d22705e 100644 --- a/api/api/endpoints/account.py +++ b/api/api/endpoints/account.py @@ -11,9 +11,10 @@ from sqlalchemy.ext.asyncio import AsyncConnection from api.db.connection.session import get_connection_dep -from api.db.logic.account import get_user_id, update_user_id, create_user,get_user_login,get_all_users_login_and_id +from api.db.logic.account import get_user_id, update_user_id, create_user,get_user_login,get_user_accaunt_page -from api.schemas.account.account import User,Status +from api.schemas.account.account import User +from api.db.tables.account import AccountStatus from api.schemas.endpoints.account import UserUpdate,AllUserResponse @@ -41,7 +42,7 @@ async def get_all_account( current_user = request.state.current_user authorize_user = await db_user_role_validation(connection, current_user) - user_list = await get_all_users_login_and_id(connection,page,limit) + user_list = await get_user_accaunt_page(connection,page,limit) if user_list is None: raise HTTPException( @@ -146,7 +147,7 @@ async def delete_account( detail="Account not found") - user_update = UserUpdate(status=Status.DELETED.value) + user_update = UserUpdate(status=AccountStatus.DELETED.value) update_values = update_user_data_changes(user_update,user) diff --git a/api/api/endpoints/auth.py b/api/api/endpoints/auth.py index 621d014..5758c7f 100644 --- a/api/api/endpoints/auth.py +++ b/api/api/endpoints/auth.py @@ -2,9 +2,7 @@ from datetime import datetime, timedelta, timezone from fastapi import ( APIRouter, - Body, Depends, - Form, HTTPException, Request, Response, diff --git a/api/api/endpoints/keyring.py b/api/api/endpoints/keyring.py index 2036b84..8994007 100644 --- a/api/api/endpoints/keyring.py +++ b/api/api/endpoints/keyring.py @@ -17,7 +17,8 @@ from api.db.connection.session import get_connection_dep from api.db.logic.keyring import get_key_id,create_key,update_key_id -from api.schemas.account.account import Status + +from api.db.tables.account import KeyStatus from api.schemas.endpoints.account_keyring import AccountKeyringUpdate from api.schemas.account.account_keyring import AccountKeyring @@ -135,7 +136,7 @@ async def delete_keyring( detail="keyring not found") - keyring_update = AccountKeyringUpdate(status=Status.DELETED.value) + keyring_update = AccountKeyringUpdate(status=KeyStatus.DELETED.value) update_values = update_key_data_changes(keyring_update,keyring) diff --git a/api/api/schemas/account/account.py b/api/api/schemas/account/account.py index 4a1557b..1ceb3b0 100644 --- a/api/api/schemas/account/account.py +++ b/api/api/schemas/account/account.py @@ -1,22 +1,9 @@ import datetime -from enum import Enum from datetime import datetime from typing import Optional from pydantic import BaseModel, EmailStr, Field +from api.db.tables.account import AccountRole,AccountStatus -# Модель для хранения информации из запроса - -class Role(Enum): - OWNER = 'OWNER' - ADMIN = 'ADMIN' - EDITOR = 'EDITOR' - VIEWER = 'VIEWER' - -class Status(Enum): - ACTIVE = 'ACTIVE' - DISABLED = 'DISABLED' - BLOCKED = 'BLOCKED' - DELETED = 'DELETED' class User(BaseModel): id: Optional[int] = None @@ -24,8 +11,8 @@ class User(BaseModel): login: str = Field(..., max_length=100) email: Optional[EmailStr] = Field(None, max_length=100) # Электронная почта (может быть None) bind_tenant_id: Optional[str] = Field(None, max_length=40) - role: Role + role: AccountRole meta: dict creator_id: Optional[int] = None created_at: datetime - status: Status + status: AccountStatus diff --git a/api/api/schemas/account/account_keyring.py b/api/api/schemas/account/account_keyring.py index c9b9052..b504797 100644 --- a/api/api/schemas/account/account_keyring.py +++ b/api/api/schemas/account/account_keyring.py @@ -1,28 +1,15 @@ import datetime -from enum import Enum -from typing import Optional, Dict +from typing import Optional from pydantic import BaseModel, Field from datetime import datetime - -# Модель для хранения информации из запроса - -class TypeKey(Enum): - PASSWORD = "PASSWORD" - ACCESS_TOKEN = "ACCESS_TOKEN" - REFRESH_TOKEN = "REFRESH_TOKEN" - API_KEY = "API_KEY" - -class StatusKey(Enum): - ACTIVE = "ACTIVE" - EXPIRED = "EXPIRED" - DELETED = "DELETED" +from api.db.tables.account import KeyType,KeyStatus class AccountKeyring(BaseModel): owner_id: int - key_type: TypeKey # Используем тот же KeyType - key_id: Optional[str] = Field(None, max_length=40) # Изменено на None как default + key_type: KeyType + key_id: Optional[str] = Field(None, max_length=40) key_value: str = Field(..., max_length=255) created_at: datetime expiry: Optional[datetime] = None - status: StatusKey + status: KeyStatus diff --git a/api/api/schemas/endpoints/account.py b/api/api/schemas/endpoints/account.py index be323db..c91a9a2 100644 --- a/api/api/schemas/endpoints/account.py +++ b/api/api/schemas/endpoints/account.py @@ -1,21 +1,10 @@ -from enum import Enum from typing import Optional, List from datetime import datetime from pydantic import BaseModel, EmailStr, Field, TypeAdapter -# Таблица для получения информации из запроса +from api.db.tables.account import AccountRole,AccountStatus -class Role(Enum): - OWNER = 'OWNER' - ADMIN = 'ADMIN' - EDITOR = 'EDITOR' - VIEWER = 'VIEWER' -class Status(Enum): - ACTIVE = 'ACTIVE' - DISABLED = 'DISABLED' - BLOCKED = 'BLOCKED' - DELETED = 'DELETED' class UserUpdate(BaseModel): id: Optional[int] = None @@ -23,21 +12,21 @@ class UserUpdate(BaseModel): login: Optional[str] = Field(None, max_length=100) email: Optional[EmailStr] = None bind_tenant_id: Optional[str] = Field(None, max_length=40) - role: Optional[Role] = None + role: Optional[AccountRole] = None meta: Optional[dict] = None creator_id: Optional[int] = None created_at: Optional[datetime] = None - status: Optional[Status] = None + status: Optional[AccountStatus] = None class AllUser(BaseModel): id: int name: str login: str - email: EmailStr - bind_tenant_id: str - role: Role + email: Optional[EmailStr] = None + bind_tenant_id: Optional[str] = None + role: AccountRole created_at: datetime - status: Status + status: AccountStatus class AllUserResponse(BaseModel): diff --git a/api/api/schemas/endpoints/account_keyring.py b/api/api/schemas/endpoints/account_keyring.py index 5587fef..5e646dc 100644 --- a/api/api/schemas/endpoints/account_keyring.py +++ b/api/api/schemas/endpoints/account_keyring.py @@ -1,28 +1,15 @@ import datetime -from enum import Enum from typing import Optional from pydantic import BaseModel, Field from datetime import datetime - -# Таблица для получения информации из запроса - -class TypeKey(Enum): - PASSWORD = "PASSWORD" - ACCESS_TOKEN = "ACCESS_TOKEN" - REFRESH_TOKEN = "REFRESH_TOKEN" - API_KEY = "API_KEY" - -class StatusKey(Enum): - ACTIVE = "ACTIVE" - EXPIRED = "EXPIRED" - DELETED = "DELETED" +from api.db.tables.account import KeyType,KeyStatus class AccountKeyringUpdate(BaseModel): owner_id: Optional[int] = None - key_type: Optional[TypeKey] = None + key_type: Optional[KeyType] = None key_id: Optional[str] = Field(None, max_length=40) key_value: Optional[str] = Field(None, max_length=255) created_at: Optional[datetime] = None expiry: Optional[datetime] = None - status: Optional[StatusKey] = None + status: Optional[KeyStatus] = None diff --git a/api/api/services/auth.py b/api/api/services/auth.py index 8e0e5b1..dcdfd64 100644 --- a/api/api/services/auth.py +++ b/api/api/services/auth.py @@ -2,7 +2,9 @@ from typing import Optional from sqlalchemy.ext.asyncio import AsyncConnection from api.db.logic.auth import get_user # # from backend.schemas.users.token import TokenData -from api.schemas.account.account import User,Status +from api.schemas.account.account import User +from api.db.tables.account import AccountStatus + from api.utils.hasher import Hasher @@ -14,7 +16,7 @@ async def authenticate_user( sql_user,sql_password = await get_user(connection, username) - if not sql_user or sql_user.status != Status.ACTIVE : + if not sql_user or sql_user.status != AccountStatus.ACTIVE : return None hasher = Hasher() if not hasher.verify_data(password, sql_password.key_value): diff --git a/api/api/services/update_data_validation.py b/api/api/services/update_data_validation.py index e19ee0a..6f29486 100644 --- a/api/api/services/update_data_validation.py +++ b/api/api/services/update_data_validation.py @@ -1,7 +1,9 @@ from enum import Enum from typing import Optional -from api.schemas.endpoints.account import UserUpdate, Role, Status -from api.schemas.endpoints.account_keyring import AccountKeyringUpdate, StatusKey, TypeKey +from api.schemas.endpoints.account import UserUpdate +from api.db.tables.account import KeyType,KeyStatus +from api.schemas.endpoints.account_keyring import AccountKeyringUpdate +from api.db.tables.account import AccountRole,AccountStatus def update_user_data_changes(update_data: UserUpdate, user) -> Optional[dict]: """ @@ -17,7 +19,7 @@ def update_user_data_changes(update_data: UserUpdate, user) -> Optional[dict]: if value is None: continue - if isinstance(value, (Role, Status)): + if isinstance(value, (AccountRole, AccountStatus)): update_values[field] = value.value else: update_values[field] = value @@ -50,7 +52,7 @@ def update_key_data_changes(update_data: AccountKeyringUpdate, key) -> Optional[ if value is None: continue - if isinstance(value, (TypeKey, StatusKey)): + if isinstance(value, (KeyType, KeyStatus)): update_values[field] = value.value else: update_values[field] = value diff --git a/api/api/services/user_role_validation.py b/api/api/services/user_role_validation.py index 6e1855e..5b97f83 100644 --- a/api/api/services/user_role_validation.py +++ b/api/api/services/user_role_validation.py @@ -3,12 +3,14 @@ from fastapi import ( status, ) from api.db.logic.account import get_user_login -from api.schemas.account.account import Role,Status +from api.db.tables.account import AccountRole + + async def db_user_role_validation(connection, current_user): authorize_user = await get_user_login(connection, current_user) - if authorize_user.role not in {Role.OWNER, Role.ADMIN}: + if authorize_user.role not in {AccountRole.OWNER, AccountRole.ADMIN}: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="You do not have enough permissions")