78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
from pydantic import BaseModel, Field
|
|
from typing import Dict, List, Optional, Any
|
|
from datetime import datetime
|
|
|
|
|
|
# ── Catalog ──────────────────────────────────────────────────────────────────
|
|
|
|
class DatasetVariable(BaseModel):
|
|
short_name: str
|
|
standard_name: Optional[str] = None
|
|
units: Optional[str] = None
|
|
description: Optional[str] = None # human-readable label derived from standard_name
|
|
|
|
|
|
class CatalogDataset(BaseModel):
|
|
dataset_id: str
|
|
title: Optional[str] = None
|
|
description: Optional[str] = None
|
|
variables: List[DatasetVariable] = []
|
|
min_longitude: Optional[float] = None
|
|
max_longitude: Optional[float] = None
|
|
min_latitude: Optional[float] = None
|
|
max_latitude: Optional[float] = None
|
|
start_datetime: Optional[str] = None
|
|
end_datetime: Optional[str] = None
|
|
|
|
|
|
# ── Jobs ─────────────────────────────────────────────────────────────────────
|
|
|
|
class DownloadJobRequest(BaseModel):
|
|
dataset_id: str
|
|
variables: List[str] = Field(..., min_length=1)
|
|
min_longitude: float
|
|
max_longitude: float
|
|
min_latitude: float
|
|
max_latitude: float
|
|
start_date: str # YYYY-MM-DD
|
|
end_date: str # YYYY-MM-DD
|
|
format: str = Field("json", pattern="^(json|csv)$")
|
|
nome: str = Field(..., min_length=1)
|
|
tags: List[str] = Field(default_factory=lambda: ["marine"])
|
|
notes: str = ""
|
|
variable_renames: Dict[str, str] = Field(default_factory=dict) # {original: custom}
|
|
|
|
|
|
class JobStatus(BaseModel):
|
|
job_id: str
|
|
status: str # pending | downloading | converting | saving | done | error
|
|
progress: int = 0 # 0-100
|
|
message: str = ""
|
|
dataset_id: Optional[str] = None # filled on done
|
|
|
|
|
|
# ── Saved Datasets ────────────────────────────────────────────────────────────
|
|
|
|
class DatasetMeta(BaseModel):
|
|
id: str
|
|
nome: str
|
|
tags: List[str] = []
|
|
created_date: str
|
|
created_by: str
|
|
used_last_date: Optional[str] = None
|
|
type: str # json | csv
|
|
size: int
|
|
notes: str = ""
|
|
version: int = 1
|
|
filename: str
|
|
copernicus_dataset_id: str
|
|
variables: List[str] = []
|
|
bbox: List[float] = [] # [min_lon, min_lat, max_lon, max_lat]
|
|
start_date: str
|
|
end_date: str
|
|
|
|
|
|
class DatasetListResponse(BaseModel):
|
|
datasets: List[DatasetMeta]
|
|
count: int
|