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

LagTeknologiHvorfor
UIReact 19, Tailwind v4Server Components reducerer JS-bundle
ServerNext.js 16 (App Router, Turbopack)Én proces til både SSR og API
AuthNextAuth v5 + Microsoft EntraJWT giver stateless sessioner — ingen session-DB
ORMPrisma 7 med @prisma/adapter-pgNative pg-driver uden connection-string-parsing
DatabasePostgreSQL (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

  1. Browser sender request med JWT-cookie
  2. auth() validerer JWT, henter session.user.organizationId
  3. can() fra lib/authz.ts checker rolle/scope
  4. Zod-skema validerer body og query-params
  5. Prisma-kald med where: { organizationId } for tenant-isolation
  6. Audit-log skrives ved skrive-operationer
  7. Svar returneres som JSON

Multi-tenancy

Single-database, single-schema, scoped by organizationId.

LagForsvar
ApplikationHver Prisma-query filtrerer på organizationId fra session
DatabaseRow-Level Security politikker på alle public-tabeller
TjenestekontoPrisma'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æneSti
API-handlersapp/api/v1/<ressource>/route.ts
Authauth.ts + lib/auth/
Authzlib/authz.ts
Valideringlib/schemas/
DB-klientlib/db.ts
Auditlib/audit/
UI-siderapp/dashboard/_pages/

Læs videre i Datamodel & ER-diagram for hvad der faktisk ligger i databasen.

On this page