from pydantic import BaseModel, Field from typing import Dict, Any, Optional, List class BundleItem(BaseModel): name: str tracking_ref: str repo_url: str subdir: str type: str = "git" class BundleListResponse(BaseModel): bundles: List[BundleItem] class SitomatProvisionRequest(BaseModel): dataset_id: str bundle_name: Optional[str] = "dlh-core-ingestion" source_type: str = Field(..., description="database | gws | api") connection_id: str source_config: Dict[str, Any] = Field(default_factory=dict) bronze_target: Optional[Dict[str, Any]] = Field(default_factory=lambda: { "s3_bucket": "dlh-landing", "s3_prefix": "bronze/raw/" }) dbt_models: Optional[Dict[str, str]] = Field(default_factory=dict) schedule: Optional[str] = "0 2 * * *" class SitomatProvisionResponse(BaseModel): status: str = "provisioned" dataset_id: str bundle_name: str bronze_dag_id: str transform_dag_id: str initial_version: str git_commit_hash: Optional[str] = None yaml_config_path: Optional[str] = None class SitomatTriggerRequest(BaseModel): correlation_id: str dataset_id: str target_dag_version: Optional[str] = "latest" conf: Optional[Dict[str, Any]] = Field(default_factory=dict) class SitomatTriggerResponse(BaseModel): status: str = "triggered" correlation_id: str dag_id: str dag_run_id: str pinned_version: str class SitomatLedgerCallback(BaseModel): correlation_id: str dataset_id: str dag_id: str dag_run_id: str status: str bronze_ref: Optional[str] = None record_count: Optional[int] = 0 byte_size: Optional[int] = 0