97 lines
2.7 KiB
Python
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}
|