from datetime import datetime from pydantic import BaseModel, Field class ListResponse(BaseModel): items: list total: int limit: int offset: int class CompanyCreateRequest(BaseModel): display_name: str legal_name: str | None = None status: str = "active" class CompanyUpdateRequest(BaseModel): display_name: str | None = None legal_name: str | None = None provider_group_id: str | None = None status: str | None = None class CompanyItem(BaseModel): id: str company_key: str display_name: str legal_name: str | None = None provider_group_id: str | None = None status: str class SiteCreateRequest(BaseModel): company_key: str display_name: str domain: str | None = None status: str = "active" class SiteUpdateRequest(BaseModel): company_key: str | None = None display_name: str | None = None domain: str | None = None provider_group_id: str | None = None status: str | None = None class SiteItem(BaseModel): id: str site_key: str company_key: str company_display_name: str display_name: str domain: str | None = None provider_group_id: str | None = None status: str class SystemCreateRequest(BaseModel): name: str provider_client_id: str status: str = "active" class SystemUpdateRequest(BaseModel): name: str | None = None provider_client_id: str | None = None status: str | None = None class SystemItem(BaseModel): id: str system_key: str name: str provider_client_id: str status: str class RoleCreateRequest(BaseModel): system_key: str name: str provider_role_name: str description: str | None = None status: str = "active" class RoleUpdateRequest(BaseModel): system_key: str | None = None name: str | None = None provider_role_name: str | None = None description: str | None = None status: str | None = None class RoleItem(BaseModel): id: str role_key: str system_key: str system_name: str name: str provider_role_name: str description: str | None = None status: str class MemberItem(BaseModel): id: str user_sub: str provider_user_id: str | None = None username: str | None = None email: str | None = None display_name: str | None = None is_active: bool status: str class MemberUpsertRequest(BaseModel): user_sub: str | None = None username: str | None = None email: str | None = None display_name: str | None = None is_active: bool = True status: str = "active" sync_to_idp: bool = True class MemberUpdateRequest(BaseModel): username: str | None = None email: str | None = None display_name: str | None = None is_active: bool | None = None status: str | None = None sync_to_idp: bool = True class MemberPasswordResetResponse(BaseModel): user_sub: str temporary_password: str class SiteRoleAssignRequest(BaseModel): role_keys: list[str] = Field(default_factory=list) class SiteRoleItem(BaseModel): id: str role_key: str role_name: str system_key: str system_name: str class UserSiteAssignRequest(BaseModel): site_keys: list[str] = Field(default_factory=list) class UserSiteItem(BaseModel): id: str site_key: str site_display_name: str company_key: str company_display_name: str class UserEffectiveRoleItem(BaseModel): site_key: str site_display_name: str company_key: str company_display_name: str system_key: str system_name: str role_key: str role_name: str provider_role_name: str class UserEffectiveRolesResponse(BaseModel): user_sub: str roles: list[UserEffectiveRoleItem] class SiteMembersResponse(BaseModel): site_key: str members: list[MemberItem] class SiteRolesResponse(BaseModel): site_key: str roles: list[SiteRoleItem] class UserSitesResponse(BaseModel): user_sub: str sites: list[UserSiteItem] class CompanySitesResponse(BaseModel): company_key: str sites: list[SiteItem] class SystemRolesResponse(BaseModel): system_key: str roles: list[RoleItem] class RoleSitesResponse(BaseModel): role_key: str sites: list[UserSiteItem] class ApiClientItem(BaseModel): id: str client_key: str name: str status: str allowed_origins: list[str] = Field(default_factory=list) allowed_ips: list[str] = Field(default_factory=list) allowed_paths: list[str] = Field(default_factory=list) rate_limit_per_min: int | None = None expires_at: datetime | None = None last_used_at: datetime | None = None created_at: datetime updated_at: datetime