57 lines
1.2 KiB
Python
57 lines
1.2 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from dataclasses import dataclass, field
|
||
|
|
from typing import Any, Literal
|
||
|
|
|
||
|
|
ProtocolName = Literal["rest", "mcp"]
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True, slots=True)
|
||
|
|
class ActorClaims:
|
||
|
|
actor_id: str
|
||
|
|
tenant_id: str
|
||
|
|
lane: str = "green"
|
||
|
|
scopes: frozenset[str] = field(default_factory=frozenset)
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True, slots=True)
|
||
|
|
class CapabilityRequest:
|
||
|
|
capability_id: str
|
||
|
|
tenant_id: str
|
||
|
|
actor_claims: ActorClaims
|
||
|
|
resource_scope: str
|
||
|
|
request_args: dict[str, Any]
|
||
|
|
protocol: ProtocolName
|
||
|
|
response_class: str = "operational_summary"
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True, slots=True)
|
||
|
|
class PolicyDecision:
|
||
|
|
allowed: bool
|
||
|
|
capability_id: str
|
||
|
|
policy_version: int
|
||
|
|
reason: str
|
||
|
|
request_args: dict[str, Any] = field(default_factory=dict)
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True, slots=True)
|
||
|
|
class QontoCredentials:
|
||
|
|
api_user: str
|
||
|
|
api_key: str
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True, slots=True)
|
||
|
|
class AuditEvent:
|
||
|
|
request_id: str
|
||
|
|
timestamp: str
|
||
|
|
actor: str
|
||
|
|
tenant_id: str
|
||
|
|
capability: str
|
||
|
|
protocol: ProtocolName
|
||
|
|
decision: str
|
||
|
|
deny_reason: str | None
|
||
|
|
policy_version: int
|
||
|
|
latency_ms: int
|
||
|
|
qonto_http_status: int | None = None
|
||
|
|
result_count: int | None = None
|