from datetime import datetime from typing import Literal from pydantic import BaseModel ActionType = Literal["view", "edit"] ScopeType = Literal["site"] class PermissionGrantRequest(BaseModel): authentik_sub: str email: str | None = None display_name: str | None = None scope_type: ScopeType scope_id: str system: str module: str | None = None action: ActionType class PermissionRevokeRequest(BaseModel): authentik_sub: str scope_type: ScopeType scope_id: str system: str module: str | None = None action: ActionType class PermissionItem(BaseModel): scope_type: ScopeType scope_id: str system: str | None = None module: str action: ActionType class PermissionSnapshotResponse(BaseModel): authentik_sub: str permissions: list[PermissionItem] class DirectPermissionRow(BaseModel): permission_id: str authentik_sub: str email: str | None = None display_name: str | None = None scope_type: ScopeType scope_id: str system: str | None = None module: str | None = None action: ActionType created_at: datetime class DirectPermissionListResponse(BaseModel): items: list[DirectPermissionRow] total: int limit: int offset: int