Denna arkitekturbeskrivning dokumenterar lösningen Kravhantering — ett digitalt system för hantering av tekniska krav med versionering, livscykelhantering och tvåspråkigt stöd (svenska och engelska).
Dokumentet följer mallen för arkitekturbeskrivningar och täcker de perspektiv som är relevanta för lösningens nuvarande utformning. Varje perspektiv riktar sig till de intressenter som anges i respektive avsnitt.
Konventioner:
- Tekniska produktnamn (Next.js, Cloudflare, Drizzle ORM etc.) skrivs på engelska enligt branschstandard.
- Mermaid-diagram renderas i GitHub-markdown.
- ArchiMate-modeller presenteras i ASCII-notation och är avsedda att ersättas med verktygsexport.
Intressenter: Arkitekturledningen · verksamhetsarkitekt · huvudarkitekt · förvaltningsledare · projektledare
Kravhantering är en webbapplikation som ger
organisationen ett gemensamt verktyg för att skapa,
granska, publicera och arkivera tekniska krav. Systemet
är tillgängligt via kravhantering.{foretag}.se och
stödjer två språk (svenska och engelska) genomgående —
både i användargränssnittet och i den underliggande
datan.
Lösningen är uppbyggd i fyra huvudlager som samverkar för att leverera funktionaliteten:
graph TB
subgraph "Webbläsare"
UI["Next.js App Router<br/>React 19 · Tailwind CSS 4"]
end
subgraph "Körmiljö"
API["REST API<br/>/api/requirements · /api/admin"]
MCP["MCP-server<br/>/api/mcp"]
end
subgraph "Databas"
DB["SQLite-databas<br/>Drizzle ORM"]
end
subgraph "Utgående format"
CSV["CSV-export"]
PDF["PDF-rapporter<br/>react-pdf · webbläsarutskrift"]
end
UI -->|HTTP| API
UI -->|HTTP| MCP
API --> DB
MCP --> DB
API --> CSV
API --> PDF
AI["AI-agenter"] -->|"MCP (HTTP)"| MCP
| Lager | Teknik | Syfte |
|---|---|---|
| Användargränssnitt | Next.js 16, React 19, Tailwind CSS 4 | Tvåspråkig webbapplikation med App Router |
| API-lager | REST-ändpunkter, MCP-server | CRUD, livscykelövergångar, AI-integration |
| Databas | SQLite via Cloudflare D1, Drizzle ORM | Kravdata, versionshistorik, taxonomi |
| Infrastruktur | Cloudflare Workers, OpenNext-adapter | Serverlös drift, global distribution |
Notera: Cloudflare Workers och Cloudflare D1 är nuvarande plattformsval men inte ett arkitekturkrav. Lösningen bygger på standardtekniker (Next.js, SQLite, Drizzle ORM) och kan driftas på alternativa plattformar (t.ex. Vercel, AWS, Azure) med anpassning av adapter och databindning.
┌─────────────────────────────────────────────────────────┐
│ << Motivation >> │
│ Mål: Enhetlig kravhantering med full spårbarhet │
│ Intressenter: Kravförfattare, Granskare, Förvaltare │
└─────────────────────────────────────────────────────────┘
│ realiseras av
▼
┌─────────────────────────────────────────────────────────┐
│ << Business Layer >> │
│ │
│ [Business Process] [Business Process] │
│ Kravlivscykel Kravpakethantering │
│ │
│ [Business Process] [Business Process] │
│ Avsteghantering Rapportgenerering │
│ │
│ [Business Actor] [Business Actor] │
│ Kravförfattare Granskare │
│ Förvaltare Administratör │
└─────────────────────────────────────────────────────────┘
│ stöds av
▼
┌─────────────────────────────────────────────────────────┐
│ << Application Layer >> │
│ │
│ [Application Service] [Application Service] │
│ Kravkatalog (UI) REST API │
│ │
│ [Application Service] [Application Service] │
│ MCP-server (AI) Rapportmotor │
│ │
│ [Application Component] │
│ RequirementsService (lib/requirements/service.ts) │
│ Data Access Layer (lib/dal/) │
└─────────────────────────────────────────────────────────┘
│ driftas på
▼
┌─────────────────────────────────────────────────────────┐
│ << Technology Layer >> │
│ │
│ [Technology Service] [Technology Service] │
│ Cloudflare Workers Cloudflare D1 (SQLite) │
│ │
│ [Technology Service] [Technology Service] │
│ Cloudflare Assets OpenNext-adapter │
└─────────────────────────────────────────────────────────┘
Intressenter: Arkitekturledningen · verksamhetsarkitekt · huvudarkitekt · förvaltningsledare
Den centrala verksamhetsprocessen är kravets livscykel — från utkast till arkivering. Processen följer en tillståndsmaskin med fyra statusar och definierade övergångar:
stateDiagram-v2
[*] --> Utkast : Skapa nytt krav
Utkast --> Granskning : Skicka för granskning
Granskning --> Publicerad : Godkänn
Granskning --> Utkast : Avslå (returnera)
Publicerad --> Granskning : Initiera arkivering
Granskning --> Arkiverad : Godkänn arkivering
Arkiverad --> Utkast : Återaktivera
note right of Utkast
Författaren redigerar
kravtext och metadata
end note
note right of Granskning
Granskaren bedömer
och godkänner/avslår
end note
note right of Publicerad
Kravet är aktivt
och giltigt
end note
note left of Arkiverad
Kravet är inaktivt
men sparat
end note
Arkivering av publicerade krav sker i två steg för att säkerställa kvalitetskontroll:
- Initiering — En förvaltare begär arkivering.
Kravet övergår till granskning med en
arkiveringsflagga (
archive_initiated_at). - Godkännande — En granskare bekräftar
arkiveringen. Kravet får status Arkiverad och
tidsstämpeln
archived_atsätts.
Arkiveringen kan avbrytas innan godkännande genom att returnera kravet till Publicerad.
Varje krav har en stabil identitet (unique_id, t.ex.
INT0001) och en serie versioner som bildar en
fullständig revisionshistorik:
flowchart TD
A["Skapa krav"] --> B["Version 1 (Utkast)"]
B -->|"Redigera utkast"| B
B -->|"Statusövergång"| C["Version 1 (Publicerad)"]
C -->|"Redigera publicerat"| D["Version 2 (Utkast)"]
D -->|"Godkänn"| E["Version 2 (Publicerad)"]
E -.->|"Auto-arkivering"| F["Version 1 (Arkiverad)"]
style B fill:#3b82f6,color:#fff
style C fill:#22c55e,color:#fff
style D fill:#3b82f6,color:#fff
style E fill:#22c55e,color:#fff
style F fill:#6b7280,color:#fff
Nyckelprinciper:
- Redigering av ett utkast uppdaterar befintlig version (ingen ny rad skapas).
- Redigering av publicerat krav skapar en ny utkastversion.
- Statusövergångar ändrar befintlig rad — de skapar aldrig nya versioner.
- Vid publicering av ny version arkiveras den föregående publicerade versionen automatiskt.
| Aktör | Huvudansvar |
|---|---|
| Kravförfattare | Skapar och redigerar krav, skickar för granskning |
| Granskare | Godkänner eller avslår krav och arkiveringsförfrågningar |
| Förvaltare | Hanterar livscykel, initierar arkivering, återaktiverar |
| Administratör | Konfigurerar taxonomi, terminologi, kolumnstandard |
Kravpaket samlar ett urval av krav för en viss användning — t.ex. en upphandling, ett projekt eller en förvaltningsperiod. Processen omfattar:
- Skapa paket — Namn, beskrivning och slug (URL-vänligt ID) anges.
- Lägga till kravposter — Krav läggs till i
paketet med en specifik kravversion.
Varje post får automatiskt statusen
Inkluderad (
Included). - Statushantering per post — Varje kravpost
i paketet har en egen användningsstatus.
Tillgängliga statusar hanteras i
uppslagstabellen
package_item_statuses. - Spåra avsteg — Om ett krav inte kan uppfyllas helt kan ett avsteg registreras (se Avsteghantering nedan).
Avsteg (deviations) dokumenterar och beslutar om undantag från enskilda krav i ett kravpaket. Processen följer en trestegsmodell:
stateDiagram-v2
[*] --> Utkast : Registrera avsteg
Utkast --> Granskning : Begär granskning
Granskning --> Utkast : Återta till utkast
Granskning --> Beslutat : Godkänn eller avslå
note right of Utkast
Motivation och skapare
anges. Kan redigeras
och raderas.
end note
note right of Granskning
Avsteget väntar på
formellt beslut.
end note
note right of Beslutat
Beslut (godkänt/avslaget),
motivering och beslutsfattare
registreras permanent.
end note
Steg i detalj:
- Utkast — Författaren registrerar ett avsteg med motivering och valfri skapare. Avsteget kan redigeras och raderas i detta steg.
- Begärd granskning — Avsteget skickas för beslut. Det kan återtas till utkast om komplettering behövs.
- Beslutat — Granskaren godkänner eller avslår avsteget. Beslutsmotivering, beslutsfattare och tidsstämpel registreras. Beslutet är permanent.
Ett godkänt avsteg möjliggör att kravpostens
användningsstatus ändras till Avviken
(Deviated). Ett avslaget avsteg lämnar posten
i befintlig status.
Förbättringsförslag (ändringsförslag, synpunkter) kopplas till ett krav och följer en egen livscykel.
stateDiagram-v2
[*] --> Registrerad : Registrera förslag
Registrerad --> Granskning : Begär granskning
Granskning --> Registrerad : Återta till utkast
Granskning --> Åtgärdad : Åtgärda
Granskning --> Avvisad : Avvisa
Åtgärdad --> [*]
Avvisad --> [*]
Steg i detalj:
- Registrerad (utkast) — Förslaget registreras med fritext. Det kan redigeras och raderas.
- Granskning begärd — Förslaget skickas för bedömning. Det kan återtas till utkast.
- Åtgärdad/Avvisad — Granskaren åtgärdar eller avvisar förslaget med motivering.
Systemet stödjer fyra rapporttyper som stöder gransknings- och beslutsprocesserna:
- Historikrapport — Tidslinje över alla versioner av ett krav.
- Granskningsrapport — Jämförelse mellan basversion och granskningsversion med ordnivådifferenser.
- Kravlistrapport — Tabellrapport över filtrerade krav.
- Kombinerad granskningsrapport — Flerkravsrapport med innehållsförteckning och sidnumrering.
┌──────────────────────────────────────────────────────────┐
│ << Business Process: Kravlivscykel >> │
│ │
│ ┌──────────┐ ┌───────────┐ ┌───────────────┐ │
│ │ Författa │───>│ Granska │───>│ Publicera │ │
│ │ krav │ │ krav │ │ krav │ │
│ └──────────┘ └───────────┘ └───────────────┘ │
│ │ │ avslå │ │
│ │<──────────────┘ │ │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ Arkivera │ │
│ │ │ krav │ │
│ │ └──────────────┘ │
│ │ │ │
│ │<────────────────────────────────┘ återaktivera │
└──────────────────────────────────────────────────────────┘
│ │ │ │
[Assigned to] [Assigned to] [Assigned to] [Assigned]
▼ ▼ ▼ ▼
┌────────────┐ ┌───────────┐ ┌────────────┐ ┌─────────┐
│ Författare │ │ Granskare │ │ Förvaltare │ │ Admin │
│ (Author) │ │ (Reviewer)│ │ (Manager) │ │ │
└────────────┘ └───────────┘ └────────────┘ └─────────┘
Intressenter: Arkitekturledningen · verksamhetsarkitekt · huvudarkitekt · lösningsarkitekt · mjukvaruarkitekt · driftorganisation
Kravhantering nås via webbläsare och presenterar kravkatalogen som primär arbetsyta. Nedan beskrivs de huvudsakliga användningsmönstren.
Huvudvyn (/requirements) visar samtliga krav i en
tabellvy med:
- Kolumnhantering — Administratörer anger organisationsstandard för vilka kolumner som visas och deras ordning. Användare kan anpassa lokalt via webbläsarens lagring.
- Filtrering — Kravområde, kategori, typ, kvalitetskaraktäristik, status, scenario och testflagga.
- Sortering — Enkelkolumnssortering med klick-baserad växling (stigande/fallande).
- Kolumnbreddsjustering — Kalkylbladsliknande dra-och-släpp med tangentbordsstöd.
- Radval — Kryssrutor för batchoperationer (t.ex. kombinerad granskningsrapport).
Klick på en rad expanderar en inline-detaljpanel som
visar kravtext, acceptanskriterier, område med ägare,
referenser och scenarier. Alternativt öppnas en
helsidevy (/requirements/[id]).
Från detaljvyn kan användaren:
- Utföra statusövergångar via knappar
- Redigera krav (skapar ny version om publicerat)
- Generera och ladda ner rapporter (PDF eller utskrift)
- Visa versionshistorik i sidopanel
Kravpaket nås via /requirement-packages/[slug]
och visar samtliga kravposter i paketet med:
- Postöversikt — Tabell med kravnamn, kravversion, risknivå och användningsstatus.
- Statushantering — Varje kravpost har en egen status (t.ex. Inkluderad eller Avviken) som kan ändras direkt i vyn.
- Avsteghantering — Från en kravpost kan
användaren registrera, redigera och begära
granskning av avsteg. En stepper-komponent
(
DeviationStepper) visar avstegsstatus grafiskt (Utkast → Begärd granskning → Beslutat). Beslutsfattande sker via en dedikerad dialog (DeviationDecisionModal). - Avsteghistorik — Alla avsteg för en
kravpost visas med senaste avsteget
framhävt och äldre i en expanderbar
historiksektion (
DeviationPill).
Administrationscentret (/admin) erbjuder tre flikar:
- Terminologi — Hantera visningsnamn för kravrelaterade begrepp (singular, plural, bestämd plural) på svenska och engelska.
- Kolumner — Ange standardkolumner och ordning för kravlistan organisationsövergripande.
- Referensdata — Navigeringsnav till alla referensdatasidor (områden, typer, kategorier, kvalitetskaraktäristiker, statusar, scenarier, paket).
- CSV-export — Filtrerade kravlistor exporteras
som CSV via
format=csvpå API:et. - PDF-rapporter — Genereras på klientsidan via
@react-pdf/renderer(automatisk nedladdning) eller via webbläsarens utskriftsfunktion (HTML/CSS med@media print).
Språkval (svenska/engelska) påverkar hela
applikationen: navigation, etiketter, kravmetadata
i listor och detaljvyer, rapportrubriker och
CSV-kolumnnamn. Språket styrs via URL-prefix
(/sv/... eller /en/...) och next-intl-middleware.
Intressenter: Arkitekturledningen · verksamhetsarkitekt · huvudarkitekt · lösningsarkitekt · mjukvaruarkitekt · driftorganisation
Applikationen erbjuder tre huvudsakliga gränssnitt för informationsutbyte:
| Gränssnitt | Protokoll | Konsument | Syfte |
|---|---|---|---|
| REST API | HTTP/JSON | Webbapplikation | CRUD, filtrering, statusövergångar |
| MCP-server | HTTP/JSON (Streamable) | AI-agenter | Kravfrågor, mutation, statusövergångar |
| Export | CSV, PDF | Slutanvändare | Rapporter och datautbyte |
MCP-servern (/api/mcp) exponerar fyra verktyg som
gör det möjligt för AI-agenter att interagera med
kravkatalogen:
requirements_query_catalog— Lista krav eller uppslagstabeller.requirements_get_requirement— Hämta detalj, specifik version eller fullständig historik.requirements_manage_requirement— Skapa, redigera, arkivera, radera utkast, återställ.requirements_transition_requirement— Statusövergångar.
MCP-servern och REST API:et delar samma
RequirementsService-lager (lib/requirements/)
vilket säkerställer konsekvent affärslogik oavsett
åtkomstkälla.
I nuläget har systemet inga integrationer mot externa system. All data hanteras inom applikationens egen databas. Nedan beskrivs de interna applikationssambanden:
┌───────────────────────────────────────────────────────────────┐
│ << Application Cooperation Viewpoint >> │
│ │
│ ┌────────────┐ ┌────────────────────────────────┐ │
│ │ Webbläsare │────────>│ Next.js App Router (UI) │ │
│ │ (Användare)│ HTTPS │ /[locale]/requirements/... │ │
│ └────────────┘ └──────────┬─────┬───────────────┘ │
│ │ │ │
│ ┌────────────┐ ┌──────────▼──┐ │ │
│ │ AI-agenter │────────>│ MCP-server │ │ │
│ │ (MCP- │ HTTP │ /api/mcp │ │ │
│ │ klienter) │ └──────┬──────┘ │ │
│ └────────────┘ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────┐ │
│ │ RequirementsService │ │
│ │ (Gemensam affärslogik) │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ┌───────────▼────────────┐ │
│ │ Data Access Layer │ │
│ │ (lib/dal/) │ │
│ └───────────┬────────────┘ │
│ │ │
│ ┌───────────▼────────────┐ │
│ │ Cloudflare D1 │ │
│ │ (SQLite) │ │
│ └───────────────────────-┘ │
│ │
│ << Application Interfaces >> │
│ ┌───────────┐ ┌──────────┐ ┌──────────────────────────┐ │
│ │ JSON/REST │ │ CSV │ │ PDF (react-pdf / print) │ │
│ └───────────┘ └──────────┘ └──────────────────────────┘ │
└───────────────────────────────────────────────────────────────┘
Intressenter: Mjukvaruarkitekt · mjukvaruutveckling
Applikationen följer Next.js 16 App Router-konventionen med locale-baserad routing:
app/
[locale]/
requirements/ Kravlista och detaljvy
[id]/ Enskilt krav
reports/ Rapportrendering (print/pdf)
admin/ Administrationscenter
requirement-areas/ Områdeshantering (CRUD)
requirement-packages/ Pakethantering
usage-scenarios/ Scenariohantering
requirement-statuses/ Statushantering
requirement-types/ Typhantering
quality-characteristics/ Kvalitetskaraktäristiker
api/
requirements/ REST-ändpunkter
admin/ Admin-API
mcp/ MCP-server
components/ Delade React-komponenter
lib/
dal/ Data Access Layer
requirements/ Affärslogik (service, auth, errors)
mcp/ MCP-serverkonfiguration
reports/ Rapportmallar och datahämtning
drizzle/
schema.ts Databasschema (Drizzle ORM)
seed.ts Testdata
migrations/ SQL-migreringar
messages/
en.json Engelska översättningar
sv.json Svenska översättningar
Applikationen implementerar ett tydligt skiktat mönster:
- Presentationslager — React-komponenter
(
components/) och sidokomponenter (app/). - Affärslogiklager —
RequirementsService(lib/requirements/service.ts) som exponerar fyra huvudoperationer:queryCatalog,getRequirement,manageRequirementochtransitionRequirement. - Dataåtkomstlager — DAL-moduler i
lib/dal/med en modul per databastabell (t.ex.requirements.ts,owners.ts,requirement-areas.ts). - Databaslager — Drizzle ORM-schema i
drizzle/schema.tsmed 15+ tabeller och explicita relationer.
erDiagram
requirements ||--o{ requirement_versions : "har versioner"
requirements }o--|| requirement_areas : "tillhör område"
requirement_versions }o--|| requirement_statuses : "har status"
requirement_versions }o--o| requirement_categories : "klassificerad som"
requirement_versions }o--o| requirement_types : "av typ"
requirement_versions }o--o| quality_characteristics : "kvalitetskaraktäristik"
requirement_versions }o--o| risk_levels : "risknivå"
requirement_versions ||--o{ requirement_version_usage_scenarios : "kopplade scenarier"
requirement_version_usage_scenarios }o--|| usage_scenarios : "refererar scenario"
requirement_versions ||--o{ requirement_version_norm_references : "kopplade normreferenser"
requirement_version_norm_references }o--|| norm_references : "refererar normreferens"
requirement_areas }o--|| owners : "ägs av"
usage_scenarios }o--o| owners : "ägs av"
quality_characteristics }o--o| quality_characteristics : "förälder"
quality_characteristics }o--|| requirement_types : "kopplad till typ"
requirement_packages ||--o{ requirement_package_items : "innehåller"
requirement_packages ||--o{ package_local_requirements : "innehåller pakets unika krav"
requirement_package_items }o--|| requirements : "pekar på krav"
requirement_package_items }o--o| package_item_statuses : "användningsstatus"
requirement_package_items ||--o{ deviations : "har avsteg"
package_local_requirements }o--|| requirement_areas : "klassificerat i område"
package_local_requirements }o--o| requirement_categories : "klassificerat som"
package_local_requirements }o--o| requirement_types : "av typ"
package_local_requirements }o--o| quality_characteristics : "kvalitetskaraktäristik"
package_local_requirements }o--o| risk_levels : "risknivå"
package_local_requirements }o--o| package_item_statuses : "användningsstatus"
package_local_requirements }o--o| package_needs_references : "behovsreferens"
package_local_requirements ||--o{ package_local_requirement_usage_scenarios : "kopplade scenarier"
package_local_requirement_usage_scenarios }o--|| usage_scenarios : "refererar scenario"
package_local_requirements ||--o{ package_local_requirement_norm_references : "kopplade normreferenser"
package_local_requirement_norm_references }o--|| norm_references : "refererar normreferens"
package_local_requirements ||--o{ package_local_requirement_deviations : "har avsteg"
requirements ||--o{ improvement_suggestions : "har förbättringsförslag"
Tillämpningsbarhet via användningsscenarier. Tabellen
usage_scenarioshanterar även tillämpningsbarhet — d.v.s. i vilka kontexter eller miljöer ett krav gäller (t.ex. "Alla system").
Alla uppslagstabeller (kategorier, typer, statusar,
scenarier, kvalitetskaraktäristiker) lagrar
användarsynliga texter i separata kolumner per språk:
name_sv och name_en. Applikationen väljer rätt
kolumn baserat på aktivt locale vid frågetillfället.
Kvalitetskaraktäristikerna följer ISO/IEC 25010:2023 med 48 poster i en hierarkisk trädstruktur (förälder-barn-relationer).
Eftersom ett krav kan ha flera versioner i olika statusar beräknas en effektiv status vid listningsfrågor enligt prioritetsordning: Publicerad > Arkiverad > Granskning > Utkast.
Intressenter: Lösningsarkitekt · infrastrukturarkitekt · driftorganisation
Kravhantering driftas i nuläget på Cloudflare Workers — en serverlös plattform som kör applikationskod vid Cloudflare:s kantservrar globalt. Plattformsvalet eliminerar behovet av egen serverinfrastruktur.
Plattformsoberoende: Cloudflare Workers och Cloudflare D1 är utbytbara. Applikationen bygger på Next.js och SQLite via Drizzle ORM — tekniker som stöds av flertalet molnplattformar. Ett byte till exempelvis Vercel, AWS Lambda eller Azure App Service kräver anpassning av deploy-adapter och databasbindning, men påverkar inte affärslogik eller användargränssnitt.
| Tjänst | Användning |
|---|---|
| Cloudflare Workers | Kör Next.js-applikationen via OpenNext-adaptern |
| Cloudflare D1 | SQLite-databas (serverlös, replikerad) |
| Cloudflare Assets | Statiska tillgångar (JS, CSS, bilder) |
Next.js-applikationen paketeras för Cloudflare via
OpenNext-adaptern (@opennextjs/cloudflare) som
kompilerar serverfunktionerna till en enda
Worker-fil (.open-next/worker.js) och separerar
statiska tillgångar (.open-next/assets).
Källkod
│
▼
Next.js build (NODE_ENV=production)
│
▼
OpenNext build (opennextjs/cloudflare)
│
├── .open-next/worker.js ← Serverfunktioner
└── .open-next/assets/ ← Statiska filer
│
▼
Wrangler deploy → Cloudflare Workers + Assets
- Kompatibilitetsdatum: 2026-02-13
- Kompatibilitetsflaggor:
nodejs_compat,global_fetch_strictly_public - Anpassad domän:
kravhantering.{foretag}.se - Observerbarhet: Aktiverad med 1 % stickprov (ett av hundra inkommande förfrågningar loggas).
| Bindning | Typ | Beskrivning |
|---|---|---|
DB |
D1Database | Databasanslutning |
IMAGES |
Cloudflare Images | Bildoptimering |
ASSETS |
Fetcher | Statiska tillgångar |
Intressenter: Lösningsarkitekt · infrastrukturarkitekt · driftorganisation
I nuvarande version saknar systemet integrerad
autentisering och auktorisering. Alla operationer
tillåts via en AllowAllAuthorizationService.
Arkitekturen har dock förberetts för framtida
behörighetskontroll genom följande utvidgningspunkter
i lib/requirements/auth.ts:
ActorContext— Modell för aktörens identitet, autentiseringsstatus, roller och källa (anonymous, headers, session, token, mcp).RequestContext— Omsluter aktör, förfrågnings-ID, källa (REST/MCP) och verktygsnamn.AuthorizationService— Pluggbart gränssnitt för att validera åtgärder mot roller.RequirementsAction— Typad åtgärdsmodell som täcker alla operationer (query_catalog,get_requirement,manage_requirement,transition_requirement).
- Content Security Policy (CSP) — Varje förfrågan genererar ett unikt nonce (16 slumpmässiga bytes, base64-kodat) för inline-skript. Produktions-CSP kräver nonce för alla skript.
- Middleware —
middleware.tshanterar CSP och i18n-routing för varje inkommande förfrågan.
Systemet planerar införande av RBAC med fyra roller:
| Roll | Behörigheter |
|---|---|
| Författare (Author) | Skapa krav, redigera egna krav, övergång Utkast → Granskning |
| Granskare (Reviewer) | Övergång Granskning → Publicerad eller Granskning → Utkast |
| Förvaltare (Manager) | Arkivera publicerade krav, återaktivera arkiverade krav |
| Admin | Alla behörigheter inklusive användar- och rollhantering |
Införandet av RBAC planeras i fyra faser:
- Transportautentisering — Bearer-token-validering på API- och MCP-ändpunkter.
- Tjänsteauktorisering — Ersätt
AllowAllAuthorizationServicemed en policyimplementation som mappar operationer mot roller. - IdP-integration — Anslutning till extern identitetsleverantör (Microsoft Entra ID eller Auth0) för JWT-baserad autentisering.
- Granskningsloggning — Utökad loggning av alla skrivoperationer med aktör, roll, åtgärd och utfall.
Intressenter: Lösningsarkitekt · mjukvaruarkitekt · mjukvaruutvecklare · leverantör
Utveckling sker i en Dev Container baserad på Ubuntu 24.04 med följande förinstallerade verktyg:
| Verktyg | Version | Användning |
|---|---|---|
| Node.js | 24+ | Runtime |
| TypeScript | 5.9 (strict) | Typkontroll |
| Biome | 2.4 | Linting och formatering |
| cSpell | 9.7 | Stavningskontroll (sv + en) |
| markdownlint | — | Markdown-kvalitet |
| Wrangler | 4.75 | Cloudflare CLI, lokal D1 |
| Ramverk | Typ | Konfiguration |
|---|---|---|
| Vitest 4.1 | Enhetstester, komponenttester | jsdom-miljö, V8-kodtäckning |
| Playwright 1.58 | Integrationstester (E2E) | Chromium, Firefox, WebKit |
| Testing Library | React-komponenttester | @testing-library/react |
Alla kontroller samlas i ett enda kommando:
npm run check
├── type-check Typkontroll (tsc --noEmit)
├── lint:py Python-typkontroll (Pyright strict)
├── format:check Formateringskontroll (Biome)
├── spell:check Stavningskontroll (cSpell)
├── lint Linting (Biome strict)
├── lint:md Markdown-linting
└── test Enhetstester (Vitest)
Integrationstester körs separat:
npm run test:integration Mot utvecklingsserver
npm run test:integration:preview Mot byggd version
Utvecklare arbetar mot en lokal SQLite-databas via Wrangler:
npm run db:setup
├── Rensa befintlig databas
├── Applicera migreringar (Wrangler D1)
└── Tilldela testdata (drizzle/seed.ts)
Testdata innehåller 367 krav fördelade på tio kravområden med fullständig versionshistorik.
- TypeScript strict mode — Inga implicita
any, strikta null-kontroller. - Path alias —
@/*mappar till projektroten. - JUnit-rapporter — Genereras av både Vitest och Playwright för CI-integration.
- Kodtäckning — V8-baserad med rapportering i text, JSON, HTML, LCOV (Codecov-kompatibel).
Intressenter: Lösningsarkitekt · infrastrukturarkitekt · driftorganisation
Kravhantering implementerar följande informationssäkerhetsåtgärder i nuvarande version:
- Parameteriserade frågor — Drizzle ORM genererar parameteriserade SQL-frågor. Ingen rå SQL-interpolering förekommer i applikationen.
- Content Security Policy — Nonce-baserad CSP per förfrågan förhindrar obehörig skriptkörning (XSS). Produktionsmiljön kräver nonce för alla inline-skript.
- Mjuk radering — Krav arkiveras med
is_archived-flagga. Ingen data raderas permanent. - Fullständig revisionshistorik — Varje ändring
av kravinnehåll skapar en ny versionsrad.
Tidsstämplar spårar skapande (
created_at), redigering (edited_at), publicering (published_at) och arkivering (archived_at). - Strukturerad loggning — JSON-formaterade loggar med fält för händelse, förfrågnings-ID, aktör, källa, krav-ID, versionsnummer och körtid.
- HTTPS genomgående via Cloudflare:s kantterminering.
- Utvecklingsmiljön tillåter
unsafe-evalför HMR och WebSocket-anslutningar — denna lättnad gäller inte i produktion.
Med införandet av RBAC (se perspektiv 7) planeras utökade säkerhetsåtgärder:
- Granskningsloggning — Alla skrivoperationer loggas med aktör-ID, roller, verktygsnamn, operation, krav-ID och utfall (tillåten, nekad, lyckad, misslyckad).
- Token-validering — JWT-baserad autentisering med signaturverifiering vid kantservern.
- Rollbaserad åtkomstkontroll — Skrivoperationer begränsas till behöriga roller. Läsåtkomst tillgänglig för alla autentiserade användare.
Intressenter: Lösningsarkitekt · infrastrukturarkitekt · driftorganisation
Eftersom Cloudflare Workers och Cloudflare D1 är utbytbara (se perspektiv 1 och 6) beskriver detta perspektiv de generella infrastrukturkrav som gäller oavsett vilken driftplattform som väljs.
- Serverlös eller containerbaserad körmiljö som kan köra en Node.js-kompatibel Next.js-applikation.
- Stöd för edge- eller lokalt baserad exekvering — applikationen har inga krav på specifik geografisk placering men bör vara nåbar med låg latens för målgruppen.
- Inga långvariga bakgrundsprocesser krävs — alla förfrågningar är kortlivade (request/response).
- SQLite-kompatibel databas — applikationen
använder Drizzle ORM med SQLite-dialekt.
Alternativ inkluderar:
- Cloudflare D1 (nuvarande)
- Turso (libSQL)
- LiteFS (Fly.io)
- Lokal SQLite-fil (vid traditionell hosting)
- Databasen lagrar all kravdata, versionshistorik, taxonomi och UI-konfiguration.
- Storleken är begränsad — 367 krav med full versionshistorik resulterar i en databas under 50 MB.
- En CDN eller statisk filhanterare för att servera JavaScript-buntar, CSS och bilder.
- Vid Cloudflare: Assets-bindning. Vid alternativa plattformar: S3 + CloudFront, Vercel Edge Network, Azure Blob Storage etc.
- HTTPS — Obligatoriskt. TLS-terminering kan ske vid kantservern eller via en reverse proxy.
- DNS — En anpassad domän
(
kravhantering.{foretag}.se) med CNAME- eller A-post mot driftplattformen. - Inga inkommande integrationer — Systemet exponerar REST API och MCP-server men tar inte emot callbacks eller webhooks från externa system.
- Inga utgående integrationer — I nuläget gör applikationen inga anrop till externa tjänster.
- Plattformen bör stödja begärandeloggning (minst stickprovsbaserad).
- Applikationen genererar strukturerade JSON-loggar som kan ledas till valfritt loggsystem (t.ex. Grafana Loki, Datadog, Azure Monitor).
| Plattform | Compute | Databas | Statiska filer | Adapter |
|---|---|---|---|---|
| Cloudflare (nuvarande) | Workers | D1 (SQLite) | Assets | @opennextjs/cloudflare |
| Vercel | Serverless Functions | Turso / Neon | Edge Network | Inbyggd Next.js |
| AWS | Lambda@Edge / ECS | RDS SQLite / Turso | S3 + CloudFront | @opennextjs/aws |
| Azure | App Service / Functions | Azure SQL / Turso | Blob Storage | Node.js-adapter |
| Självhostad | Node.js-process | Lokal SQLite-fil | Nginx / Caddy | next start |
Byte av plattform kräver anpassning av deploy-adapter och databasbindning (
lib/db.ts,wrangler.jsoncrespektive motsvarande konfiguration). Affärslogik, användargränssnitt och databasschema förblir oförändrade.
Följande perspektiv från arkitekturmallen har bedömts som ej tillämpligt för denna lösning:
- Implementering- och förflyttningsperspektiv — Lösningen är nyutvecklad utan migrering från befintligt system. Driftsättning hanteras genom den valda plattformens CLI-verktyg.