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

1import secrets 

2from contextlib import suppress 

3 

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 

16 

17 

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()) 

27 

28 

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