You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 9 Next »

Indholdsfortegnelse

Introduktion

Formål

Formålet med dette dokument er at beskrive systemarkitekturen for GM-BFF.

Læsevejledning

Nærværende dokument er tiltænkt udviklere og IT-arkitekter med interesse i GM-BFF og dens opbygning.

Definitioner og referencer

NSPNational Service Platform
GMGraviditetsmappen

Overblik over GM-BFF

Backend For Frontend (GM-BFF) er en service, som skal servicere MinGraviditet app. Den følger BFF mønsteret (https://samnewman.io/patterns/architectural/bff/), hvilket resulterer i en række operationer, der stiller data til rådighed i klumper tilpasset klientens (appens) behov, uanset at disse kan komme fra flere datakilder eller i strukturer der ikke egner sig til appens brug. BFF'en har til opgave at sammenstille og omforme data efter appens behov.

gm-bff component overview

BFF'en henter data fra 2 kilder: gm-facade på NSP for journaldata og CMS for artikler, tekster og tjeklister. Journal data caches i en lokal database, for at undgå gentagne opslag efter de samme data.

Løsningens afhængigheder

BFF'en udstilles som en Spring Boot server med et REST API.

CMS er en Strapi (https://strapi.io/) instans, hostet i samme kubernetes miljø som BFF'en. Strapi stiller et API til rådighed til udlæsning af ressourcer i Strapi, fx kategorier, artikler eller tjeklister. API'et er et REST agtigt api med en lidt speciel syntaks for søgninger og specificering af returnerede værdier. Disse særheder gemmes bag BFF'en, så appen kan få et API der er lettere at arbejde med.

gm-facade komponenten ligger på NSP, og udstiller en FHIR model for graviditetsmappen. Da der ikke er indført et forløbsbegreb eller lignende strukturerende begreber, er der kun én operation på gm-facade, nemlig "hent hele journalen for den angivne borger". Denne udstilles i en FHIR model som BFF læser og omformer til en intern model, der benyttes til de enkelte operationer på BFF.

Løsningens arkitektur

Internt er BFF'en struktureret i delkomponenter som følger:

  • Controllere: API'et specificeret i OpenAPI, og ud fra dette genereres model-klasser og API interfaces. Disse API interfaces implementeres af Controllere, hvis formål er at udstille operationerne på BFF web servicen.
  • Config: Applikationen er en Spring Boot applikation, så en del aspekter er sat op gennem konfiguration og interceptorer, deriblandt sikkerhed og logning.
  • Integrationer: Der skal kaldes til eksterne services i form af CMS og gm-facade.
  • Mappere: For at oversætte de interne modeller til API'ets modeller foretages mapning fra interne model-klasser eller kaldte services modeller til BFF API'ets genererede model-klasser.
  • Journal Translator: gm-facadens FHIR model oversættes til en intern model, der er nemmere at arbejde med.
  • Journal Logic: Udledning af terminsdatoer og forløb fra journal-modellen.
  • Journal Cache: En tidsbestemt caching af læste journal data pr. borger.


Den simpleste udgave af et kald på BFF kalder videre til CMS eller gm-facade, omformer svaret til det rette format og returnerer dette. Lidt mere detaljeret ser det sådan ud:

gm-bff sequence diagram

Der er som det ses af ovenstående mere end blot gennemstilling af kald:

  • gm-facaden returnerer en FHIR model. Modellen består af en masse FHIR Observations med data i forskellige extensions. For at gøre navigationen i modellen lettere, læses FHIR modellen over i en model der afspejler den logiske model mere direkte, dvs. man kan tilgå data på mere sigende vis, fx prf.allergiskDiposition().barnDisponeret().  Dette sker i SearchBundleTranslator og returnerer en UnstructuredJournal.
  • UnstructuredJournal indeholder stadig alle borgerens dokumenter i ustruktureret form. Da der ikke er et eksplicit forløbsbegreb, er vi nødt til at forsøge at samle dokumenter i grupper der er samme forløb. Dette foregår i CarePathExtractor, der udleder forløbsperioder ud fra registrerede terminsdatoer og fordeler dokumenter i de forskellige forløb.
  • Endelig skal data formateres om fra UnstructuredJournal til operationens API. For de helt simple operationer foregår det bare direkte i controlleren, men for mere avancerede strukturer foregår det i en mapper, ala BackgroundInfoJournalDataSetMapper.

Ovenstående sekvensdiagram ignorerer to yderligere kompleksiteter, nemlig cachen af journaldata og sammenstilling af journaldata med CMS indhold. Sammenstilling af data foregår ved at data hentes fra CMS (fx i dette tilfælde ordforklaringer) og fra gm-facaden, og i mapperen plukkes data så fra hhv. CMS'ens eller gm-facadens returnerede data.

Cache

Caching foregår ved at UnstructuredJournal objektet serialiseres til JSON og gemmes i databasen. Ved senere operationer for samme borger checkes i databasen om der er en cachet værdi der kan bruges, og i så fald undgås kaldet til gm-facaden.

Nøglen til opslag i cachen er borgerens CPR (taget fra bearer token) kombineret med BFF'ens release nummer. CPR er fordi det er borgerens journal... BFF'ens release nummer er for at gamle cachede data ikke genbruges med potentielle kodeændringer, der gør man ikke kan læse det cachede korrekt.

Cachen er tidsbegrænset, dvs. en cachet værdi genbruges kun hvis den er hentet for nyligt. Hvor lang tid cachen skal gælde er konfigurerbart, men er i udgangspunktet konfigureret til en halv time. Dog er det lavet sådan at hver gang man bruger data nulstilles uret. Så hvis man læser journalen op og lægger den i cachen, og så læser den igen 20 minutter senere, vil den så igen gælde 30 minutter derfra, altså 50 minutter i alt, hvis den ikke tilgås igen inden.

Cachen ryddes op løbende af et baggrundsjob, der kører hvert 5 minut (konfigurerbart). Jobbet finde alle indgang der er udløbet og slette dem fra databasen.

Sikkerhed

REST servicens API er delt i åbne og lukkede endpoints. De endpoints der ikke involverer persondata, er åbne og kræver ingen adgangskontrol.

For de lukkede endpoints er adgangskontrollen baseret på bearer token sikkerhed. Tokens valideres for gyldighed, for issuer og for om de har det forventede scope. Det givne token sendes i øvrigt videre med til kald på gm-facaden.

BFF'en kobles på sundhedsdatanettet til al adgang til NSP'en.

Dokument Historik

3/4 2025Martin Henriksen/SDSEtablering af dokumentation


  • No labels