from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel class DatasetStorageResponse(BaseModel): original_filename: str | None = None stored_filename: str | None = None content_type: str | None = None size_bytes: int | None = None checksum_sha256: str | None = None class DatasetVectorSummary(BaseModel): feature_count: int | None = None geometry_types: list[str] | None = None bounds_json: dict | None = None approximate_area_m2: float | None = None crs: str | None = None feature_geometry_count: int | None = None invalid_features: int | None = None crs_assumed: bool | None = None class DatasetCreateResponse(BaseModel): id: UUID name: str dataset_type: str source: str dataset_role: str = "source" source_name: str | None = None reference_layer_name: str | None = None source_metadata: dict | None = None provenance_metadata: dict | None = None ingest_key: str | None = None source_registry_id: UUID | None = None source_snapshot_id: UUID | None = None data_contract_key: str | None = None data_contract_version: str | None = None validation_status: str | None = None validation_report_json: dict | None = None provenance_status: str | None = None lineage_status: str | None = None quarantine_status: str | None = None imported_at: datetime | None = None temporal_series_key: str | None = None observed_at: datetime | None = None valid_from: datetime | None = None valid_to: datetime | None = None temporal_granularity: str | None = None source_version: str | None = None project_id: UUID area_id: UUID | None = None storage_path: str | None = None original_filename: str | None = None stored_filename: str | None = None content_type: str | None = None size_bytes: int | None = None checksum_sha256: str | None = None crs: str | None = None bounds_json: dict | None = None metadata_json: dict | None = None vector_summary: DatasetVectorSummary | None = None status: str derived_from_dataset_id: UUID | None = None created_at: datetime | None = None feature_count: int | None = None model_config = {"from_attributes": True} class DatasetList(BaseModel): items: list[DatasetCreateResponse] total: int limit: int offset: int class DatasetMetadataRefresh(BaseModel): feature_count: int | None = None geometry_types: list[str] | None = None bounds_json: dict | None = None crs: str | None = None class DatasetTemporalUpdate(BaseModel): temporal_series_key: str observed_at: datetime valid_from: datetime | None = None valid_to: datetime | None = None temporal_granularity: str = "snapshot" source_version: str | None = None class DatasetVersionRead(BaseModel): id: UUID dataset_id: UUID version: int storage_path: str | None = None source_version: str | None = None observed_at: datetime | None = None valid_from: datetime | None = None valid_to: datetime | None = None checksum_sha256: str | None = None source_metadata: dict | None = None provenance_metadata: dict | None = None ingest_key: str | None = None source_registry_id: UUID | None = None source_snapshot_id: UUID | None = None data_contract_key: str | None = None data_contract_version: str | None = None validation_status: str | None = None validation_report_json: dict | None = None provenance_status: str | None = None lineage_status: str | None = None created_at: datetime | None = None model_config = {"from_attributes": True} class ExportRequest(BaseModel): dataset_id: UUID name: str | None = None class ExportRead(BaseModel): export_id: UUID path: str status: str