"""Schemas for the two-dimension service catalog (STATE-WP-0062).""" import uuid from datetime import datetime from pydantic import BaseModel, ConfigDict # ── Extension read models ──────────────────────────────────────────────────── class ServiceThirdPartyRead(BaseModel): model_config = ConfigDict(from_attributes=True) pricing_model: str upstream_packages: list | None = None upstream_contacts: list | None = None source_url: str | None = None support_url: str | None = None license: str | None = None class ServiceFirstPartyRead(BaseModel): model_config = ConfigDict(from_attributes=True) repo_id: uuid.UUID | None = None owning_domain: str | None = None class ServiceCloudRead(BaseModel): model_config = ConfigDict(from_attributes=True) gdpr_maturity: str gdpr_notes: str | None = None dpa_available: bool tos_url: str | None = None privacy_policy_url: str | None = None data_processing_regions: list | None = None data_retention_notes: str | None = None class ServiceSelfHostedRead(BaseModel): model_config = ConfigDict(from_attributes=True) helix_instance: str | None = None host_node: str | None = None deployment_ref: str | None = None runbook_ref: str | None = None upstream_oss_project: str | None = None class ServiceCatalogRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID slug: str name: str owner_or_provider: str | None = None category: str | None = None description: str | None = None website_url: str | None = None status: str hosting_type: str development_type: str maturity_level: int | None = None created_at: datetime updated_at: datetime third_party: ServiceThirdPartyRead | None = None first_party: ServiceFirstPartyRead | None = None cloud: ServiceCloudRead | None = None self_hosted: ServiceSelfHostedRead | None = None # ── Write (upsert) models ──────────────────────────────────────────────────── class ServiceThirdPartyIn(BaseModel): pricing_model: str = "unknown" upstream_packages: list | None = None upstream_contacts: list | None = None source_url: str | None = None support_url: str | None = None license: str | None = None class ServiceFirstPartyIn(BaseModel): repo_id: uuid.UUID | None = None repo_slug: str | None = None owning_domain: str | None = None class ServiceCloudIn(BaseModel): gdpr_maturity: str = "unknown" gdpr_notes: str | None = None dpa_available: bool = False tos_url: str | None = None privacy_policy_url: str | None = None data_processing_regions: list | None = None data_retention_notes: str | None = None class ServiceSelfHostedIn(BaseModel): helix_instance: str | None = None host_node: str | None = None deployment_ref: str | None = None runbook_ref: str | None = None upstream_oss_project: str | None = None class ServiceUpsert(BaseModel): slug: str name: str owner_or_provider: str | None = None category: str | None = None description: str | None = None website_url: str | None = None status: str = "active" hosting_type: str # self_hosted | cloud_hosted development_type: str # first_party | third_party maturity_level: int | None = None third_party: ServiceThirdPartyIn | None = None first_party: ServiceFirstPartyIn | None = None cloud: ServiceCloudIn | None = None self_hosted: ServiceSelfHostedIn | None = None