Tech4Art API2

Pagina di introduzione alle API di Tech4Art.

Versione con prefisso API2

La versione corrente è 0.23.1. Il prefisso delle chiamate alle funzioni di gestione del catalogo è:

    https://host/api2/v0.23.1/

La pagina swagger è disponibile a questo link.

Principali novità di questa versione

API2 contiene molte novità rispetto alla versione precedente. I principali ambiti sono:

  1. Gestione dei profili utente.
  2. Gestione dei media associati a catalog-element.

Gestione dei profili utente.

Attenzione! Dal momento che i profili utente sono condivisi tra più applicazioni, e non dipendono dalle versioni delle API del catalogo, le chiamate non contengono il prefisso con la versione API.

Profilo pubblico

    curl -X GET http://.../user-profiles/

    { ... [ ... {"username":"alice", "signature":"Prof. Alice", "preferred_language":"it", "image_url":"http://.../default-avatar.png"} ... ] ... }
    curl -X GET http://.../user-profiles/alice/

    {"username":"alice", "signature":"Prof. Alice", "preferred_language":"it", "image_url":"http://.../default-avatar.png"}

Note

Profilo privato

Il profilo privato può essere utilizzato tra utenti di cui si conosce l'identità (per esempio catalogatori per una stessa istituzione). Al momento l'unico a vedere il profilo privato è l'utente stesso. L'endpoint per la modifica del profilo privato dovrebbe essere usato solo per preferred_language, signature, image.

    curl -X GET -H "Authorization: Bearer ..." http://host/owner-profile/

    {
        "user_type":"CA",
        "username":"alice",
        "first_name":"Alice",
        "last_name":"",
        "email":"alice@uno.it",
        "preferred_language":"it",
        "signature":"Prof. Alice",
        "affiliations":"Fondazione Uno",
        "image":null,
        "image_url":"http://.../default-avatar.png"
    }

Notare

owner-profile
al singolare. La chiamata richiede autenticazione. Viene restituito il profilo dell'utente autenticato.

Il campo user_type indica il tipo di utente. La codifica è da definire, ma CM sta per Community Member (non produce contenuti ma solo like) e CA per Catalogatore. Questo viene definito all'atto della registrazione e non è modificabile dall'utente, come pure il campo affiliations. Allo stato attuale è possibile modificare questi campi ma in una prossima versione saranno aggiunti controlli in modo da permettere cambiamenti solo previa approvazione di un responsabile.

    curl -X PATCH -H "Authorization: Bearer ..." 
        -H "Content-type: application/json" 
        --data '{"signature":"Professoressa Alice"}' http://.../owner-profile/ 

Per l'upload di un'immagine si utilizza il campo image. In assenza di image viene assegnato un image_url di default.

    curl -X PATCH -H "Authorization: Bearer ..." 
        -F signature="Professoressa Alice" 
        -F image=@assets/my-picture.jpg http://.../owner-profile/

    {
        ...
        "image":"http://.../my-picture.jpg",
        "image_url":"http://.../my-picture.png"
        ...
    }

Note:

Il profilo viene creato automaticamente al momento della creazione dell'account.

I metodi PUT e DELETE non sono supportati.

Elementi multimediali associati a catalog-element

Gli elementi multimediali sono costituiti da:

Il QR code viene generato automaticamente al momento della creazione del catalog-element. Esiste un solo QR code per ciascun elemento. In futuro potranno esistere QR code associati ad altri tipi di oggetto (per esempio luoghi). Il contenuto del QR code è una stringa in formato JSON, della forma

        {
            "entity":"catalog-element",
            "id":"abcde-12345-xyz" 
        }
    
Spetta all'app di tradurre questa informazione in una azione (in questo caso aprire la scheda dell'elemento).

Un catalog-element può avere associati più contenuti di tipo foto, disegno o video. Ciascun contenuto va inserito nel sistema assieme alla scheda che lo descrive. Per esempio:

        curl -X "Authorization: Bearer ..." -X POST http://.../api2/0.23.1/catalog-photos/ 
            -F DO_FTAT="Didascalia foto" 
            -F element="abcde-12345-xyz" 
            -F media_content=@path-to-photo.jpg
    
Note:

Nuovi endpoint

I nuovi endpoint supportano i metodi GET, POST e PATCH.

    /api2/0.23.1/catalog-documents/     Documenti (per es. PDF) con informazioni aggiuntive.
    /api2/0.23.1/catalog-drawings/      Documentazione grafica.
    /api2/0.23.1/catalog-photos/        Documentazione fotografica.    
    /api2/0.23.1/catalog-videos/        Documentazione video.
Il metodo GET può ritornare una lista oppure un singolo contenuto. Per esempio:
    /api2/0.23.1/catalog-photos/             (lista)
    /api2/0.23.1/catalog-photos/photo-id/    (singolo)
Infine, un nuovo endpoint ritorna tutti i contenuti multimediali associati a un elemento.
    /api2/0.23.1/element-media/abcde-12345-xyz/
L'id da fornire è quello del catalog-element. Il risultato è un oggetto contenente tre array: photos, drawings, videos.

Cambiamenti nell'API catalog-elements

Le novità descritte sopra hanno comportato alcune modifiche all'endpoint catalog-elements. In particolare:

Ulteriori avvertenze

Allo stato attuale i controlli sui file caricati sono minimi. In futuro saranno aggiunti controlli per evitare problemi di sicurezza o di sovraccarico delle risorse.

