Zum Hauptinhalt springen

API & Server Actions — Überblick

Die School-SaaS-Plattform setzt nicht auf ein klassisches REST-CRUD-API. Datenmutationen (Anlegen, Ändern, Löschen von Schülern, Klassen, Fächern, Lehrkräften usw.) laufen über Next.js Server Actions in lib/*/actions.ts. HTTP-API-Routen (app/api/**/route.ts) existieren nur dort, wo eine externe Gegenstelle (Stripe, Cron, OAuth-Callback, E-Mail-Links) oder ein eigenständiges Session-System (Portal) eine echte URL benötigt.

Datenzugriff: Server Actions statt REST​

Es gibt keine Endpoints wie /api/students, /api/teachers, /api/classes oder /api/subjects. Das CRUD für diese Domänen findet über Server Actions statt:

// Beispiel: lib/student/actions.ts
'use server';

import { auth } from '@/auth';
import { hasPermission } from '@/lib/permissions';

export async function createStudent(input: StudentInput) {
const session = await auth();
if (!session?.user?.tenantId) throw new Error('Nicht angemeldet');

const allowed = await hasPermission(session, 'students', 'create');
if (!allowed) throw new Error('Keine Berechtigung');

// Zod-Validierung → DB-Funktion in lib/student/db.ts
}
  • Datenfetching erfolgt in Server Components direkt über die DB-Funktionen in lib/*/db.ts (gefiltert nach tenant_id aus der Session).
  • Mutationen laufen über Server Actions, die auth(), hasPermission() und Zod-Validierung kombinieren und anschließend revalidatePath() aufrufen.

Details: Architektur-Übersicht und Berechtigungssystem.

Tatsächlich vorhandene HTTP-API-Routen​

Verzeichnis: app/api/. Diese Routen werden in proxy.ts teilweise von der Auth-Prüfung ausgenommen (siehe apiRoutes).

Auth (/api/auth/*)​

RouteMethodeZweck
/api/auth/[...nextauth]GET/POSTNextAuth-Handler (Callbacks, Session, Sign-in/out)
/api/auth/loginPOSTCredentials-Login
/api/auth/logoutPOSTAbmeldung
/api/auth/refreshPOSTSession/Token-Refresh
/api/auth/verifyGETSession-Verifikation
/api/auth/cleanup-sessionsGET/POSTAdmin: Sessions inaktiver User bereinigen / Statistiken

Registrierung & E-Mail​

RouteMethodeZweck
/api/verify-email—E-Mail-Verifikation auslösen
/api/verify-email/[token]—Verifikations-Token einlösen
/api/set-passwordPOSTPasswort nach Verifikation setzen

Stripe (/api/stripe/*)​

RouteZweck
/api/stripe/webhookStripe-Webhook-Empfänger (Signatur-Verifikation)
/api/stripe/create-setup-intentSetup-Intent für regulären Checkout (Elements)
/api/stripe/create-checkout-sessionCheckout-Session erzeugen
/api/stripe/create-subscription-checkout-sessionSubscription-Checkout
/api/stripe/create-trial-checkout-sessionTrial-Checkout (Hosted Checkout)
/api/stripe/create-portal-sessionStripe Customer Portal
/api/stripe/get-all-productsAktive Produkte/Preise live aus Stripe laden

Siehe Stripe Integration Setup.

File Storage (/api/files/*, /api/admin/files/*)​

RouteMethodeZweck
/api/filesGETDateiliste (Filter, Pagination)
/api/files/uploadPOSTDatei hochladen (FormData)
/api/files/[id]/downloadGETDatei herunterladen (Permission-Check)
/api/files/public/[id]GETÖffentliche Datei (anonym, Redirect zur Blob-URL)
/api/admin/filesGETAdmin: Dateien auflisten
/api/admin/files/[id]DELETEAdmin: Datei löschen
/api/admin/files/[id]/archivePOSTAdmin: Datei archivieren

Siehe File Storage — Architektur.

Cron (/api/cron/*)​

RouteScheduleZweck
/api/cron/check-expired-filestäglich 02:00Abgelaufene Dateien markieren
/api/cron/delete-non-critical-filestäglich 03:00Unkritische abgelaufene Dateien physisch löschen

Authentifizierung per CRON_SECRET (Bearer-Token). Schedules in vercel.json.

Portal (/api/portal/*)​

Eigenständiges Session-System für das Schüler-/Eltern-Portal (unabhängig von NextAuth).

RouteZweck
/api/portal/auth/loginPortal-Login
/api/portal/auth/logoutPortal-Logout
/api/portal/auth/sessionPortal-Session abrufen
/api/portal/activatePortal-Zugang über Einladungs-/Aktivierungslink aktivieren
/api/admin/portal/inviteAdmin: Portal-Einladung erstellen

User & Sonstiges​

RouteZweck
/api/user/subscriptionAbonnement-Status des aktuellen Users
/api/user/set-professional-planPlan auf Professional setzen
/api/test/trial-expiredTest-Endpoint für abgelaufenen Trial

Authentifizierung & Zugriffsschutz​

  • Backend-Routen werden über proxy.ts (Next.js-Middleware) geschützt — siehe Session-Sicherheit.
  • Server Actions und geschützte API-Routen prüfen die Session zusätzlich serverseitig (auth() bzw. getSession() für das Portal) plus hasPermission() für granulare Rechte.
  • Es gibt keinen API-Key-Mechanismus für externe Konsumenten; der Zugriff erfolgt über die Session-Cookies der jeweiligen App.