Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Table of Contents

Introduktion

I NAP optræder både self hosted services samt INSP services.

Denne guide er primært målrettet til anvendere, som skal implementere en ny afprøvningsløsning til INSP og har til formål, at give eksempler på kode og opsætning af web applikation og facade til NAP. 

...

Dette dokument er en del af den samlede dokumentation for NAP Reference implemenationimplementation.

Dokumentet er udformet, så det i videst muligt omfang opfylder sit formål uafhængigt af de øvrige dokumenter.

...

 NAP Ref.Impl. Opbygning

Nap-reference består references består af en java backend (nap-reference-facade) samt en front for backend (nap-reference-web), bygget med angular fremworket frameworket og som anvender version 1.0.0 af nap-typescript-sdk og nap-angular-sdk.

Applikationen kan køres indlejrede i et værtssytem (Applikationens hovedfunktionalitet er at vise aftaledokumenter for den patient, der er i kontekst i det værtssystem, den er indlejret i (f.eks. nap-java-host). Derfor af funktionalitet i applikationen begrænset, hvis den åbnes uden at være framet.

Hvis applikationen køres i indlejret som understøtter sikker browser opstart og tilføjer , hvori der tilføjes en NAP Bridge på global scope . Således af indlejrede systeme kan kommunikation mellem host og nap-reference ske i gennem NAP SDK - Guide til anvendere.

Denne kommunikation giver muligheden for overførelse af patientkonteksten og sessionsfejl  til det indlejret værtssysteminformationer som patientkontekst og sessionsfejl mellem det indlejrede system og værtssystemet.

Når nap-reference får overført en patientkontekst kaldes facaden med det cpr nummer sam samt en SOR værdi tilføjet i en "X-OrganizationSor" header (denne værdi er hardcoded i dette tilfælde, da den ikke kan læses ud af SOSI IDkortet)". Facaden validere kaldet og viderestiller til Dokumentdelingsservice (DDS)..

Nap-reference-facade sørger for at tjekke at  står for at validere kaldet og hente relevante aftaledokumenter (via anvendelse af org.openehealth.ipf.commons) for den valgte patient. For at formatere aftaledokumenterne fra XML til objekter, bruges biblioteket "dk.s4.hl7.builders".

Før objekterne aftaledokumenterne returneres, bliver kun relevant information sendt tilbage til nap-reference-web. 

Nap-reference-web

Nap-reference-web er en front end til nap-reference-facade og deployes i dennes kontekst-rod.

Nap-reference-web er bygget med Angular version 9 og fungerer som illustration på:

  1. Projekt opsætning overholdende https://www.nspop.dk/display/public/web/Husregler+for+udvikling+til+NSP.
  2. Brug af NAP SDK NAP SDK - Guide til anvendere

  3. GUI for NAP Projekter.

...

  1. til+NSP.
  2. Brug af NAP SDK NAP SDK - Guide til anvendere

  3. GUI for NAP Projekter.

Opsætning og struktur af et angular projekt

...

Fejlen bliver sendt hvis kaldet til getAppointments() fejler.


Code Block

/**
 * Generetas Requests to get appoitnemnts for a given person and organization
 *
 * @export AppointmentService
 * @class AppointmentService
 */
@Injectable({
  providedIn: 'root'
})

export class AppointmentService {

  /**
   * The appointment endpoint
   *
   * @private
   * @memberof AppointmentService
   */
  private appointmentEndPoint$ = this.configurationService.fetch(
    config => config.appointmentsEndpoint
  );

  /**
   * The server url
   *
   * @private
   * @memberof AppointmentService
   */
  private serverUrl = this.configurationService.fetch(config => config.serverUrl);

  /**
   * A refresh indicator
   *
   * @private
   * @memberof AppointmentService
   */
  private serviceActivator = new BehaviorSubject(undefined);

  constructor(
    private http: HttpClient,
    private errorService: ErrorService,
    private configurationService: ConfigurationsService,
    private napSDK: NapAngularService
  ) {
  }

  /**
   * Make a HTTP GET to the serverurl/appointmentendpoint
   * @param patientIdentifier
   */
  public getAppointments(patientIdentifier: string | undefined): Observable<any[] | undefined> {
    return combineLatest(
      [
        this.serverUrl,
        this.appointmentEndPoint$,
        this.serviceActivator
      ]
    ).pipe(
      switchMap(([serverUrl, endpointPath, _]) => this.http.get<any[]>(serverUrl + endpointPath + '/' + patientIdentifier)),
      catchError(error => {
        this.errorService.postError(error);
        this.napSDK.sendMessage(NAPEventCatalogue.v1.MessageFactory.createSessionErrorMessage(UUID(), error.innerError?.message, error.errorMessage)); // indicate to the host that something went wrong
        return of(undefined);
      }),
    );
  }

  /**
   * Triggers a data update of the service
   */
  refresh(): void {
    this.serviceActivator.next(undefined);
  }
}


Nap-reference-facade

Nap-reference-facade er backend til nap-reference-web og deployes med denne webapplikation i kontekst roden.

Nap-reference-facade er bygget med java 8 og fungerer som illustration på:

...

Code Block
languagejava
 
@WebListener
public class SpringLoader implements ServletContextListener {
    protected static final String ANNOTATION_CONFIG_CONTEXT = "ANNOTATION_CONFIG_APPLICATION_CONTEXT";

    /**
     * Initialize standalone spring context. Registers the spring configuration and finally register it at the servlet context
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        AnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext();
        springContext.register(SpringContext.class);
        springContext.refresh();
        final ServletContext servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute(ANNOTATION_CONFIG_CONTEXT, springContext);
        ServletRegistration servletRegistration = servletContext.addServlet("SAMLDispatcherServlet", DispatcherServlet.class);
        servletRegistration.addMapping("/saml/*");
        FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("LoginFilter", SPFilter.class);
        filterRegistration.addMappingForUrlPatterns(null, false, "/api/*");
        filterRegistration.addMappingForUrlPatterns(null, false, "/saml/*");
        filterRegistration.setInitParameter("a", "b");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        Object ctx = servletContextEvent.getServletContext().getAttribute(ANNOTATION_CONFIG_CONTEXT);
        if(ctx instanceof AnnotationConfigApplicationContext) {
            ((AnnotationConfigApplicationContext)ctx).close();
        }
    }
}


SPfilteret OIOSAML sørger for at validere den assertion der kommer fra en given iDP (https://www.nspop.dk/display/public/web/Sikkerhedsservices+%28STS%29+-+Leverancebeskrivelse  i dette tilfælde) og tilføjer denne til brugerens session.

Der findes flere information om hvordan oisaml eksempel på hvordan OIOSAML konfigureres på NAP Ref.Impl. - Guide til udviklere.

...

Dokumentationen OIOSAML kan læses her https://github.com/digst/OIOSAML.Java/tree/master/docs

Men overordnet bruges følgende 2 endpoints til autentifikation og logout.

/saml/SAMLAssertionConsumer

Brugeres til at valider validere autentifikations requests og registrere en brugers assertion i en threadlocal session.

/saml/Logout

Bruger til single logout. Den sletter brugerens session.

...