diff --git a/routes.py b/routes.py index 14d49af..5efc8ce 100644 --- a/routes.py +++ b/routes.py @@ -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), ]) diff --git a/web/js/ideogram4_shared.js b/web/js/ideogram4_shared.js index 7b9cd84..5c686a0 100644 --- a/web/js/ideogram4_shared.js +++ b/web/js/ideogram4_shared.js @@ -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);