from fastapi import FastAPI, HTTPException, Form, Body from fastapi.responses import HTMLResponse import os, json, uuid from datetime import datetime from typing import Optional DATA = "/data/overlay.json" app = FastAPI(redirect_slashes=False) def load(): if os.path.exists(DATA): with open(DATA) as f: return json.load(f) return {} def save(d): with open(DATA, "w") as f: json.dump(d, f, indent=2) @app.get("/api/list") def list_features(): items = load() return [{"id": k, **v} for k, v in items.items()] @app.post("/api/add") def add(payload: dict = Body(...)): items = load() fid = uuid.uuid4().hex[:12] items[fid] = { "name": payload.get("name", ""), "category": payload.get("category", "general"), "color": payload.get("color", "#22d3ee"), "notes": payload.get("notes", ""), "geometry": payload.get("geometry", {}), # GeoJSON geometry "added": datetime.utcnow().isoformat(), } save(items) return {"id": fid, **items[fid]} @app.patch("/api/update/{fid}") def update(fid: str, payload: dict = Body(...)): items = load() if fid not in items: raise HTTPException(404) for k in ["name", "category", "color", "notes", "geometry"]: if k in payload: items[fid][k] = payload[k] save(items) return {"ok": True} @app.delete("/api/delete/{fid}") def delete(fid: str): items = load() if fid not in items: raise HTTPException(404) del items[fid] save(items) return {"ok": True} @app.get("/", response_class=HTMLResponse) def root(): with open("/static/index.html") as f: return f.read()