Store filer / DEFT (Direkte og Enkel FilTransportør)

Overordnet

Under er listen over endepunktene:

Metode Endepunkt Funksjon
POST /objects Last opp én stor fil
POST /objects/initialization Initialiser opplasting av en oppdelt fil
POST /objects/{key}/part Opplasting av én av flere deler av en oppdelt fil
POST /objects/{key}/completion Fullfør opplasting av en oppdelt fil
POST /objects/{key}/cancellation Kanseller opplastningen av en oppdelt fil
GET /objects/{key} Last ned fil
DELETE /objects/{key} Slett opplastet fil
PUT /objects/{key}/download-receipt/{markerHerId} Kviter på at fil er lastet ned og lagret
GET /objects/{key}/download-status Hente status på hvilke mottakere som har kvittert på nedlasting

For opplasting velger man en av to metoder. Én hel fil med POST /objects, eller en fil oppstykket i flere små filer (multipart). Sistnevnte gjennomføres ved å initialisere opplastingen med POST /objects/initialization som returnerer en key. Denne brukes når en fortsetter med POST /objects/{key}/part hvor hver bit av det oppstykkede vedlegget lastes opp. Til slutt POST /objects/{key}/completion, alternativt POST /objects/{key}/cancellation.

Returverdien fra en opplastet fil er en lenke som kan brukes til å laste ned filen. Denne kan sendes mottaker via en annen kommunikasjonskanal, eller f.eks. brukes som en fil-referanse i en fagmelding. Filreferansen som returneres etter opplasting inneholder hele lenken, så filen kan f.eks. lastes ned direkte i en nettleser ved å aksessere lenken. Alternativt så kan nøkkelen (key) brukes til å laste ned filen ved å gjøre et kall mot GET /objects/{key}.

Sletting av en opplastet fil kan gjøres av avsender med DELETE /objects/{key}. Nedlaster skal også markere filen som nedlastet med PUT /objects/{key}/download-receipt/{markerHerId}. Når alle mottaker har lastet ned og markert filen som nedlastet, vil den bli automatisk slettet. Filen vil automatisk slettes av retention mekanismer noen dager etter opplasting, så REST APIet skal ikke brukes til lagring, kun transport

Opplaster kan også verifisere hvem som har kvittert på nedlasting med GET /objects/{key}/download-status

Helhetlig flyt

--- title: Helhetlig flyt --- sequenceDiagram autonumber actor A as Avsender participant DEFT as DEFT REST API actor B as Mottaker A ->> DEFT: Laster opp fil DEFT ->> A: Får url og key tilbake A ->> B : Sender url og/eller key til mottaker B ->> DEFT: Laster ned filen B ->> DEFT: Kviterer på at filen er lastet ned DEFT ->> DEFT: Sletter filen om alle nedlastere har kvitert

Opplasting

Opplastning av filer kan gjøres på to måter: Ved å laste opp hele filen med en gang, eller ved å dele opp filen lokalt for så å laste opp hver del/"chunk" av den oppdelte filen.

Laste opp én fil sammenhengende

--- title: Laste opp hel fil --- sequenceDiagram autonumber actor A as Avsender participant DEFT as DEFT REST API A ->>+ DEFT: POST /objects DEFT ->>- A: 201 Created (Location + key)

Førstnevnte POST /objects, bruker multipart/form-data til å laste opp en hel fil av gangen. Filen streames fra klienten og settes sammen på REST API siden. Fordelen med denne metoden er at det kun krever et API kall for å laste opp en fil, og minneforbruket på klientsiden er lavt noe som gjør det godt egnet for "tynne" brukergrensesnitt som f.eks. nettlesere. I requesten må det defineres et filnavn som en del av Content-Disposition, samt SenderHerId og ReceiverHerIds som query i requesten.

eksempel på query med 123 som avsender, og 456 og 789 som mottakere

/objects?SenderHerId=123&ReceiverHerIds=456&ReceiverHerIds=789

Laste opp én fil i flere deler

--- title: Laste opp oppdelt fil --- sequenceDiagram autonumber actor A as Avsender participant DEFT as DEFT REST API A ->>+ DEFT: POST /objects/initialization DEFT ->> A : 200 OK (key + uploadId) loop par Last opp deler av fil A ->>+ DEFT: POST /objects/{key}/part DEFT ->>- A: 200 Ok (partNumber + ETag) end end A ->> DEFT : POST /objects/{key}/completion DEFT ->>- A: 201 Created (Location + key)

Den andre måten å laste opp et vedlegg på er å initialere en opplastning med POST /objects/initialization, laste opp hver del av filen med POST /objects/{key}/part, og fullføre opplastingen med POST /objects/{key}/completion. Denne måten å laste opp på passer best hvis man har mulighet til å dele opp filen lokalt og anbefales ved veldig store filer, eller når opplastingshastigheten er lav og man vil sikre seg mot avbrudd som kan avbryte opplastningen.

POST /objects/initialization eksempel request body:

{
  "fileName": "my-secret-passwords.txt",
  "senderHerId": 123,
  "receiverHerIds": [
    456,
    789
  ]
}

POST /objects/initialization eksempel response body:

