Files
webcarto/backend/app/routes/features.py
2026-02-09 00:01:29 +01:00

97 lines
2.7 KiB
Python

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}