API-reference

API-reference v1

Komplet teknisk reference for Ressourcify API v1 — alle endpoints, request/response-formater og adgangskrav.

Ressourcify v2 — API Reference

Version: v1 · Base path: /api/v1 · Sidst opdateret: 2026-04-23


1. Overblik

Alle API-endpoints ligger under /api/v1/. API'et er multi-tenant: hver request scoperes automatisk til den autentificerede brugers organisation.

Request-format: Content-Type: application/json Response-format: Content-Type: application/json (fejl: application/problem+json)


2. Konventioner

2.1 Autentificering

Alle /api/v1/-endpoints kræver en aktiv session. Autentificering håndteres af NextAuth v5 (Microsoft Entra ID / Azure AD). Uautentificerede requests modtager 401 Unauthorized.

Sessions vedligeholdes via en HTTP-only cookie (__Secure-next-auth.session-token). Der er ingen API-nøgle- eller Bearer-token-mekanisme.

2.2 Paginering

List-endpoints bruger cursor-baseret paginering:

{
  "data": [ /* array of items */ ],
  "nextCursor": "018e5f3a-..."
}

nextCursor er null når der ikke er flere sider. Send værdien som cursor-query-parameter for næste side.

Fælles query-parametre:

ParameterTypeStandardMaks
cursorstring
limitinteger50200

2.3 Fejlformat

Alle fejl følger RFC 7807 Problem Details:

{
  "type": "about:blank",
  "title": "Validation Error",
  "status": 422,
  "detail": "Request body failed validation.",
  "errors": [
    { "field": "endDate", "message": "endDate must be on or after startDate" }
  ]
}

2.4 HTTP-statuskoder

KodeBetydning
200 OKVellykket læsning eller opdatering
201 CreatedRessource oprettet
204 No ContentVellykket sletning
400 Bad RequestMisdannet request
401 UnauthorizedIngen gyldig session
403 ForbiddenUtilstrækkelig rolle
404 Not FoundRessourcen eksisterer ikke
409 ConflictUnique constraint-overtrædelse
422 Unprocessable EntityZod-valideringsfejl
500 Internal Server ErrorUventet serverfejl

2.5 Roller og adgangskontrol

RolleScopeBeskrivelse
ORG_ADMINOrganisationFuld administrativ adgang
DEPT_ADMINAfdelingAdmin inden for egne afdelinger
COORDINATORTeamKan administrere assignments for egne teams
RESOURCESelvKan læse og skrive egne data
VIEWEROrganisationSkrivebeskyttet adgang

2.6 Soft delete

  • UsersDELETE sætter deletedAt og skifter status til INACTIVE
  • ProjectsDELETE sætter deletedAt og skifter status til CANCELLED

Soft-slettede poster ekskluderes automatisk fra alle list-responses.


3. Ressourcer

3.1 Users

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/usersList brugereVIEWER
POST/api/v1/usersOpret brugerORG_ADMIN
GET/api/v1/users/:idHent enkelt brugerVIEWER
PATCH/api/v1/users/:idOpdatér brugerORG_ADMIN
DELETE/api/v1/users/:idSoft-slet brugerORG_ADMIN
GET/api/v1/users/exportDownload CSVDEPT_ADMIN

GET /api/v1/users

Query-parametre: teamId, departmentId, status (ACTIVE|INACTIVE), q (fritekst, maks 80)

Eksempel-response:

{
  "data": [
    {
      "id": "018e5f3a-1111-7000-8000-000000000001",
      "name": "Anna Andersen",
      "email": "anna.andersen@demo.ressourcify.local",
      "status": "ACTIVE",
      "employmentPct": 1.0,
      "defaultWeeklyHours": 37,
      "startDate": "2024-01-01",
      "endDate": null,
      "primaryDepartmentId": "018e5f3a-2222-7000-8000-000000000001",
      "primaryDepartment": { "id": "018e5f3a-2222-7000-8000-000000000001", "name": "Design" },
      "teams": [
        { "teamId": "018e5f3a-3333-7000-8000-000000000001", "isCoordinator": true, "team": { "name": "Team Alpha", "color": "#3B82F6" } }
      ]
    }
  ],
  "nextCursor": null
}

POST /api/v1/users

FeltTypePåkrævet
namestring (1–120)Ja
emailemailJa — unik i org
primaryDepartmentIdUUIDNej
employmentPctnumber (0.1–1)Nej — standard: 1
defaultWeeklyHoursnumber (1–80)Nej — standard: 37
startDateYYYY-MM-DDNej
endDateYYYY-MM-DDNej
statusACTIVE|INACTIVENej — standard: ACTIVE

Response: 201 Created

PATCH /api/v1/users/:id

Alle POST-felter er valgfrie. Kun angivne felter opdateres.

DELETE /api/v1/users/:id

204 No Content. Brugeren soft-slettes.

GET /api/v1/users/export

Streamer UTF-8 CSV med BOM. Query-parametre: status, departmentId.


3.2 Departments

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/departmentsList afdelingerVIEWER
POST/api/v1/departmentsOpret afdelingORG_ADMIN
GET/api/v1/departments/:idHent enkeltVIEWER
PATCH/api/v1/departments/:idOpdatérORG_ADMIN
DELETE/api/v1/departments/:idSletORG_ADMIN

DEPT_ADMIN og COORDINATOR ser kun afdelinger de tilhører. En afdeling med aktive brugere kan ikke slettes — API'et returnerer 409 Conflict.

POST body: name (string 1–80, påkrævet), code (string maks 20, valgfri)


3.3 Teams

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/teamsList teamsVIEWER
POST/api/v1/teamsOpret teamORG_ADMIN
GET/api/v1/teams/:idHent enkeltVIEWER
PATCH/api/v1/teams/:idOpdatér team og medlemmerORG_ADMIN
DELETE/api/v1/teams/:idDeaktivérORG_ADMIN

Query-parametre: q (fritekst), isActive (boolean)

POST body:

FeltTypePåkrævet
namestring (1–80)Ja
descriptionstring (maks 500)Nej
colorhex-farveNej — standard: #3B82F6
isActivebooleanNej — standard: true
members[].userIdUUIDJa
members[].isCoordinatorbooleanNej — standard: false

members-arrayet i en PATCH-request erstatter hele medlemslisten. Udelades members, forbliver medlemmerne uændrede.


3.4 Projects

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/projectsList projekterVIEWER
POST/api/v1/projectsOpret projektCOORDINATOR
GET/api/v1/projects/:idHent enkeltVIEWER
PATCH/api/v1/projects/:idOpdatérCOORDINATOR
DELETE/api/v1/projects/:idSoft-sletORG_ADMIN

Query-parametre: status, deptId, teamId, q

POST body (udvalgte felter):

FeltTypePåkrævet
codestring (1–40)Ja — konverteres til store bogstaver; unik i org
namestring (1–120)Ja
statusACTIVE|PAUSED|COMPLETED|CANCELLEDNej — standard: ACTIVE
departmentId, managerId, categoryIdUUIDNej
startDate, endDateYYYY-MM-DDNej
forecastEnabledbooleanNej — standard: false
teamIdsUUID[]Nej — standard: []

3.5 Assignments

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/assignmentsList assignmentsVIEWER
POST/api/v1/assignmentsOpretCOORDINATOR
GET/api/v1/assignments/:idHent enkeltVIEWER
PATCH/api/v1/assignments/:idOpdatérCOORDINATOR
DELETE/api/v1/assignments/:idSletCOORDINATOR

Query-parametre: projectId, userId, from, to (YYYY-MM-DD)

POST body:

FeltTypePåkrævet
projectId, userIdUUIDJa
startDateYYYY-MM-DDJa — skal være ≤ endDate
endDateYYYY-MM-DDJa
allocationKindPERCENT|HOURSJa
valuenumber (0–999999)Ja — hvis PERCENT, maks 100
notestring (maks 500)Nej

3.6 Time Entries

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/time-entriesListRESOURCE
POST/api/v1/time-entriesOpretRESOURCE
GET/api/v1/time-entries/:idHent enkeltRESOURCE
PATCH/api/v1/time-entries/:idOpdatérRESOURCE
DELETE/api/v1/time-entries/:idSletRESOURCE
POST/api/v1/time-entries/autofillGenerer fra assignmentsCOORDINATOR

Self-scope: RESOURCE kan kun tilgå egne poster. COORDINATOR og derover kan tilgå alle i org. Kun hours og note kan opdateres via PATCH — date, projectId, userId og kind er uforanderlige.

POST /autofill query-parametre: userId, year, month, kind (standard: PLANNED)

Autofill-response: { "created": 12, "skipped": 8 }


3.7 Leaves

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/leavesList fraværRESOURCE
POST/api/v1/leavesOpretCOORDINATOR
GET/api/v1/leaves/:idHent enkeltRESOURCE
PATCH/api/v1/leaves/:idOpdatérCOORDINATOR
DELETE/api/v1/leaves/:idSletCOORDINATOR

