Files
nexarch/web/mail-postfach/lib/http.ts
patrickandClaude Sonnet 5 9b1661d6ff UX-01: postfach-ordneransicht
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>
2026-10-16 06:54:40 +00:00

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})`;
}