rebreak-monorepo/backend/server/api/protection/webcontent-domains.get.ts
chahinebrini 86ed603a45 feat(protection): GET /api/protection/webcontent-domains — runtime-updatebare Layer-2-Domain-Liste
Neuer Nitro-Endpoint serviert die kuratierte Gambling-Domain-Liste pro Land
(DE/GB/FR) aus backend/data/gambling-domains.json. Auth wie alle
/api/protection/*-Routen (requireUser). 50-Domain-Cap pro Land serverseitig
erzwungen. Liste pflegen = JSON editieren + _meta.version hochzaehlen + deploy.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 20:21:54 +02:00

56 lines
1.6 KiB
TypeScript

import { requireUser } from "../../utils/auth";
const MAX_DOMAINS_PER_COUNTRY = 50;
/**
* GET /api/protection/webcontent-domains
*
* Liefert die runtime-updatebare iOS-Layer-2-Gambling-Domain-Liste.
* Datenquelle: backend/data/gambling-domains.json (file-based, v1).
* Im Build über Nitro serverAssets gebundelt → kein process.cwd()-Trick.
*
* Pflege: backend/data/gambling-domains.json editieren,
* _meta.version hochzählen, _meta.updatedAt setzen, dann neu deployen.
*
* Apple-Hartlimit: max. 50 Domains pro Land-Key. Wird serverseitig
* enforced (slice), damit ein versehentlicher Überschuss in der JSON-Datei
* nie zur App durchdringt.
*
* Auth: identisch zu allen anderen /api/protection/*-Routen (requireUser).
*/
export default defineEventHandler(async (event) => {
await requireUser(event);
const storage = useStorage("assets:server");
const raw = await storage.getItem<{
_meta: { version: number; updatedAt: string; [k: string]: unknown };
_comment?: string;
[country: string]: unknown;
}>("data:gambling-domains.json");
if (!raw) {
throw createError({
statusCode: 500,
message: "GAMBLING_DOMAINS_UNAVAILABLE",
});
}
const { _meta, _comment: _c, ...countryEntries } = raw;
const countries: Record<string, string[]> = {};
for (const [key, value] of Object.entries(countryEntries)) {
if (Array.isArray(value)) {
// Apple-Hartlimit: niemals mehr als 50 Domains pro Land ausliefern
countries[key] = (value as string[]).slice(0, MAX_DOMAINS_PER_COUNTRY);
}
}
return {
_meta: {
version: _meta.version,
updatedAt: _meta.updatedAt,
},
...countries,
};
});