feat: added endpoints: auth, pofile, account, keyring #5
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "VORKOUT-4"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
@ -0,0 +49,4 @@
return user, password
async def upgrade_old_refresh_token(connection: AsyncConnection, user) -> Optional[User]:
Он все текущие токены пометит устаревшими у аккаунта?
Тут момент - он должен экспайрить конкретный рефреш токен, т.к. один Пользователь может заходить с нескольких устройств.
Как при решении этой проблемы привязать рефреш токен к конкретной сессии?
Когда пользователь заходит(логин/пароль) я могу получить только все ключи по его ID.
Ты прав в отсутствии привязки. А я про то, что в update_query надо ставить фильтрацию по expiry как минимум, т.е. при генерации нового рефреша не губить скопом все старые как минимум.
По поводу сессионной привязки я подумаю, стоит ли её организовывать по идентификатору сессию, который по идее должен тоже быть у нас на руках.
@ -0,0 +39,4 @@
connection: AsyncConnection = Depends(get_connection_dep),
Authorize: AuthJWT = Depends()):
current_user = AccessTokenValidadtion(Authorize)
Я вижу тут повторяющийся в каждом методе паттерн "взять текущего пользователя/получить его данные".
Не думал сделать общий механизм через middleware?
@app.middleware("http")
@ -0,0 +102,4 @@
update_values = put_key_data_validator(keyring_update,keyring)
if update_values is None:
А это разве ошибка, если изменений не было, но попытались сохранить данные?
Оно должно проходить без лишнего крика.
@ -0,0 +3,4 @@
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]:
По названию оно должно заниматься валидацией через DTO/модель, т.е. проверять поля на их соответствие типам и размерностям.
Тут скорее просится название put_user_data_changes() как вариант оптимизации избыточности вставки данных, но не проверки валидности.
Это не отменяет необходимости валидации данных. Либо Pydantic в модели, либо DTO с валидацией - ваш выбор.
Функция сравнивает то что пришло с таблицей Pydantic AccountKeyringUpdate(api\schemas\endpoints\account_keyring) где все точно такие же поля только все необязательные, это в данном случае и выполняет функцию валидации. Это не верное решение?
У Pydantic же есть model_validate() и @validator() директива, в которой реализуется не только проверка размерности по типу данных, но и всякие дополнительные нюансы, к примеру длина логина, его состав (e-mail) и прочие дополнительные ограничения.
В классике там оно приходит уже провалидированным в методе:
https://stackoverflow.com/questions/78157897/sqlmodel-and-pydantic-data-validation
@ -0,0 +52,4 @@
@api_router.post("/{user_id}")
async def post_account(
Вот сейчас еще раз посмотрел, кажется, что лучше все-таки создание аккаунта делать на простой пост, без
path
параметра, а то как-то глупо получается, что мы хардкодимid
, хотя у нас там автоинкремент идет)@cyrussmeat какой роут использовать для создания пользователя, просто
http://localhost:8000/api/v1/account/
?@ -0,0 +78,4 @@
@api_router.put("/{user_id}")
async def put_account(
По поводу имен, я думаю, что лучше вместо put, post использовать более наглядные update и create
@ -0,0 +107,4 @@
@api_router.post("/refresh")
def refresh(
Тут
access_token
же должен возвращаться теле ответа, разве нет?Новый(сгенерированный) или старый?
Генерируешь новый
access_token
на основе валидногоrefresh
По сути, надо просто поменять ответ, вместо проставления
access_token
в куки, вернуть его в теле@ -39,6 +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()
@ -0,0 +130,4 @@
user_update = UserUpdate(status=Status.DELETED.value)
update_values = put_user_id_validator(user_update,user)
put_user_id_validator
выдает у меня ошибку, что имя не определено@ -0,0 +103,4 @@
if update_values is None:
return user
user_update_data = User.model_validate({**user.model_dump(), **update_values})
А вот где неиспользуемые переменные, можешь объяснить зачем они, я просто не особо понял?
Вот к примеру
user_update_data
иauthorize_user
, это какой-то задел на будущее?Да, если логика поменяется.
@ -0,0 +27,4 @@
@api_router.get("/{user_id}")
async def get_profile(
Тут, наверное, надо переделать
Профиль не должен зависеть от
id
, то есть, можно переделать роут на просто/profile
Сам пользователя можно брать из загрузки jwt, вроде там уже есть
login
@ -0,0 +46,4 @@
@api_router.put("/{user_id}")
async def update_profile(
Тут тоже самое, что и с
get_profile
, только вот по поводу обновления полей@cyrussmeat какие поля пользователь не может сам себе обновить? Роль?
Роль и Логин
Checkout
From your project repository, check out a new branch and test the changes.