You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Dialogporten skal la sluttbrukersystemer får en push notification hvis en dialog endres
Beskrivelse
For å kunne støtte bl.a. #331 og andre scenarioer der det er nødvendig for arbeidsflate/SBSer å kunne laste inn dialogen på nytt når den er endret, trenger vi å bygge støtte i DIalogporten for at det pushes en event til SBS-et om at en endring har blitt foretatt, slik at SBS-et da gjennom standard API kan laste dialogen på nytt. Dette gjelder i første omgang kun for detaljvisning av dialogen.
Løsningen vil basere seg på Azure Service bus. Outbox-pattern anses som unødvendig, siden dette ikke handler om å sikre konsistens (i motsetning til Altinn Events, hvor vi faktisk skal skrive til et API og gjøre en tilstandsendring).
Det vil fungere som følgende (BFF vil proxy mellom react og DP, dette er utelatt her for enkelhets skyld):
Bruker åpner en dialog. I en og samme graphql request hentes dialogen, og det åpnes en graphql subscription som oppgir dialogId-en som korrelerings-id
Dialogporten mottar requesten, og oppretter en subscription til en forhåndsdefinert topic i Service Bus. Subscriptionen er satt med et korreleringsfilter, slik at kun events knyttet til den aktuelle dialog-iden konsumeres. Det holdes oppe en connection til klienten (enten for SSE eller websocket)
Tjenesteeier gjør en endring på dialogen gjennom tjenesteeier-API. Så fort endringen er commited til database, legges ut en melding på Azure Service bus som oppgir den aktuelle dialogId-en som korrelerings-id. Meldingen har kort TTL (<5 sekunder)
Alle tråder på alle replicas som har en subscription med filter som treffer denne dialogId-en får melding om dette, og omsetter dette til en event på GQL-subscriptionen.
Frontend laster dialogen på nytt.
Merknad:
Innenfor TTL på meldingen vil en ny subscription føre til at meldingen mottas på nytt. Dvs. at for hver gang frontend laster en dialog som det er gjort en endring på innenfor TTL, vil det gjøre at en event mottas. Frontend må unngå at dette fører til reload-loops innenfor TTL. En måte er å skille på "loadDialogAndSubscribe" og bare "loadDialog", og bare gjøre sistnevnte ved mottatt event. Eventet vil også kunne inneholde informasjon om UpdatedAt, slik at frontend kan sammenligne med lastet dialog (hvis lastet dialog er nyere, ignorer event)
Gammel SignalR-basert tilnærming (ikke aktuell)
Vi implementerer en SignalR-hub som tilgjengeliggjøres sluttbrukern med biblioteket som tilbys av Microsoft for ASP.NET Core. Dette endpunktet konfigureres av arbeidsflate, og benyttes av statisk frontend. Dialogtoken blir benyttet for å autorisere requesten fra statisk frontend.
Når requesten mottas, sjekkes tokenet for gyldighet. Hvis tokenet er utløpt, indikeres dette med en 401 tilbake til statisk frontend, som da trigger en full refresh av siden som da vil innebære at et nytt dialogtoken blir benyttet.
Når tokenet er validert, hentes aktuell dialogId ut fra JWT-payloaden, og tilkoblingen blir lagt inn i en SignalR-gruppe som representerer dialogen, med noe ala await Groups.AddToGroupAsync(Context.ConnectionId, dialogIdFromJwt);. SignalR vil automatisk håndtere fjerning fra gruppen når connection faller bort av en eller annen grunn.
Ved endring av dialogen (når DialogportenService mottar domeneventet) kjøres det en notifikasjon om at dialogen er oppdatert, med noe ala await Clients.Group(dialogIdThatHasChanged).SendAsync("dialogUpdated", "");.
Dette vil underrette eventuelle lyttere, og react-frontenden vil da initiere en relasting av hele dialogen gjennom et kall til BFF-en.
Verdt å merke seg at så lenge brukeren holder oppe dialogen og ble autorisert ved registrering, vil den få notifikasjoner om at dialogen er oppdatert selv om dialogtokenet kan være utløpt eller til og med tilgang til dialogen er mistet. Dette anses som akseptabelt, siden man bare får informasjon om at dialogen er endret, og ikke hva endringen går ut på (dette må lastes på vanlig måte og er dermed gjenstand for vanlig autoriasjon)
The content you are editing has changed. Please copy your edits and refresh the page.
<!--- Provide a general summary of your changes in the Title above -->
## Description
![CleanShot 2024-09-02 at 16 58
07](https://github.com/user-attachments/assets/5e6a2847-0600-42f6-b233-df89fb0deafc)
## Related Issue(s)
- #378
## Verification
- [ ] **Your** code builds clean without any errors or warnings
- [ ] Manual testing done (required)
- [ ] Relevant automated test added (if you find this hard, leave it and
we'll help out)
## Documentation
- [ ] Documentation is updated (either in `docs`-directory, Altinnpedia
or a separate linked PR in
[altinn-studio-docs.](https://github.com/Altinn/altinn-studio-docs), if
applicable)
Co-authored-by: Knut Haug <knut.espen.haug@digdir.no>
Co-authored-by: Magnus Sandgren <5285192+MagnusSandgren@users.noreply.github.com>
Introduksjon
Dialogporten skal la sluttbrukersystemer får en push notification hvis en dialog endres
Beskrivelse
For å kunne støtte bl.a. #331 og andre scenarioer der det er nødvendig for arbeidsflate/SBSer å kunne laste inn dialogen på nytt når den er endret, trenger vi å bygge støtte i DIalogporten for at det pushes en event til SBS-et om at en endring har blitt foretatt, slik at SBS-et da gjennom standard API kan laste dialogen på nytt. Dette gjelder i første omgang kun for detaljvisning av dialogen.
Implementasjon
Vi ser på å bruke GraphQL subscriptions for dette. https://chillicream.com/docs/hotchocolate/v13/defining-a-schema/subscriptions
Løsningen vil basere seg på Azure Service bus. Outbox-pattern anses som unødvendig, siden dette ikke handler om å sikre konsistens (i motsetning til Altinn Events, hvor vi faktisk skal skrive til et API og gjøre en tilstandsendring).
Det vil fungere som følgende (BFF vil proxy mellom react og DP, dette er utelatt her for enkelhets skyld):
Merknad:
Gammel SignalR-basert tilnærming (ikke aktuell)
Vi implementerer en SignalR-hub som tilgjengeliggjøres sluttbrukern med biblioteket som tilbys av Microsoft for ASP.NET Core. Dette endpunktet konfigureres av arbeidsflate, og benyttes av statisk frontend. Dialogtoken blir benyttet for å autorisere requesten fra statisk frontend.Når requesten mottas, sjekkes tokenet for gyldighet. Hvis tokenet er utløpt, indikeres dette med en 401 tilbake til statisk frontend, som da trigger en full refresh av siden som da vil innebære at et nytt dialogtoken blir benyttet.
Når tokenet er validert, hentes aktuell dialogId ut fra JWT-payloaden, og tilkoblingen blir lagt inn i en SignalR-gruppe som representerer dialogen, med noe ala
await Groups.AddToGroupAsync(Context.ConnectionId, dialogIdFromJwt);
. SignalR vil automatisk håndtere fjerning fra gruppen når connection faller bort av en eller annen grunn.Ved endring av dialogen (når DialogportenService mottar domeneventet) kjøres det en notifikasjon om at dialogen er oppdatert, med noe ala
await Clients.Group(dialogIdThatHasChanged).SendAsync("dialogUpdated", "");
.Dette vil underrette eventuelle lyttere, og react-frontenden vil da initiere en relasting av hele dialogen gjennom et kall til BFF-en.
Verdt å merke seg at så lenge brukeren holder oppe dialogen og ble autorisert ved registrering, vil den få notifikasjoner om at dialogen er oppdatert selv om dialogtokenet kan være utløpt eller til og med tilgang til dialogen er mistet. Dette anses som akseptabelt, siden man bare får informasjon om at dialogen er endret, og ikke hva endringen går ut på (dette må lastes på vanlig måte og er dermed gjenstand for vanlig autoriasjon)
Oppgaver
The text was updated successfully, but these errors were encountered: