/* ===================================================================== PATCH /api/verwaltung/orders/:id — Status (und/oder Tracking-Nummer) einer Bestellung ändern, direkt aus der Verwaltungsseite heraus (siehe src/pages/verwaltung/index.astro). Genau wie bei GET /api/verwaltung/orders: zusätzlich zur Middleware-Sperre wird die Sitzung hier noch einmal eigenständig geprüft. ===================================================================== */ import { getGateRole, unauthorizedJson } from "../../../_shared/auth.js"; import { json } from "../../../_shared/http.js"; const ERLAUBTE_STATUS = ["bezahlt", "bearbeitung", "versandVorbereitet", "versendet", "abgeschlossen", "storniert"]; export async function onRequestPatch(context) { const { request, env, params } = context; const role = await getGateRole(request, env); if (!role) return unauthorizedJson(); if (!env.DB) { return json(500, { ok: false, error: "Datenbank nicht verbunden." }); } const id = Number(params.id); if (!Number.isInteger(id) || id <= 0) { return json(400, { ok: false, error: "Ungültige Bestell-ID." }); } let body; try { body = await request.json(); } catch { return json(400, { ok: false, error: "Ungültige Anfrage." }); } const updates = []; const values = []; if (body.status !== undefined) { if (!ERLAUBTE_STATUS.includes(body.status)) { return json(400, { ok: false, error: "Ungültiger Status." }); } updates.push("status = ?"); values.push(body.status); } if (body.tracking !== undefined) { updates.push("tracking = ?"); values.push(String(body.tracking || "")); } if (updates.length === 0) { return json(400, { ok: false, error: "Nichts zu ändern übergeben." }); } updates.push("updated_at = ?"); values.push(new Date().toISOString()); values.push(id); try { const result = await env.DB.prepare(`UPDATE orders SET ${updates.join(", ")} WHERE id = ?`) .bind(...values) .run(); if (result.meta.changes === 0) { return json(404, { ok: false, error: "Bestellung nicht gefunden." }); } return json(200, { ok: true }); } catch (err) { return json(500, { ok: false, error: "Bestellung konnte nicht aktualisiert werden." }); } }