360 lines
12 KiB
Python
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
|