Files
govoplan-idm/src/govoplan_idm/backend/api/v1/schemas.py
T

360 lines
12 KiB
Python

from __future__ import annotations
from datetime import datetime
from typing import Any, Literal
from pydantic import Field
from pydantic import BaseModel
AuditDetailLevel = Literal["summary", "standard", "full"]
class OrganizationIdentityCandidate(BaseModel):
id: str
display_name: str | None = None
external_subject: str | None = None
source: str
primary_account_id: str | None = None
account_ids: list[str]
status: str
class OrganizationIdentityCandidateList(BaseModel):
identities: list[OrganizationIdentityCandidate]
class OrganizationFunctionAssignmentItem(BaseModel):
id: str
tenant_id: str
identity_id: str
account_id: str | None = None
function_id: str
organization_unit_id: str
applies_to_subunits: bool
source: str
delegated_from_assignment_id: str | None = None
acting_for_account_id: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
expired_event_at: datetime | None = None
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationFunctionAssignmentList(BaseModel):
assignments: list[OrganizationFunctionAssignmentItem]
total: int = 0
page: int = 1
page_size: int = 500
pages: int = 1
class OrganizationFunctionAssignmentCreateRequest(BaseModel):
identity_id: str = Field(min_length=1)
function_id: str = Field(min_length=1)
account_id: str | None = None
applies_to_subunits: bool = False
source: str = "direct"
delegated_from_assignment_id: str | None = None
acting_for_account_id: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool = True
settings: dict[str, Any] = Field(default_factory=dict)
change_request_id: str | None = None
governance_override_reason: str | None = Field(default=None, max_length=4_000)
governance_override_evidence: list[str] = Field(
default_factory=list, max_length=100
)
class OrganizationFunctionAssignmentUpdateRequest(BaseModel):
identity_id: str | None = None
function_id: str | None = None
account_id: str | None = None
applies_to_subunits: bool | None = None
source: str | None = None
delegated_from_assignment_id: str | None = None
acting_for_account_id: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool | None = None
settings: dict[str, Any] | None = None
change_request_id: str | None = None
governance_override_reason: str | None = Field(default=None, max_length=4_000)
governance_override_evidence: list[str] = Field(
default_factory=list, max_length=100
)
class IdmSettingsItem(BaseModel):
tenant_id: str
require_assignment_change_requests: bool
audit_detail_level: AuditDetailLevel
change_retention_days: int | None = None
settings: dict[str, Any]
created_at: datetime | None = None
updated_at: datetime | None = None
class IdmSettingsUpdateRequest(BaseModel):
require_assignment_change_requests: bool | None = None
audit_detail_level: AuditDetailLevel | None = None
change_retention_days: int | None = Field(default=None, ge=0)
settings: dict[str, Any] | None = None
class TypedGroupItem(BaseModel):
id: str
tenant_id: str
key: str
name: str
group_type: str
description: str | None = None
status: Literal["active", "inactive"]
source_provider: str
source_resource_type: str | None = None
source_resource_id: str | None = None
source_revision: str | None = None
properties: dict[str, Any]
provenance: dict[str, Any]
revision: int
created_at: datetime | None = None
updated_at: datetime | None = None
class TypedGroupList(BaseModel):
groups: list[TypedGroupItem]
total: int
class TypedGroupCreateRequest(BaseModel):
key: str = Field(min_length=1, max_length=120)
name: str = Field(min_length=1, max_length=255)
group_type: str = Field(min_length=1, max_length=80)
description: str | None = Field(default=None, max_length=8_000)
source_provider: str = Field(default="local", min_length=1, max_length=80)
source_resource_type: str | None = Field(default=None, max_length=120)
source_resource_id: str | None = Field(default=None, max_length=255)
source_revision: str | None = Field(default=None, max_length=255)
properties: dict[str, Any] = Field(default_factory=dict)
provenance: dict[str, Any] = Field(default_factory=dict)
class TypedGroupUpdateRequest(BaseModel):
base_revision: int = Field(ge=1)
key: str | None = Field(default=None, min_length=1, max_length=120)
name: str | None = Field(default=None, min_length=1, max_length=255)
group_type: str | None = Field(default=None, min_length=1, max_length=80)
description: str | None = Field(default=None, max_length=8_000)
status: Literal["active", "inactive"] | None = None
source_provider: str | None = Field(default=None, min_length=1, max_length=80)
source_resource_type: str | None = Field(default=None, max_length=120)
source_resource_id: str | None = Field(default=None, max_length=255)
source_revision: str | None = Field(default=None, max_length=255)
properties: dict[str, Any] | None = None
provenance: dict[str, Any] | None = None
class IdentityRelationshipItem(BaseModel):
id: str
tenant_id: str
relationship_kind: str
subject_identity_id: str
target_group_id: str | None = None
related_identity_id: str | None = None
role: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
status: Literal["active", "revoked"]
revoked_at: datetime | None = None
revoked_by: str | None = None
revocation_reason: str | None = None
expired_event_at: datetime | None = None
source_provider: str
source_resource_type: str | None = None
source_resource_id: str | None = None
source_revision: str | None = None
properties: dict[str, Any]
provenance: dict[str, Any]
revision: int
created_at: datetime | None = None
updated_at: datetime | None = None
class IdentityRelationshipList(BaseModel):
relationships: list[IdentityRelationshipItem]
total: int
class IdentityRelationshipCreateRequest(BaseModel):
relationship_kind: str = Field(min_length=1, max_length=80)
subject_identity_id: str = Field(min_length=1, max_length=36)
target_group_id: str | None = Field(default=None, max_length=36)
related_identity_id: str | None = Field(default=None, max_length=36)
role: str | None = Field(default=None, max_length=120)
valid_from: datetime | None = None
valid_until: datetime | None = None
source_provider: str = Field(default="local", min_length=1, max_length=80)
source_resource_type: str | None = Field(default=None, max_length=120)
source_resource_id: str | None = Field(default=None, max_length=255)
source_revision: str | None = Field(default=None, max_length=255)
properties: dict[str, Any] = Field(default_factory=dict)
provenance: dict[str, Any] = Field(default_factory=dict)
class IdentityRelationshipUpdateRequest(BaseModel):
base_revision: int = Field(ge=1)
relationship_kind: str | None = Field(default=None, min_length=1, max_length=80)
target_group_id: str | None = Field(default=None, max_length=36)
related_identity_id: str | None = Field(default=None, max_length=36)
role: str | None = Field(default=None, max_length=120)
valid_from: datetime | None = None
valid_until: datetime | None = None
source_provider: str | None = Field(default=None, min_length=1, max_length=80)
source_resource_type: str | None = Field(default=None, max_length=120)
source_resource_id: str | None = Field(default=None, max_length=255)
source_revision: str | None = Field(default=None, max_length=255)
properties: dict[str, Any] | None = None
provenance: dict[str, Any] | None = None
class IdentityRelationshipRevokeRequest(BaseModel):
base_revision: int = Field(ge=1)
reason: str = Field(min_length=1, max_length=8_000)
class IdentityRelationshipDecisionItem(BaseModel):
relationship: IdentityRelationshipItem
included: bool
code: str
explanation: str
identity_status: str | None = None
class TypedGroupMembershipResolutionItem(BaseModel):
group: TypedGroupItem
effective_at: datetime
decisions: list[IdentityRelationshipDecisionItem]
identity_ids: list[str]
FunctionAssignmentChangeKind = Literal["request", "grant"]
FunctionAssignmentChangeAction = Literal[
"approve",
"reject",
"accept",
"request_changes",
"respond",
"withdraw",
"recover",
]
class FunctionAssignmentChangeCreateRequest(BaseModel):
kind: FunctionAssignmentChangeKind
function_id: str = Field(min_length=1, max_length=36)
candidate_identity_id: str = Field(min_length=1, max_length=36)
candidate_account_id: str | None = Field(default=None, max_length=36)
justification: str = Field(min_length=1, max_length=8_000)
evidence: list[str] = Field(default_factory=list, max_length=100)
requested_valid_from: datetime | None = None
requested_valid_until: datetime | None = None
applies_to_subunits: bool = False
assignment_source: Literal["governance", "delegated"] = "governance"
represented_assignment_id: str | None = Field(default=None, max_length=36)
idempotency_key: str = Field(min_length=1, max_length=255)
metadata: dict[str, Any] = Field(default_factory=dict)
class FunctionAssignmentChangeActionRequest(BaseModel):
action: FunctionAssignmentChangeAction
base_revision: int = Field(ge=1)
comment: str | None = Field(default=None, max_length=4_000)
evidence: list[str] = Field(default_factory=list, max_length=100)
class FunctionAssignmentChangeEventItem(BaseModel):
id: str
sequence: int
action: str
from_state: str | None = None
to_state: str
actor_account_id: str | None = None
actor_identity_id: str | None = None
actor_assignment_id: str | None = None
comment: str | None = None
evidence: list[str]
policy_decision: dict[str, Any]
workflow_step_id: str | None = None
details: dict[str, Any]
created_at: datetime
class FunctionAssignmentChangeItem(BaseModel):
id: str
tenant_id: str
kind: FunctionAssignmentChangeKind
state: str
profile: str
function_id: str
organization_unit_id: str
candidate_identity_id: str
candidate_account_id: str | None = None
initiator_account_id: str
initiator_identity_id: str | None = None
represented_assignment_id: str | None = None
justification: str
evidence: list[str]
requested_valid_from: datetime | None = None
requested_valid_until: datetime | None = None
applies_to_subunits: bool
assignment_source: str
required_steps: list[str]
completed_steps: list[str]
policy_decision: dict[str, Any]
workflow_definition_id: str | None = None
workflow_definition_revision_id: str | None = None
workflow_definition_revision: int | None = None
workflow_definition_hash: str | None = None
workflow_instance_id: str | None = None
workflow_current_step_id: str | None = None
resulting_assignment_id: str | None = None
expires_at: datetime | None = None
outcome_reason: str | None = None
resource_revision: int
etag: str
metadata: dict[str, Any]
events: list[FunctionAssignmentChangeEventItem] = Field(default_factory=list)
available_actions: list[str] = Field(default_factory=list)
availability_reason: str | None = None
created_at: datetime
updated_at: datetime
class FunctionAssignmentChangeList(BaseModel):
changes: list[FunctionAssignmentChangeItem]
total: int
page: int
page_size: int
pages: int
class FunctionAssignmentCapabilityItem(BaseModel):
kind: FunctionAssignmentChangeKind
function_id: str
available: bool
reason: str | None = None
profile: str = "unavailable"
required_steps: list[str] = Field(default_factory=list)
requirements: list[str] = Field(default_factory=list)
authority_function_id: str | None = None
evidence_required: bool = False
recipient_acceptance_required: bool = False
maximum_validity_days: int | None = None
workflow_available: bool = False
policy_available: bool = False