|
|
|
||
Version |
0.6 |
|
Status |
05 - Approved |
|
Godkender |
Kristian Jørgensen |
© Copyright 2025 Netcompany |
Forfatter |
mnq@netcompany.com |
|
Dokumenthistorik
Version |
Dato |
Forfatter |
Status |
Bemærkninger |
0.1 |
15-05-2025 |
Marcus Norton Quistgaard |
Udkast |
|
0.2 |
12-06-2025 |
Marcus Norton Quistgaard |
Udkast |
Første udkast til internt review |
0.3 |
13-06-2025 |
Rasmus Dupont Søgaard |
Udkast |
Review af første udkast |
0.4 |
13-06-2025 |
Marcus Norton Quistgaard |
Færdig |
Review kommentarer indarbejdet og dokument er klar til review ved KDS. |
0.5 |
05-09-2025 |
Marcus Norton Quistgaard |
Færdig |
Dokument tilrettet jf. review-møde med KDS. |
0.6 |
2025-09-09 |
Simon Snabe Sørensen |
Færdig |
Billeder og kode eksempler er opdateret til at bruge variable navne som stemmer overens med begrebslisten. |
0.6.1 |
2025-10-30 |
Kristian Jørgensen |
Approved |
|
Referencer
Reference |
Titel |
Forfatter |
|||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="16da7fc9-d669-4656-9e2b-3e31e7057b05"><ac:plain-text-body><![CDATA[ |
|
[Fildownload API |
https://confluence.sdfi.dk/pages/viewpage.action?pageId=151999753] |
Datafordeleren |
|
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="aeb544ca-fb0b-4001-9737-2bfa4fb05a4b"><ac:plain-text-body><![CDATA[ |
|
[DLS udstilling |
https://confluence.sdfi.dk/display/DML/DLS-udstilling] |
Datafordeleren |
|
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="427abb94-5261-457e-908f-d7754a581834"><ac:plain-text-body><![CDATA[ |
[fildownload_guide] |
[C0200 - Brugervejledning - Transitionsguide for fildownload samt etablering og vedligeholdelse af kopiregister |
https://goto.netcompany.com/cases/GTE1416/SDFEDDP/_layouts/15/guestaccess.aspx?guestaccesstoken=ncosLPJxKqq8cxmKFqqpIh%2foCXnaoCC%2fh0zCzwuSRmE%3d&docid=2_1b803e8c54b63481da189745363085a2b&rev=1] |
Datafordeleren |
]]></ac:plain-text-body></ac:structured-macro> |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="402760b9-9e0d-4c01-90be-3fc3e87266ea"><ac:plain-text-body><![CDATA[ |
|
[C0200 - Portal - Anvender flow |
https://goto.netcompany.com/cases/GTE1416/SDFEDDP/Deliverables/Change/C0200%20Portal%20-%20Anvender%20flow.docx] |
Datafordeleren |
]]></ac:plain-text-body></ac:structured-macro> |
Indholdsfortegnelse
1 Introduktion
2 Forudsætninger og afgrænsninger
3 Projektsetup
3.1 NuGet pakker
3.2 Appsettings
4 Hentning af access token til at tilgå API
5 Etablering af kopiregister
5.1 Hentning af totaldownload
5.2 Identificering af udtræksnummer
5.3 Gem udtræks udtræksnummeret i databasen
5.4 Konvertering af hentet totaldownload til Data Transfer Object (DTO)
5.4.1 Udledning af entitetens variable og tilhørende typer samt DTO-oprettelse
5.4.2 Hjælpemetode: ReadLatestTotalOfEntityJsonFile
5.5 Indlæsning af DTO'er i databasen
5.5.1 Hjælpemetode: EnsureTableExists
5.5.2 Hjælpemetode: UploadDtosToDatabase
5.6 Overordnet rækkefølge
6 Vedligeholdelse af kopiregister gennem deltadownload for entitet
6.1 Hentning af navne på nyeste deltafiler
6.2 Hentning af nyeste deltafiler samt indlæsning i databasen
6.2.1 Gennemløb af nyeste deltadownload
6.2.2 Hælpemetode: DownloadAndProcessDeltaFiles
7 Afrunding
Dette dokument beskriver hvordan en anvender kan etablere et kopiregister lokalt ved at hente totaldownload og herefter vedligeholde det ved at hente deltadownloads.
Der tages i dette dokument udgangspunkt i at oprette et kopiregister bestående af én entitet fra ét register. I dette eksempel vil det være registret BBR med sin entitet Etage af typen bitemporal. Bemærk at processen beskrevet i indeværende dokument kan gentages, hvis der ønskes flere entiteter for samme eller andre registre.
Følgende forudsætninger og afgrænsninger gælder for at kunne følge guiden:
For at få adgang til data, skal man først have oprettet en bruger i Datafordeler Administrationen med tilhørende OAuth Shared Secret. Der henvises til følgende guide: *\[Portal_guide\]{*}. |
I dette guideeksempel bliver der brugt et C# projekt. Til dette er der blevet opsat et regulært C# Console App Project.
Følgende NuGet pakker som ikke medfølger automatisk ved opsætning af nyt projekt skal i dette guideeksempel tilføjes vha. NuGet Package Manager Console:
Opret en appsettings.json fil som indeholder Client ID og Client Secret som blev oprettet og gemt i trin 3.2.
Et eksempel kan være dette:

Figur 11: Appsettings.json eksempel
Sørg for appsettings-filen er med i build ved at tilføje følgende til .csproj:

Figur 12: .csproj eksempel
Filen er i dette guideeksempel placeret følgende sted:

Figur 13: Projektstruktur
For at kunne tilgå Datafordelerens API, skal der hentes en access token, som har en kortvarig holdbarhed.
Først oprettes der en metode til at hente access token ud fra Client ID og Client Secret. Denne kontakter https://auth.datafordeler.dk/realms/distribution/protocol/openid-connect/token som er endpointet der bruges til at hente access token.
Bemærk at følgende blot er et eksempel på hvordan det kan implementeres.

Figur 14: Kodeeksempel på hentning af access token

Figur 15: Kodeeksempel på access token hjælpermetode
For at kalde denne metode med brug af sine værdier fra appsettings.json, kan man eksempelvis gøre følgende:

Figur 16: Eksempel på hentning af access token
Her er der sat op således at der bruges en ConfigurationBuilder til at hente fra appsettings.json, hvorefter ens access token gemmes i den lokale variabel accessToken.
Efter at have hentet en access token, kan man nu bruge denne til at hente seneste totaldownload for en entitet fra et givent register for at etablere et kopiregister. I det følgende eksempel vil vi hente totaldownload for BBR's entitet Etage.
For at hente totaldownload er der i dette eksempel lavet en metode som gør følgende:
Kald Datafordelerens GetFile endpoint (dokumentation findes her *\[fildownload_api\]{*}) |
Her fremgår et eksempel på en implementering med ovenstående logik:

Figur 17: Kodeeksempel på hentning af total for BBR Etage
Da der kan findes opdateringer til totaldownload'et gennem efterfølgende deltadownload, skal udtræksnummeret fra totaldownload'et identificeres. Da filnavnet fra deltadownload'et slutter med et udtræksnummer kan det nemt trækkes ud vha. regular expressions.
Følgende eksempel trækker versionsnummeret ud fra filstien der blev gemt i forrige trin.

Figur 18: Kodeeksempel på udtræk af udtræksnummer
For at gemme det senest hentede udtræksnummer mellem kørsler, vil der i dette eksempel blive oprettet en tabel i databasen til at indeholde et udtræksnummer for entiteter i et register.
Implementeringen følger denne rækkefølge:

Figur 19: Kodeeksempel på at gemme senest-hentede versionsnummer for et registers entitet.
Indlæsning i databasen af den hentede entitets totaldownload, bruger følgende fremgangsmåde:
Først oprettes en DTO til BBR's entitet Etage kaldt "BBREtageDTO.cs". For at udlede variablerne samt typerne som fremgår i en entitet, kan man gøre følgende for BBR Etage eksemplet:
Et eksempel på den udledte BBR Etage DTO fremgår i følgende:

Figur 20: BBR Etage DTO-eksempel med udledte variabler samt tilhørende typer
Følgende kodeeksempel læser filen gemt fra trin 6.1 og konverterer JSON-objekterne fra filen til DTO'en oprettet i trin 6.4.1.

Figur 21: Konvertering af JSON til DTO af BBR's entitet Etage
For at indlæse DTO'erne i databasen er følgende fremgangsmåde implementeret:
Hjælpemetoden opretter tabellen for _bbr_etage_ med de udledte variabler og typer fra afsnit 6.4.1. Her skal det også vides hvad primærnøglen er. Dette kan findes i registrets tilhørende *\[{*}<span style="color: #0f2147"><strong>DLS]</strong></span>. BBR bruger eksempelvis følgende fil, som findes i DLS'en: _BBR_v2.4.1_2018.05.07_Bilag 26 - Primær nøgler.xlsx_
For BBR's Etage-entitet gælder følgende composite-key: ({_}id_lokalId, registreringFra, virkningFra{_}).
!worddav165c1e3f2c19fd627ec4626b8abde1d9.png|height=422,width=624!
Figur 22: Kodeeksempel på oprettelse af tabel i databasen for BBR Etage
\\ |
For at indsætte DTO'erne i databasen, kan man med fordel bruge COPY-metoden. Heri gennemløbes DTO'erne fra 6.4.2 og indlæses én efter én i databasen på effektiv vis.

Figur 23: Indlæsning af DTO'er i databasen vha. COPY
Hele afsnit 6's overordnede rækkefølge af kaldt funktionalitet kan ses i følgende overblik:

Figur 24: Overblik over rækkefølge af kaldt funktionalitet
Efter at have hentet totaldownload'et for en entitet, holdes denne entitet opdateret vha. deltadownload. Deltadownload kommer én gang i døgnet og man kan derfor med fordel opsætte en scheduled task, som henter deltadownload dagligt og opdaterer databasens rækker for en given entitet.
Det skal her bemærkes, at da totaldownload dannes én gang om ugen, kan der allerede været kommet adskillige deltadownload siden den nyeste total man har hentet. Det anbefales derfor, at man sætter hentningen af deltadownload op med det samme.
Denne sektion beskriver eksempler på hvordan man kan opsætte hentning af deltadownload samt opdaterer databasen med dens værdier for BBR's entitet Etage.
Det overordnede flow fremgår således:
Der oprettes en hjælpemetode som henter de nyeste fildownload for BBR's entitet Etage vha. _GetAvailableFileDownloads_ fra *\[fildownload_api\]{*}, for derefter at filtrere filer fra, så de tilbageværende opfylder følgende kriterier: |

Figur 25: Kodeeksempel på hentning af deltafil-navne for BBR Etage
Efter at navnene på de nye deltafiler nu er fundet og gemt i den lokale variabel newDeltas, skal filerne nu hentes, castes til DTO'er, så de herefter kan bruges til at opdatere databasen.
Første trin gennemløber de hentede deltafiler og kalder hjælpemetoden DownloadAndProcessDeltaFiles som henter filerne, caster dem til DTO'er samt ligger den i databasen. Denne metode uddybes i næste sektion.

Figur 26: Kodeeksempel på gennemløb af deltafiler
_DownloadAndProcessDeltaFiles_ henter deltafiler vha. _GetFile_ endpointet fra *\[fildownload_api\]{*}. Dette kodeeksempels funktionalitet foregår på følgende måde: |

Figur 27: Kodeeksempel på hentning af deltadownloads samt upload til databasen.
Denne hjælpemetode bruges til at simplificere hentning af deltafiler vha. _GetFile_ endpointet fra *\[fildownload_api\]{*}.
Først kaldes _GetFile_ endpointet med den access token som blev hentet i sektion 5. Herefter læses indholdet ved hjælp af streaming.
!worddav8f2bd689889bad0faac5fbcbcf92fa6f.png|height=212,width=631!
Figur 28: Kodeeksempel på hjælpermetode til hentning af filer vha. GetFile endpointet |
Denne hjælpemetode bruges til at deserialisere deltafilens JSON-objekter til en liste af BBREtageDTO'er.
Hjælpemetoden udpakker zip-filen for derefter at gennemløbe JSON-filerne og caste dem til DTO'er.

Figur 29: Kodeeksempel på deserialisering af JSON-objekter fra deltafiler til DTO'er.
Denne hjælpemetode bruges til at opdatere databasen med de nye delta DTO'er. Den gør følgende:

Figur 30: Kodeeksempel på opdatering af database med nye Delta DTO'er
Efter at have fulgt trinene op til denne sektion, er der nu følgende funktionalitet tilgængelig i rækkefølge: