fix(magic): createAdGuardClient idempotent — 400 → clients/update

Verwaiste AdGuard-Clients (magic_<deviceId> existiert, aber DB-Row fehlt nach
Crash zwischen clients/add und DB-Upsert) führten beim Re-Register zu 400 → 502.
Jetzt: bei 400 auf clients/update zurückfallen und den bestehenden Client auf
die frisch generierte clientId umbiegen. Behebt Magic-Register-502.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
chahinebrini 2026-06-09 02:45:28 +02:00
parent 579eb5b5e0
commit 547f86187b

View File

@ -59,18 +59,45 @@ export async function createAdGuardClient(
}; };
const authHeader = `Basic ${Buffer.from(`${user}:${password}`).toString("base64")}`; const authHeader = `Basic ${Buffer.from(`${user}:${password}`).toString("base64")}`;
const headers = {
Authorization: authHeader,
"Content-Type": "application/json",
};
try { try {
const response = await $fetch(`${baseUrl}/control/clients/add`, { const response = await $fetch(`${baseUrl}/control/clients/add`, {
method: "POST", method: "POST",
headers: { headers,
Authorization: authHeader,
"Content-Type": "application/json",
},
body: payload, body: payload,
}); });
return response as void; return response as void;
} catch (err: any) { } catch (err: any) {
// AdGuard antwortet mit 400, wenn schon ein Client mit diesem Namen ODER
// dieser Client-ID existiert. Das passiert bei Re-Registrierung wenn ein
// früherer Versuch den Client anlegte, aber die DB-Row nie geschrieben wurde
// (z.B. Prozess-Crash zwischen clients/add und DB-Upsert). Statt hart zu
// failen → idempotent auf clients/update zurückfallen und den bestehenden
// Client auf den frisch generierten clientId umbiegen.
const status = err?.status ?? err?.response?.status ?? err?.statusCode;
if (status === 400) {
try {
const response = await $fetch(`${baseUrl}/control/clients/update`, {
method: "POST",
headers,
body: { name, data: payload },
});
return response as void;
} catch (updErr: any) {
console.error(
"[AdGuard] Client update (after add-conflict) failed:",
updErr,
);
throw createError({
statusCode: 502,
message: `AdGuard API error (update): ${updErr.message || "unknown"}`,
});
}
}
console.error("[AdGuard] Client creation failed:", err); console.error("[AdGuard] Client creation failed:", err);
throw createError({ throw createError({
statusCode: 502, statusCode: 502,