feat: added endpoints: auth, pofile, account, keyring #5

Merged
ivan.dev merged 10 commits from VORKOUT-4 into master 2025-05-15 15:21:33 +05:00
5 changed files with 22 additions and 26 deletions
Showing only changes of commit 29027bf9f8 - Show all commits

View File

@ -9,6 +9,7 @@ from fastapi import (
status,
)
from fastapi import FastAPI
from fastapi_jwt_auth import AuthJWT
@ -23,7 +24,8 @@ from api.schemas.endpoints.account import UserUpdate
from api.services.access_token_validadtion import AccessTokenValidadtion
from api.services.user_role_validation import db_user_role_validation
from api.services.update_data_validation import put_user_data_validator
from api.services.update_data_validation import put_user_data_changes
api_router = APIRouter(
prefix="/account",
@ -96,12 +98,10 @@ async def put_account(
detail="Account not found")
update_values = put_user_data_validator(user_update,user)
update_values = put_user_data_changes(user_update,user)
if update_values is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="The provided data already exists in the database")
return user
await put_user_id(connection, update_values, user)
ivan.dev marked this conversation as resolved
Review

А вот где неиспользуемые переменные, можешь объяснить зачем они, я просто не особо понял?
Вот к примеру user_update_data и authorize_user, это какой-то задел на будущее?

А вот где неиспользуемые переменные, можешь объяснить зачем они, я просто не особо понял? Вот к примеру `user_update_data` и `authorize_user`, это какой-то задел на будущее?
Review

Да, если логика поменяется.

Да, если логика поменяется.
@ -130,12 +130,11 @@ async def delete_account(
user_update = UserUpdate(status=Status.DELETED.value)
update_values = put_user_id_validator(user_update,user)
update_values = put_user_data_changes(user_update,user)
ivan.dev marked this conversation as resolved Outdated

put_user_id_validator выдает у меня ошибку, что имя не определено

`put_user_id_validator` выдает у меня ошибку, что имя не определено
if update_values is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="The provided data already exists in the database")
return user
await put_user_id(connection, update_values, user)

View File

@ -22,9 +22,11 @@ from api.db.logic.keyring import get_key_id,post_add_key,put_key_id
from api.schemas.account.account import Role,Status
from api.schemas.endpoints.account_keyring import AccountKeyringUpdate
from api.schemas.account.account_keyring import AccountKeyring
from api.services.access_token_validadtion import AccessTokenValidadtion
from api.services.user_role_validation import db_user_role_validation
from api.services.update_data_validation import put_key_data_validator
from api.services.update_data_validation import put_key_data_changes
api_router = APIRouter(
@ -100,12 +102,11 @@ async def put_keyring(
detail="keyring not found")
update_values = put_key_data_validator(keyring_update,keyring)
update_values = put_key_data_changes(keyring_update,keyring)
ivan.dev marked this conversation as resolved Outdated

А это разве ошибка, если изменений не было, но попытались сохранить данные?
Оно должно проходить без лишнего крика.

А это разве ошибка, если изменений не было, но попытались сохранить данные? Оно должно проходить без лишнего крика.
if update_values is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="The provided data already exists in the database")
return keyring
await put_key_id(connection, update_values, keyring)
@ -135,12 +136,10 @@ async def delete_keyring(
keyring_update = AccountKeyringUpdate(status=Status.DELETED.value)
update_values = put_key_validator(keyring_update,keyring)
update_values = put_key_data_changes(keyring_update,keyring)
if update_values is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="The provided data already exists in the database")
return keyring
await put_key_id(connection, update_values, keyring)

View File

@ -15,7 +15,7 @@ from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.connection.session import get_connection_dep
from api.db.logic.account import get_user_id, put_user_id,get_user_login
from api.services.update_data_validation import put_user_data_validator
from api.services.update_data_validation import put_user_data_changes
from api.schemas.endpoints.account import UserUpdate
@ -76,12 +76,10 @@ async def put_pofile(
detail="Account not found")
update_values = put_user_data_validator(user_updata,user)
update_values = put_user_data_changes(user_updata,user)
if update_values is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="The provided data already exists in the database")
return user
await put_user_id(connection, update_values, user)

View File

@ -3,7 +3,7 @@ from typing import Optional
from api.schemas.endpoints.account import UserUpdate, Role, Status
from api.schemas.endpoints.account_keyring import AccountKeyringUpdate, StatusKey, TypeKey
def put_user_data_validator(update_data: UserUpdate, user) -> Optional[dict]:
def put_user_data_changes(update_data: UserUpdate, user) -> Optional[dict]:
ivan.dev marked this conversation as resolved Outdated

По названию оно должно заниматься валидацией через DTO/модель, т.е. проверять поля на их соответствие типам и размерностям.

Тут скорее просится название put_user_data_changes() как вариант оптимизации избыточности вставки данных, но не проверки валидности.

Это не отменяет необходимости валидации данных. Либо Pydantic в модели, либо DTO с валидацией - ваш выбор.

По названию оно должно заниматься валидацией через DTO/модель, т.е. проверять поля на их соответствие типам и размерностям. Тут скорее просится название put_user_data_changes() как вариант оптимизации избыточности вставки данных, но не проверки валидности. Это не отменяет необходимости валидации данных. Либо Pydantic в модели, либо DTO с валидацией - ваш выбор.

Функция сравнивает то что пришло с таблицей Pydantic AccountKeyringUpdate(api\schemas\endpoints\account_keyring) где все точно такие же поля только все необязательные, это в данном случае и выполняет функцию валидации. Это не верное решение?

Функция сравнивает то что пришло с таблицей Pydantic AccountKeyringUpdate(api\schemas\endpoints\account_keyring) где все точно такие же поля только все необязательные, это в данном случае и выполняет функцию валидации. Это не верное решение?

У Pydantic же есть model_validate() и @validator() директива, в которой реализуется не только проверка размерности по типу данных, но и всякие дополнительные нюансы, к примеру длина логина, его состав (e-mail) и прочие дополнительные ограничения.

В классике там оно приходит уже провалидированным в методе:
https://stackoverflow.com/questions/78157897/sqlmodel-and-pydantic-data-validation

У Pydantic же есть model_validate() и @validator() директива, в которой реализуется не только проверка размерности по типу данных, но и всякие дополнительные нюансы, к примеру длина логина, его состав (e-mail) и прочие дополнительные ограничения. В классике там оно приходит уже провалидированным в методе: https://stackoverflow.com/questions/78157897/sqlmodel-and-pydantic-data-validation
"""
Сравнивает данные для обновления с текущими значениями пользователя.
Возвращает:
@ -36,7 +36,7 @@ def put_user_data_validator(update_data: UserUpdate, user) -> Optional[dict]:
return changes if changes else None
def put_key_data_validator(update_data: AccountKeyringUpdate, key) -> Optional[dict]:
def put_key_data_changes(update_data: AccountKeyringUpdate, key) -> Optional[dict]:
"""
Сравнивает данные для обновления с текущими значениями пользователя.
Возвращает:

View File

@ -40,7 +40,7 @@ async def init():
create_key_query = account_keyring_table.insert().values(
owner_id=user_id,
key_type=KeyType.PASSWORD,
key_id=KeyIdGenerator()
key_id=KeyIdGenerator(),
ivan.dev marked this conversation as resolved Outdated

Тут потерял запятую после key_id=KeyIdGenerator()

Тут потерял запятую после `key_id=KeyIdGenerator()`
key_value=hashed_password,
status=KeyStatus.ACTIVE,
)