Skip to main content

Sanntid, dypelenker og notifikasjoner

Når noe skjer i Utleggsappen, må riktig person ofte få beskjed og ledes til riktig sted. Denne siden dekker tre ting integrasjoner ofte trenger: lytte på hendelser i sanntid (SSE), bygge dypelenker tilbake til appen, og forstå hvordan notifikasjoner fungerer.

Server-Sent Events (SSE) — lytte på hendelser i sanntid

Bruk SSE når du vil reagere på hendelser i Utleggsappen uten å polle.

Admin-perspektiv: Hvis du er admin og bare vil at organisasjonen din skal kalle en URL når noe skjer (f.eks. når en rapport godkjennes), bruk HTTP-forespørsel-handlingen i Flyt og automatisering i stedet. SSE passer for utviklere som bygger backend som trenger en kontinuerlig hendelsesstrøm.

Endepunkt

GET https://api.utlegg.app/sse/events
Authorization: Bearer ua_... (PAT eller SAT)
Accept: text/event-stream

Response-stream er standard SSE — én linje med data: {...} per event, dobbel newline mellom events. Heartbeats sendes periodisk for å holde forbindelsen åpen.

Filter med scopes

Default får du alle hendelser brukeren/tokenen har tilgang til. Snevre inn med scopes-parameteren (JSON-array, URL-encodet):

SCOPES='[{"resourceType":"report","eventType":"approved"},{"resourceType":"report","eventType":"submitted"}]'
curl -N "https://api.utlegg.app/sse/events?scopes=$(jq -rn --arg s "$SCOPES" '$s|@uri')" \
-H "Authorization: Bearer ua_..." \
-H "Accept: text/event-stream"

Event-skjema

type ClientUiEvent = {
resourceType: 'report' | 'organization' | 'department'
| 'expense' | 'user' | 'account' | 'invoice';
eventType: 'created' | 'updated' | 'deleted'
| 'submitted' | 'approved' | 'rejected'
| 'reviewed' | 'published' | 'stale';
resourceId: string;
timestamp: number; // unix ms
id?: string; // for deduplisering / resume
};

Når du mottar et event, hent fullt objekt fra det relevante REST-endepunktet (GET /reports/{id} osv.) — selve event-payloaden er bevisst tynn.

Eksempel (JS / Node)

const es = new EventSource(
'https://api.utlegg.app/sse/events',
{ headers: { Authorization: `Bearer ${process.env.UA_TOKEN}` } }
);

es.onmessage = (msg) => {
const event = JSON.parse(msg.data);
if (event.resourceType === 'report' && event.eventType === 'approved') {
fetchAndProcessReport(event.resourceId);
}
};

Praktiske hensyn

  • Forbindelsen er knyttet til ditt token. Ved token-utløp må klienten reconnecte med ny token.
  • Klient bør implementere reconnect med eksponentielt backoff og bruke event.id til å droppe duplikater på reconnect.
  • Hendelser er filtrert per organisasjon og rolle på server-siden — du ser bare det tokenen din har tilgang til.
  • For deterministisk levering ved tap av forbindelse, kombiner SSE med periodisk polling av /reports?updatedAfter=... som backup.

Dypelenker

Bruk dypelenker når du sender brukeren fra ditt system tilbake til Utleggsappen.

Stabile ruter

https://app.utlegg.app/reports/{reportId}
https://app.utlegg.app/inbox/{itemId}
https://app.utlegg.app/{organization_handle}/godkjenning/{reportId}

Mobilappen åpner samme URLer via Universal Links (iOS) og App Links (Android).

Tips

  • Bygg lenker rundt objekter og handlinger, ikke skjermnavn — UI-struktur kan endres.
  • Samle ruter i én helper i koden din slik at samme format brukes i e-post, push og web.

Notifikasjoner

Brukerne får beskjed gjennom flere kanaler:

  • Push (mobilapp) — primær kanal for action-required hendelser
  • E-post — sendes som backup eller når brukeren ikke har appen
  • Innboks — vedvarende oppgaveliste i appen
  • Slack / Teams (organisasjonsnivå) — konfigureres av admin

Som integrator påvirker du ikke notifikasjonene direkte — de utløses av samme hendelser som SSE eksponerer. Vil du sende egne varsler, abonner på SSE og gjør utsendingen i ditt eget system.

Se også