etape laptop
This commit is contained in:
96
backend/app/routes/features.py
Normal file
96
backend/app/routes/features.py
Normal file
@@ -0,0 +1,96 @@
|
||||
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}
|
||||
Reference in New Issue
Block a user