Arkitektur-overblik
De bærende valg i Ressourcify — fra browser til database — og hvorfor de er truffet.
Ressourcify er en monolitisk Next.js-applikation med en PostgreSQL-database. Der er bevidst valgt få bevægelige dele.
Komponenter
| Lag | Teknologi | Hvorfor |
|---|---|---|
| UI | React 19, Tailwind v4 | Server Components reducerer JS-bundle |
| Server | Next.js 16 (App Router, Turbopack) | Én proces til både SSR og API |
| Auth | NextAuth v5 + Microsoft Entra | JWT giver stateless sessioner — ingen session-DB |
| ORM | Prisma 7 med @prisma/adapter-pg | Native pg-driver uden connection-string-parsing |
| Database | PostgreSQL (Supabase) | Row-Level Security som ekstra forsvarslinje |
Auth-flow
JWT-sessionen er gyldig i 12 timer. Brugerens roller læses fra databasen
ved hver session-callback — så rolle-ændringer træder i kraft næste gang
sessionen valideres uden at brugeren skal logge ud.
Gruppemedlemskab i Entra læses kun ved login (signIn-callback). Ændrer
du gruppe-medlemskab midt i en session, skal brugeren logge ud og ind igen.
Request-flow til en API-route
- Browser sender request med JWT-cookie
auth()validerer JWT, hentersession.user.organizationIdcan()fralib/authz.tschecker rolle/scope- Zod-skema validerer body og query-params
- Prisma-kald med
where: { organizationId }for tenant-isolation - Audit-log skrives ved skrive-operationer
- Svar returneres som JSON
Multi-tenancy
Single-database, single-schema, scoped by organizationId.
| Lag | Forsvar |
|---|---|
| Applikation | Hver Prisma-query filtrerer på organizationId fra session |
| Database | Row-Level Security politikker på alle public-tabeller |
| Tjenestekonto | Prisma's role ejer tabellerne og bypasser RLS — appen virker normalt |
RLS er defense-in-depth: hvis en query-builder en dag glemmer at filtrere, eller hvis en angriber finder en SQL-injection, beskytter RLS stadig.
Hvad ligger udenfor monolitten
- Microsoft Entra ID — identitets-provider
- Jira Cloud — projekt-kilde (læses via REST, skrives ikke)
- Supabase — managed Postgres + connection pooling
- Vercel — hosting
Alt andet kører i samme Next.js-proces.
Hvor du finder hvad
| Domæne | Sti |
|---|---|
| API-handlers | app/api/v1/<ressource>/route.ts |
| Auth | auth.ts + lib/auth/ |
| Authz | lib/authz.ts |
| Validering | lib/schemas/ |
| DB-klient | lib/db.ts |
| Audit | lib/audit/ |
| UI-sider | app/dashboard/_pages/ |
Læs videre i Datamodel & ER-diagram for hvad der faktisk ligger i databasen.