# navikt/veilarbdialog architecture

> Architecture diagram of the GitHub repository navikt/veilarbdialog, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/navikt/veilarbdialog
- Repository: https://github.com/navikt/veilarbdialog

## Overview

Veilarbdialog is a backend for employment-related conversations, exposing REST services to retrieve, create, and change dialogs. The central workflow handles a message by finding or creating its dialog thread, persisting the message, updating read/waiting status, and publishing status to Kafka. Separate capabilities cover internal dialog access, escalation notices, user notifications, follow-up periods, and integrations. Connections reflect the README or shown source/index references; several endpoints and event consumers are represented from the tree, so their unverified wiring is omitted or dashed.

Main entry points: [`src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java`](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java) (Dialog service), [`src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt`](https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt) (Escalation service), [`src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt`](https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt) (User notifications), [`src/main/java/no/nav/fo/veilarbdialog/service/DialogStatusService.java`](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/service/DialogStatusService.java) (Status updates)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["Application APIs"]
  node_rest["Dialog REST<br/>[DialogRessurs.java]"]
  node_graphql["Dialog GraphQL"]
  node_internal["Internal API"]
end

subgraph group_dialog["Dialog lifecycle"]
  node_dialogservice["Dialog service"]
  node_dialogdata["Dialog state<br/>[DialogData.java]"]
  node_dialogstore[("Dialog storage<br/>[DialogDAO.java]")]
  node_status["Status updates"]
end

subgraph group_alerts["Alerts and escalation"]
  node_escalation["Escalation service"]
  node_escalationapi["Escalation API"]
  node_escalationstore[("Escalation records")]
  node_minside["User notifications"]
  node_notifyqueue[("Notification store")]
end

subgraph group_integrations["Events and integrations"]
  node_followup["Follow-up periods"]
  node_followupclient["Follow-up client"]
  node_kvp["KVP events"]
  node_periodconsumer["Period events"]
  node_oversikten["Oversikten outbox"]
  node_bigquery["Metrics export<br/>[BigQueryClient.kt]"]
  node_warehouse[("Data warehouse events")]
end

node_user(("User or adviser"))
node_kafka["Kafka"]
node_database[("Relational database")]
node_bigqueryservice[("Google BigQuery")]

node_user -.->|"uses"| node_rest
node_user -.->|"uses"| node_graphql
node_rest -.->|"delegates to"| node_dialogservice
node_graphql -.->|"delegates to"| node_dialogservice
node_internal -->|"queries"| node_dialogstore
node_dialogservice -->|"reads and writes"| node_dialogstore
node_dialogservice -->|"updates status"| node_status
node_dialogservice -->|"requests notifications"| node_minside
node_dialogservice -->|"uses state"| node_dialogdata
node_status -->|"reloads dialog"| node_dialogstore
node_status -->|"records events"| node_warehouse
node_status -.->|"updates status"| node_database
node_escalationapi -->|"delegates to"| node_escalation
node_escalation -->|"creates dialog"| node_dialogservice
node_escalation -->|"queues notice"| node_minside
node_escalation -->|"stores escalation"| node_escalationstore
node_escalation -->|"queues updates"| node_oversikten
node_escalation -->|"logs events"| node_bigquery
node_minside -->|"stores notices"| node_notifyqueue
node_minside -->|"checks eligibility"| node_followupclient
node_minside -->|"publishes notice events"| node_kafka
node_followup -->|"fetches fallback"| node_followupclient
node_followup -.->|"reads periods"| node_database
node_kvp -.->|"consumes events"| node_kafka
node_periodconsumer -.->|"consumes events"| node_kafka
node_oversikten -->|"publishes messages"| node_kafka
node_oversikten -.->|"stores outbox"| node_database
node_bigquery -->|"inserts metrics"| node_bigqueryservice
node_warehouse -.->|"writes events"| node_database

