feat: added endpoints: auth, pofile, account, keyring #5
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, passwordasync 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, Statusfrom api.schemas.endpoints.account_keyring import AccountKeyringUpdate, StatusKey, TypeKeydef 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 useruser_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 какие поля пользователь не может сам себе обновить? Роль?
Роль и Логин
@@ -0,0 +52,4 @@try:current_user = Authorize.get_jwt_subject()print(current_user)Так, а куда это оно выводит, stdout ?