VORKOUT-8 #13

Merged
vlad.dev merged 30 commits from VORKOUT-8 into master 2025-07-02 12:23:44 +05:00
Showing only changes of commit 4c0beb24f9 - Show all commits

View File

@ -3,12 +3,12 @@ from enum import Enum
from typing import Optional
from sqlalchemy import insert, select, update
from sqlalchemy.dialects.mysql import insert as mysql_insert
from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.tables.account import account_keyring_table, KeyStatus, KeyType
from api.schemas.account.account_keyring import AccountKeyring
from api.utils.hasher import hasher
from api.utils.key_id_gen import KeyIdGenerator
async def get_key_by_id(connection: AsyncConnection, key_id: str) -> Optional[AccountKeyring]:
@ -73,15 +73,19 @@ async def create_key(connection: AsyncConnection, key: AccountKeyring, key_id: i
async def create_password_key(connection: AsyncConnection, password: str | None, owner_id: int):
if password is None:
password = hasher.generate_password()
stmt = insert(account_keyring_table).values(
hashed_password = hasher.hash_data(password)
stmt = mysql_insert(account_keyring_table).values(
owner_id=owner_id,
key_type=KeyType.PASSWORD.value,
Review

Может тут два пароля с разными id создаться, получается?

Может тут два пароля с разными id создаться, получается?
Review

Нет, не должны
Есть какие-то предпосылки? Я просто не вижу такой возможности

Нет, не должны Есть какие-то предпосылки? Я просто не вижу такой возможности
Review

Ну, просто в моменте у нас может быть несколько ключей одного типа (API KEY как минимум), но с разными key_id, и по идее уникальность тут обеспечивается в том числе key_id, т.е. если key_type:PASSWORD присваивать разные key_id, то в случае двойной сработки create_password_key (я не увидел блокировки на двойной вызов этого метода чисто из-за сбоя сетевого стека, к примеру), то мы получим два ключа key_type:PASSWORD ?

решается тем, что паролю надо key_id прописывать статичный, кмк.

Ну, просто в моменте у нас может быть несколько ключей одного типа (API KEY как минимум), но с разными key_id, и по идее уникальность тут обеспечивается в том числе key_id, т.е. если key_type:PASSWORD присваивать разные key_id, то в случае двойной сработки create_password_key (я не увидел блокировки на двойной вызов этого метода чисто из-за сбоя сетевого стека, к примеру), то мы получим два ключа key_type:PASSWORD ? решается тем, что паролю надо key_id прописывать статичный, кмк.
Review

Тогда на основе чего его генерить?
У нас там сейчас f"{datetime.now().strftime('%Y-%m-%d')}-{random_number}", где random_number четырехзначное число, брать id пользователя?

Тогда на основе чего его генерить? У нас там сейчас `f"{datetime.now().strftime('%Y-%m-%d')}-{random_number}"`, где `random_number` четырехзначное число, брать id пользователя?
Review

А я не вижу необходимости генерить его конкретно для PASSWORD, просто прописать статичный литерал 'password' к примеру и сделать фоллбэк в случае, если при создании key_type: PASSWORD на конкретном пользователе уже существует такой ключ, я бы сделал его либо на обновление, либо просто пропуск.

А я не вижу необходимости генерить его конкретно для PASSWORD, просто прописать статичный литерал 'password' к примеру и сделать фоллбэк в случае, если при создании key_type: PASSWORD на конкретном пользователе уже существует такой ключ, я бы сделал его либо на обновление, либо просто пропуск.
key_id=KeyIdGenerator(),
key_value=hasher.hash_data(password),
key_id="PASSWORD",
key_value=hashed_password,
created_at=datetime.now(timezone.utc),
expiry=datetime.now(timezone.utc) + timedelta(days=365),
status=KeyStatus.ACTIVE,
)
stmt.on_duplicate_key_update(
key_value=hashed_password
)
await connection.execute(stmt)
await connection.commit()