{
  "key": "fcffff81-0bdd-4be0-81a6-777f9bd10bb3_my-secret-passwords.txt",
  "uploadId": "aGVsbG8gbXIgb3IgbXJzIGRldmVsb3BlciA6KQ=="
}

POST /objects/{key}/part eksempel request body:

{
  "uploadId": "aGVsbG8gbXIgb3IgbXJzIGRldmVsb3BlciA6KQ==",
  "file": @filepart_2,
  "partNumber": 2
}

❗️partNumber er begrenset til å være mellom 1 og 10'000. Sekvensen på partNumber bestemmer rekkefølgen på hvordan delene blir satt sammen til en hel fil, så opplasting av deler kan skje parallelt

POST /objects/{key}/part eksempel response body:

{
  "partNumber": 2,
  "eTag": "cXdlZHNhenhjdmZydA=="
}

❗️ partNumber og eTag er et key-value par som må tas vare på av opplasteren da disse brukes for å sette sammen filen helt til slutt. POST /objects/{key}/part gjøres til alle deler av fila er lastet opp.

POST /objects/{key}/completion eksempel request body:

{
  "uploadId": "aGVsbG8gbXIgb3IgbXJzIGRldmVsb3BlciA6KQ==",
  "partETags": [
    {
      "partNumber": 1,
      "eTag": "eXV0aWdraGpkeWVodA=="
    },
    {
      "partNumber": 2,
      "eTag": "cXdlZHNhenhjdmZydA=="
    },
    {
      "partNumber": 3,
      "eTag": "YWlza2RqZmhneXR1Nw=="
    }
  ]
}

POST /objects/{key}/completion eksempel respons:

Response Headers:
    location: url

Response Body:
    key

Avbryt opplasting av oppdelt fil

--- title: Avbryte opplasting --- sequenceDiagram autonumber actor A as Avsender participant DEFT as DEFT REST API A ->>+ DEFT: POST /objects/initialization DEFT ->> A: 200 OK (key + uploadId) loop par Last opp deler av fil A ->>+ DEFT: POST /objects/{key}/part DEFT ->>- A: 200 OK (partNumber + ETag) end end A ->> DEFT: POST /objects/{key}/cancellation DEFT ->>- A: 200 Ok

Skulle det være behov for å avbryte opplastningen gjøres det et kall mot POST /objects/{key}/cancellation

POST /objects/{key}/cancellation eksempel request body:

{
  "uploadId": "aGVsbG8gbXIgb3IgbXJzIGRldmVsb3BlciA6KQ=="
}

Sletting

--- title: Sletting --- sequenceDiagram autonumber actor A as Avsender participant DEFT as DEFT REST API A ->>+ DEFT: DELETE /objects/{key} DEFT ->>- A: 204 No Content

DELETE /objects/{key} vil utføre sletting av et vedlegg som har blitt opplastet. Statuskode 204 indikerer at vedlegget ble slettet. Statuskode 404 tilsier at vedlegget ikke finnes, og kan alt være slettet (eller ikke eksistert til å begynne med)

Nedlasting

Laste ned fil

--- title: Last ned fil --- sequenceDiagram autonumber actor B as Mottaker participant DEFT as DEFT REST API B ->>+ DEFT: GET /objects/{key} DEFT ->>- B: 200 Ok (filstrøm)

Nedlastning gjøres ved å aksessere referansen/url-en, eller med GET /objects/{key} hvis man kun har key. Location url-en som ble generert etter opplasting tilsvarer det samme som en oppbygd GET /objects/{key} request.

Kvitere på nedlastet fil

--- title: Kvitere på nedlastet fil --- sequenceDiagram autonumber actor B as Mottaker participant DEFT as DEFT REST API B ->>+ DEFT: PUT /objects/{key}/download-receipt/{markerHerId} DEFT ->>- B: 204 No content

Når filen er nedlastet skal den kviteres som nedlastet. Det gjøres med en PUT /objects/{key}/download-receipt/{markerHerId} request hvor markerHerId tilsvarer HerIDen som kviterer på at filen er lastet ned

Sjekke nedlastingsstatus

--- title: Sjekke nedlastingsstatus --- sequenceDiagram autonumber actor A as Avsender participant DEFT as DEFT REST API A ->>+ DEFT: GET /objects/{key}/download-status DEFT ->>- A: 200 Ok (json body med status)

Opplaster kan sjekke hvilke mottakere som har kvitert og hvilke mottakere som ikke har kvitert. Det gjøres med en GET /objects/{key}/download-status request som returnerer en json body med informasjon om kviteringsstatus.

GET /objects/{key}/download-status eksempel response body:

{
  "receiverDownloadStatus": {
    "123": true,
    "4567": false,
    "78": true
  }
}

Verdt å vite

Det er verdt å vite at filnavn på vedlegg kan maks være 100 tegn langt, og kan kun inneholde bokstavene a-å, store og små, tallene 0-9 og spesialtegnene bindestrek ( - ) og understrek ( _ ). Dette er av kompabilitet og sikkerhetsmessige årsaker. Punktum er tillat, men kun for å skille mellom filnavn og filutvidelse.