Språk og terminologi
API inneholder mye terminologi og forkortelser som kan være uklare eller vanskelige å forstå uten detaljkunnskap om FS. Dette gjør også at intern logikk skinner gjennom i API-et.
F.eks.:
"studentKompentanse": "VE1"
. Hva erVE1
for oss som ikke har mellomfag i FS? BurdestudentKompetanse
være referanse til mer informasjon?
Språk
Attributtnavn og ressursnavn er delt mellom norsk (adresse, harBilde) og engelsk (size, items). Dette burde kanskje holdes til ett språk.
Her vil jeg gjerne foreslå min personlige preferanse: engelsk.
true/false
Returverdier bør ha fornuftig type. Hvorfor brukes "J"
/"N"
når JSON har innebygde datatyper for dette?
Eksempel: "harBilde": "N"
→ "harBilde": false
null-verdier
Verdier som er tomme, bør settes til null
.
F.eks. manglende adresse:
...
"adresse": {
"type": "HJEM",
"postnr": 0
},
...
Her burde vel det vært:
...
"adresse": null,
...
Stedkoder
En person jeg slo opp på, hadde:
"fagpersonSted": {
"meta": {
"href": "https://docker-demo.fsat.no/fsapi/steder/0.0.0.0"
},
"institusjon": 0,
"fakultet": 0,
"institutt": 0,
"gruppe": 0
}
- Verdi burde vært
null
- her er det ingen stedkode! - Ser ut som URL til stedkode er
/steder/<org>.<fac>.<inst>.<gr>
, hva med/steder/<org>/<fac>/<inst>/<gr>
. Da kunne denne ressursen også bli benyttet som organisasjonskart, og f.eks./steder/<org>
kunne gitt informasjon om institusjon, og liste over fakulteter.
Adresser
Valg av adresse, adressetyper
Hvilken adresse vil man få? Er dette avhengig av hvilke roller personen har? Det ser ut som det bare er type HJEM som kommer ut her? Antar det er en feil (mangel) at ikke andre typer vises?
I Cerebrum importerer vi flere adresser for personer, avhengig av rolle:
- Fagperson: fs.fagperson._arbeide, fs.person._hjemsted
- Student: fs.person._hjemsted, fs.student._semadr
- EVU: fs.deltaker._job, fs.deltaker._hjem
Vi vil gjerne at API-et gir oss akkurat de adressene som vi er interesserte i, og jeg ser egentlig for meg at vi bare har behov for en adresse, men da må det være den riktige adressen...
Jeg innbiller meg at andre tjenester vil ha behov for å plukke ut spesifike adresser, f.eks. /personer/n/adresse/arbeid
. Slik som adresse gies nå, vil vi kanskje ha redusert mulighet for å bytte ut eller utvide dette senere?
Jeg ser for meg at kanskje adresse burde leve under /personer/n/adresse/<type>
, og at /personer/n/adresse
inneholder referanse til alle eksisterende adresser for en person, samt en indikator/referanse til den adressen som nå dukker opp i adresse-atributtet i /personer/n
.
Adresse-modell
"adresse": {
...
"sted": "1363 HØVIK",
"postnr": 1363
}
Skal sted inneholde postnummer? Hvordan ser evt. internasjonale adresser ut? Eller postboks? Eller finnes ikke dette i FS?
Hvilke verdier finnes for "type"?
Det ser slik ut ved utenlandsk adresse:
"adresse": {
"type": "HJEM",
"co": "c/o John Doe",
"gate": "38, Casale San Nicola",
"sted": "83038 - Montemiletto (AV)",
"postnr": 0,
"land": "Italy"
},
Internasjonale adresser burde heller hatt et annet format (felter).
Telefon
Slik som det ser ut, får vi bare et telefon-felt. For bruk i integrasjon med Cerebrum, så er dette glimrende! Vi er egentlig kun interessert i mobilnummer. Men hva om en annen tjeneste kommer på plass, og kun er interessert i f.eks. faksnummer eller telefonnummer?
Antar det er ein feil (mangel) at ikke andre typer enn MOBIL vises?
Hvilke verdier finnes for "type" (er dette opplistet noe sted)? Og hva benyttes feltet til? Hvilken verdi får vi hvis det finnes flere telefonnummer i FS? Hva om eneste telefonnummer er FAKS?
/personer
query-parameter
RFC2396 sier lite om hvordan boolske query-parameter skal utformes, men hadde det vært en ide å gå for noe som er litt vanligere enn J
/N
? F.eks.:
api/resource?hasProperty=true&otherProperty=false
api/resource?hasProperty=1&otherProperty=0
api/resource?hasProperty=yes&otherProperty=no
Eventuelt noe litt mindre verbost: /persons/?select=student,studrett
Utplukk
Hva skjer om jeg slår opp på fagperson=J&student=J
?
- Får jeg union av alle personer som er enten fagperson eller student?
- Hvordan vet jeg i så fall om personen er fagperson og/eller student i resultatet?
- Får jeg snitt altså personer som er både fagperson og student?
- Hva om jeg ber om
fagperson=N&fagpersonAktiv=J
?
- Hva om jeg ber om
Hva skjer om jeg ber om GET /personer
? Hvilke personer er med i utplukket hvis jeg ikke oppgir verdi for personroller
eller semreg
?
Dokumentasjon
I følge swagger-docs så returnerer GET /personer
en liste med fulle personobjekter (liste med objekter, hvor hvert objekt har samme schema som /personer/n
).
Jeg er usikker på hva som er riktig her, for alle søk som jeg har forsøkt resulterer i liste med referanser:
{
"meta": {
"href": "https://docker-demo.fsat.no/fsapi/personer",
"rel": [ "collection" ]
},
"size": 6378,
"items": [
{
"meta": {
"href": "https://docker-demo.fsat.no/fsapi/personer/n"
},
"lopenr": n
},
...
]
}
Tipper det er doken som er feil.
Filtrering/søkemuligheter
Det kunne vært nytting for oss med flere filtreringsmuligheter i «personsøket». Dette for å kunne gjøre feilsøking, feilretting og testing.
Mulighet for å filtrere etter person-ider som studentnummer/ansattnummer vil gjøre det mulig å slå opp på "kjent informasjon", for å sammenligne entiteter i flere systemer. Det vil også gjøre det mulig for oss å f.eks. gjøre synk av enkeltpersoner, dersom det skulle oppstå feil.
Mulighet for å filtrere etter stedkode kunne hjulpet ved å gi oss mindre datasett for testing, samt muliggjort en gradvis utrulling av ny FS-synk.
Timeouts
Jeg slet med testing av /personer
- spørringer tar en del tid, og de fleste spørringer resulterer i en 504 Gateway Timeout
. Antar at dette kommer seg i senere versjoner.
camelCase
Dette er i høyeste grad personlig preferanse, men jeg vil gjerne slå et slag for å bruke lowercase/snake_case fremfor camelCase (studentKompetanse
, fagpersonSted
) i attributtnavn.
Grunnen til å ta det opp er å unngå at verdier kan bli overskrevet i parsing av JSON-output:
$ echo '{"foo": "bar", "Foo": "baz"}' | jq
{
"foo": "bar",
"Foo": "baz"
}
$ echo '{"foo": "bar", "Foo": "baz"}' | tr '[:upper:]' '[:lower:]' | jq
{
"foo": "baz"
}
Dette gjør at samme navnestandard kan brukes som ressursnavn/url og attributt-navn:
$ GET /collection/<id>
< {
< "id": "<id>",
< ...
< "some_resource": {
< "href": /collection/<id>/some_resource
< }
< }
> GET /collection/<id>/some_resource
< {
< "foo": true,
< ...
< }