click node_rest "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/rest/DialogRessurs.java"
click node_graphql "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/graphql/DialogGraphqlController.java"
click node_internal "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/internapi/InternApiService.java"
click node_dialogservice "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java"
click node_dialogdata "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/domain/DialogData.java"
click node_dialogstore "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/db/dao/DialogDAO.java"
click node_status "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/service/DialogStatusService.java"
click node_escalation "https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt"
click node_escalationapi "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselController.java"
click node_escalationstore "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselRepository.java"
click node_minside "https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt"
click node_notifyqueue "https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/dto/MinsideVarselDao.kt"
click node_followup "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/oppfolging/siste_periode/SistePeriodeService.java"
click node_followupclient "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/oppfolging/v2/OppfolgingV2Client.java"
click node_periodconsumer "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/oppfolging/siste_periode/OppfolgingsperiodeConsumer.java"
click node_oversikten "https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/oversiktenVaas/OversiktenService.kt"
click node_bigquery "https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/eventsLogger/BigQueryClient.kt"
click node_warehouse "https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/db/dao/DataVarehusDAO.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_rest,node_graphql,node_internal,node_user toneBlue
class node_dialogservice,node_dialogdata,node_dialogstore,node_status,node_database,node_bigqueryservice toneAmber
class node_escalation,node_escalationapi,node_escalationstore,node_minside,node_notifyqueue toneMint
class node_followup,node_followupclient,node_kvp,node_periodconsumer,node_oversikten,node_bigquery,node_warehouse toneRose
class node_kafka toneIndigo
```

## Components

### Application APIs

- [Dialog REST](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/rest/DialogRessurs.java): `src/main/java/no/nav/fo/veilarbdialog/rest/DialogRessurs.java`
- [Dialog GraphQL](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/graphql/DialogGraphqlController.java): `src/main/java/no/nav/fo/veilarbdialog/graphql/DialogGraphqlController.java`
- [Internal API](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/internapi/InternApiService.java): `src/main/java/no/nav/fo/veilarbdialog/internapi/InternApiService.java`

### Dialog lifecycle

- [Dialog service](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java): `src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java`
- [Dialog state](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/domain/DialogData.java): `src/main/java/no/nav/fo/veilarbdialog/domain/DialogData.java`
- [Dialog storage](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/db/dao/DialogDAO.java): `src/main/java/no/nav/fo/veilarbdialog/db/dao/DialogDAO.java`
- [Status updates](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/service/DialogStatusService.java): `src/main/java/no/nav/fo/veilarbdialog/service/DialogStatusService.java`

### Alerts and escalation

- [Escalation service](https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt): `src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt`
- [Escalation API](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselController.java): `src/main/java/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselController.java`
- [Escalation records](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselRepository.java): `src/main/java/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselRepository.java`
- [User notifications](https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt): `src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt`
- [Notification store](https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/dto/MinsideVarselDao.kt): `src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/dto/MinsideVarselDao.kt`

### Events and integrations

- [Follow-up periods](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/oppfolging/siste_periode/SistePeriodeService.java): `src/main/java/no/nav/fo/veilarbdialog/oppfolging/siste_periode/SistePeriodeService.java`
- [Follow-up client](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/oppfolging/v2/OppfolgingV2Client.java): `src/main/java/no/nav/fo/veilarbdialog/oppfolging/v2/OppfolgingV2Client.java`
- **KVP events**
- [Period events](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/oppfolging/siste_periode/OppfolgingsperiodeConsumer.java): `src/main/java/no/nav/fo/veilarbdialog/oppfolging/siste_periode/OppfolgingsperiodeConsumer.java`
- [Oversikten outbox](https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/oversiktenVaas/OversiktenService.kt): `src/main/kotlin/no/nav/fo/veilarbdialog/oversiktenVaas/OversiktenService.kt`
- [Metrics export](https://github.com/navikt/veilarbdialog/blob/main/src/main/kotlin/no/nav/fo/veilarbdialog/eventsLogger/BigQueryClient.kt): `src/main/kotlin/no/nav/fo/veilarbdialog/eventsLogger/BigQueryClient.kt`
- [Data warehouse events](https://github.com/navikt/veilarbdialog/blob/main/src/main/java/no/nav/fo/veilarbdialog/db/dao/DataVarehusDAO.java): `src/main/java/no/nav/fo/veilarbdialog/db/dao/DataVarehusDAO.java`

### Other components

- **User or adviser**
- **Kafka**
- **Relational database**
- **Google BigQuery**

## Connections

- User or adviser → Dialog REST: uses
- User or adviser → Dialog GraphQL: uses
- Dialog REST → Dialog service: delegates to
- Dialog GraphQL → Dialog service: delegates to (evidence: `src/main/java/no/nav/fo/veilarbdialog/graphql/DialogGraphqlController.java`)
- Internal API → Dialog storage: queries (evidence: `src/main/java/no/nav/fo/veilarbdialog/internapi/InternApiService.java`)
- Dialog service → Dialog storage: reads and writes (evidence: `src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java`)
- Dialog service → Status updates: updates status (evidence: `src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java`)
- Dialog service → User notifications: requests notifications (evidence: `src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java`)
- Dialog service → Dialog state: uses state (evidence: `src/main/java/no/nav/fo/veilarbdialog/service/DialogDataService.java`)
- Status updates → Dialog storage: reloads dialog (evidence: `src/main/java/no/nav/fo/veilarbdialog/service/DialogStatusService.java`)
- Status updates → Data warehouse events: records events (evidence: `src/main/java/no/nav/fo/veilarbdialog/service/DialogStatusService.java`)
- Status updates → Relational database: updates status
- Escalation API → Escalation service: delegates to (evidence: `src/main/java/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselController.java`)
- Escalation service → Dialog service: creates dialog (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt`)
- Escalation service → User notifications: queues notice (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt`)
- Escalation service → Escalation records: stores escalation (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt`)
- Escalation service → Oversikten outbox: queues updates (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt`)
- Escalation service → Metrics export: logs events (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/eskaleringsvarsel/EskaleringsvarselService.kt`)
- User notifications → Notification store: stores notices (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt`)
- User notifications → Follow-up client: checks eligibility (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt`)
- User notifications → Kafka: publishes notice events (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/minsidevarsler/MinsideVarselService.kt`)
- Follow-up periods → Follow-up client: fetches fallback (evidence: `src/main/java/no/nav/fo/veilarbdialog/oppfolging/siste_periode/SistePeriodeService.java`)
- Follow-up periods → Relational database: reads periods
- KVP events → Kafka: consumes events
- Period events → Kafka: consumes events
- Oversikten outbox → Kafka: publishes messages (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/oversiktenVaas/OversiktenService.kt`)
- Oversikten outbox → Relational database: stores outbox
- Metrics export → Google BigQuery: inserts metrics (evidence: `src/main/kotlin/no/nav/fo/veilarbdialog/eventsLogger/BigQueryClient.kt`)
- Data warehouse events → Relational database: writes events
