from __future__ import annotations from datetime import datetime from typing import Literal from uuid import UUID from pydantic import BaseModel SourceCatalogProbeStatus = Literal["available", "degraded", "unavailable", "disabled"] SourceCatalogComparisonStatus = Literal["same", "different", "not_comparable", "no_local_data", "unavailable"] class SourceCatalogProbeItem(BaseModel): source_name: str display_name: str service_type: Literal["WFS", "WMS", "HTML", "DCAT"] endpoint_url: str status: SourceCatalogProbeStatus reachable: bool checked_at: datetime cached: bool = False expected_layers: list[str] matched_layers: list[str] missing_layers: list[str] advertised_layer_count: int metadata_url: str | None = None metadata_identifier: str | None = None remote_title: str | None = None remote_version: str | None = None remote_modified_at: datetime | None = None remote_published_at: datetime | None = None local_source_version: str | None = None comparison_status: SourceCatalogComparisonStatus capabilities_sha256: str | None = None capabilities_etag: str | None = None capabilities_last_modified_at: datetime | None = None message: str error_code: str | None = None class SourceCatalogProbeSummary(BaseModel): provider_count: int available_count: int degraded_count: int unavailable_count: int disabled_count: int different_version_count: int class SourceCatalogProbeReport(BaseModel): project_id: UUID generated_at: datetime summary: SourceCatalogProbeSummary items: list[SourceCatalogProbeItem] limitations: list[str]