API-reference
Fejlkoder & HTTP-status
Hvilke HTTP-koder Ressourcify-API'et returnerer, og hvordan fejlobjektet er bygget op.
API'et følger RFC 7807 — Problem Details for HTTP APIs.
Alle fejl returneres som JSON med Content-Type: application/problem+json.
Fejlobjekt-format
| Felt | Type | Note |
|---|---|---|
type | string | Default "about:blank" — RFC-anbefalet placeholder |
title | string | Kort, læselig titel — én af nedenstående |
status | number | Matcher HTTP-statuskoden |
detail | string? | Forklaring til mennesker |
instance | string? | URI til den fejlende request (sjældent sat) |
errors | array? | Kun ved validation-fejl — liste af Zod-issues |
HTTP-statuskoder
| Kode | Titel | Hvornår | Helper |
|---|---|---|---|
400 | Bad Request | Generisk fejl der ikke passer andetsteds | Problems.badRequest(detail) |
401 | Unauthorized | auth() returnerede null — ikke logget ind | Problems.unauthorized(detail) |
403 | Forbidden | Logget ind, men can() returnerede false | Problems.forbidden(detail) |
404 | Not Found | Ressource findes ikke, eller findes i anden org | Problems.notFound(detail) |
409 | Conflict | Unique constraint (Prisma P2002) — fx duplicate code | Problems.conflict(detail) |
422 | Validation failed | Zod-skema afviste body eller query | Problems.validation(zodError) |
500 | Internal Server Error | Uventet fejl — logges med logger.error | Problems.internal(detail) |
Hvorfor 404 og ikke 403 for cross-org-adgang? Hvis en bruger forsøger
at læse en ressource i en anden organisation, returnerer vi 404 for
ikke at lække eksistensen af ressourcen. Et 403 ville bekræfte at
ressourcen findes — netop hvad vi vil undgå.
Eksempel-svar
401 Unauthorized
403 Forbidden
404 Not Found
409 Conflict
422 Validation failed
Prisma-fejl der mapper til HTTP-koder
| Prisma error | HTTP | Helper |
|---|---|---|
P2002 (unique constraint) | 409 | Problems.conflict() |
P2025 (record not found) | 404 | Problems.notFound() |
P2003 (FK constraint) | 400 | Problems.badRequest() |
| Alle andre | 500 | Problems.internal() + log |
Mønster i en route-handler
Hvad fejl-svar ikke indeholder
- Stack traces
- Database-query'er
- Brugerens session-data
- Andre brugeres data
Disse logges server-side via logger.error() men sendes aldrig til klienten.