60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
// Duenner Client fuer das LIC-04-Backend-API (internal/adminapi) — enthaelt
|
|
// keinerlei eigene Lizenz-/Flag-Logik, nur Datenabruf und -weitergabe.
|
|
export type FlagOverview = {
|
|
key: string;
|
|
enabled: boolean;
|
|
licensed: boolean;
|
|
deny_grund?: string;
|
|
};
|
|
|
|
export type UsageOverview = {
|
|
metric: string;
|
|
value: number;
|
|
limit: number;
|
|
status: "ok" | "warning" | "exceeded";
|
|
};
|
|
|
|
export type Overview = {
|
|
plan: string;
|
|
modules: string[];
|
|
issued_at: string;
|
|
valid_until: string;
|
|
expired: boolean;
|
|
flags: FlagOverview[];
|
|
usage: UsageOverview[];
|
|
};
|
|
|
|
// Standard: serverseitiger Proxy (app/api/proxy), der das Dienst-Token ergaenzt.
|
|
// NEXT_PUBLIC_ADMIN_API_URL kann fuer Tests/Sonderfaelle auf ein Backend zeigen.
|
|
function apiBase(): string {
|
|
return process.env.NEXT_PUBLIC_ADMIN_API_URL || "/api/proxy";
|
|
}
|
|
|
|
export async function fetchOverview(tenantId: string): Promise<Overview> {
|
|
const res = await fetch(
|
|
`${apiBase()}/admin/overview?tenant=${encodeURIComponent(tenantId)}`,
|
|
{ cache: "no-store" }
|
|
);
|
|
if (!res.ok) {
|
|
const body = await res.json().catch(() => ({}));
|
|
throw new Error(body.error || `Anfrage fehlgeschlagen (${res.status})`);
|
|
}
|
|
return res.json();
|
|
}
|
|
|
|
export async function toggleFlag(
|
|
tenantId: string,
|
|
key: string,
|
|
enabled: boolean
|
|
): Promise<void> {
|
|
const res = await fetch(`${apiBase()}/admin/flags/toggle`, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ tenant: tenantId, key, enabled }),
|
|
});
|
|
if (!res.ok) {
|
|
const body = await res.json().catch(() => ({}));
|
|
throw new Error(body.error || `Umschalten fehlgeschlagen (${res.status})`);
|
|
}
|
|
}
|