Coverage for src/lexigram/auth/models/apikey.py: 86%

22 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 12:26 +0800

1"""API Key model for Lexigram Auth.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass, field 

6from datetime import datetime 

7 

8 

9@dataclass(frozen=True) 

10class APIKey: 

11 """API Key data model. 

12 

13 Used for service-to-service authentication. 

14 """ 

15 

16 key_id: str 

17 name: str 

18 key_hash: str 

19 prefix: str 

20 user_id: str 

21 scopes: list[str] = field(default_factory=list) 

22 expires_at: datetime | None = None 

23 last_used_at: datetime | None = None 

24 last_used_ip: str | None = None 

25 revoked_at: datetime | None = None 

26 created_at: datetime | None = None 

27 updated_at: datetime | None = None 

28 

29 def is_active(self) -> bool: 

30 """Check if the key is active and not expired or revoked.""" 

31 if self.revoked_at is not None: 

32 return False 

33 return not (self.expires_at is not None and self.expires_at < datetime.now()) 

34 

35 

36__all__ = [ 

37 "APIKey", 

38]