Postfach- und Ordneransicht fuer archivierte Mails (Next.js/React/TS, @nexarch/shl). Ordnerbaum (aus der flachen Postfachliste der Mail-API clientseitig aufgebaut), virtualisierte Nachrichtenliste mit Sortierung nach Datum/Absender/Betreff, Grundsuche. Aufbau nach etabliertem Muster (web/mail-search fuer die App-Struktur, web/dms-browser fuer Ordnerbaum/ virtualisierte Liste), bewusst schlicht gehalten (Mailpit/MailHog als Vorbild, nicht die Komplexitaet eines nativen Mailprogramms). Automatisierte Tests je Akzeptanzkriterium, inkl. eines echten Backend-Integrationstests (e2e/ux01.e2e.test.ts) gegen den echten mailapi.Server (mail/cmd/mailpostfach-fixture) mit zwei Mandanten und einem gleichnamigen Ordner — keine Mandanten-Isolationslogik wird gemockt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
// UX-01: einziger Weg zur Mail-API — Bearer-Token aus dem Core-Modul-Token
|
|
// (aud=mail), wie es mail/internal/moduleauth serverseitig erzwingt. Kein
|
|
// Übergangsmodus wie in dms-browser/lib/http.ts: mailapi.go akzeptiert
|
|
// ausschließlich bearerAuth (siehe openapi.yaml), es gibt keinen caller-Pfad.
|
|
import { createSession, describeHttpError, redirectToLogin, type Session } from "@nexarch/shl";
|
|
|
|
let session: Session | undefined;
|
|
|
|
export function getSession(): Session {
|
|
if (!session) {
|
|
const coreBase = process.env.NEXT_PUBLIC_CORE_API_BASE;
|
|
if (!coreBase) {
|
|
throw new Error("NEXT_PUBLIC_CORE_API_BASE ist nicht gesetzt (Umgebungsvariable erforderlich)");
|
|
}
|
|
session = createSession({
|
|
coreBase,
|
|
onLoginRequired: () => redirectToLogin(process.env.NEXT_PUBLIC_LOGIN_URL),
|
|
});
|
|
}
|
|
return session;
|
|
}
|
|
|
|
export function resetSessionForTests(): void {
|
|
session = undefined;
|
|
}
|
|
|
|
export function apiFetch(input: string, init?: RequestInit): Promise<Response> {
|
|
return getSession().fetch(input, init);
|
|
}
|
|
|
|
export function statusMessage(res: { status: number }, prefix: string): string {
|
|
if (res.status === 401 || res.status === 403 || res.status === 503) return describeHttpError(res.status);
|
|
return `${prefix} (${res.status})`;
|
|
}
|