Cambiamenti nelle versioni precedenti

CatalogReaction contiene il campo creator_username

creator_username può essere usato come criterio di filtro (query param: username).

    curl -X GET https://<host>/api/v0.23.1/catalog-reactions/?username=<nome_utente>
In luogo di un particolare username si può usare 'self' per l'utente autenticato:
    curl -X GET https://<host>/api/v0.23.1/catalog-reactions/?username=self

Nuovo endpoint per la lista dei preferiti

    curl -X GET https://<host>/api/v0.23.1/catalog-favorites/
    
ritorna la lista delle catalog-reaction dell'utente corrente (identificato dal token di autorizzazione) e le informazioni sul catalog-element associato. Per esempio, la risposta a una GET potrà avere la forma:

    {
        "count":10, <-- numero di reaction create dall'utente corrente
        "next":null,
        "previous":null,
        "results":[ <-- array
            { 
                "id":"837ba692-e499-4b7a-8086-fdac706023c7", <-- id della reaction
                "element": 
                {
                    "id":"47bcb6da-60bb-4317-823b-c20e7ed3936e", <-- id dell'element
                    ... <-- altri campi dell'element
                    "creator_username":"alice",
                    "is_public":true,
                    ... 
                },
                ... <- altri campi della reaction
                "creator_username":"bruno", <-- corrisponde all'utente corrente
            },
            ... <-- altri risultati
        ]
    }

Questo nuovo endpoint è stato creato per motivi di performance. Dal momento che la lista delle catalog-reactions di un utente ritorna anche l'id del corrispondente catalog-element, le altre informazioni sull'elemento possono essere ottenute utilizzando l'API /catalog-elements/id_elemento/, per ciascuno degli elementi. Il problema è che in questo modo si effettua una chiamata API per ciascun elemento, quindi aumentano gli accessi al database e il traffico di rete.

Entità

Le entità in questa versione sono le stesse delle precedenti:

Gestione degli utenti e dei permessi

Questa versione supporta autorizzazioni basate su token. Per ottenere un token occorre effettuare una richiesta POST contenente nel body i campi 'username' e 'password' con credenziali valide.

Esempio:

    curl -X POST -H "Content-Type: application/json" -d '{"username":"alice", "password":"secret"}' https://host/token_auth

Se le credenziali inserite sono corrette la risposta sarà simile a questa:

    {"token":"ef48622ee4d5e27a1ff918afbb602ca8a30ce10d"}

Da questo momento il si potrà usare il token per tutte le operazioni che richiedono autorizzazione. Il token non è (almeno per il momento) soggetto a scadenza.

Esempio:

    curl -X GET https://host/api/v0.23.1/cultural-institutions/

non ha bisogno di autorizzazione, ma

    curl -X POST -H "Content-Type: application/json" \
        -d '{"name": "test institution"}' \
        https://host/api/v0.23.1/cultural-institutions/'

richiede che l'utente sia autenticato. Il token deve essere passato come header come nell'esempio che segue:

    curl -X POST -H "Content-Type: application/json" \
        -H "Authorization: Bearer ef48622ee4d5e27a1ff918afbb602ca8a30ce10d" \
        -d '{"name": "test institution"}' \
        https://host/api/v0.21.1/cultural-institutions/'

Allo stesso modo, le richieste DELETE PATCH e PUT richiedono l'invio del token.

Elementi privati

Al momento della creazione un catalog-element è privato, visibile solo all'utente che l'ha creato. L'id dell'utente che ha creato l'elemento è inserito dal sistema, in base al token. Per rendere pubblico l'elemento si deve cambiare il valore del campo is_public, da False a True. Si possono usare i metodi PUT e PATCH.

Query parameters relativi a elementi privati.

    GET .../catalog-elements/  -- caso base: ritorna gli elementi pubblici di tutti gli utenti.

GET .../catalog-elements/?username=user_name -- ritorna gli elementi pubblici dell'utente user_name (non è mai possibile ottenere gli elementi privati di un utente diverso da quello autenticato). GET .../catalog-elements/?username=self -- ritorna gli elementi pubblici dell'utente autenticato.
GET .../catalog-elements/?username=self&drafts=include -- ritorna gli elementi pubblici e privati dell'utente autenticato. GET .../catalog-elements/?username=self&drafts=only -- ritorna gli elementi privati dell'utente autenticato.
GET .../catalog-elements/?drafts=include -- ritorna gli elementi pubblici di tutti gli utenti e quelli privati dell'utente autenticato. GET .../catalog-elements/?drafts=only -- ritorna solo gli elementi privati dell'utente autenticato.

Parametri di filtro

I parametri di filtro restringono i risultati a quelli che soddisfano i criteri. Sono sempre opzionali.

    /cultural-institutions/?name=param_name
    /catalogs/?owner_institution=cultural_institution_id
    /catalog-elements/ in aggiunta ai già discussi username e drafts sono utilizzabili i seguenti parametri: 
      ?catalog=catalog_id
      ?CD_SSD
      ?CD_TSK
      ?CD_CDR
      ?LC_LCR
      ?LC_LCP
      ?LC_LCC
      ?LD_LDCN
    /catalog-comments/?element=catalog_element_id
    /catalog-comments/?username=self
    /catalog-comments/?username=some_user_name
    /catalog-reactions/?element=catalog_element_id
    /catalog-reactions/?username=self
    /catalog-reactions/?username=some_user_name