import json from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from typing import Optional from sqlmodel import Session, select from ..database import get_session from ..models import Dataset, Feature, FeatureVersion from .images import IMAGES_DIR router = APIRouter(prefix="/features", tags=["features"]) class FeatureUpdate(BaseModel): geometry: Optional[dict] = None properties: Optional[dict] = None @router.put("/{feature_id}") def update_feature( feature_id: int, data: FeatureUpdate, session: Session = Depends(get_session), ): feature = session.get(Feature, feature_id) if not feature: raise HTTPException(404, "Feature non trouvée") before = { "geometry": json.loads(feature.geometry_json), "properties": json.loads(feature.properties_json), } if data.geometry is not None: feature.geometry_json = json.dumps(data.geometry) if data.properties is not None: feature.properties_json = json.dumps(data.properties) after = { "geometry": json.loads(feature.geometry_json), "properties": json.loads(feature.properties_json), } # Sauvegarder la version version = FeatureVersion( feature_id=feature_id, before_json=json.dumps(before), after_json=json.dumps(after), ) session.add(version) session.add(feature) session.commit() session.refresh(feature) # Compter les versions pour ce feature from sqlmodel import select, func count = session.exec( select(func.count()).where(FeatureVersion.feature_id == feature_id) ).one() return {"id": feature.id, "version": count} @router.delete("/{feature_id}") def delete_feature( feature_id: int, session: Session = Depends(get_session), ): feature = session.get(Feature, feature_id) if not feature: raise HTTPException(404, "Feature non trouvée") # Supprimer les versions versions = session.exec( select(FeatureVersion).where(FeatureVersion.feature_id == feature_id) ).all() for v in versions: session.delete(v) # Supprimer les fichiers images associés props = json.loads(feature.properties_json) for img_url in props.get("_images", []): if img_url.startswith("/api/images/"): filename = img_url.split("/")[-1] filepath = IMAGES_DIR / str(feature.dataset_id) / filename if filepath.exists(): filepath.unlink() # Décrémenter le compteur du dataset dataset = session.get(Dataset, feature.dataset_id) if dataset: dataset.feature_count = max(0, dataset.feature_count - 1) session.add(dataset) session.delete(feature) session.commit() return {"ok": True}