64 lines
1.6 KiB
TypeScript
64 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[];
|
|
};
|
|
|
|
function apiBase(): string {
|
|
const base = process.env.NEXT_PUBLIC_ADMIN_API_URL;
|
|
if (!base) {
|
|
throw new Error(
|
|
"NEXT_PUBLIC_ADMIN_API_URL ist nicht gesetzt (Umgebungsvariable erforderlich)"
|
|
);
|
|
}
|
|
return base;
|
|
}
|
|
|
|
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})`);
|
|
}
|
|
}
|