from datetime import datetime, timezone from typing import Optional from sqlmodel import SQLModel, Field, Column import sqlalchemy as sa class Dataset(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) name: str raw_filename: str feature_count: int = 0 bbox_json: Optional[str] = None # JSON string [minLng, minLat, maxLng, maxLat] created_at: datetime = Field( default_factory=lambda: datetime.now(timezone.utc), sa_column=Column(sa.DateTime(timezone=True), default=sa.func.now()), ) class Feature(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) dataset_id: int = Field(foreign_key="dataset.id", index=True) geometry_json: str # GeoJSON geometry as JSON string properties_json: str # GeoJSON properties as JSON string class FeatureVersion(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) feature_id: int = Field(foreign_key="feature.id", index=True) before_json: str after_json: str timestamp: datetime = Field( default_factory=lambda: datetime.now(timezone.utc), sa_column=Column(sa.DateTime(timezone=True), default=sa.func.now()), ) class MapSettings(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) center_lng: float = 2.35 center_lat: float = 48.85 zoom: float = 5.0 base_layer: str = "vector"