RESOURCE kan kun se eget fravær.

POST body: userId, leaveTypeId (UUID), startDate, endDate, hoursPerDay (0.25–24, standard: brugerens daglige timer), note


3.8 Lookups

Organisationsstyrede referencelister. type-parametret vælger liste.

Typer: category, task-type, project-type, leave-type

MetodeStiMin. Rolle
GET/api/v1/lookups?type=VIEWER
POST/api/v1/lookups?type=ORG_ADMIN
GET/api/v1/lookups/:id?type=VIEWER
PATCH/api/v1/lookups/:id?type=ORG_ADMIN
DELETE/api/v1/lookups/:id?type=ORG_ADMIN

Elementer med organizationId: null er system-leverede og skrivebeskyttede. Hvis et element refereres af eksisterende poster, deaktiverer DELETE det i stedet for at fjerne det.

GET returnerer et fuldt array (ikke pagineret). Ekstra query-parameter: includeInactive (boolean, standard: false).


3.9 Capacity

MetodeStiMin. Rolle
GET/api/v1/capacityRESOURCE

Query-parametre: userId, year, month (valgfri — udelades: alle 12 måneder)

Response-felter:

FeltBeskrivelse
workdaysArbejdsdage (ekskl. weekender og helligdage)
baseHoursworkdays × defaultWeeklyHours / 5
leaveHoursFraværstimer trukket fra base
netHoursbaseHours − leaveHours

3.10 Utilization

MetodeStiMin. Rolle
GET/api/v1/utilizationVIEWER

Query-parametre: scope (user:<UUID> eller dept:<UUID>), from, to (YYYY-MM)


3.11 Forecast

MetodeStiBeskrivelseMin. Rolle
GET/api/v1/forecast/plansList planerVIEWER
POST/api/v1/forecast/plansOpret planCOORDINATOR
GET/api/v1/forecast/plans/:idHent enkeltVIEWER
PATCH/api/v1/forecast/plans/:idOpdatérCOORDINATOR
DELETE/api/v1/forecast/plans/:idSletCOORDINATOR
GET/api/v1/forecast/workloadsAggregerede timerVIEWER

Kun én forecast-plan pr. (projectId, year) er tilladt. Duplikat returnerer 409 Conflict.

POST body: projectId, year, size (S|M|L|XL|F|T), startMonth, endMonth, note, teamIds, allocations[]


3.12 Rapporter og eksporter

EndpointBeskrivelseMin. Rolle
GET /api/v1/reports/workloadsUdnyttelsesaggregat med totalerVIEWER
GET /api/v1/reports/opslagÅrligt kapacitets-/udnyttelsessnapshotVIEWER
GET /api/v1/exports/totalsCSV-eksport kapacitet + udnyttelseDEPT_ADMIN

workloads query-parametre: from (YYYY-MM), to (YYYY-MM), scope (org, user:<UUID>, dept:<UUID>)

opslag query-parametre: year, teamId

totals query-parametre: period (YYYY-MM..YYYY-MM), format (csv)


3.13 Admin

Alle endpoints kræver ORG_ADMIN.

GET /api/v1/admin/audit

Query-parametre: entityType, entityId, performedBy, from, to (ISO 8601)

GET + PATCH /api/v1/admin/config/:key

Læs eller upsert en org-konfigurationsværdi. PATCH body: { "value": "..." }

POST /api/v1/admin/jobs/backfill-monthlies

Genberegner MonthlyCapacity og MonthlyUtilization. Body: year, month (valgfri), userIds (valgfri), dryRun (boolean)


3.14 Integrationer

POST /api/v1/integrations/entra/sync

Synkroniserer brugere fra Entra-grupper. Upserts brugerpost og tildeler roller. Brugere fjernet fra alle grupper deaktiveres.

Min. Rolle: ORG_ADMIN · Body: dryRun (boolean)

preview-arrayet i response er kun til stede når dryRun: true.


4. System-endpoints

GET /api/health

Returnerer applikationens sundhedsstatus. Kræver ikke autentificering.

{ "status": "ok", "db": "ok", "version": "2.0.0" }

Hvis DB-forbindelsen fejler: db: "error" og HTTP 503.

GET + POST /api/auth/[...nextauth]

NextAuth.js-handler til Microsoft Entra ID-flow. Ikke beregnet til direkte brug af API-klienter.