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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 12:26 +0800
1"""API Key model for Lexigram Auth."""
3from __future__ import annotations
5from dataclasses import dataclass, field
6from datetime import datetime
9@dataclass(frozen=True)
10class APIKey:
11 """API Key data model.
13 Used for service-to-service authentication.
14 """
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
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())
36__all__ = [
37 "APIKey",
38]