feat: add DELETE endpoint for store entries

- Add DELETE /byae/ideogram/stores/{bucket}/{name} route handler
- Return 400 for invalid bucket/name, 404 for not found, 200 on success
- Mirror error handling pattern from PUT route
- Add deleteStoreEntry() helper in ideogram4_shared.js
- Use same fetch/timeout/error-handling pattern as saveStoreEntry

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
This commit is contained in:
by-ae
2026-10-24 09:56:53 +00:00
co-authored by Cursor Agent
parent 41a54fa376
commit 3956165b25
2 changed files with 35 additions and 0 deletions
+20
View File
@@ -41,6 +41,25 @@ async def put_store_entry(request: web.Request) -> web.Response:
return web.json_response({"error": "Failed to save"}, status=500)
async def delete_store_entry(request: web.Request) -> web.Response:
bucket = request.match_info.get("bucket", "")
name = request.match_info.get("name", "")
if bucket not in ("characters", "objects", "scenes"):
return web.json_response({"error": "Invalid bucket"}, status=400)
if not name or len(name) > 128:
return web.json_response({"error": "Invalid or missing name"}, status=400)
try:
deleted = store.delete_entry(bucket, name)
if not deleted:
return web.json_response({"error": "Entry not found"}, status=404)
return web.json_response({"ok": True, "bucket": bucket, "name": name})
except ValueError as e:
return web.json_response({"error": str(e)}, status=400)
except Exception:
logger.exception("ByAE Ideogram: failed to delete store entry")
return web.json_response({"error": "Failed to delete"}, status=500)
async def get_bg_stat(request: web.Request) -> web.Response:
guid = request.match_info.get("guid", "")
try:
@@ -80,5 +99,6 @@ def register_routes(app) -> None:
app.add_routes([
web.get("/byae/ideogram/stores", get_stores),
web.put("/byae/ideogram/stores/{bucket}/{name}", put_store_entry),
web.delete("/byae/ideogram/stores/{bucket}/{name}", delete_store_entry),
web.get("/byae/ideogram/bg/{guid}/stat", get_bg_stat),
])
+15
View File
@@ -45,6 +45,21 @@ export async function saveStoreEntry(bucket, name, data) {
}
}
export async function deleteStoreEntry(bucket, name) {
const resp = await fetch(`${STORE_API}/${bucket}/${encodeURIComponent(name)}`, {
method: "DELETE",
signal: AbortSignal.timeout ? AbortSignal.timeout(5000) : undefined
});
if (!resp.ok) {
let msg = `HTTP ${resp.status}`;
try {
const err = await resp.json();
if (err?.error) msg = err.error;
} catch (e) { /* ignore */ }
throw new Error(msg);
}
}
export function findBuildersOnGraph(graph) {
if (!graph?._nodes) return [];
return graph._nodes.filter((n) => nodeClassName(n) === BUILDER_CLASS);