Coverage for api/handlers/api_keys.py: 40%
21 statements
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
1import secrets
2from contextlib import suppress
4from exceptions import APIKeyGenerationFailed, NotAcceptableHTTPError
5from mongodb import api_keys_col, users_col
6from pymongo.errors import DuplicateKeyError
7from sotrans_models.models.admin.api_keys import (
8 APIKeyCreateModel,
9 APIKeyDBModel,
10)
11from sotrans_models.models.users import (
12 SotransOIDCUserModel,
13 SotransUserDBModel,
14)
15from utils.dt_utils import get_current_datetime
18async def save_key(name: str, creator: SotransUserDBModel):
19 key = secrets.token_urlsafe(32)
20 key_model = APIKeyCreateModel(
21 api_key=key,
22 created_at=get_current_datetime(),
23 owner=creator,
24 name=name,
25 )
26 return await api_keys_col.create(key_model.model_dump())
29async def on_create_api_key(
30 name: str, user: SotransOIDCUserModel
31) -> APIKeyDBModel | dict:
32 already_in = await api_keys_col.find_single("name", name)
33 if already_in:
34 raise NotAcceptableHTTPError("имя используется")
35 user = await users_col.find_single("id", user.sub)
36 for _ in range(3):
37 with suppress(DuplicateKeyError):
38 return await save_key(name, user)
39 raise APIKeyGenerationFailed