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
6 changed files with 29 additions and 29 deletions
Showing only changes of commit 22e2bca83c - Show all commits

View File

@ -60,7 +60,7 @@ async def get_user_login(connection: AsyncConnection, login: str) -> Optional[Us
return User.model_validate(user_data)
async def put_user_id(connection: AsyncConnection, update_values, user) -> Optional[User]:
async def update_user_id(connection: AsyncConnection, update_values, user) -> Optional[User]:
"""
Вносит изменеия в нужное поле таблицы account_table.
"""
@ -73,7 +73,7 @@ async def put_user_id(connection: AsyncConnection, update_values, user) -> Optio
await connection.commit()
async def post_add_user(connection: AsyncConnection, user: User, creator_id: int) -> Optional[User]:
async def create_user(connection: AsyncConnection, user: User, creator_id: int) -> Optional[User]:
"""
Создает нове поле в таблице account_table.
"""

View File

@ -36,7 +36,7 @@ async def get_key_id(connection: AsyncConnection, key_id: str) -> Optional[Accou
return AccountKeyring.model_validate(user_data)
async def put_key_id(connection: AsyncConnection, update_values, key) -> Optional[AccountKeyring]:
async def update_key_id(connection: AsyncConnection, update_values, key) -> Optional[AccountKeyring]:
"""
Вносит изменеия в нужное поле таблицы account_keyring_table.
"""
@ -49,7 +49,7 @@ async def put_key_id(connection: AsyncConnection, update_values, key) -> Optiona
await connection.commit()
async def post_add_key(connection: AsyncConnection, key: AccountKeyring, key_id:int) -> Optional[AccountKeyring]:
async def create_key(connection: AsyncConnection, key: AccountKeyring, key_id:int) -> Optional[AccountKeyring]:
"""
Создает нове поле в таблице account_keyring_table).
"""

View File

@ -17,14 +17,14 @@ 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, post_add_user,get_user_login
from api.db.logic.account import get_user_id, update_user_id, create_user,get_user_login
from api.schemas.account.account import User,Role,Status
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_changes
from api.services.update_data_validation import update_user_data_changes
api_router = APIRouter(
@ -54,7 +54,7 @@ async def get_account(user_id: int,
ivan.dev marked this conversation as resolved Outdated

Вот сейчас еще раз посмотрел, кажется, что лучше все-таки создание аккаунта делать на простой пост, без path параметра, а то как-то глупо получается, что мы хардкодим id, хотя у нас там автоинкремент идет)
@cyrussmeat какой роут использовать для создания пользователя, просто http://localhost:8000/api/v1/account/?

Вот сейчас еще раз посмотрел, кажется, что лучше все-таки создание аккаунта делать на простой пост, без `path` параметра, а то как-то глупо получается, что мы хардкодим `id`, хотя у нас там автоинкремент идет) @cyrussmeat какой роут использовать для создания пользователя, просто `http://localhost:8000/api/v1/account/`?
@api_router.post("")
async def post_account(
async def create_account(
user: UserUpdate,
connection: AsyncConnection = Depends(get_connection_dep),
Authorize: AuthJWT = Depends()
@ -68,7 +68,7 @@ async def post_account(
if user_validation is None:
await post_add_user(connection,user,authorize_user.id)
await create_user(connection,user,authorize_user.id)
user_new = await get_user_login(connection, user.login)
return user_new
@ -81,7 +81,7 @@ async def post_account(
ivan.dev marked this conversation as resolved
Review

По поводу имен, я думаю, что лучше вместо put, post использовать более наглядные update и create

По поводу имен, я думаю, что лучше вместо put, post использовать более наглядные update и create
@api_router.put("/{user_id}")
async def put_account(
async def update_account(
user_id: int,
user_update: UserUpdate,
connection: AsyncConnection = Depends(get_connection_dep),
@ -99,14 +99,14 @@ async def put_account(
detail="Account not found")
update_values = put_user_data_changes(user_update,user)
update_values = update_user_data_changes(user_update,user)
if update_values is None:
return user
ivan.dev marked this conversation as resolved
Review

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

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

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

Да, если логика поменяется.
user_update_data = User.model_validate(update_values)
await put_user_id(connection, update_values, user)
await update_user_id(connection, update_values, user)
user = await get_user_id(connection, user_id)
@ -133,13 +133,13 @@ async def delete_account(
ivan.dev marked this conversation as resolved Outdated

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

`put_user_id_validator` выдает у меня ошибку, что имя не определено
user_update = UserUpdate(status=Status.DELETED.value)
update_values = put_user_data_changes(user_update,user)
update_values = update_user_data_changes(user_update,user)
if update_values is None:
return user
await put_user_id(connection, update_values, user)
await update_user_id(connection, update_values, user)
user = await get_user_id(connection, user_id)

View File

@ -16,7 +16,7 @@ from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.connection.session import get_connection_dep
from api.db.logic.account import get_user_login
from api.db.logic.keyring import get_key_id,post_add_key,put_key_id
from api.db.logic.keyring import get_key_id,create_key,update_key_id
from api.schemas.account.account import Role,Status
@ -26,7 +26,7 @@ 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_changes
from api.services.update_data_validation import update_key_data_changes
api_router = APIRouter(
@ -56,7 +56,7 @@ async def get_keyring(
@api_router.post("/{user_id}/{key_id}")
async def post_keyring(
async def create_keyring(
user_id: int,
key_id: str,
key: AccountKeyringUpdate,
@ -72,7 +72,7 @@ async def post_keyring(
if keyring is None:
print(key.key_type)
user_new = await post_add_key(connection,key, key_id, )
user_new = await create_key(connection,key, key_id, )
return user_new
else:
@ -83,7 +83,7 @@ async def post_keyring(
@api_router.put("/{user_id}/{key_id}")
async def put_keyring(
async def update_keyring(
user_id: int,
key_id: str,
keyring_update: AccountKeyringUpdate,
@ -102,13 +102,13 @@ async def put_keyring(
detail="keyring not found")
update_values = put_key_data_changes(keyring_update,keyring)
update_values = update_key_data_changes(keyring_update,keyring)
ivan.dev marked this conversation as resolved Outdated

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

А это разве ошибка, если изменений не было, но попытались сохранить данные? Оно должно проходить без лишнего крика.
if update_values is None:
return keyring
await put_key_id(connection, update_values, keyring)
await update_key_id(connection, update_values, keyring)
keyring = await get_key_id(connection, key_id)
@ -136,12 +136,12 @@ async def delete_keyring(
keyring_update = AccountKeyringUpdate(status=Status.DELETED.value)
update_values = put_key_data_changes(keyring_update,keyring)
update_values = update_key_data_changes(keyring_update,keyring)
if update_values is None:
return keyring
await put_key_id(connection, update_values, keyring)
await update_key_id(connection, update_values, keyring)
keyring = await get_key_id(connection, key_id)

View File

@ -14,8 +14,8 @@ from fastapi_jwt_auth import AuthJWT
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_changes
from api.db.logic.account import get_user_id, update_user_id,get_user_login
from api.services.update_data_validation import update_user_data_changes
from api.schemas.endpoints.account import UserUpdate
@ -53,7 +53,7 @@ async def get_pofile(user_id: int,
@api_router.put("/{user_id}")
async def put_pofile(
async def update_pofile(
user_id: int,
user_updata: UserUpdate,
connection: AsyncConnection = Depends(get_connection_dep),
@ -76,12 +76,12 @@ async def put_pofile(
detail="Account not found")
update_values = put_user_data_changes(user_updata,user)
update_values = update_user_data_changes(user_updata,user)
if update_values is None:
return user
await put_user_id(connection, update_values, user)
await update_user_id(connection, update_values, user)
user = await get_user_id(connection, user_id)

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_changes(update_data: UserUpdate, user) -> Optional[dict]:
def update_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_changes(update_data: UserUpdate, user) -> Optional[dict]:
return changes if changes else None
def put_key_data_changes(update_data: AccountKeyringUpdate, key) -> Optional[dict]:
def update_key_data_changes(update_data: AccountKeyringUpdate, key) -> Optional[dict]:
"""
Сравнивает данные для обновления с текущими значениями пользователя.
Возвращает: