fix: model, name

This commit is contained in:
TheNoxium 2025-06-03 13:01:10 +05:00
parent 31236d558f
commit c60d19262e
12 changed files with 59 additions and 114 deletions

View File

@ -13,9 +13,9 @@ from api.schemas.account.account import User
from api.schemas.endpoints.account import AllUserResponse, all_user_adapter 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) 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) result = await connection.execute(query)
count_result = await connection.execute(count_query) count_result = await connection.execute(count_query)
users_data = result.fetchall() users_data = result.mappings().all()
total_count = count_result.scalar() total_count = count_result.scalar()
total_pages = math.ceil(total_count / limit) total_pages = math.ceil(total_count / limit)
validated_users = all_user_adapter.validate_python(users_data)
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]
)
return AllUserResponse( return AllUserResponse(
users=validated_users, users=validated_users,

View File

@ -8,16 +8,16 @@ from api.db import metadata
class AccountRole(str,Enum): class AccountRole(str,Enum):
OWNER = auto() OWNER = 'OWNER'
ADMIN = auto() ADMIN = 'ADMIN'
EDITOR = auto() EDITOR = 'EDITOR'
VIEWER = auto() VIEWER = 'VIEWER'
class AccountStatus(str,Enum): class AccountStatus(str,Enum):
ACTIVE = auto() ACTIVE = 'ACTIVE'
DISABLED = auto() DISABLED = 'DISABLED'
BLOCKED = auto() BLOCKED = 'BLOCKED'
DELETED = auto() DELETED = 'DELETED'
account_table = Table( account_table = Table(
@ -38,15 +38,15 @@ account_table = Table(
) )
class KeyType(str,Enum): class KeyType(str,Enum):
PASSWORD = auto() PASSWORD = "PASSWORD"
ACCESS_TOKEN = auto() ACCESS_TOKEN = "ACCESS_TOKEN"
REFRESH_TOKEN = auto() REFRESH_TOKEN = "REFRESH_TOKEN"
API_KEY = auto() API_KEY = "API_KEY"
class KeyStatus(str,Enum): class KeyStatus(str,Enum):
ACTIVE = auto() ACTIVE = "ACTIVE"
EXPIRED = auto() EXPIRED = "EXPIRED"
DELETED = auto() DELETED = "DELETED"
account_keyring_table = Table( account_keyring_table = Table(
'account_keyring', metadata, 'account_keyring', metadata,

View File

@ -11,9 +11,10 @@ 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_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 from api.schemas.endpoints.account import UserUpdate,AllUserResponse
@ -41,7 +42,7 @@ async def get_all_account(
current_user = request.state.current_user current_user = request.state.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_all_users_login_and_id(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(
@ -146,7 +147,7 @@ async def delete_account(
detail="Account not found") 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) update_values = update_user_data_changes(user_update,user)

View File

@ -2,9 +2,7 @@ from datetime import datetime, timedelta, timezone
from fastapi import ( from fastapi import (
APIRouter, APIRouter,
Body,
Depends, Depends,
Form,
HTTPException, HTTPException,
Request, Request,
Response, Response,

View File

@ -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.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.endpoints.account_keyring import AccountKeyringUpdate
from api.schemas.account.account_keyring import AccountKeyring from api.schemas.account.account_keyring import AccountKeyring
@ -135,7 +136,7 @@ async def delete_keyring(
detail="keyring not found") 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) update_values = update_key_data_changes(keyring_update,keyring)

View File

@ -1,22 +1,9 @@
import datetime import datetime
from enum import Enum
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
from pydantic import BaseModel, EmailStr, Field 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): class User(BaseModel):
id: Optional[int] = None id: Optional[int] = None
@ -24,8 +11,8 @@ class User(BaseModel):
login: str = Field(..., max_length=100) login: str = Field(..., max_length=100)
email: Optional[EmailStr] = Field(None, max_length=100) # Электронная почта (может быть None) email: Optional[EmailStr] = Field(None, max_length=100) # Электронная почта (может быть None)
bind_tenant_id: Optional[str] = Field(None, max_length=40) bind_tenant_id: Optional[str] = Field(None, max_length=40)
role: Role role: AccountRole
meta: dict meta: dict
creator_id: Optional[int] = None creator_id: Optional[int] = None
created_at: datetime created_at: datetime
status: Status status: AccountStatus

View File

@ -1,28 +1,15 @@
import datetime import datetime
from enum import Enum from typing import Optional
from typing import Optional, Dict
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from datetime import datetime from datetime import datetime
from api.db.tables.account import KeyType,KeyStatus
# Модель для хранения информации из запроса
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"
class AccountKeyring(BaseModel): class AccountKeyring(BaseModel):
owner_id: int owner_id: int
key_type: TypeKey # Используем тот же KeyType key_type: KeyType
key_id: Optional[str] = Field(None, max_length=40) # Изменено на None как default key_id: Optional[str] = Field(None, max_length=40)
key_value: str = Field(..., max_length=255) key_value: str = Field(..., max_length=255)
created_at: datetime created_at: datetime
expiry: Optional[datetime] = None expiry: Optional[datetime] = None
status: StatusKey status: KeyStatus

View File

@ -1,21 +1,10 @@
from enum import Enum
from typing import Optional, List from typing import Optional, List
from datetime import datetime from datetime import datetime
from pydantic import BaseModel, EmailStr, Field, TypeAdapter 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): class UserUpdate(BaseModel):
id: Optional[int] = None id: Optional[int] = None
@ -23,21 +12,21 @@ class UserUpdate(BaseModel):
login: Optional[str] = Field(None, max_length=100) login: Optional[str] = Field(None, max_length=100)
email: Optional[EmailStr] = None email: Optional[EmailStr] = None
bind_tenant_id: Optional[str] = Field(None, max_length=40) bind_tenant_id: Optional[str] = Field(None, max_length=40)
role: Optional[Role] = None role: Optional[AccountRole] = None
meta: Optional[dict] = None meta: Optional[dict] = None
creator_id: Optional[int] = None creator_id: Optional[int] = None
created_at: Optional[datetime] = None created_at: Optional[datetime] = None
status: Optional[Status] = None status: Optional[AccountStatus] = None
class AllUser(BaseModel): class AllUser(BaseModel):
id: int id: int
name: str name: str
login: str login: str
email: EmailStr email: Optional[EmailStr] = None
bind_tenant_id: str bind_tenant_id: Optional[str] = None
role: Role role: AccountRole
created_at: datetime created_at: datetime
status: Status status: AccountStatus
class AllUserResponse(BaseModel): class AllUserResponse(BaseModel):

View File

@ -1,28 +1,15 @@
import datetime import datetime
from enum import Enum
from typing import Optional from typing import Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from datetime import datetime from datetime import datetime
from api.db.tables.account import KeyType,KeyStatus
# Таблица для получения информации из запроса
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"
class AccountKeyringUpdate(BaseModel): class AccountKeyringUpdate(BaseModel):
owner_id: Optional[int] = None 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_id: Optional[str] = Field(None, max_length=40)
key_value: Optional[str] = Field(None, max_length=255) key_value: Optional[str] = Field(None, max_length=255)
created_at: Optional[datetime] = None created_at: Optional[datetime] = None
expiry: Optional[datetime] = None expiry: Optional[datetime] = None
status: Optional[StatusKey] = None status: Optional[KeyStatus] = None

View File

@ -2,7 +2,9 @@ from typing import Optional
from sqlalchemy.ext.asyncio import AsyncConnection from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.logic.auth import get_user from api.db.logic.auth import get_user
# # from backend.schemas.users.token import TokenData # # 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 from api.utils.hasher import Hasher
@ -14,7 +16,7 @@ async def authenticate_user(
sql_user,sql_password = await get_user(connection, username) 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 return None
hasher = Hasher() hasher = Hasher()
if not hasher.verify_data(password, sql_password.key_value): if not hasher.verify_data(password, sql_password.key_value):

View File

@ -1,7 +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, Role, Status from api.schemas.endpoints.account import UserUpdate
from api.schemas.endpoints.account_keyring import AccountKeyringUpdate, StatusKey, TypeKey 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]: 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: if value is None:
continue continue
if isinstance(value, (Role, Status)): if isinstance(value, (AccountRole, AccountStatus)):
update_values[field] = value.value update_values[field] = value.value
else: else:
update_values[field] = value update_values[field] = value
@ -50,7 +52,7 @@ def update_key_data_changes(update_data: AccountKeyringUpdate, key) -> Optional[
if value is None: if value is None:
continue continue
if isinstance(value, (TypeKey, StatusKey)): if isinstance(value, (KeyType, KeyStatus)):
update_values[field] = value.value update_values[field] = value.value
else: else:
update_values[field] = value update_values[field] = value

View File

@ -3,12 +3,14 @@ from fastapi import (
status, status,
) )
from api.db.logic.account import get_user_login 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): async def db_user_role_validation(connection, current_user):
authorize_user = await get_user_login(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( raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN, status_code=status.HTTP_403_FORBIDDEN,
detail="You do not have enough permissions") detail="You do not have enough permissions")