Inventory-Zugriff

Im Original von Julian Ladisch

Hier werden verschiedene Möglichkeiten erklärt, direkt auf die Inventorydaten (Instance, Holding, Item, usw.) zuzugreifen.

Die Erklärung/Dokumenation der einzelnen Felder ist auf https://dev.folio.org/reference/api/#mod-inventory-storage ,  dazu in der entsprechenden Zeile auf view-1 klicken, dann in der Zeile mit {...id} auf GET klicken, in dem sich öffnenden Fenster dann auf Response. Beispiellink für Item.





Browser

Chrome und Firefox haben Developertools, die sich mit Strg+Umschalt+I anschalten lassen. Dort im Tab Network erscheinen im Untertab Response die Antworten des Inventory-Backends:

API mit curl

Mit einem Kommandozeilentool wie curl kann man auf die APIs zugreifen. Eine Liste möglicher Kommandozeilentools steht auf https://dev.folio.org/faqs/how-to-use-apis/

Als Beispiele für die OKAPI-Adresse können https://folio-snapshot-stable-okapi.aws.indexdata.com und https://folio-demo.gbv.de/okapi dienen.

Instances

Shellskriptbeispiel get-instance.sh:
get-instance.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json")
CQL=$(echo "$1" | sed 's/ /%20/g; s/"/%22/g; s/\\/%5c/g' # urlencode
echo "$CQL"
curl "${OPT[@]}" "$OKAPI/instance-storage/instances?query=$CQL"

Dieses Skript kann man mit ./get-instance.sh "title=baby" aufrufen, um die Instances, die baby im Titel enthalten, anzuzeigen.

Bei Bedarf die Maxmimalzahl zurückgelieferter Datensätze ändern: ./get-instance.sh "title=the*&limit=1"

Ist die UUID bekannt, kann man sich den Datensatz direkt holen:

curl "${OPT[@]}" "$OKAPI/instance-storage/instances/$UUID"

Oder man nutzt dieses Skipt mit

./get-instance-by-id 7fbd5d84-62d1-44c6-9c45-6cb173998bbd > studien.json
get-instance-by-id.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -D - -s -S -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" \
              -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
RESULT=$( curl -w'\n' -D - -s -S -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
               -H "Accept: text/plain" $OKAPI/instance-storage/instances/$1 )
if echo "$RESULT" | grep -q "^HTTP/1.1 200"
then
  echo "$RESULT" | sed '1,/^\r*$/d'
  exit 0
fi
echo "$RESULT" 1>&2
exit 1


Eine Instance, dessen Daten in einer JSON-Datei (z.B. studien.json) stehen, kann man mit ./post-instance.sh studien.json anlegen:
post-instance.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json")
curl "${OPT[@]}" -d "@$1" $OKAPI/instance-storage/instances

Um eine Instance zu ändern, muss die id (z.B. 6a22bd5b-645e-411f-9446-597b5e659fc2) bekannt sein, dann kann man ./put-instance.sh 6a22bd5b-645e-411f-9446-597b5e659fc2 studien.json aufrufen, bei erfolgreichem Update antwortet der Server mit "HTTP/1.1 204 No Content":
put-instance.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain")
curl "${OPT[@]}" -d "@$2" -XPUT "$OKAPI/instance-storage/instances/$1"

Analog mit ./delete-instance.sh 6a22bd5b-645e-411f-9446-597b5e659fc2 das Löschen:
delete-instance.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain")
curl "${OPT[@]}" -XDELETE "$OKAPI/instance-storage/instances/$1"

Holdings


get-holding.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json")
CQL=$(echo "$1" | sed 's/ /%20/g; s/"/%22/g; s/\\/%5c/g' # urlencode
echo "$CQL"
curl "${OPT[@]}" "$OKAPI/holdings-storage/instances?query=$CQL"


get-holding-by-id.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -D - -s -S -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" \
              -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
RESULT=$( curl -w'\n' -D - -s -S -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
               -H "Accept: text/plain" $OKAPI/holdings-storage/holdings/$1 )
if echo "$RESULT" | grep -q "^HTTP/1.1 200"
then
 echo "$RESULT" | sed '1,/^\r*$/d'
 exit 0
fi
echo "$RESULT" 1>&2
exit 1


post-holding.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json")
curl "${OPT[@]}" -d "@$1" $OKAPI/holdings-storage/holdings


put-holding.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain")
curl "${OPT[@]}" -d "@$2" -XPUT "$OKAPI/holdings-storage/holdings/$1"


delete-holding.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain")
curl "${OPT[@]}" -XDELETE "$OKAPI/holdings-storage/holdings/$1"

Items


get-items.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json")
CQL=$(echo "$1" | sed 's/ /%20/g; s/"/%22/g; s/\\/%5c/g' # urlencode
echo "$CQL"
curl "${OPT[@]}" "$OKAPI/item-storage/items?query=$CQL"


get-item-by-id.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -D - -s -S -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json" \
              -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
RESULT=$( curl -w'\n' -D - -s -S -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
               -H "Accept: text/plain" $OKAPI/item-storage/items/$1 )
if echo "$RESULT" | grep -q "^HTTP/1.1 200"
then
 echo "$RESULT" | sed '1,/^\r*$/d'
 exit 0
fi
echo "$RESULT" 1>&2
exit 1


post-item.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: application/json")
curl "${OPT[@]}" -d "@$1" $OKAPI/item-storage/items


put-item.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain")
curl "${OPT[@]}" -d "@$2" -XPUT "$OKAPI/item-storage/items/$1"


delete-item.sh

OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" \
  -d '{"tenant":"diku","username":"diku_admin","password":"admin"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - -H "$TOKEN" -H "X-Okapi-Tenant: diku" -H "Content-type: application/json" -H "Accept: text/plain")
curl "${OPT[@]}" -XDELETE "$OKAPI/item-storage/items/$1"

Service Points

Wegen schwieriger, noch nicht programmierter Konsistenzprüfung (https://folio-org.atlassian.net/browse/UIORG-129) wird der "Delete Service Point"-Button im Frontend nicht angezeigt (https://folio-org.atlassian.net/browse/UIORG-130). Man muss Service Points auf eigenes Risiko über das Backend löschen:
delete-service-point.sh

USERNAME="${USERNAME:-diku_admin}"
PASSWORD="${PASSWORD:-admin}"
TENANT="${TENANT:-diku}"
OKAPI="${OKAPI:-https://folio-demo.gbv.de/okapi}"
TOKEN=$( curl -s -S -D - -H "X-Okapi-Tenant: $TENANT" -H "Content-type: application/json" \
  -d '{"tenant":"$TENANT","username":"$USERNAME","password":"$PASSWORD"}' $OKAPI/authn/login | grep -i "^x-okapi-token: " )
OPT=(-w"\n" -s -S -D - --http1.1 -H "$TOKEN" -H "X-Okapi-Tenant: $TENANT" -H "Content-type: application/json" -H "Accept: text/plain")
curl "${OPT[@]}" -XDELETE $OKAPI/service-points/$1

API mit Postman

Mit der Postman-App, die es kostenlos auf https://www.getpostman.com/downloads/ gibt, kann man per GUI und komfortabel API-Abfrageskripte schreiben. Beispiel-Postman-Skripte:

https://gist.github.com/julianladisch/b5239149fc8cbe0f474d2464c7e01108

SQL

Hat man direkten Zugriff auf die Installation, kann man mit dem Kommandozeilentool psql auf die PostgreSQL-Datenbank zugreifen.

Beispiel:

In die Vagrant-Box einloggen:

vagrant ssh

Nun psql aufrufen:

PGPASSWORD=folio_admin psql -h localhost okapi_modules folio_admin

Alle Tabellen von mod_inventory_storage anzeigen:

\dt diku_mod_inventory_storage.*

Eine Instance anzeigen, die baby im Titel enthält:

SELECT * FROM diku_mod_inventory_storage.instance WHERE jsonb->>'title' ILIKE '%baby%' LIMIT 1;

Instance, Holding und Item anzeigen für ein ausgeliehenes Item:

SELECT * FROM diku_mod_inventory_storage.instance_holding_item_view WHERE it_jsonb->'status'->>'name'='Checked out' LIMIT 1;

HRID-Handling

Für Instances: https://folio-org.atlassian.net/browse/MODINV-160

Für Holdings: https://folio-org.atlassian.net/browse/MODINV-161

Für Items: https://folio-org.atlassian.net/browse/MODINV-162