Manuel de référence

API HTTP Core 1.0

Anakeen Labs <labs@anakeen.com>

Table des matières

Chapitre 1 API HTTP REST

1.1 Présentation

L'API HTTP a pour but d'offrir un accès standard aux données de Dynacase.

L'architecture de cette api s'appuie sur une architecture REST (Representational state transfer) et permet de manipuler les ressources Dynacase suivantes :

1.2 Quelques notions de REST

L'api présentée dans la suite du document est de type REST et utilise le vocabulaire propre à ces API, ce qui inclut :

1.3 Structure de l'API

La structure est conforme au standard REST.

Les actions du CRUD sont implémentées et associées aux méthodes de HTTP, suivant la liste d'équivalence suivante :

Action Méthode HTTP URL Action effectuée
Create POST /api/v1/<collection> Créé une nouvelle ressource dans la collection et répond avec la ressource
Read GET /api/v1/<collection> Lit le contenu de la collection et répond avec une liste de ressources
Read GET /api/v1/<collection>/<id> Lit la ressource id et répond avec la ressource
Update PUT /api/v1/<collection> Remplace l'intégralité de la collection et répond avec une liste de ressources
Update PUT /api/v1/<collection>/<id> Modifie la ressource id de la collection et répond avec la ressource
Delete DELETE /api/v1/<collection> Supprime l'intégralité de la collection et répond avec une liste de ressources
Delete DELETE /api/v1/<collection>/<id> Supprime la ressource id de la collection et répond avec la ressource

Les accès à l'API HTTP Dynacase se font par l'url http[s]://<url_du_contexte>/api/v1/.

1.3.1 Encodage

Tous les échanges, entrées et retours de l'API, sont encodés en UTF-8.

1.3.2 Requête

Les éléments de la requête sont les suivants :

1.3.2.1 Type de retour attendu

Le type de retour attendu (format) est précisé soit :

    [http]
    PUT /api/v1/<collection>/<identifier>.<type>

Actuellement, seul le type json est géré. Celui-ci est renvoyé dans le corps de la requête HTTP.

Le type exprimé dans l'URL est prioritaire à celui du header HTTP.

Pour supporter certains navigateurs ne possédant pas les objets XMLHttpRequest v2, il est possible d'ajouter le paramètre GET alt=html et d'avoir ainsi le retour de la donnée json dans un textarea au sein d'une page web. 1.0.1

1.3.2.2 PUT (Mise à jour), POST (Création)

Les données à enregistrer dans la ressource peuvent être envoyées sous 2 formes :

  1. Sous la forme d'un objet JSON (application/json) transmis dans le corps de la requête HTTP,
  2. Sous la forme de variables encodées (x-www-form-urlencoded) transmis dans le code de la requête HTTP.

Les options de mise à jour sont envoyées via des variables sur l'URL.

1.3.2.3 GET (Consultation), DELETE (Suppression)

Le corps de la requête est vide.

Les options de consultation, suppression sont envoyées dans l'url à l'aide de variables dans l'URL.

Exemples :

1.3.2.4 Compatibilité

Certains clients ne permettant pas d'effectuer des requêtes autre que GET et POST, un fonctionnement en mode compatiblité est possible. Pour ce faire, il faut modifier le header HTTP en ajoutant X-HTTP-Method-Override :

Simuler une méthode PUT :

Simuler une méthode DELETE :

1.3.3 Réponse

L'API répond via plusieurs éléments, le contenu (content) du retour et les entêtes (headers) HTTP.

1.3.3.1 Contenu

Dans le cas d'un retour JSON, la structure retournée contient les éléments suivants :

{
    "success" : true,       // false ou true
    "messages" : [{
        "type" : "warning", // type de message error, userMessage, warning, notice, notification
        "contentText" : "once upon a time",
        "contentHtml" : "",
        "code" : "",        // code identifiant la catégorie du message
        "uri" : "",         // url d'accès à la page web correspondant à l'erreur
        "data" : { }        // données supplémentaires
        }],
    "data" : {}             // données demandées par la requête
}

Ce retour est envoyé quelque soit le résultat de la requête, y compris en cas d'erreur.

1.3.3.2 Code de retour http

L'API utilise les codes standards du protocole HTTP.

1.3.3.2.1 Les retours sans erreur

Si l'action demandée a été exécutée, le code HTTP 2xx est retourné.

200
Ressource trouvée
201
Ressource créé

Exemple de retour :

{
    "success" : true, // false ou true
    "messages" : [],
    "data" : {
        "document" : {
                "properties" : {
                    "id" : 1224,
                    "title" : "Hello world"
                },
                "attributes" : {
                    "ba_ttle" : {"value" : "Hello world"},
                    "ba_desc" : {"value" : "Nice Day"},
                }
          }
    }
}

Dans l'enveloppe retournée, le booléen success est à true.

1.3.3.2.2 Les retours d'erreur

Si l'action demandée n'a pas pu aboutir, un code HTTP 4xx ou en 5xx est retourné.

400
Données en entrée invalides
403
Ressource protégée (accès interdit)
404
Ressource non trouvée
501
La méthode demandée n'est pas disponible sur cette ressource
507
Espace de stockage insuffisant sur le serveur

Exemple de retour, cas d'un 404 :

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"22222\" not found",
            "contentHtml" : "",
            "code" :        "API0200",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"22222\" not found"
}

Dans l'enveloppe retournée, le booléen success est à false est un ensemble de messages explicitant l'erreur est ajouté dans le tableau messages.

1.3.4 Version de l'API

Il est nécessaire de préciser la version de l'API pour s'assurer de l'immuabilité des retours et des entrées.

La version de l'api doit être indiquée dans l'url :

/api/v1/documents/1234.json

La version de l'api est le chiffre indiqué après la lettre "v".

1.4 Droit d'accès

L'accès aux ressources est contrôlé par les ressources elles-même mais l'utilisation de l'api est aussi contrôlée de manière générale par l'application "HTTPAPI".

Cette application définit 4 droits (ACL) qui autorisent l'utilisation des méthodes sur les ressources/collections :

Ces droits s'appliquent de manière globale sur toute l'API quelque soit la ressource/collection concernée.

Si un utilisateur ne possède pas le droit, il ne peut pas effectuer de demande de ce type.

L'accès aux routes est contrôlé si la configuration de la route indique un droit spécifique.

1.5 Authentification

1.5.1 Authentification par cookie de session

L'accès à l'api requiert une session valide préexistante et préalablement ouverte à l'aide des mécanismes d'authentification de Dynacase (voir manuel de référence de Dynacase Core).

L'api n'est pas utilisable en mode "anonyme" ou "invité".

L'utilisation de l'api dans le cadre d'une interface issue d'une action ne nécessite pas d'autorisation particulière. Le cookie de session est transmis naturellement par le navigateur.

1.5.2 Authentification par jeton d'authentification

L'accès à l'api peut être autorisé à l'aide d'un jeton d'authentification.

Le jeton peut être indiqué dans le header HTTP :

GET api/v1/documents/9.json
Authorization: DcpOpen e2bb65612c70e7ac78d5ccbfe12aa234

Le terme "DcpOpen" est le "HTTP Authentication Scheme" pour identifier le mode d'autorisation.

Il peut être indiqué aussi dans le paramètre GET dcpopen-authorization

GET api/v1/documents/9.json?dcpopen-authorization=e2bb65612c70e7ac78d5ccbfe12aa234

Si un cookie de session est aussi utilisé, il sera ignoré. Le jeton est prioritaire sur le cookie de session.

1.5.2.1 Obtenir un jeton pour l'api

Le jeton d'accès peut être obtenu avec la méthode suivante :

string Dcp\HttpApi\V1\Authent::getAuthorizationToken(
                                    \Account $userAccount,
                                    array    $routes ,
                                    int      $expireDelay = -1, 
                                    bool     $oneshot = false)

Cette méthode retourne un jeton : une chaîne de caractères composée de caractères hexadécimaux (0-9a-f).

$userAccount (Account): Utilisateur identifié pour ce jeton
Les groupes ou rôles ne sont pas autorisés.
$expireDelay (int): Délai de validité du jeton en secondes.
Mettre "-1" (ou false) pour indiquer un délai infini.
$oneshot (bool): Mettre "true" pour indiquer que le jeton sera valide une seule fois
Le jeton est supprimé une fois consommée.
$routes (array): Tableau des routes autorisées
Indique sous forme d'expressions régulières les routes autorisées avec ce jeton la partie /api/v1, ne fait pas partie de la vérification.
De manière facultative, la méthode HTTP (GET, PUT, POST, DELETE) peut préfixer la route afin de limiter à une méthode donnée. Par défaut, les 4 méthodes sont autorisées. Note : un tableau vide n'autorise aucune route.

Une route peut être notée de différentes manières :

Dans ce dernier exemple, la route vers les logs de niveau "waring" sera autorisée seulement:

api/v1/vendor/logs?level=warning

1.5.2.2 Exemple de routes

Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe"

$john=new account();
$john->setLoginName("john.doe");
 
$t=Dcp\HttpApi\V1\Authent::getAuthorizationToken($john, ["%.*%"]);
print $t; // > cad68f8e1848f12df16e44857c595f9a72124f41

Cet exemple autorise toutes les routes à vie pour l'utilisateur "john.doe".

Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe" limité aux données de documents.

$john=new account();
$john->setLoginName("john.doe");
 
$t=Dcp\HttpApi\V1\Authent::getAuthorizationToken(
    $john, 
    [
      "%^/documents/[0-9]+(.json)?$%",
      "%^/families/[^/]+/[0-9]+(.json)?$%"
    ]);
 

Ici les routes autorisées peuvent être :

Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe" limité à la consultation des données de documents.

$john=new account();
$john->setLoginName("john.doe");
 
$t=Dcp\HttpApi\V1\Authent::getAuthorizationToken(
    $john, 
    [
      "GET %^/documents/[0-9]+(.json)?$%",
      "GET %^/families/[^/]+/[0-9]+(.json)?$%"
    ]);
 

1.5.2.3 Utilisation du jeton

En ligne de commande : à l'aide du programme curl :

curl  -H "Authorization: DcpOpen 8e05b60aac3f67447ab4e352a524633839924eda" http://www.example.net/api/v1/documents/12

En ligne de commande : à l'aide du programme wget :

wget http://www.example.net/api/v1/documents/12?dcpopen-authorization=cb713422beb7745f9567710ce011039fabf49224 -O 12.json

Sur un client web en javascript avec jQuery :

var token="8e05b60aac3f67447ab4e352a524633839924eda";
 
$.ajax({
  dataType: "json",
  url: "api/v1/documents/12",
  headers: {
    "Authorization":"DcpOpen " + token
  }
}).done(function (data) {
     console.log("Response", data);
}).fail(function () {
     console.error("Fail", arguments);
});

En PHP :

$token="8e05b60aac3f67447ab4e352a524633839924eda";
$url="http://www.example.net/api/v1/documents/12";
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Authorization: DcpOpen $token\r\n" 
  )
);
 
$context = stream_context_create($opts);
 
$file = file_get_contents($url, false, $context);
print $file;

1.5.3 Authentification par login et mot de passe

Cette authentification est basée sur l'authentification HTTP basic.

L'accès peut être effectué en indiquant le login et le mot de passe dans le header HTTP.

GET api/v1/documents/9.json
Authorization: Basic am9obi5kb2U6c2VjcmV0

Dans ce cas, celui-ci doit contenir la méthode utilisée (Basic) suivi de la représentation en Base64 du nom de l'utilisateur et du mot de passe séparés par le caractère « : » (deux-points).

L'accès peut être effectué via une url comportant le login est le mot passe

Ce type d'authentification ne comporte pas d'autorisation particulière comme pour les jetons. Toute route est accessible en fonction des droits de l'utilisateur identifié.

Si un cookie de session est aussi utilisé, il sera ignoré. L'utilisation du login et du mot de passe est prioritaire.

Par contre, la requête HTTP contient un header "Authorization" avec la méthode "DcpOpen" et que l'url contient le login et le mot de passe alors, ce sera la méthode "Dcp" qui sera utilisée et non la méthode "Basic".

Note : On ne peut pas avoir 2 headers "Authorization" dans la requête.

1.5.3.1 Utilisation du mode basic

En ligne de commande : à l'aide du programme curl :

Avec les informations en clair :

curl   --user  "john.doe:secret" "http://www.example.net/api/v1/documents/12"
curl   "http://john.doe:secret@www.example.net/api/v1/documents/12"

Note : Dans ce cas curl utilise les informations de connexion pour écrire dans le header la clef "Authorization" avec la méthode "basic" d'authentification. Le programme "wget" ne supporte pas cette notation d'url avec les mots de passe.

Avec les informations encodées.

curl  -H "Authorization: Basic am9obi5kb2U6c2VjcmV0" http://www.example.net/api/v1/documents/12

Sur un client web en javascript avec jQuery :

var login="john.doe";
var password="secret";
 
$.ajax({
  dataType: "json",
  url: "api/v1/documents/12",
  headers: {
    "Authorization":"Basic " + btoa(login + ":" + password)
  }
}).done(function (data) {
     console.log("Response", data);
}).fail(function () {
     console.error("Fail", arguments);
});

En php :

$url="http://john.doe:secret@www.example.net/api/v1/documents/12";
 
$f=file_get_contents($url);
print $f;

Chapitre 2 Historique de la documentation

Ce chapitre contient un descriptif des améliorations entre les releases de l'api HTTP.

2.1 Édition 3

Modifications Chapitre Version
Restauration de document Restauration Mise à jour
Ajout des liens vers les propriétés Tous les chapitres sur les ressources documents Mise à jour
Réorganisation du plan de l'API Chapitre cycle de vie, tags Mise à jour
Précision sur l'authentification requise au préalable Authentification Mise à jour
Ajout de middleware Middleware Nouveau

2.2 Édition 2

Modifications Chapitre Version
Correction du répertoire d'extension Extension Mise à jour
Précisions sur les formats de retour Introduction Mise à jour
Liste des transitions Liste des états Mise à jour
Restauration de document Restauration Mise à jour

Chapitre 3 Résumé de l'API

3.1 Carte de l'api

Type URL Implanté Signification
GET /api/v1/documents/ Oui Liste de documents
PUT /api/v1/documents/ N/A N/A
POST /api/v1/documents/ N/A N/A
DELETE /api/v1/documents/ N/A N/A
GET /api/v1/documents/<docid> Oui Récupération d'un document
PUT /api/v1/documents/<docid> Oui Mise à jour d'un document
POST /api/v1/documents/<docid> N/A N/A
DELETE /api/v1/documents/<docid> Oui Mise à la poubelle d'un document
GET /api/v1/documents/<docid>/history/ Oui Récupération des messages d'historique
PUT /api/v1/documents/<docid>/history/ N/A N/A
POST /api/v1/documents/<docid>/history/ Future version Ajout d'un message d'historique
DELETE /api/v1/documents/<docid>/history/ N/A N/A
GET /api/v1/documents/<docid>/revisions/ Oui Liste des révisions d'un document
PUT /api/v1/documents/<docid>/revisions/ N/A N/A
POST /api/v1/documents/<docid>/revisions/ N/A N/A
DELETE /api/v1/documents/<docid>/revisions/ N/A N/A
GET /api/v1/documents/<docid>/revisions/<revisionNumber> Oui Révision <revisionNumber>
PUT /api/v1/documents/<docid>/revisions/<revisionNumber> N/A N/A
POST /api/v1/documents/<docid>/revisions/<revisionNumber> N/A N/A
DELETE /api/v1/documents/<docid>/revisions/<revisionNumber> N/A N/A
GET /api/v1/families/ Oui Liste des familles
PUT /api/v1/families/ N/A N/A
POST /api/v1/families/ Future version Création d'une nouvelle famille
DELETE /api/v1/families/ N/A N/A
GET /api/v1/families/<family> Oui Consultation du document décrivant la famille
PUT /api/v1/families/<family> Future version Modification de la configuration de la famille
POST /api/v1/families/<family> N/A N/A
DELETE /api/v1/families/<family> Future version Suppression de la famille et des documents associés
GET /api/v1/families/<family>/documents/ Oui Liste des documents de cette famille
PUT /api/v1/families/<family>/documents/ Future version Modification en masse de documents de cette famille
POST /api/v1/families/<family>/documents/ Oui Création d'un document de cette famille
DELETE /api/v1/families/<family>/documents/ Future version Mise à la poubelle en masse des documents de cette famille
GET /api/v1/families/<family>/documents/<docid> Oui Récupération d'un document de la famille
PUT /api/v1/families/<family>/documents/<docid> Oui Mise à jour d'un document de la famille
POST /api/v1/families/<family>/documents/<docid> N/A N/A (Création d'un document avec un identifiant donné)
DELETE /api/v1/families/<family>/documents/<docid> Oui Suppression d'un document de la famille
GET /api/v1/families/<family>/enumerates/ Oui Récupération de la liste des énumérés
PUT /api/v1/families/<family>/enumerates/ N/A N/A
POST /api/v1/families/<family>/enumerates/ N/A N/A
DELETE /api/v1/families/<family>/enumerates/ N/A N/A
GET /api/v1/families/<family>/enumerates/<docid> Oui Récupération de la liste des valeurs
PUT /api/v1/families/<family>/enumerates/<docid> Future version Modification d'une valeur de la liste des énumérés
POST /api/v1/families/<family>/enumerates/<docid> Future version Ajout d'une valeur à la liste d'énumérés
DELETE /api/v1/families/<family>/enumerates/<docid> Future version Suppression d'un énuméré
GET /api/v1/temporaryFiles/ N/A N/A
PUT /api/v1/temporaryFiles/ N/A N/A
POST /api/v1/temporaryFiles/ Oui Création d'un fichier temporaire
DELETE /api/v1/temporaryFiles/ Future version Suppression d'un fichier temporaire
GET /api/v1/trash/ Oui Liste des documents de la poubelle
PUT /api/v1/trash/ N/A N/A
POST /api/v1/trash/ N/A N/A
DELETE /api/v1/trash/ Future version Supprime définitivement les documents de la poubelle
GET /api/v1/trash/<docid> Oui Récupération d'un document mis à la poubelle
PUT /api/v1/trash/<docid> N/A N/A
POST /api/v1/trash/<docid> N/A N/A
DELETE /api/v1/trash/<docid> Future version Suppression définitive d'un document mis à la poubelle
GET /api/v1/folders/ Oui Liste de documents de type dossier
PUT /api/v1/folders/ N/A N/A
POST /api/v1/folders/ N/A N/A
DELETE /api/v1/folders/ N/A N/A
GET /api/v1/folders/<folderId> Future version Description du dossier
PUT /api/v1/folders/<folderId> N/A N/A
POST /api/v1/folders/<folderId> N/A N/A
DELETE /api/v1/folders/<folderId> N/A N/A
GET /api/v1/folders/<folderId>/documents/ Oui Contenu du dossier folderId
PUT /api/v1/folders/<folderId>/documents/ N/A N/A
POST /api/v1/folders/<folderId>/documents/ Future version Ajout d'un document au dossier
DELETE /api/v1/folders/<folderId>/documents/ Future version Suppression d'un document du dossier
GET /api/v1/searches/ Oui Liste de documents de type recherche
PUT /api/v1/searches/ N/A N/A
POST /api/v1/searches/ N/A N/A
DELETE /api/v1/searches/ N/A N/A
GET /api/v1/searches/<searchId> Future version Description de la recherche
PUT /api/v1/searches/<searchId> N/A N/A
POST /api/v1/searches/<searchId> N/A N/A
DELETE /api/v1/searches/<searchId> N/A N/A
GET /api/v1/searches/<searchId>/documents/ Oui Contenu d'une recherche
PUT /api/v1/searches/<searchId>/documents/ N/A N/A
POST /api/v1/searches/<searchId>/documents/ N/A N/A
DELETE /api/v1/searches/<searchId>/documents/ N/A N/A
GET /api/v1/documents/<docid>/usertags/ Oui Liste des tags utilisateurs d'un document
PUT /api/v1/documents/<docid>/usertags/ N/A N/A
POST /api/v1/documents/<docid>/usertags/ N/A N/A
DELETE /api/v1/documents/<docid>/usertags/ N/A N/A
GET /api/v1/documents/<docid>/usertags/<tagIdentifier> Oui Tag utilisateur <tagIdentifier>
PUT /api/v1/documents/<docid>/usertags/<tagIdentifier> Oui Modification d'un tag utilisateur <tagIdentifier>
POST /api/v1/documents/<docid>/usertags/<tagIdentifier> Oui Création d'un tag utilisateur <tagIdentifier>
DELETE /api/v1/documents/<docid>/usertags/<tagIdentifier> Oui Suppression d'un tag utilisateur <tagIdentifier>
GET /api/v1/documents/<docid>/workflows/states/ Oui Liste des états possibles d'un document
PUT /api/v1/documents/<docid>/workflows/states/ N/A N/A
POST /api/v1/documents/<docid>/workflows/states/ N/A N/A
DELETE /api/v1/documents/<docid>/workflows/states/ N/A N/A
GET /api/v1/documents/<docid>/workflows/states/<state> Oui Caractéristiques de l'état
PUT /api/v1/documents/<docid>/workflows/states/<state> N/A N/A
POST /api/v1/documents/<docid>/workflows/states/<state> Oui Changement d'état d'un document <state>
DELETE /api/v1/documents/<docid>/workflows/states/<state> N/A N/A
GET /api/v1/documents/<docid>/workflows/transitions/ Oui Liste des transitions possibles d'un document
PUT /api/v1/documents/<docid>/workflows/transitions/ N/A N/A
POST /api/v1/documents/<docid>/workflows/transitions/ N/A N/A
DELETE /api/v1/documents/<docid>/workflows/transitions/ N/A N/A
GET /api/v1/documents/<docid>/workflows/transitions/<transitions> Oui Caractéristiques de la transition
PUT /api/v1/documents/<docid>/workflows/transitions/<transitions> N/A N/A
POST /api/v1/documents/<docid>/workflows/transitions/<transitions> Oui Passage d'une transition
DELETE /api/v1/documents/<docid>/workflows/transitions/<transitions> N/A N/A

Légende :

Les entrées documents de famillies et de trash possède aussi les sous-collections :

Les entrées en Future version sont prévues pour une implémentation future mais non présentes dans la version courante de l'API.

Chapitre 4 Documents

Cette collection décrit les documents de Dynacase.

4.1 URL

L'url d'accès est : api/v1/documents

4.2 Méthodes

La collection documents implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/documents/ Retourne la liste des documents
POST api/v1/documents/ N/A
PUT api/v1/documents/ N/A
DELETE api/v1/documents/ N/A
Action URL Action effectuée
GET api/v1/documents/<id> Retourne le document id
POST api/v1/documents/<id> N/A
PUT api/v1/documents/<id> Modifie le document id
DELETE api/v1/documents/<id> Supprime le document id

4.3 Consultation de la liste des documents

4.3.1 URL canonique

GET /api/v1/documents/

Récupération de la liste des documents présents sur la plateforme.

4.3.2 Content

Le contenu de la requête est vide.

4.3.3 Structure de retour

Le retour est une donnée JSON.

4.3.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. documents : un tableau de document (sous la même forme que les documents unitaires)

Chaque document est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés du document,
  2. attributes : liste des attributs du document (facultatif),
  3. uri : URI d'accès du document.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 10,
            "orderBy": "title asc, id desc"
        },
        "uri": "/api/v1/documents/",
        "documents": [
            {
                "properties": {
                    "id": 1003,
                    "title": "accord",
                    "icon": "api/v1/images/assets/sizes/24x24c/wask.png",
                    "initid": 1003,
                    "name": "WASK",
                    "revision": 0
                },
                "uri": "/api/v1/documents/1003.json"
            },
            [...]
        ]
    }
}

Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.

4.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Sens de l'orderBy inconnu 400 CRUD0501
Attribut ou propriété d'orderBy invalide 400 CRUD0502

4.3.4 Résultat partiel

4.3.4.1 Pagination et tri

La liste des documents est paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

Exemple :

4.3.4.2 Informations retournées

Les documents peuvent être retournés avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés par défaut "id", "title", "icon", "initid", "name"
document.properties.all Récupère toutes les propriétés
document.properties.<prop> Récupère la propriété indiquée
document.attributes.my_attribute Ajoute l'attribut my_attribute si l'attribut n'existe pas dans un des documents il est retourné vide
requestParameters.slice Nombre maximum de document demandé
requestParameters.offset Nombre de premiers document à ignorer
requestParameters.orderBy Tri demandé
requestParameters.length Nombre de document effectivement retourné

La liste des propriétés est documentée dans la documentation de format collection.

4.3.5 Cache

La collection n'a pas de cache.

4.4 Consultation d'un document

4.4.1 URL canonique

GET /api/v1/documents/<documentId>

Récupération de la dernière révision du document ayant l'identifiant <documentId>.

L'extension ".json" peut être ajoutée pour expliciter le format de sortie.

Exemple :

GET /api/v1/documents/1234.json

L'identifiant ajouté peut-être soit :

Dans tous les cas le document retourné est le dernier de sa lignée documentaire.

Si vous souhaitez accéder à une révision précise du document, il faut utiliser la collection /api/v1/documents/<documentId>/revisions/.

4.4.2 Content

Le contenu de la requête est vide.

4.4.3 Structure de retour

Le retour est une donnée JSON.

4.4.3.1 En cas de réussite :

La partie data contient 3 champs :

  1. document.uri : uri d'accès à la ressource modifiée
  2. document.properties : liste des valeurs des propriétés
  3. document.attributes : liste des valeurs des attributs

Exemple :

{"success" :             true,
    "messages" :         [],
    "data" :             {
        "document" : {
            "uri" :        "api/v1/documents\/1057.json",
            "properties" : {
                "title" :     "La culture des perles",
                "state" :     null,
                "name" :      null,
                "icon" :      "api/v1/images/assets/sizes/24x24c/doc.png",
                "fromname" :  "MY_ARTICLE",
                [...]
            },
            "attributes" : {
                "my_title" :            {"value" : "La culture des perles", "displayValue" : "La culture des perles"},
                "my_description" :          {"value" : "Sur les bords de la rivière...", "displayValue" : "Sur les bords de la rivière..."},
                "my_annexes" : [],
                [...]
            }
        }
    }
}

Les valeurs retournées correspondent aux valeur de la vue de consultation par défaut.

Les attributs en visibilité "I" dans la vue de consultation par défaut ne sont pas retournés. Leur existence n'est pas dévoilée ni dans les données ni dans la structure.

4.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Document non trouvé 404 CRUD0200
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0219
Propriété demandée inexistante 400 CRUD0202
Attribut demandé inexistant 400 CRUD0218

Exemple :

Cas d'erreur de document non trouvé

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1200\" not found",
            "contentHtml" : "",
            "code" :        "API0200",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1200\" not found"
}

4.4.4 Résultat partiel

Le document peut être retourné avec plus ou moins d'information.

Par défaut : fields=document.properties,document.attributes

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés "visibles" "state", "fromname", "id", "postitid", "initid", "locked", "revision", "wid", "cvid", "profid", "fromid", "owner", "domainid"
document.properties.<prop> Récupère la propriété indiquée
document.attributes Récupère les valeurs et les valeurs affichable des attributs
document.attributes.<id> Récupère la valeur d'un attribut particulier
document.family.structure Récupère la structure de la famille

La liste des propriétés est documentée dans la documentation de format collection.

4.4.5 Cache

Dans le cadre du cache, le Etag est calculé à l'aide des éléments suivants :

L'ensemble de ces éléments sont concaténés et ensuite le sha1 de cette concaténation consitue le Etag.

4.4.6 Autres URL d'accès

Vous pouvez aussi accéder à cette ressource via :

GET /api/v1/families/<famName>/documents/<documentId>

Récupération de la dernière révision du document de la famille <famName> ayant l'identifiant <documentId>.

La différence entre les collection families et documents est que pour la collection families/<famName>/documents/ l'identifiant doit être dans la famille indiquée pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.

Un document "supprimé" peut être récupéré via l'url trash.

Les documents accédés via les collections families/<famName>/documents/ et trash possèdent aussi les sous- collections :

4.5 Modification d'un document

4.5.1 URL

PUT /api/v1/documents/<id>

Modification de la dernière révision document ayant l'identifiant <documentId>.

L'extension ".json" peut être ajoutée pour expliciter le format de sortie.

Exemple :

PUT /api/v1/documents/1234.json

Attention : L'identifiant du document peut être son nom logique, son identifiant numérique. L'identifiant numérique peut référencer n'importe quelle révision du document. Dans tous les cas, la modification porte sur la dernière révision du document.

4.5.2 Content

4.5.2.1 Format JSON

Le contenu de la requête doit contenir une donnée JSON avec la liste des attributs modifiés.

{
    "document": {
        "attributes": {
            "attrid": {
                "value": "<value>"
            }
        }
    }
}

Le type de la requête est application/json.

Exemple :

{
    "document": {
        "attributes": {
            "my_title": {
                "value": "Hello world"
            }
        }
    }
}

Note : Toute donnée additionnelle sera ignorée.

4.5.2.2 Format urlEncoded

Le contenu de la requête contient la liste des valeurs d'attributs à enregistrer. Chaque variable (PUT) est le nom de l'attribut (casse insensible).

Le type de la requête est application/x-www-form-urlencoded.

Note : Ce format peut être utilisé directement depuis un formulaire HTML.

Cette forme permet aussi d'enregistrer des fichiers dans le document.

4.5.3 Structure de retour

Le retour est une donnée JSON.

4.5.3.1 En cas de réussite :

La partie data contient 3 champs :

  1. document.uri : uri d'accès à la ressource modifiée
  2. document.properties : liste des valeurs des propriétés
  3. document.attributes : liste des valeurs des attributs
  4. changes : liste des valeurs modifiées

Exemple :

{"success" :             true,
    "messages" :         [],
    "data" :             {
        "document" : {
            "uri" :        "api\/v1\/documents\/1057.json",
            "properties" : {
                "title" :     "Hello World",
                [...]
            },
            "attributes" : {
                "my_title" :  {"value" : "Hello World", "displayValue" : "Hello World"},
                [...]
            }
        }
    },
    "exceptionMessage" : ""
}

La liste des propriétés est documentée dans la documentation de format collection.

4.5.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour modifier le document 403 API0201
Tentative de modification échouée 500 API0212
Impossible de modifier l'attribut 500 API0211
Le document est une famille 403 API0109

NB : On ne peut pas modifier les documents de familles.

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Update forbidden",
            "contentHtml" : "",
            "code" :        "API0201",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1057\" access deny : Pas de privil\u00e8ge edit pour le document Hello world [1057]"
}

4.5.4 Autres URL d'accès

Vous pouvez aussi accéder à cette ressources via :

PUT /api/v1/families/<famName>/documents/<documentId>

Modification de la dernière révision du document de la famille <famName> ayant l'identifiant <documentId>.

La différence entre les collection families et documents est que pour la collection families/<famName>/documents/ l'identifiant doit être dans la famille indiquée pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.

4.6 Suppression d'un document

4.6.1 URL

DELETE /api/v1/documents/<id>

Suppression de la lignée documentaire dont un des membres a l'identifiant <documentId>.

L'extension ".json" peut être ajoutée pour expliciter le format de sortie.

Exemple :

DELETE /api/v1/documents/1234.json

La suppression donne l'ordre de mettre le document dans la poubelle. Dans ce cas, toute la lignée documentaire du document est mise à la poubelle.

L'identifiant du document peut être son nom logique, son identifiant numérique, ou celui de n'importe laquelle de ses révisions.

La suppression "physique" (réelle suppression de la ligne en base de données) n'est pas possible.

4.6.2 Content

Le contenu de la requête est vide.

4.6.3 Structure de retour

Le retour est une donnée JSON.

4.6.3.1 En cas de réussite :

La partie data contient 3 champs :

  1. document.uri : uri d'accès à la ressource supprimée;
  2. document.properties : liste des valeurs des propriétés du document supprimé;
  3. document.attributes : liste des valeurs des attributs du document supprimé.

Les attributs en visibilité "I" ne sont pas retournés. Leur existence n'est pas dévoilée ni dans les données ni dans la structure.

Un document mis à la poubelle n'est plus accessible via la ressource documents mais reste accessible par la ressource trash.

Exemple :

{"success" :             true,
    "messages" :         [],
    "data" :             {
        "document" : {
            "uri" :        "api\/v1\/trash\/1057.json",
            "properties" : {
                "title" :     "La vie des escargots",
                [...]
            },
            "attributes" : {
                "my_title" : {"value" : "La vie des escargots", "displayValue" : "La vie des escargots"},
                [...]
            }
        }
    },
    "exceptionMessage" : ""
}

La liste des propriétés est documentée dans la documentation de format collection.

4.6.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour supprimer le document 403 API0216
Erreur lors de la suppression 400 API0215
Document déjà supprimé 404 API0219

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1057\" deleted",
            "contentHtml" : "",
            "code" :        "API0219",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1057\" deleted"
}

4.6.4 Autres URL d'accès

Vous pouvez aussi accéder à cette ressources via :

DELETE /api/v1/families/<famName>/documents/<documentId>

Suppression de la lignée documentaire de la famille <famName> dont un des membres a l'identifiant <documentId>.

La différence entre les collection families et documents est que pour la collection families/<famName>/documents/ l'identifiant doit être dans la famille indiquée pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.

Chapitre 5 Document : Révision

Cette sous-collection décrit les révisions des documents.

5.1 URL

L'url d'accès est : api/v1/documents/<documentId>/revisions/

5.2 Méthodes

La sous-collection revisions implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/documents/<documentId>/revisions/ Liste des urls de révisions
POST api/v1/documents/<documentId>/revisions/ N/A
PUT api/v1/documents/<documentId>/revisions/ N/A
DELETE api/v1/documents/<documentId>/revisions/ N/A
Action URL Action effectuée
GET api/v1/documents/<documentId>/revisions/<revisionNumber> Récupère une révision
POST api/v1/documents/<documentId>/revisions/<revisionNumber> N/A
PUT api/v1/documents/<documentId>/revisions/<revisionNumber> N/A
DELETE api/v1/documents/<documentId>/revisions/<revisionNumber> N/A

5.3 Consultation de la liste des révisions d'un document

5.3.1 URL

GET /api/v1/documents/<documentId>/revisions/

Récupération de la liste des révisions du document <documentId>.

L'identifiant du document peut être son nom logique, son identifiant numérique.

5.3.2 Content

Le contenu de la requête est vide.

5.3.3 Structure de retour

Le retour est une donnée JSON.

5.3.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. revisions : un tableau de révision (sous la même forme que les documents unitaires)

Chaque révision est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés de la révision,
  2. attributes : liste des attributs du document révisé (facultatif),
  3. uri : URI d'accès du document.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 2,
            "orderBy": "revision desc, id desc"
        },
        "uri": "http://www.example.net/api/v1/documents/1427/revisions/",
        "revisions": [
            {
                "properties": {
                    "id": 13511,
                    "title": "Éléonore d'aquitaine",
                    "icon": "api/v1/images/assets/sizes/24x24c/article.png",
                    "initid": 1427,
                    "name": null,
                    "status": "alive",
                    "revision": 1
                },
                "attributes": {
                    "an_nom": {
                        "value": "Éléonore d'aquitaine",
                        "displayValue": "Éléonore d'aquitaine"
                    },...
                },
                "uri": "http://www.example.net/api/v1/documents/1427/revisions/1.json"
            },
            {
                "properties": {
                    "id": 1427,
                    "title": "Éléonore",
                    "icon": "api/v1/images/assets/sizes/24x24c/article.png",
                    "initid": 1427,
                    "name": null,
                    "status": "fixed",
                    "revision": 0
                },
                "attributes": {
                    "an_nom": {
                        "value": "Éléonore",
                        "displayValue": "Éléonore"
                    },...
                },
                "uri": "http://www.example.net/api/v1/documents/1427/revisions/0.json"
            }
        ]
    }
}

5.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Document non trouvé 404 API0200

Exemple :

Cas d'erreur de document non trouvé

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1200\" not found",
            "contentHtml" : "",
            "code" :        "API0200",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1200\" not found"
}

5.3.4 Cache

Dans le cadre du cache, le Etag est calculé à l'aide des éléments suivants :

L'ensemble de ces éléments sont concaténés et ensuite le sha1 de cette concaténation consitue le Etag.

5.3.5 Autres URL d'accès

Vous pouvez aussi accéder à cette ressources via :

GET /api/v1/families/<famName>/documents/<documentId>/revisions/

Récupération de la liste des révisions de la dernière révision d'un document de la famille <famName> ayant l'identifiant <documentId>.

La différence entre les collection families et documents est que pour la collection /api/v1/families/<famName>/documents/<documentId>/revisions/ l'identifiant doit être dans la famille indiquée pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.

Les révisions d'un document "supprimé" pevent être récupérés via l'url

GET /api/v1/trash/<documentId>/revisions/

5.4 Consultation d'une révision d'un document

5.4.1 URL

GET /api/v1/documents/<documentId>/revisions/<revisionNumber>

Récupération de la révision <revisionNumber> de la dernière révision d'un document ayant l'id <documentId>.

L'extension ".json" peut être ajoutée pour expliciter le format de sortie.

Exemple :

GET /api/v1/documents/1234/revisions/0.json

L'identifiant du document peut être son nom logique, son identifiant numérique.

5.4.2 Content

Le contenu de la requête est vide.

5.4.3 Structure de retour

Le retour est une donnée JSON.

5.4.3.1 En cas de réussite :

La partie data contient 3 champs :

  1. revision.uri : uri d'accès à la ressource modifiée
  2. revision.properties : liste des valeurs des propriétés
  3. revision.attributes : liste des valeurs des attributs

Les attributs en visibilité "I" ne sont pas retournés.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "revision": {
            "properties": {
                "id": 28203,
                "title": "Le monde sous-marin",
                "icon": "api/v1/images/assets/sizes/24x24c/article.gif",
                "initid": 7120,
                "name": null,
                "revision": 17,
                "state": {
                    "reference": "my_transmited",
                    "color": "#A8E5FF",
                    "activity": null,
                    "stateLabel": "Transmis",
                    "displayValue": "Transmis"
                }
            },
            "attributes": {
                "de_reference": {
                    "value": "1",
                    "displayValue": "1"
                },
                "de_version": {
                    "value": "Deuxième",
                    "displayValue": "Deuxième"
                },...
            },
            "uri": "http://www.example.net/api/v1/documents/7120.json"
        }
    }
}

5.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Révision ou document non trouvé 404 API0220
Privilège insuffisant pour accéder au document 403 API0201
Document supprimé 404 API0219
Propriété demandée inexistante 400 API0202
Attribut demandé inexistant 400 API0218

Exemple :

Cas d'erreur de document non trouvé

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1200\" not found",
            "contentHtml" : "",
            "code" :        "API0200",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1200\" not found"
}

5.4.4 Résultat partiel

Le document peut être retourné avec plus ou moins d'information.

Par défaut : fields=document.properties,document.attributes

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés "visibles" "state", "id", "initid", "revision", "icon", "name"
document.properties.<prop> Récupère la propriété indiquée
document.attributes Récupère les valeurs et les valeurs affichable des attributs
document.attributes.<id> Récupère la valeur d'un attribut particulier
document.family.structure Récupère la structure de la famille

La liste des propriétés est documentée dans la documentation de format collection.

5.4.5 Cache

Dans le cadre du cache, le Etag est calculé à l'aide des éléments suivants :

L'ensemble de ces éléments sont concaténés et ensuite le sha1 de cette concaténation consitue le Etag.

5.4.6 Autres URL d'accès

Vous pouvez aussi accéder à cette ressources via :

GET /api/v1/families/<famName>/documents/<documentId>/revisions/<revisionNumber>

Récupération de la révision <revisionNumber> de la dernière révision d'un document de la famille <famName> ayant l'identifiant <documentId>.

La différence entre les collection families et documents est que pour la collection /api/v1/families/<famName>/documents/<documentId>/revisions/<revisionNumber> l'identifiant doit être dans la famille indiquée pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.

La révision d'un document "supprimé" pevent être récupérés via l'url

GET /api/v1/trash/<documentId>/revisions/<revisionNumber>

Chapitre 6 Document : Historique

Cette sous-collection décrit les messages de l'historique des documents

6.1 URL

L'url d'accès est : api/v1/documents/<documentId>/history/

6.2 Méthodes

La sous-collection history implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/documents/<documentId>/history/ Liste des messages historique
POST api/v1/documents/<documentId>/history/ N/A
PUT api/v1/documents/<documentId>/history/ N/A
DELETE api/v1/documents/<documentId>/history/ N/A
Action URL Action effectuée
GET api/v1/families/<famName>/documents/<documentId>/history/ Liste des messages historique
POST api/v1/families/<famName>/documents/<documentId>/history/ N/A
PUT api/v1/families/<famName>/documents/<documentId>/history/ N/A
DELETE api/v1/families/<famName>/documents/<documentId>/history/ N/A

6.3 Consultation des messages d'historique

6.3.1 URL

GET /api/v1/documents/<documentId>/history/

Récupération de l'historique du document ayant l'identifiant <documentId>.

6.3.2 Content

Le contenu de la requête est vide.

6.3.3 Structure de retour

Le retour est une donnée JSON.

6.3.3.1 En cas de réussite :

La partie data contient les éléments suivants :

Clef Description Exemple
history Liste des caractéristiques des révisions [{documentId:13514, uri:api/v1/documents/7120/revisions/3, title:Document de test, fixed:false,…}]
requestParameters: Filtre utilisé {slice:-1, offset:0, revision:3}

Chaque élément de l'historique history contient la structure suivante :

Clef Description Exemple
id Identifiant numérique du document 13514
revision: Numéro de la révision 3
revisionDate: Date de la révision "2014-10-16 13:58:56"
state.reference : État de la révision "zoo_realised"
state.color: Couleur de l'état "#8870FF"
state.stateLabel: Libelle de l'état "Réalisé"
state.activity: Libelle de l'activité "Contrôle des vis-à-vis"
status: Indique si le status de la révision "fixed" , "alive", "deleted" "fixed"
title: Titre de la révision "Alberta"
uri: Uri d'accès à la révision "api/v1/documents/7120/revisions/3"
version: Version de la révision null

Chaque message contient la structure suivante :

Clef Description Exemple
code Code du message "MODIFY"
comment: Message textuel "modification Pays, Propriétaire actuel"
date: Date d'enregistrement du message "2014-10-16 13:58:56"
level: Niveau du message 4
uid: Identifiant de l'utilisateur ayant enregistré le message "2014-10-16 13:58:56"
uname: Nom de l'utilisateur ayant enregistré le message "Jean Martin"

Les niveaux (level) correspondent aux criticités suivantes :

Criticité Description
"notice" Message d'information mineur
"info" Message d'information (par défaut)
"message" Message important
"warning" Avertissement
"error" Erreur

Exemple :

GET api/v1/document/7120/history/
{
    "success": true,
    "messages": [],
    "data": {
        "uri": "http://www.example.net/api/v1/documents/7120/history/",
        "requestParameters": {
            "slice": -1,
            "offset": 0,
            "revision": -1
        },
        "history": [
            {
                "uri": "http://www.example.net/api/v1/documents/7120/revisions/2.json",
                "properties": {
                    "id": 7120,
                    "title": "Test d'un alligator",
                    "status": "alive",
                    "revision": 2,
                    "owner": {
                        "id": "1",
                        "title": "O'reilly Master"
                    },
                    "state": {
                        "reference": "zoo_transmited",
                        "stateLabel": "Transmis",
                        "activity": "Vérification d'aptitude",
                        "color": "#A8E5FF"
                    },
                    "version": "Deuxième",
                    "revisionDate": "2014-12-01 17:00:37"
                },
                "messages": [
                    {
                        "uid": 1,
                        "uname": "O'reilly Master",
                        "date": "2014-12-01 17:00:37",
                        "level": "info",
                        "code": null,
                        "comment": "no mail template"
                    }
                ]
            },
            {
                "uri": "http://www.example.net/api/v1/documents/7120/revisions/1.json",
                "properties": {
                    "id": 7120,
                    "title": "Test primaire",
                    "status": "fixed",
                    "revision": 1,
                    "owner": {
                        "id": "1",
                        "title": "O'reilly Master"
                    },
                    "state": {
                        "reference": "zoo_accepted",
                        "stateLabel": "Accepté",
                        "activity": "Préparation de l'accueil",
                        "color": "#66FF7A"
                    },
                    "version": null,
                    "revisionDate": "2014-10-16 13:57:16"
                },
                "messages": [
                    {
                        "uid": 1,
                        "uname": "O'reilly Master",
                        "date": "2014-10-16 13:57:16",
                        "level": "message",
                        "code": "REVISION",
                        "comment": "changement d'état de Transmis vers Accepté"
                    },
                    {
                        "uid": 1,
                        "uname": "O'reilly Master",
                        "date": "2014-10-16 13:57:04",
                        "level": "info",
                        "code": null,
                        "comment": "no mail template"
                    }
                ]
            },
            {
                "uri": "http://www.example.net/api/v1/documents/7120/revisions/0.json",
                "properties": {
                    "id": 7120,
                    "title": "Test primaire",
                    "status": "fixed",
                    "revision": 0,
                    "owner": {
                        "id": "1",
                        "title": "O'reilly Master"
                    },
                    "state": {
                        "reference": "zoo_transmited",
                        "stateLabel": "Transmis",
                        "activity": "Vérification de l'adoption",
                        "color": "#A8E5FF"
                    },
                    "version": null,
                    "revisionDate": "2014-10-16 13:57:04"
                },
                "messages": [
                    {
                        "uid": 1,
                        "uname": "O'reilly Master",
                        "date": "2014-10-16 13:57:04",
                        "level": "message",
                        "code": "REVISION",
                        "comment": "changement d'état de Initialisé vers Transmis"
                    },...
                ]
            }
        ]
    }
}

6.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Famille non trouvée 404 API0220
Document non trouvé 404 API0200

Exemple :

Cas d'erreur en cas de document non trouvé

{
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "Document \"3802\" not found",
            "contentHtml": "",
            "code": "API0200",
            "uri": "",
            "data": null
        },
        {
            "type": "message",
            "contentText": "You can consult http://dynacase.dev:8081/index.php?app=HTTPAPI_V1 to have info on the API",
            "contentHtml": "You can consult <a href=\"http://dynacase.dev:8081/index.php?app=HTTPAPI_V1\">the REST page</a> to have info on the API",
            "code": "",
            "uri": "",
            "data": null
        }
    ],
    "data": null,
    "exceptionMessage": "Document \"3802\" not found"
}

6.3.4 Filtres

6.3.4.1 Slice

Cette option indique le nombre de révision maximum à retourner.

Les révisions sont ordonnées par numéro décroissant, de la plus récente à la plus ancienne.

Exemple : les 10 dernières révisions

GET api/v1/document/1234/history/?slice=10

6.3.4.2 Offset

Index à partir duquel, les révisions sont retournées.

Exemple: Les révisions de 7 à 10.

GET api/v1/document/1234/history/?slice=2&offset=7

6.3.4.3 Révision

Cette option permet de ne retourner l'historique que d'une révision précise.

Exemple : Retourner la révision 3

GET api/v1/document/1234/history/?revision=3

La première révision porte le n°0.

6.3.5 Autres URL d'accès

Vous pouvez aussi accéder à cette ressources via :

GET /api/v1/families/<famName>/documents/<documentId>/history/

Récupération de l'historique de la dernière révision du document de la famille <famName> ayant l'identifiant <documentId>.

La différence entre les collection families et documents est que pour la collection /api/v1/families/<famName>/documents/<documentId>/history/ l'identifiant doit être dans la famille indiquée pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.

L'historique d'un document "supprimé" peut être récupéré via l'url

GET /api/v1/trash/<documentId>/history/

Chapitre 7 Document : Cycle de vie

Cette collection décrit les états et transitions du cycle de vie associé à un document.

7.1 URL

L'url d'accès est : api/v1/documents/<docid>/workflows/

7.2 Méthodes

La collection documents implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/documents/<docid>/workflows/states/ Retourne la liste des états pour le document docid
POST N/A
PUT N/A
DELETE N/A
GET api/v1/documents/<docid>/workflows/transitions/ Retourne la liste des transitions pour le document docid
POST N/A
PUT N/A
DELETE N/A
Action URL Action effectuée
GET api/v1/documents/<id>/workflows/states/<stateId> Retourne les caractéristiques de l'état stateId
POST Change l'état du document docid
PUT N/A
DELETE N/A
GET api/v1/documents/<id>/workflows/transitions/<transitionId> Retourne les caractéristiques de la transition transitionId
POST Change la transition du document docid
PUT N/A
DELETE N/A

7.3 Récupérer les caractéristiques d'un état

7.3.1 URL

GET /api/v1/documents/<documentId>/workflows/states/<stateId>

Récupération de l'état stateId du document documentId.

Exemple :

GET /api/v1/documents/my_document/workflows/states/my_published

7.3.2 Content

Le contenu de la requête est vide.

7.3.3 Structure de retour

Le retour est une donnée JSON.

7.3.3.1 En cas de réussite :

La partie data contient :

  1. uri : URI préférentielle d'accès à la ressource;
  2. state : Caractéristique de l'étape
    1. id : identifiant de l'état,
    2. isCurrentState : indique si cet état est l'étape courante,
    3. label : intitulé de l'état (localisé en fonction de la langue de l'utilisateur)
    4. activity : intitulé de l'activité (localisé en fonction de la langue de l'utilisateur)
    5. displayValue : intitulé calculé en fonction des valeurs de "activity" et "label"
    6. color : code couleur (#RRGGBB) associé à l'état
    7. transition : transition qui emmène à cet étape ("null" si pas de transition possible)
      1. uri : uri de la transition
      2. label : libellé de la transition

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "./api/v1/documents/61120/workflows/states/my_transmited",
        "state": {
            "id": "my_transmited",
            "isCurrentState": false,
            "label": "Transmis",
            "activity": "Vérification de l'adoption",
            "displayValue": "Vérification de l'adoption",
            "color": "#A8E5FF",
            "transition": {
                "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited",
                "label": "Transmettre le dossier"
            }
        }
    }
}

7.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
État inconnu 404 State not found CRUD0228
Pas de cycle de vie associé 404 No workflow detected CRUD0227

Exemple :

 {
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "State \"foo\" is not available for  workflow \"My workflow\" (1090)",
            "code": "CRUD0228"
        }
    ],
    "data": null,
    "exceptionMessage": "State \"foo\" is not available for  workflow \"My workflow\" (1090)"
}

7.4 Changer d'état

7.4.1 URL

POST /api/v1/documents/<documentId>/workflows/states/<stateid>

Le document documentId passe dans le nouvel état donné stateId. La transition liée à ce changement d'état est exécutée.

Note : Seul l'utilisateur "admin", peut changer l'état d'un document lorsqu'aucune transition n'est valide.

Exemple :

POST /api/v1/documents/<documentId>/workflows/states/<stateid>

7.4.2 Content

Le contenu est une structure JSON qui comprend les informations suivantes :

  1. comment : Texte à insérer dans l'historique
  2. parameters : Liste des valeurs des paramètres indexés par leur identifiant

Exemple :

{
    "comment" : "Mon commentaire de transition"
    "parameters": {
        "my_referencedate": "2015-06-23",
        "my_validation": "yes"
    }
}

7.4.3 Structure de retour

Le retour est une donnée JSON.

7.4.3.1 En cas de réussite :

La partie data contient :

  1. uri : URI préférentielle d'accès à la ressource;
  2. state : Nouvel état du document
    1. id : identifiant de l'état,
    2. isCurrentState : indique si cet état est l'étape courante,
    3. label : intitulé de l'état (localisé en fonction de la langue de l'utilisateur)
    4. activity : intitulé de l'activité (localisé en fonction de la langue de l'utilisateur)
    5. displayValue : intitulé calculé en fonction des valeurs de "activity" et "label"
    6. color : code couleur (#RRGGBB) associé à l'état

Exemple :

{
    "success": true,
    "messages": [
        {
            "type": "warning",
            "contentText": "Avertissement : Pas de modèle de courriel",
            "code": "WORKFLOW_TRANSITION"
        },
        {
            "type": "notice",
            "contentText": "12:00 - Bulle changement d'état vers Transmis"
        }
    ],
    "data": {
        "state": {
            "id": "my_transmited",
            "isCurrentState": true,
            "label": "Transmis",
            "activity": "Vérification de l'adoption",
            "displayValue": "Vérification de l'adoption",
            "color": "#A8E5FF"
        }
    }
}

7.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Échec de la transition (droit, m0, m1) 403 Forbidden CRUD0230
Pas de cycle de vie associé 404 No workflow detected CRUD0227

Exemple :

{
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "Erreur : Pas d'adresse pour le contrôleur",
            "code": "CRUD0230"
        }
    ],
    "data": null,
    "exceptionMessage": "Cannot use transition \"Erreur : Pas d'adresse pour le contrôleur\" "
}

7.5 Récupérer la liste des étapes

7.5.1 URL

GET /api/v1/documents/<documentId>/workflows/states/

Récupération des étapes suivantes possibles du document documentId.

Les étapes possibles sont les étapes qui ont une transition pour rejoindre l'étape suivante et dont l'utilisateur a les privilège pour passer la transition.

Si la méthode m0 d'une transition, retourne un message, l'étape suivante sera retournée en indiquant l'erreur.

Le paramètre optionnel allStates=1 permet de retourner toutes les étapes même celles qui n'ont pas de transition.

Exemple :

GET /api/v1/documents/my_document/workflows/states/

7.5.2 Content

Le contenu de la requête est vide.

7.5.3 Structure de retour

Le retour est une donnée JSON.

7.5.3.1 En cas de réussite :

La partie data contient :

  1. uri : URI préférentielle d'accès à la ressource;
  2. states : Liste des états
    1. id : identifiant de l'état,
    2. label : intitulé de l'état (localisé en fonction de la langue de l'utilisateur)
    3. activity : intitulé de l'activité (localisé en fonction de la langue de l'utilisateur)
    4. displayValue : intitulé calculé en fonction des valeurs de "activity" et "label"
    5. color : code couleur (#RRGGBB) associé à l'état
    6. uri : URI d'accès à l'état
    7. transition : transition qui emmène à cet étape ("null" si pas de transition possible)
      1. id : identifiant de la transition 1.0.1
      2. uri : uri de la transition
      3. label : libellé de la transition
      4. error : message de la méthode m0
      5. authorized : indique si l'utilisateur possède le droit d'effectuer la transition 1.0.1

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "./api/v1/documents/61120/workflows/states/",
        "states": [
            {
                "id": "my_transmited",
                "label": "Transmis",
                "activity": "Vérification de l'adoption",
                "displayValue": "Vérification de l'adoption",
                "color": "#A8E5FF",
                "uri": "./api/v1/documents/61120/workflows/states/my_transmited",
                "transition": {
                    "id" : "my_Ttransmited",
                    "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited",
                    "label": "Transmettre le dossier",
                    "error": "",
                    "authorized" : true
                }
            }
        ]
    }
}

7.5.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Pas de cycle de vie associé 404 No workflow detected CRUD0227

Exemple :

{
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "No associated workflow for document \"9567\"",
            "code": "CRUD0227"
        }
    ],
    "data": null,
    "exceptionMessage": "No associated workflow for document \"9567\""
}

7.6 Récupérer les caractéristiques d'une transition

7.6.1 URL

GET /api/v1/documents/<documentId>/workflows/transitions/<transitionId>

Récupération de la transition transitionId du document documentId.

Exemple :

GET /api/v1/documents/my_document/workflows/transitions/my_publication

7.6.2 Content

Le contenu de la requête est vide.

7.6.3 Structure de retour

Le retour est une donnée JSON.

7.6.3.1 En cas de réussite :

La partie data contient :

  1. uri : URI préférentielle d'accès à la ressource;
  2. transition : Caractéristique de la transition
    1. id : identifiant de la transition
    2. beginState : étape de départ de la transition
      1. id : identifiant de l'état de départ
      2. isCurrentState : indique si c'est l'état courant du document
      3. label : libellé de l'état (localisé en fonction de la langue de l'utilisateur)
      4. activity : libellé de l'activité (localisé en fonction de la langue de l'utilisateur)
      5. displayValue : intitulé calculé en fonction des valeurs de "activity" et "label"
      6. color : code couleur (#RRGGBB) associé à l'état
    3. endState : étape d'arrivée de la transition
      1. id : identifiant de l'état d'arrivée
      2. isCurrentState : indique si c'est l'état courant du document
      3. label : libellé de l'état (localisé en fonction de la langue de l'utilisateur)
      4. activity : libellé de l'activité (localisé en fonction de la langue de l'utilisateur)
      5. displayValue : intitulé calculé en fonction des valeurs de "activity" et "label"
      6. color : code couleur (#RRGGBB) associé à l'état
    4. label : libellé de la transition (localisé en fonction de la langue de l'utilisateur)
    5. askComment : (bool) indique si un commentaire peut être associé à la transition
    6. askAttributes : liste des paramètres de transition
      1. id : identifiant du paramètre (provenant de la famille du cycle de vie)
      2. visibility : visibilité du paramètre
      3. label : libellé du paramètre
      4. type : type du paramètre
      5. logicalOrder : ordre (non affecté)
      6. multiple : indique si le type est multivalué
      7. options : options de l'attribut
      8. needed : indique si la valeur est obligatoire

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited",
        "transition": {
            "id": "my_Ttransmited",
            "beginState": {
                "id": "my_initialised",
                "isCurrentState": true,
                "label": "Initialisé",
                "activity": "Rédaction de la demande",
                "displayValue": "Rédaction de la demande",
                "color": "#FFE991"
            },
            "endState": {
                "id": "my_transmited",
                "isCurrentState": false,
                "label": "Transmis",
                "activity": "Vérification de l'adoption",
                "displayValue": "Vérification de l'adoption",
                "color": "#A8E5FF"
            },
            "label": "Transmettre le dossier",
            "askComment": false,
            "askAttributes": [
                {
                    "id": "wan_date",
                    "visibility": "W",
                    "label": "date de début",
                    "type": "date",
                    "logicalOrder": 0,
                    "multiple": false,
                    "options": [],
                    "needed": false
                },
                {
                    "id": "wad_mailsecure",
                    "visibility": "W",
                    "label": "Espèce protégée",
                    "type": "docid",
                    "logicalOrder": 0,
                    "multiple": false,
                    "options": [],
                    "needed": false
                },
                {
                    "id": "wad_file",
                    "visibility": "W",
                    "label": "Fichier",
                    "type": "file",
                    "logicalOrder": 0,
                    "multiple": false,
                    "options": [],
                    "needed": false
                }
            ]
        }
    }
}

7.6.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Transition inconnue 404 Transition not found CRUD0229
Pas de cycle de vie associé 404 No workflow detected CRUD0227

Exemple :

{
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "transition \"foo\" is not available for  workflow \"My workflow\" (1090)",
            "code": "CRUD0229"
        }
    ],
    "data": null,
    "exceptionMessage": "transition \"foo\" is not available for  workflow \"My workflow\" (1090)"
}

7.7 Passer une transition

7.7.1 URL

POST /api/v1/documents/<documentId>/workflows/transitions/<transitionId>

Le document documentId passe la transition donné transitionId. La transition demandée doit exister à partir de l'état courant.

Exemple :

POST /api/v1/documents/<documentId>/workflows/transitions/my_transmission

7.7.2 Content

Le contenu est une structure JSON qui comprend les informations suivantes :

  1. comment : Texte à insérer dans l'historique
  2. parameters : Liste des valeurs des paramètres indexés par leur identifiant

Exemple :

{
    "comment" : "Mon commentaire de transition"
    "parameters": {
        "my_referencedate": "2015-06-23",
        "my_validation": "yes"
    }
}

7.7.3 Structure de retour

Le retour est une donnée JSON.

7.7.3.1 En cas de réussite :

La partie data contient :

  1. uri : URI préférentielle d'accès à la ressource;
  2. state : Nouvel état du document
    1. id : identifiant de l'état,
    2. isCurrentState : indique si cet état est l'étape courante,
    3. label : intitulé de l'état (localisé en fonction de la langue de l'utilisateur)
    4. activity : intitulé de l'activité (localisé en fonction de la langue de l'utilisateur)
    5. displayValue : intitulé calculé en fonction des valeurs de "activity" et "label"
    6. color : code couleur (#RRGGBB) associé à l'état

Exemple :

{
    "success": true,
    "messages": [
        {
            "type": "warning",
            "contentText": "Avertissement : no mail template",
            "code": "WORKFLOW_TRANSITION"
        },
        {
            "type": "notice",
            "contentText": "13:48 - Bulle changement d'état vers Transmis"
        }
    ],
    "data": {
        "state": {
            "id": "my_transmited",
            "isCurrentState": true,
            "label": "Transmis",
            "activity": "Vérification de l'adoption",
            "displayValue": "Vérification de l'adoption",
            "color": "#A8E5FF"
        }
    }
}

7.7.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Échec de la transition (droit, m0, m1) 403 Forbidden CRUD0230
Pas de cycle de vie associé 404 No workflow detected CRUD0227
Transition invalide (non applicable depuis l'étape courante) 404 Invalid transition CRUD0235

Exemple :

  {
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "Destination state is not defined for workflow \"Défaut demande adoption\" (1090)",
            "code": "CRUD0235"
        },
        {
            "type": "message",
            "contentText": "You can consult ?app=HTTPAPI_V1 to have info on the API",
            "contentHtml": "You can consult <a href=\"?app=HTTPAPI_V1\">the REST page</a> to have info on the API"
        }
    ],
    "data": null,
    "exceptionMessage": "Destination state is not defined for workflow \"Défaut demande adoption\" (1090)"
}

7.8 Récupérer la liste des transitions

7.8.1 URL

GET /api/v1/documents/<documentId>/workflows/transitions/

Récupération de toutes les transitions du document documentId.

Exemple :

GET /api/v1/documents/61120/workflows/transitions/

7.8.2 Content

Le contenu de la requête est vide.

7.8.3 Structure de retour

Le retour est une donnée JSON.

7.8.3.1 En cas de réussite :

La partie data contient :

  1. uri : URI préférentielle d'accès à la ressource;
  2. transitions : Liste de transition
    1. uri : identifiant de l'état de départ
    2. label : libellé de la transition (localisé en fonction de la langue de l'utilisateur)
    3. valid : indique si la transition existe depuis l'étape courante
      Cela ne vérifie pas si l'utilisateur courant peut passer la transition

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "./api/v1/documents/61120/workflows/transitions/",
        "transitions": [
            {
                "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited",
                "label": "Transmettre le dossier",
                "valid": true
            },
            {
                "uri": "./api/v1/documents/61120/workflows/transitions/my_Taccepted",
                "label": "Accepter le dossier",
                "valid": false
            },
            {
                "uri": "./api/v1/documents/61120/workflows/transitions/my_Trefused",
                "label": "Refuser le dossier",
                "valid": false
            },
            {
                "uri": "./api/v1/documents/61120/workflows/transitions/my_Trealised",
                "label": "Fin de traitement",
                "valid": false
            },
            {
                "uri": "./api/v1/documents/61120/workflows/transitions/my_Tretry",
                "label": "À corriger",
                "valid": false
            }
        ]
    }
}

7.8.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Pas de cycle de vie associé 404 No workflow detected CRUD0227

Exemple :

{
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "No associated workflow for document \"9567\"",
            "code": "CRUD0227"
        }
    ],
    "data": null,
    "exceptionMessage": "No associated workflow for document \"9567\""
}

Chapitre 8 Document : Supprimé

Cette collection décrit les documents de Dynacase supprimés.

8.1 URL

L'url d'accès est : /api/v1/trash

8.2 Méthodes

La collection trash implémente les éléments suivants :

Action URL Action effectuée
GET /api/v1/trash/ Liste des documents supprimés
POST /api/v1/trash/ N/A
PUT /api/v1/trash/ N/A
DELETE /api/v1/trash/ N/A
Action URL Action effectuée
GET /api/v1/trash/<id> Retourne le document id
POST /api/v1/trash/<id> N/A
PUT /api/v1/trash/<id> Restauration du document id
DELETE /api/v1/trash/<id> N/A

8.3 Consultation de la liste des documents supprimés

8.3.1 URL canonique

GET /api/v1/trash/

Récupération de la liste des documents supprimés de la plateforme.

8.3.2 Content

Le contenu de la requête est vide.

8.3.3 Structure de retour

Le retour est une donnée JSON.

8.3.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. properties : Le titre de la recherche "The trash" (traduit)
  4. documents : un tableau de document (sous la même forme que les documents unitaires)

Chaque document est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés du document,
  2. attributes : liste des attributs du document (facultatif),
  3. uri : URI d'accès du document.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 10,
            "orderBy": "title asc, id desc"
        },
        "uri": "/api/v1/trash/",
        "properties": {
            "title": "The trash"
        },
        "documents": [
            {
                "properties": {
                    "id": 1003,
                    "title": "accord",
                    "icon": "api/v1/images/assets/sizes/24x24c/wask.png",
                    "initid": 1003,
                    "name": "WASK",
                    "revision": 0
                },
                "uri": "/api/v1/trash/1003.json"
            },
            [...]
        ]
    }
}

Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.

8.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Sens de l'orderBy inconnu 400 CRUD0501
Attribut ou propriété d'orderBy invalide 400 CRUD0502

8.3.4 Résultat partiel

8.3.4.1 Pagination et tri

La liste des documents peut être paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

Exemple :

8.3.4.2 Informations retournées

Les documents peuvent être retournés avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés par défaut "id", "title", "icon", "initid", "name"
document.properties.all Récupère toutes les propriétés
document.properties.<prop> Récupère la propriété indiquée
document.attributes.my_attribute Ajoute l'attribut my_attribute si l'attribut n'existe pas dans un des documents il est retourné vide

La liste des propriétés est documentée dans la documentation de format collection.

8.3.5 Cache

La collection n'a pas de cache.

8.4 Consultation d'un document supprimé

8.4.1 URL

Récupération d'un document du trash.

GET /api/v1/trash/<documentId>

Récupération de la dernière révision du document supprimé ayant pour id <documentId>.

L'extension ".json" peut être ajoutée pour expliciter le format de sortie.

Exemple :

GET /api/v1/trash/1234.json

L'identifiant du document peut être son nom logique, son identifiant numérique.

8.4.2 Content

Le contenu de la requête est vide.

8.4.3 Structure de retour

Le retour est une donnée JSON.

8.4.3.1 En cas de réussite :

La partie data contient 3 champs :

  1. document.uri : uri d'accès à la ressource modifiée
  2. document.properties : liste des valeurs des propriétés
  3. document.attributes : liste des valeurs des attributs

Les attributs en visibilité "I" ne sont pas retournés.

Exemple :

{"success" :             true,
    "messages" :         [],
    "data" :             {
        "document" : {
            "uri" :        "api\/v1\/documents\/1057.json",
            "properties" : {
                "title" :     "Aristote le Stagirite",
                "name" :      null,
                "icon" :      "api/v1/images/assets/sizes/24x24c/doc.png"
                [...]
            },
            "attributes" : {
                "my_title" :            {"value" : "[123", "displayValue" : "[123"},
                "my_level" :          {"value" : 34, "displayValue" : "34"}
                [...]
            }
        }
    }
}

8.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Document non trouvé 404 API0200
Privilège insuffisant pour accéder au document 403 API0201
Document supprimé 404 API0219
Propriété demandée inexistante 400 API0202
Attribut demandé inexistant 400 API0218

Exemple :

Cas d'erreur de document non trouvé

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1200\" not found",
            "contentHtml" : "",
            "code" :        "API0200",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1200\" not found"
}

8.4.4 Résultat partiel

Le document peut être retourné avec plus ou moins d'information.

Par défaut : fields=document.properties,document.attributes

fields Signification Remarques
document.properties Récupère les propriétés données par défaut "id", "title", "icon", "initid", "name", "revision"
document.properties.<prop> Récupère la propriété indiquée
document.attributes Récupère les valeurs et les valeurs affichable des attributs
document.attributes.<id> Récupère la valeur d'un attribut particulier
document.family.structure Récupère la structure de la famille

La liste des propriétés est documentée dans la documentation de format collection.

8.5 Restauration d'un document

8.5.1 URL

PUT /api/v1/trash/<id>

Restauration du document <documentId>.

L'extension ".json" peut être ajoutée pour expliciter le format de sortie.

Exemple :

PUT /api/v1/trash/1234.json

Attention : L'identifiant du document peut être son nom logique, son identifiant numérique. L'identifiant numérique peut référencer n'importe quelle révision du document. Dans tous les cas, la modification porte sur la dernière révision du document.

8.5.2 Content

8.5.2.1 Format JSON

La demande de restauration doit être formulée de la manière suivante.

Le type de la requête est application/json.

{
    "document": {
        "properties": {
            "status": "alive"
        }
    }
}

Note : Toute donnée additionnelle sera ignorée.

8.5.3 Structure de retour

Le retour est une donnée JSON.

8.5.3.1 En cas de réussite :

La partie data contient 3 champs :

  1. document.uri : uri d'accès à la ressource modifiée
  2. document.properties : liste des valeurs des propriétés
  3. document.attributes : liste des valeurs des attributs

Exemple :

{"success" :             true,
    "messages" :         [],
    "data" :             {
        "document" : {
            "uri" :        "api\/v1\/documents\/1057.json",
            "properties" : {
                "title" :     "Hello World",
                [...]
            },
            "attributes" : {
                "my_title" :  {"value" : "Hello World", "displayValue" : "Hello World"},
                [...]
            }
        }
    },
    "exceptionMessage" : ""
}

8.5.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Impossible de lire la demande de restauration 500 CRUD0208
Demande de restauration mal formulée 500 CRUD0236
Document non trouvé 404 CRUD0200
Document trouvé mais pas dans la poubelle 404 CRUD0236
Impossible de restaurer le document 500 CRUD0505

Exemple :

Cas de demande de restauration mal formulée

{
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "The restoration must be initialized with {\"document\" : { \"properties\" : { \"status\" : \"alive\" } } }",
            "code": "CRUD0236"
        }
    ],
    "data": null,
    "exceptionMessage": "The restoration must be initialized with {\"document\" : { \"properties\" : { \"status\" : \"alive\" } } }"
}

Chapitre 9 Document : Tags utilisateurs

Cette ressource décrit les tags utilisateur des documents. Un tag est un mot- clef auquel une valeur est éventuellement associée. Ce tag est associé à un document pour un utilisateur particulier.

9.1 URL

L'url d'accès est : api/v1/documents/<documentId>/usertags/

9.2 Méthodes

La sous-collection usertags implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/documents/<documentId>/usertags/ Liste des tags utilisateurs
POST api/v1/documents/<documentId>/usertags/ N/A
PUT api/v1/documents/<documentId>/usertags/ N/A
DELETE api/v1/documents/<documentId>/usertags/ N/A
Action URL Action effectuée
GET api/v1/documents/<documentId>/usertags/<tagid> Retourne la définition du tag donnée
POST api/v1/documents/<documentId>/usertags/<tagid> Ajoute un tag
PUT api/v1/documents/<documentId>/usertags/<tagid> Modifie un tag existant
DELETE api/v1/documents/<documentId>/usertags/<tagid> Supprime un tag

9.3 Liste des tags utilisateur

9.3.1 URL

GET /api/v1/documents/<documentId>/usertags/

Récupération des tags de l'utilisateur connecté pour le document documentId.

Exemple :

GET /api/v1/documents/my_document/usertags/

9.3.2 Content

Le contenu de la requête est vide.

9.3.3 Structure de retour

Le retour est une donnée JSON.

9.3.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination),
  2. uri : URI d'accès de la collection,
  3. userTags : un tableau de tags utilisateur

Chaque tag utilisateur est un objet contenant les entrées suivantes :

  1. id : identifiant du tag (les identifiants sont sensibles à la casse),
  2. date : date de pose du tag,
  3. value : valeur du tag,
  4. uri : URI d'accès au tag.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "http://www.example.net/api/v1/documents/34757/usertags/",
        "requestParameters": {
            "slice": -1,
            "offset": 0
        },
        "userTags": [
            {
                "id": "lasttab",
                "date": "2015-01-07 17:40:43",
                "uri": "http://www.example.net/api/v1/documents/34757/usertags/lasttab",
                "value": "tst_t_tab_relations"
            },
            {
                "id": "VIEWED",
                "date": "2015-01-07 16:09:13",
                "uri": "http://www.example.net/api/v1/documents/34757/usertags/VIEWED",
                "value": ""
            },
            {
                "id": "my_special",
                "date": "2014-12-24 09:21:41",
                "uri": "http://www.example.net/api/v1/documents/34757/usertags/solo",
                "value": {
                    "a": 1
                }
            }
        ]
    }
}

9.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0108
Document non existant 404 CRUD0200

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]",
            "contentHtml" : "",
            "code" :        "API0201",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]"
}

9.3.4 Pagination et tri

La liste des tags utilisateur est paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

Le tri des tags utilisé est basé sur la date de modification. Il est donné dans l'ordre descendant (du plus récent au plus ancien).

Exemple :

9.4 Récupérer un tag utilisateur

9.4.1 URL

GET /api/v1/documents/<documentId>/usertags/<tagid>

Récupération du tag tagid du document documentId de l'utilisateur connecté.

Exemple :

GET /api/v1/documents/my_document/usertags/my_custom

9.4.2 Content

Le contenu de la requête est vide.

9.4.3 Structure de retour

Le retour est une donnée JSON.

9.4.3.1 En cas de réussite :

La partie data contient 2 champs :

  1. uri : URI préférentielle d'accès à la ressource;
  2. userTag : Propriétés du tag
    1. id : identifiant du tag (les identifiants sont sensible à la casse),
    2. date : date de pose du tag,
    3. value : valeur du tag. La valeur peut avoir 3 formes :
      1. String : Pour les données chaîne (ex : Hello world)
      2. Numerique : Pour les données numériques (ex : 123.34)
      3. Objet : Pour les données compatibles JSON (ex : {"one": 12, "two":"Hello"})

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "http://www.example.net/api/v1/documents/34757/usertags/my_custom",
        "userTag": {
            "id": "my_custom",
            "date": "2014-12-24 09:17:24",
            "value": {
                "my_first": 1123,
                "my_second": "Hello world"
            }
        }
    }
}

9.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0108
Document non existant 404 CRUD0200
Tag demandé inexistant 404 CRUD0223

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]",
            "contentHtml" : "",
            "code" :        "API0201",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]"
}

9.5 Créer un tag utilisateur

9.5.1 URL

POST /api/v1/documents/<documentId>/usertags/<tagid>

Création du tag tagid pour document documentId. Le tag est associé à l'utilisateur connecté.

Exemple :

POST /api/v1/documents/my_document/usertags/my_custom

Le droit de modifier le document n'est pas requis pour ajouter un tag. Seul le droit de consulter le document est requis.

9.5.2 Content

Le contenu contient la valeur du tag. Si elle est vide la valeur sera égale à la chaîne vide.

Si le contenu est une structure json, la valeur retournée sera une structure.

9.5.3 Structure de retour

Le retour est une donnée JSON.

9.5.3.1 En cas de réussite :

La partie data contient 2 champs :

  1. uri : URI préférentielle d'accès à la ressource;
  2. userTag : liste des valeurs des propriétés;

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "http://www.example.net/api/v1/documents/34757/usertags/test",
        "userTag": {
            "id": "test",
            "date": "2015-01-08 14:58:27",
            "value": "Hello"
        }
    }
}

9.5.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0108
Tag demandé existant 400 CRUD0225

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]",
            "contentHtml" : "",
            "code" :        "API0201",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]"
}

9.6 Modifier un tag utilisateur

9.6.1 URL

PUT /api/v1/documents/<documentId>/usertags/<tagid>

Modification du tag tagid du document documentId pour l'utilisateur connecté.

Exemple :

PUT /api/v1/documents/my_document/usertags/my_custom

Si le tag n'existe déjà, il est créé.

9.6.2 Content

Le contenu contient la valeur du tag.
Si il est vide la valeur est égale à la chaîne vide.

Si le contenu est une structure JSON, la valeur retournée est une structure.

9.6.3 Structure de retour

Le retour est une donnée JSON.

9.6.3.1 En cas de réussite :

La partie data contient 2 champs :

  1. uri : URI préférentielle d'accès à la ressource;
  2. userTag : liste des valeurs du tag;

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "http://www.example.net/api/v1/documents/34757/usertags/test",
        "userTag": {
            "id": "test",
            "date": "2015-01-08 14:58:27",
            "value": {
                "first":"Interesting",
                "second" : 123.56
            }
        }
    }
}

9.6.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0108

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]",
            "contentHtml" : "",
            "code" :        "API0201",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]"
}

9.7 Supprimer un tag utilisateur

9.7.1 URL

DELETE /api/v1/documents/<documentId>/usertags/<tagid>

Suppression du tag tagid du document documentId

Exemple :

DELETE /api/v1/documents/my_document/usertags/my_custom

Le droit de modifier le document n'est pas requis pour supprimer un tag. Seul le droit de consulter le document est requis.

9.7.2 Content

Le contenu de la requête est vide.

9.7.3 Structure de retour

Le retour est une donnée JSON.

9.7.3.1 En cas de réussite :

La partie data est vide.

Exemple :

{
    "success": true,
    "messages": [],
    "data": null
}

9.7.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0108
Tag demandé inexistant 400 CRUD0223

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]",
            "contentHtml" : "",
            "code" :        "API0201",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]"
}

Chapitre 10 Recherche

Cette collection décrit les recherches de Dynacase.

10.1 URL

L'url d'accès est : api/v1/searches

10.2 Méthodes

La collection searches implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/searches/ Liste des recherches
POST api/v1/searches/ N/A
PUT api/v1/searches/ N/A
DELETE api/v1/searches/ N/A

Une recherche étant un document Dynacase, la création d'une nouvelle recherche passe par l'utilisation de l'entrée families/SEARCH/documents/. De plus, il existe différents type de recherches.

Action URL Action effectuée
GET api/v1/searches/<id>/documents/ Contenu de la recherche id
POST api/v1/searches/<id>/documents/ N/A
PUT api/v1/searches/<id>/documents/ N/A
DELETE api/v1/searches/<id>/documents/ N/A

10.3 Liste des recherches

10.3.1 URL canonique

GET /api/v1/searches/

Récupération de la liste des recherches accessibles.

10.3.2 Content

Le contenu de la requête est vide.

10.3.3 Structure de retour

Le retour est une donnée JSON.

10.3.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. documents : un tableau de recherche (sous la même forme que les documents unitaires)

Chaque document est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés de la recherche,
  2. uri : URI de contenu de la recherche.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 9,
            "orderBy": "title asc, id desc"
        },
        "uri": "/api/v1/searches/",
        "documents": [
            {
                "properties": {
                    "id": 1894,
                    "title": "Les articles intéressants",
                    "icon": "api/v1/images/assets/sizes/24x24c/search.gif",
                    "initid": 1894,
                    "name": null,
                    "revision": 0
                },
                "uri": "/api/v1/searches/1894/documents/"
            }[...]
        ]
    }
}

10.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Sens de l'orderBy inconnu 400 CRUD0501
Attribut ou propriété d'orderBy invalide 400 CRUD0502

10.3.4 Résultat partiel

10.3.4.1 Pagination et tri

La liste des documents peut être paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

10.3.4.2 Informations retournées

Les documents peuvent être retournés avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés par défaut "id", "title", "icon", "initid", "name", "revision"
document.properties.all Récupère toutes les propriétés
document.properties.<prop> Récupère la propriété indiquée

La liste des propriétés est documentée dans la documentation de format collection.

10.3.5 Cache

La collection n'a pas de cache.

10.4 Consultation du contenu d'une recherche

10.4.1 URL canonique

GET /api/v1/searches/<searchId>/documents/

Récupération de la liste des documents trouvés par la recherche <searchId>.

10.4.2 Content

Le contenu de la requête est vide.

10.4.3 Structure de retour

Le retour est une donnée JSON.

10.4.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. properties: contient le titre de la recherche, et l'uri d'accès au document "recherche"
  4. documents : un tableau de document (sous la même forme que les documents unitaires)

Chaque document est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés du document,
  2. attributes : liste des attributs du document (facultatif),
  3. uri : URI d'accès du document.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 1,
            "orderBy": "title asc, id desc"
        },
        "uri": "http://www.example.net/api/v1/searches/5236/documents/",
        "properties": {
            "title": "Articles intéressants",
            "uri": "http://localhost/tmp32/api/v1/document/5236.json"
        },
        "documents": [
            {
                "properties": {
                    "id": 26653,
                    "title": "La culture des perles",
                    "icon": "api/v1/images/assets/sizes/24x24c/article.png",
                    "initid": 1425,
                    "name": null,
                    "revision": 1
                },
                "uri": "http://www.example.net/api/v1/documents/1425.json"
            }
        ]
    }
}

Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.

10.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Sens de l'orderBy inconnu 400 CRUD0501
Attribut ou propriété d'orderBy invalide 400 CRUD0502
L'identifiant de la recherche ne correspond pas à une recherche 400 CRUD0503

10.4.4 Résultat partiel

10.4.4.1 Pagination et tri

La liste des documents peut être paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

Exemple :

10.4.4.2 Informations retournées

Les documents peuvent être retournés avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés par défaut "id", "title", "icon", "initid", "name", "revision"
document.properties.all Récupère toutes les propriétés
document.properties.<prop> Récupère la propriété indiquée
document.attributes Ajoute tous les attributs de la famille référencée par la recherche s'il n'y a pas de famille de référence alors aucun attribut n'est retourné
document.attributes.my_attribute Ajoute l'attribut my_attribute si l'attribut n'existe pas dans un des documents il est retourné vide

La liste des propriétés est documentée dans la documentation de format collection.

10.4.5 Cache

La collection n'a pas de cache.

Chapitre 11 Dossier

Cette collection décrit les dossiers de Dynacase.

Un dossier est un document permettant de stocker un ensemble de documents.

11.1 URL

L'url d'accès est : /api/v1/folders

11.2 Méthodes

La collection searches implémente les éléments suivants :

Action URL Action effectuée
GET /api/v1/folders/ Liste des dossiers
POST /api/v1/folders/ N/A
PUT /api/v1/folders/ N/A
DELETE /api/v1/folders/ N/A

Une recherche étant un document Dynacase, la création d'une nouvelle dossier passe par l'utilisation de l'entrée families/DIR/documents/.

Action URL Action effectuée
GET /api/v1/folders/<id>/documents/ Contenu du dossier id
POST /api/v1/folders/<id>/documents/ N/A
PUT /api/v1/folders/<id>/documents/ N/A
DELETE /api/v1/folders/<id>/documents/ N/A

11.3 Liste des dossiers

11.3.1 URL canonique

GET /api/v1/folders/

Récupération de la liste des dossiers accessibles.

11.3.2 Content

Le contenu de la requête est vide.

11.3.3 Structure de retour

Le retour est une donnée JSON.

11.3.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. documents : un tableau de document (sous la même forme que les documents unitaires)

Chaque document est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés du dossier,
  2. uri : URI du contenu du dossier

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 10,
            "orderBy": "title asc, id desc"
        },
        "uri": "/api/v1/folders/",
        "properties": {
            "title": "The folders"
        },
        "documents": [
            {
                "properties": {
                    "id": 1011,
                    "title": "Administrateurs",
                    "icon": "api/v1/images/assets/sizes/24x24c/igroup.png",
                    "initid": 1011,
                    "name": "GADMIN",
                    "revision": 0
                },
                "uri": "/api/v1/folders/1011/documents/"
            }
        ], ...
    }
}

11.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Sens de l'orderBy inconnu 400 CRUD0501
Attribut ou propriété d'orderBy invalide 400 CRUD0502

11.3.4 Résultat partiel

11.3.4.1 Pagination et tri

La liste des documents peut être paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

11.3.4.2 Informations retournées

Les documents peuvent être retournés avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés par défaut "id", "title", "icon", "initid", "name"
document.properties.all Récupère toutes les propriétés
document.properties.<prop> Récupère la propriété indiquée

La liste des propriétés est documentée dans la documentation de format collection.

11.3.5 Cache

La collection n'a pas de cache.

11.4 Consultation du contenu d'un dossier

11.4.1 URL canonique

GET /api/v1/folders/<folderId>/documents/

Récupération de la liste des documents contenu par le dossier <folderId>.

11.4.2 Content

Le contenu de la requête est vide.

11.4.3 Structure de retour

Le retour est une donnée JSON.

11.4.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. documents : un tableau de documents (sous la même forme que les documents unitaires)

Chaque document est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés du document,
  2. attributes : liste des attributs du document (facultatif),
  3. uri : URI d'accès au document

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 10,
            "orderBy": "title asc, id desc"
        },
        "uri": "/api/v1/folders/9987/documents/",
        "properties": {
            "title": "Documents importants",
            "uri": "http://www.example.net/api/v1/documents/9987.json"
        },
        "documents": [
            {
                "properties": {
                    "id": 1003,
                    "title": "Réchauffement climatique",
                    "icon": "api/v1/images/assets/sizes/24x24c/article.png",
                    "initid": 1003,
                    "name": null,
                    "revision": 0
                },
                "uri": "http://www.example.net/api/v1/documents/1003.json"
            },
            [...]
        ]
    }
}

Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.

11.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Sens de l'orderBy inconnu 400 CRUD0501
Attribut ou propriété d'orderBy invalide 400 CRUD0502
L'identifiant du dossier ne correspond pas à un dossier 400 CRUD0504

11.4.4 Résultat partiel

11.4.4.1 Pagination et tri

La liste des documents peut être paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

Exemple :

11.4.4.2 Informations retournées

Les documents peuvent être retournés avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère l'ensemble des propriétés par défaut "id", "title", "icon", "initid", "name", "revision"
document.properties.all Récupère toutes les propriétés
document.properties.<prop> Récupère la propriété indiquée
document.attributes Ajoute tous les attributs de la famille référencée par le dossier s'il n'y a pas de famille de référence alors aucun attribut n'est retourné
document.attributes.my_attribute Ajoute l'attribut my_attribute si l'attribut n'existe pas dans un des documents il est retourné vide

La liste des propriétés est documentée dans la documentation de format collection.

11.4.5 Cache

La collection n'a pas de cache.

Chapitre 12 Famille

Cette collection décrit les familles de Dynacase.

12.1 URL

L'url d'accès est : /api/v1/families

12.2 Méthodes

La collection familles implémente les méthodes suivantes :

Action URL Action effectuée
GET /api/v1/families/ N/A
POST /api/v1/families/ N/A
PUT /api/v1/families/ N/A
DELETE /api/v1/families/ N/A
Action URL Action effectuée
GET /api/v1/families/<famid> Retourne les propriétés de la famille famid
POST /api/v1/families/<famid> N/A
PUT /api/v1/families/<famid> N/A
DELETE /api/v1/families/<famid> N/A
Action URL Action effectuée
GET /api/v1/families/<famid>/documents/ Liste des documents de la famille famid
POST /api/v1/families/<famid>/documents/ Créé un document de la famille famid
PUT /api/v1/families/<famid>/documents/ N/A
DELETE /api/v1/families/<famid>/documents/ N/A
Action URL Action effectuée
GET /api/v1/families/<famid>/documents/<id> Retourne le document id
POST /api/v1/families/<famid>/documents/<id> N/A
PUT /api/v1/families/<famid>/documents/<id> Met à jour le document id
DELETE /api/v1/families/<famid>/documents/<id> Supprime le document id

12.3 Propriétés d'une famille

12.3.1 URL

GET /api/v1/families/<famName>

Récupération de la ressource décrivant la famille <famName>.

Exemple :

GET /api/v1/families/my_cookbook

Le nom de la famille est insensible à la casse.

12.3.2 Content

Le contenu de la requête est vide.

12.3.3 Structure de retour

Le retour est une donnée JSON.

12.3.3.1 En cas de réussite :

La partie data contient 2 champs :

  1. uri : URI préférentielle d'accès à la ressource;
  2. document.properties : liste des valeurs des propriétés;

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "document": {
            "properties": {
                "id": 1065,
                "title": "Articles",
                "icon": "api/v1/images/assets/sizes/24x24c/article.png",
                "initid": 1065,
                "name": "MY_ARTICLE",
                "revision": 0
            },
            "uri": "http://localhost/tmp32/api/v1/families/MY_ARTICLE.json"
        }
    }
}

12.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0108
Propriété demandé inexistante 400
Attribut demandé inexistant 400

Exemple :

Cas d'erreur de privilège

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]",
            "contentHtml" : "",
            "code" :        "API0201",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]"
}

12.3.4 Résultat partiel

La ressource peut être retournée avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère les propriétés données par défaut "id", "title", "icon", "initid", "name", "revision"
document.properties.<prop> Récupère la propriété indiquée
family.structure Récupère la structure de la famille

La liste des propriétés est documentée dans la documentation de format collection.

12.4 Consultation des documents de la familles

12.4.1 URL canonique

GET /api/v1/families/<famName>/documents/

Récupération de la liste des documents de la famille families présents sur la plateforme.

12.4.2 Content

Le contenu de la requête est vide.

12.4.3 Structure de retour

Le retour est une donnée JSON.

12.4.3.1 En cas de réussite :

La partie data contient :

  1. requestParameters : contient un résumé des paramètres de la requête en cours (pagination et orderBy),
  2. uri : URI d'accès de la collection,
  3. properties : titre de la recherche (composée à partie du titre de la famille)
  4. documents : un tableau de document (sous la même forme que les documents unitaires)

Chaque document est un objet contenant les entrées suivantes :

  1. properties : liste des propriétés du document,
  2. attributes : liste des attributs du document (facultatif),
  3. uri : URI d'accès du document.

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "requestParameters": {
            "slice": 10,
            "offset": 0,
            "length": 2,
            "orderBy": "title asc, id desc"
        },
        "uri": "/api/v1/families/TEXT/documents/",
        "properties": {
            "title": "Texte Documents"
        },
        "documents": [
            {
                "properties": {
                    "id": 1054,
                    "title": "La vie des fourmis",
                    "icon": "api/v1/images/assets/sizes/24x24c/text.gif",
                    "initid": 1054,
                    "name": null,
                    "revision": 0
                },
                "uri": "/api/v1/documents/1054.json"
            },
            {
                "properties": {
                    "id": 1053,
                    "title": "Les grands philosophes",
                    "icon": "api/v1/images/assets/sizes/24x24c/text.gif",
                    "initid": 1053,
                    "name": null,
                    "revision": 0
                },
                "uri": "/api/v1/documents/1053.json"
            }
        ]
    }
}

Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.

12.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Sens de l'orderBy inconnu 400 CRUD0501
Attribut ou propriété d'orderBy invalide 400 CRUD0502

12.4.4 Résultat partiel

12.4.4.1 Pagination et tri

La liste des documents peut être paginée et ordonnée.

Les mots clefs GET sont les suivants :

Les paramètres appliqués sont résumés dans le retour de la collection requestParameter.

Exemple :

12.4.4.2 Informations retournées

Les documents peuvent être retournés avec plus ou moins d'information.

Par défaut : fields=document.properties

fields Signification Remarques
document.properties Récupère les propriétés données par défaut "id", "title", "icon", "initid", "name", "revision"
document.properties.all Récupère toutes les propriétés
document.properties.<prop> Récupère la propriété indiquée
document.attributes.my_attribute Ajoute l'attribut my_attribute si l'attribut n'existe pas dans un des documents il est retourné vide
document.attributes Ajoute tous les attributs

La liste des propriétés est documentée dans la documentation de format collection.

12.4.5 Cache

La collection n'a pas de cache.

12.5 Création d'un document

12.5.1 URL

POST /api/v1/families/<famName>/documents/

Création d'un document de la famille <famName>

Exemple :

POST /api/v1/families/my_cookbook/documents/

Le nom de la famille est insensible à la casse.

12.5.2 Content

12.5.2.1 Format JSON

Le contenu de la requête doit contenir une donnée JSON avec la liste des attributs à valuer.

{
    "document": {
      "attributes" : {
          "<attrName>" : {
            "value" : <newValue>
          }
      }
    }
}

Le type de la requête est application/json.

Exemple :

{
 
    "document": {
      "attributes" : {
          "ba_ttle" : {"value" : "Hello world"},
          "ba_desc" : {"value" : "Nice Day"}
    }
}

Note : Toute donnée additionnelle sera ignorée.

Cette forme ne permet pas d'enregistrer directement des fichiers dans le document.

Pour enregistrer le fichier, il sera nécessaire de passer par la ressource file qui retournera un identifiant valide qui pourra être utilisé comme valeur d'attribut de type fichier.

12.5.2.2 Format urlEncoded

Le contenu de la requête contient la liste des valeurs d'attributs à enregistrer. Chaque variable (POST) est le nom de l'attribut (casse insensible).

Le type de la requête est application/x-www-form-urlencoded.

Ce format peut être utilisé directement depuis un formulaire HTML.

Cette forme permet aussi d'enregistrer des fichiers dans le document.

12.5.3 Structure de retour

Le retour est une donnée JSON.

12.5.3.1 En cas de réussite :

La partie data contient un champ document qui inclut 3 champs :

  1. document.uri : uri d'accès à la nouvelle ressource
  2. document.properties : liste des valeurs des propriétés
  3. document.attributes : liste des valeurs des attributs

Exemple :

{
  success :true,
  messages : [],
  data : {
    "document" : {
          "uri" : "api/v1/documents/1256",
          "properties" : { 
             "id" : 1256,
             "title" : "Hello world",
             ....
           }
          "attributes" : { 
            "ba_title" : {
                "value" : "Hello world",
                "displayValue" : "Hello world"
            },
            "ba_cost" : {
                "value" : 234,
                "displayValue" : "234.00 €"
            }
          }
        }
  }
}

La liste des propriétés est documentée dans la documentation de format collection.

12.5.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Privilège insuffisant pour créer le document de cette famille 403 API0204
Tentative de modification d'un attribut inconnu 403 API0205
Tentative de modification d'un attribut en visibilité I 403 API0205
Erreur lors de la création 403 API0205
Famille inconnue 404 API0206

Chapitre 13 Famille : Énuméré

Cette collection décrit les énumérés de Dynacase.

13.1 URL

L'url d'accès est : api/v1/families/<famName>/enumerates/

13.2 Méthodes

La sous-collection enumerates implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/families/<famName>/enumerates/ Liste des attributs énumérés
POST api/v1/families/<famName>/enumerates/ N/A
PUT api/v1/families/<famName>/enumerates/ N/A
DELETE api/v1/families/<famName>/enumerates/ N/A
Action URL Action effectuée
GET api/v1/families/<famName>/enumerates/<attrid> Retourne la définition de l'énuméré attrid
POST api/v1/families/<famName>/enumerates/<attrid> N/A
PUT api/v1/families/<famName>/enumerates/<attrid> N/A
DELETE api/v1/families/<famName>/enumerates/<attrid> N/A

13.3 Liste des attributs énumérés

13.3.1 URL

GET /api/v1/families/<famName>/enumerates/

Récupére la liste des énumérés de la famille <famname>.

13.3.2 Content

Le contenu de la requête est vide.

13.3.3 Structure de retour

Le retour est une donnée JSON.

13.3.3.1 En cas de réussite :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "http://www.example.net/api/v1/families/DIR/enumerates/",
        "enumerates": [
            {
                "attributeId": "gui_isrss",
                "label": "Utilisable comme flux RSS",
                "uri": "http://www.example.net/api/v1/families/DIR/enumerates/gui_isrss.json"
            },
            {
                "attributeId": "gui_sysrss",
                "label": "Flux RSS système",
                "uri": "http://www.example.net/api/v1/families/DIR/enumerates/gui_sysrss.json"
            },
            {
                "attributeId": "fld_allbut",
                "label": "tout ou rien",
                "uri": "http://www.example.net/api/v1/families/DIR/enumerates/fld_allbut.json"
            },
            {
                "attributeId": "fld_subfam",
                "label": "restriction sous famille",
                "uri": "http://www.example.net/api/v1/families/DIR/enumerates/fld_subfam.json"
            }
        ]
    }
}

L'api retourne une liste d'énumérés (enumerates) chacun des éléments contient :

13.3.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Famille non trouvée 404 API0220

Exemple :

{
    "success": false,
    "messages": [
        {
            "type": "error",
            "contentText": "Document \"NOT_A_FAMILY\" not found",
            "code": "API0200"
        },
        {
            "type": "message",
            "contentText": "You can consult http://www.example.net/index.php?app=HTTPAPI_V1 to have info on the API",
            "contentHtml": "You can consult <a href=\"http://www.example.net/index.php?app=HTTPAPI_V1\">the REST page</a> to have info on the API"
        }
    ],
    "data": null,
    "exceptionMessage": "Document \"NOT_A_FAMILY\" not found"
}

13.3.4 Filtres

13.3.4.1 Slice

Cette option indique le nombre de valeur maximum à retourner.

Exemple :

GET api/v1/families/<famName>/enumerates/?slice=10

13.3.4.2 Offset

Index à partir duquel, les énumérés sont retournées.

Exemple:

GET api/v1/families/<famName>/enumerates/?slice=2&offset=7

13.4 Valeurs possibles d'un attribut énuméré

13.4.1 URL

GET /api/v1/families/<famName>/enumerates/<attrid>

Récupération des valeurs de l'énuméré de l'attribut attrid et de la famille famName.

13.4.2 Content

Le contenu de la requête est vide.

13.4.3 Structure de retour

Le retour est une donnée JSON.

13.4.3.1 En cas de réussite :

La partie data contient 3 champs :

  1. document.data.uri : URI d'accès à la ressource;
  2. document.data.label : label de l'attribut traduit dans la langue de l'utilisateur;
  3. document.data.requestParameters : filtre appliqués à la recherche;
  4. document.data.enumItems : tableau d'objets :
    1. key : valeur de l'élément
    2. label : libellé (traduit dans la langue de l'utilisateur)

Exemple :

{
    "success": true,
    "messages": [],
    "data": {
        "uri": "http://www.example.net/api/v1/families/my_article/enumerates/my_continent.json",
        "label": "Continents",
        "requestParameters": {
            "operator": "contains",
            "keyword": ""
        },
        "enumItems": [
            {
                "key": "Asia",
                "label": "Asie"
            },
            {
                "key": "Europa",
                "label": "Europe"
            },
            {
                "key": "Africa",
                "label": "Afrique"
            },
            {
                "key": "SouthAmerica",
                "label": "Amérique du sud"
            },
            {
                "key": "NorthAmerica",
                "label": "Amérique du nord"
            },
            {
                "key": "Oceania",
                "label": "Océanie"
            },
            {
                "key": "Antartica",
                "label": "Antartique"
            }
        ]
    }
}

13.4.3.2 En cas d'échec

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Famille non trouvée 404 API0200
Attribut non trouvé 404 API0400
Attribut de type non énuméré 403 API0401

Exemple :

Cas d'erreur de en cas d'attribut non énuméré

{"success" :             false,
    "messages" :         [
        {
            "type" :        "error",
            "contentText" : "Attribute \"an_tatouage\" is not an enum (type \"int\") in family \"ZOO_ANIMAL\"",
            "contentHtml" : "",
            "code" :        "API0401",
            "uri" :         "",
            "data" :        null
        }
    ],
    "data" :             null,
    "exceptionMessage" : "Attribute \"an_tatouage\" is not an enum (type \"int\") in family \"ZOO_ANIMAL\""
}

13.4.4 Résultat partiel (?keyword et ?operator)

Il est possible de filtrer les résultats pour n'en retourner qu'un sous ensemble.

Les paramètres sont :

13.4.5 Ordre des résultats (?orderBy)

Il est possible de spécifier l'ordre dans lequel les résultats doivent être retournés.

Les valeurs possibles pour orderBy sont :

none (tri par défaut)
trie les énumérés par l'ordre indiqué dans la définition de l'énuméré.
key

trie les énumérés par ordre alphabétique de leur clé

ce tri ne tient pas compte de la locale de l'utilisateur. C'est un tri alphabétique non naturel.

label

trie les énumérés par ordre alphabétique de leur label.

ce tri tient compte de la locale de l'utilisateur.

Chapitre 14 Fichiers temporaires

Cette collection décrit les fichiers temporaires de Dynacase.

14.1 URL

L'url d'accès est : /api/v1/temporaryFiles/

14.2 Méthodes

La collection files implémente les éléments suivants :

Action URL Action effectuée
GET /api/v1/temporaryFiles/ N/A
POST /api/v1/temporaryFiles/ Créer un nouveau fichier temporaire
PUT /api/v1/temporaryFiles/ N/A
DELETE /api/v1/temporaryFiles/ N/A

14.3 Création d'un fichier

14.3.1 Url

Création d'un fichier
POST /api/v1/temporaryFiles/

Ce fichier est temporairement stocké dans le vault. S'il n'est pas associé à un document, le fichier temporaire est supprimé au bout d'une période définie par le paramètre applicatif CORE_TMPDIR_MAXAGE .

14.3.2 Content

14.3.2.1 Format urlEncoded

Le contenu de la requête contient une variable (type file) contenant le contenu du fichier

-----------------------------70122309720638098951066485136 
Content-Disposition: form-data; name="fi_file"; filename="my_file.jpeg" 
Content-Type: image/jpeg
...

Le type de la requête est application/x-www-form-urlencoded.

Ce format peut être utilisé directement depuis un formulaire HTML.

14.3.2.2 Utilisation d'une requête ajax

L'envoi du fichier peut aussi être fait en javascript via l'objet FormData.

var fd = new FormData();
fd.append('myFile', myFile); // myFile objet de type File
$.ajax({
    type: 'POST',
    url: "api/v1/temporaryFiles/",
    processData: false,
    contentType: false,
    cache: false,
    data: fd});

Tous les navigateurs ne supportent pas l'objet FormData.

14.3.3 Structure de retour

Le retour est une donnée JSON.

14.3.3.1 En cas de réussite :

La partie data contient un objet file :

  1. file.uri : uri d'accès à la nouvelle ressource
  2. file.reference : référence pouvant être utilisant comme valeur dans un attribut de type file ou image.
  3. file.size : Taille du fichier en octets
  4. file.fileName : Nom du fichier (basename)
  5. file.mime : Type mime (système)
  6. file.cdate : Date de création
  7. file.mdate : Date de modification
  8. file.downloadUrl : Url de téléchargement du fichier
Exemple, création d'un fichier temporaire
{"success" :             true,
    "messages" :         [],
    "data" :             {
        "file" : {
            cdate:          "2016-08-30 11:41:45"
            downloadUrl:    "api/v1/images/recorded/original/8878229557124583290.png"
            fileName:       "une-fourmis-panda-ark.jpg"
            iconUrl:        "api/v1/images/assets/sizes/20/mime-image.png"
            id:             "8878229557124583290"
            mime:           "image/jpeg"
            reference:      "image/jpeg|8878229557124583290|une-fourmis-panda-ark.jpg"
            size:           "102997"
            thumbnailUrl:   "api/v1/images/recorded/sizes/48/8878229557124583290.png"
        }
    },
    "exceptionMessage" : "",
    "headers" :          []
}

14.3.4 Utilisation

Une fois le fichier ajouté, il peut être associé à un document en indiquant sa référence dans la valeur d'un attribut de type file comme tout autre attribut en utilisant :

C'est la propriété reference qui doit être affectée à la valeur de l'attribut fichier.

Chapitre 15 Fichiers

Cette collection décrit l'accès aux fichiers contenu dans les documents.

15.1 URL

L'url d'accès est : api/v1/documents/<documentId>/files/<attrid>/<index>

15.2 Méthodes

La collection files implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/documents/<documentId>/files/<attrid> Télécharge un fichier d'un attribut de type file ou image
POST api/v1/temporaryFiles/ N/A
PUT api/v1/temporaryFiles/ N/A
DELETE api/v1/temporaryFiles/ N/A

15.3 Téléchargement d'un fichier de document

15.3.1 Url

Téléchargement d'un fichier contenu dans un attribut de type file ou image. :

GET api/v1/documents/<documentId>/files/<attrid>

Pour des attributs inclus dans un tableau, l'index indique le rang dans le tableau

GET api/v1/documents/<documentId>/files/<attrid>/<index>

Téléchargement du fichier associé à l'attribut <attrid> du document <documentId>.

L'index <index> facultatif vaut -1 pour les attributs fichiers non contenu dans un tableau.

Dans le cas, d'un attribut inclus dans un tableau, l'index contient le rang dans le tableau de fichier. 0 indique la première rangée.

Si l'index n'est pas indiqué pour un attribut inclus dans un tableau, alors l'ensemble des fichiers sera téléchargé dans une archive "zip". Les fichiers sont alors numérotés suivant l'ordre du tableau.

Ce fichier est extrait du vault.

De manière optionnelle, le nom du fichier peut être indiqué après l'index pour préciser le fichier mais ce nom n'est pas utilisé pour récupérer le fichier.

Pour accéder au fichier, le droit view sur le document est vérifié. De plus, si l'attribut est en visibilité "I" alors le téléchargement du fichier ne sera pas autorisé.

15.3.2 Structure de retour

15.3.2.1 En cas de réussite

Le retour est le contenu du fichier.

15.3.2.2 En cas d'échec

En cas d'échec, une structure JSON est retournée avec l'erreur si aucune extension n'est indiquée dans l'url. Si une extension (différente de json) est indiquée alors l'erreur affiché sera un texte brut.

Les raisons d'échecs spécifiques à cette requête sont

Raison Status HTTP Error Code
Document non trouvé 404 CRUD0200
Privilège insuffisant pour accéder au document 403 CRUD0201
Document supprimé 404 CRUD0219
Propriété demandée inexistante 400 CRUD0202
Attribut demandé inexistant 400 CRUD0605
Visibilité "I" sur l'attribut 403 CRUD0606
Attribut n'est pas de type file ou image 400 CRUD0614
Erreur dans l'index 400 CRUD0610
Erreur dans l'index 400 CRUD0611
Erreur dans l'index 400 CRUD0612
Pas de fichier enregistré 404 CRUD0607
Erreur sur la valeur de l'attribut 400 CRUD0608
Fichier non référencé dans le coffre 400 CRUD0609

15.3.3 Paramètres

Le paramètre inline permet de modifier l'entête HTTP pour demander au navigateur un téléchargement de fichier ou un affichage dans le navigateur dans le cas où celui-ci permet son affichage.

Par défaut, le téléchargement est demandé. L'entête contient

Content-Disposition: attachment

Si inline vaut "true", "1" ou "yes", la disposition vaut :

Content-Disposition: inline

15.3.4 Exemple :

Récupération des informations sur l'attribut my_file du document 41429.

GET /tmp/api/v1/documents/41429?fields=document.attributes.my_file

Réponse :

{
    "success": true,
    "messages": [],
    "data": {
        "document": {
            "attributes": {
                "my_file": {
                    "size": "459285",
                    "creationDate": "2016-05-09 09:11:58",
                    "fileName": "web api.pdf",
                    "url": "api/v1/documents/41429/files/my_file/-1/web%20api.pdf",
                    "mime": "application/pdf",
                    "icon": "api/v1/images/assets/sizes/20x20c/mime-pdf.png",
                    "value": "application/pdf|4090445749180739423|web api.pdf",
                    "displayValue": "web api.pdf"
                }
            },
            "uri": "/tmp/api/v1/documents/41429.json"
        }
    }
}

La réponse de la consultation d'un document contient l'url de téléchargement (dans la propriété url) de l'attribut.

Téléchargement :

GET http://localhost/tmp/api/v1/documents/41429/files/my_file

ou avec le nom du fichier en option et pour un affichage web:

GET http://localhost/tmp/api/v1/documents/41429/files/my_file/-1/web%20api.pdf?inline=1

Chapitre 16 Images

Cette collection décrit l'accès aux images publiques notamment les icônes.

16.1 URL

Pour les images enregistrées sur le serveur, l'url d'accès est :

Pour les images enregistrées dans le coffre

16.2 Méthodes

La collection images implémente les éléments suivants :

Action URL Action effectuée
GET api/v1/images/assets/original/<fileName> Télécharge l'image
GET api/v1/images/recorded/original/<vaultId> [Télécharge l'image libre identifié par depuis le coffredownload_img
GET api/v1/images/assets/sizes/<size>/<fileName> Télécharge l'image redimensionnée
GET api/v1/images/recorded/sizes/<size>/<vaultId> Télécharge l'image libre redimensionnée identifié par depuis le coffre
POST api/v1/images/* N/A
PUT api/v1/images/* N/A
DELETE api/v1/images/* N/A

16.3 Téléchargement d'une image publique

16.3.1 Url

Téléchargement d'un fichier image contenu dans le répertoire Images ou dans le coffre en accès public.

16.3.1.1 Images enregistrées sur le serveur

Pour les images enregistrées sur le serveur, l'url d'accès est :

Cette ressource télécharge le fichier image contenu dans le répertoire Images du serveur. Le nom du fichier <fileName> est le chemin relatif du fichier à télécharger. Le chemin est relatif au répertoire Ìmages du serveur. Le chemin ne peut pas contenir ...

Les extensions de fichiers autorisées sont png, jpg, jpeg et gif.

Exemple :

16.3.1.2 Images publiques enregistrées dans le coffre

Pour les images enregistrées dans le coffre

Depuis l'interface de consultation d'un document famille, d'un dossier ou d'une recherche, il est possible de modifier l'icône de celle-ci. Dans ce cas, l'image est enregistrée dans le coffre en accès public c'est à dire sans nécessité de vérifier un contrôle sur le document. L'identifiant utilisée doit correspondre à un identifiant d'une image. Si l'identifiant indique un autre type de fichier, le téléchargement ne sera pas autorisé.

L'extension du fichier est facultative. Si elle est présente elle doit correspondre à l'extension du fichier enregistré dans le coffre.

L'identifiant du coffre peut être obtenu par la récupération des informations sur la propriété "icon" du document (ici n°66518).

GET http://localhost/tmp/api/v1/documents/66518?fields=document.properties

Réponse :

{
    "success": true,
    "messages": [],
    "data": {
        "document": {
            "properties": {
                "id": 66518,
                "title": "Les ondes gravitationnelles",
                "icon": "api/v1/images/recorded/sizes/24x24c/3865333998465762597.png",
                "initid": 66518,
                "name": null,
                "revision": 0
            },
            "uri": "/tmp32/api/v1/documents/66518.json"
        }
    }
}

L'url indiquée dans la caractéristique "icon" est l'image redimensionnée. L'url de l'image original est :

api/v1/images/recorded/original/3865333998465762597.png

16.3.2 Structure de retour

Le retour est le contenu du fichier. En cas d'échec, une structure JSON est retournée avec l'erreur si aucune extension n'est indiquée dans l'url. Si une extension (différente de json) est indiquée alors l'erreur affiché sera un texte brut.

16.3.3 Paramètres

Le paramètre inline permet de modifier l'entête HTTP pour demander au navigateur un téléchargement de fichier ou un affichage dans le navigateur dans le cas où celui-ci permet son affichage.

Par défaut, le téléchargement est demandé. L'entête contient

Content-Disposition: attachment

Si inline vaut "true", "1" ou "yes", la disposition vaut :

Content-Disposition: inline

16.3.4 Exemple :

Récupération des informations sur la propriété "icon" du document 66518.

GET http://localhost/tmp/api/v1/documents/66518?fields=document.properties

Réponse :

{
    "success": true,
    "messages": [],
    "data": {
        "document": {
            "properties": {
                "id": 66518,
                "title": "Panda",
                "icon": "api/v1/images/recorded/sizes/24x24c/3865333998465762597.png",
                "initid": 66518,
                "name": null,
                "revision": 0
            },
            "uri": "/tmp32/api/v1/documents/66518.json"
        }
    }
}

La réponse de la consultation d'un document contient l'url de téléchargement (dans la propriété url) de l'attribut.

Téléchargement de l'icône "mime-pdf.png" associée au type mime "application/pdf":

GET http://localhost/tmp/api/v1/images/assets/original/mime-pdf.png

Téléchargement de l'original d'une icône enregistrée dans le coffre

GET http://localhost/tmp/api/v1/images/recorded/original/3865333998465762597.jpg

16.4 Redimensionnement d'une image

16.4.1 Url

Téléchargement d'une image redimensionnée.

Le redimensionnement ne peux excéder la taille de l'image originale.

16.4.1.1 Images enregistrées sur le serveur

Pour les images enregistrées sur le serveur, l'url d'accès est :

Cette ressource télécharge l'image redimensionnée du fichier image original contenu dans le répertoire Images du serveur. Le nom du fichier <fileName> est le chemin relatif du fichier à télécharger. Le chemin est relatif au répertoire Ìmages du serveur. Le chemin ne peut pas contenir ...

Les extensions de fichiers autorisées sont png, jpg, jpeg et gif.

Le type du fichier retourné est le même que celui de l'original.

Exemple :

16.4.1.2 Images publiques enregistrées dans le coffre

Pour les images publiques enregistrées dans le coffre

L'extension du fichier est obligatoire. Les valeurs autorisées sont png, jpg et gif.

Le fichier retourné correspond à l'image originale redimensionnée et convertie en fonction de l'extension.

16.4.1.3 Attribut image des documents

Redimensionnement d'une image incluse dans un attribut "image" d'un document.

Paramètres :

L'extension du fichier est obligatoire. Les valeurs autorisées sont png, jpg et gif.

Le fichier retourné correspond à l'image originale redimensionnée et convertie en fonction de l'extension.

Cette url est notamment utilisée pour afficher les miniatures (thumbnail) des attributs images.

Exemple : informations sur l'attribut image "es_photo" du document n°66518.

GET api/v1/documents/66518?fields=document.attributes.es_photo
{
    "success": true,
    "messages": [],
    "data": {
        "document": {
            "attributes": {
                "es_photo": {
                    "thumbnail": "api/v1/documents/66518/images/es_photo/-1/sizes/48.png",
                    "size": "317762",
                    "creationDate": "2016-08-29 08:24:05",
                    "fileName": "panda-bambou-alimentation.jpg",
                    "url": "api/v1/documents/66518/files/es_photo/-1/panda-bambou-alimentation.jpg",
                    "mime": "image/jpeg",
                    "icon": "api/v1/images/assets/sizes/24x24c/mime-image.png",
                    "value": "image/jpeg|7168768396445052131|panda-bambou-alimentation.jpg",
                    "displayValue": "panda-bambou-alimentation.jpg"
                }
            },
            "uri": "/tmp/api/v1/documents/66518.json"
        }
    }
}

Cas particulier, l’icône du document peut être adressée avec cette url en utilisant comme nom d'attribut icon.

GET api/v1/documents/66518/images/icon/-1/sizes/48x48c.png

Cela permet notamment d'accéder à des icônes qui ne serait pas publiques. Cela est le cas pour les documents qui ont des icônes spécifiques en fonction des attributs images.

16.4.2 Syntaxe pour le redimensionnement

Le paramètre <size> permet d'indiquer la nouvelle taille avec la syntaxe suivante :

Soit l'image originale :

GET api/v1/images/assets/original/sky.jpg
Image de référence (600x338px)

Figure 1. Image de référence (600x338px)

16.4.2.1 Définir une largeur : <width> indique la largeur (en pixel)

La hauteur est calculée pour garder la proportion de l'image.

GET api/v1/images/assets/sizes/200/sky.jpg
Image 200x113px

Figure 2. Image 200x113px

16.4.2.2 Définir une hauteur : x<height> indique la hauteur (en pixel)

La largeur est calculée pour garder la proportion de l'image.

GET api/v1/images/assets/sizes/x200/sky.jpg
Image 355x200px

Figure 3. Image 355x200px

16.4.2.3 Définir la largeur et la hauteur : <width>x<height>

L'image est redimensionnée pour contenir dans la dimension indiquée tout en gardant sa proportion.

GET api/v1/images/assets/sizes/200x200/sky.jpg
Image 200x113px

Figure 4. Image 200x113px

GET api/v1/images/assets/sizes/200x100/sky.jpg
Image 178x100px

Figure 5. Image 178x100px

16.4.2.4 Définir la largeur et la hauteur en découpant l'image : <width>x<height>c

Pour que l'image contienne dans les exactes dimensions fournies, cette option permet de rogner (crop) l'image. Ce rognage est centré, les bords (haut / bas) ou (droite /gauche) sont supprimés avec la même proportion.

GET api/v1/images/assets/sizes/50x200c/sky.jpg
Image 50x200px

Figure 6. Image 50x200px

GET api/v1/images/assets/sizes/200x50c/sky.jpg
Image 200x50px

Figure 7. Image 200x50px

16.4.2.5 Définir la largeur et la hauteur en étirant l'image : <width>x<height>s

L'image est déformée (strech) pour contenir dans la dimension indiquée.

GET api/v1/images/assets/sizes/50x200s/sky.jpg
Image 50x200px

Figure 8. Image 50x200px

GET api/v1/images/assets/sizes/200x50s/sky.jpg
Image 200x50px

Figure 9. Image 200x50px

16.4.3 Structure de retour

Le retour est le contenu du fichier. En cas d'échec, une structure JSON est retournée avec l'erreur si aucune extension n'est indiquée dans l'url. Si une extension (différente de json) est indiquée alors l'erreur affiché sera un texte brut.

16.4.4 Paramètres

Le paramètre inline permet de modifier l'entête HTTP pour demander au navigateur un téléchargement de fichier ou un affichage dans le navigateur dans le cas où celui-ci permet son affichage.

Par défaut, le téléchargement est demandé. L'entête contient

Content-Disposition: attachment

Si inline vaut "true", "1" ou "yes", la disposition vaut :

Content-Disposition: inline

Chapitre 17 Paramétrage avancé

Ce chapitre contient les éléments de paramétrage avancé permettant de mieux comprendre le fonctionnement de l'API REST et de le customiser.

17.1 Extension de l'API REST

Il est possible à un module d'étendre l'API REST pour ajouter de nouvelles ressources ou surcharger les ressources existantes.

L'extension de l'API REST passe par deux éléments :

17.1.1 Classe de CRUD

Les classes de CRUD étendent la classe abstraite \Dcp\HttpApi\V1\Crud\Crud et doivent implémenter les méthodes suivantes :

Chacune de ces méthodes doit retourner la réponse. Si le type retourné est json le retour doit être un tableau ou un objet implémentant l'interface JsonSerializable.

Dans le cas d'une réponse HTML le résultat doit être une chaîne de caractères contenant le code html de la page.

L'attribut urlParameters contient le résultat de l'interprétation de l'expression régulière définie dans la route.

Exemple : pour la route

"regExp" :       "%^/documents/(?P<identifier>[^/]+)/locks/(?P<lockType>(temporary|permanent))$%",

L'url api/v1/documents/35699/locks/temporary retourne le résultat

$this->urlParameter :
Array
(
    [0] => /documents/35699/locks/temporary
    [identifier] => 35699
    [1] => 35699
    [lockType] => temporary
    [2] => temporary
    [3] => temporary
)

L'attribut contentParameters contient les données soumises par la requête sous la forme d'un tableau indexé.

L'extraction des contentParameters varie suivant le type de requête :

17.1.2 Messages pour les types json

La méthode ::addMessage(RecordReturnMessage $message) permet d'ajouter un message.

Cette méthode permet d'ajouter un message dans la donnée renvoyée si le type retourné est du json. Si le type est html, seuls les messages d'erreur sont pris en compte. Dans ce cas le retour se fait par une page html contenant le message d'erreur.

La classe Dcp\HttpApi\V1\Api\RecordReturnMessage est une classe de description de message, elle contient les attributs publics suivants :

string $type = self::MESSAGE; // Type de message ::ERROR, ::WARNING, ::INFO, ::NOTICE, ::DEBUG
string $contentText = '';     // Texte brut
string $contentHtml = '';     // Texte formaté (doit être échappé)
string $code = '';            // Code - Utilisé pour les codes erreurs
string $uri = '';             // Url - pour indiquer une page par exemple
mixed $data = null;           // autres données - 

Exemple :

use Dcp\HttpApi\V1\Api\RecordReturnMessage;
 
// Message text simple
$message1=new RecordReturnMessage();
$message1->contentText=sprintf("Hello");
 
// Avertissement texte formaté
$message2=new RecordReturnMessage();
$message2->contentHtml=sprintf("<b>Attention</b>");
$message2->type=RecordReturnMessage::WARNING;

17.1.2.1 Exemple de message retourné

{
    "success":true,
    "messages":[
        {"type":"message","contentText":"Hello world"},
        {"type":"notice","contentText":"This is a lock request"}],
    "data":{
        "uri":"\/api\/v1\/documents\/35699\/locks\/permanent",
        "lock":null}
}

17.1.3 Méthodes de la classe Crud

La classe fournit aussi quelques autres méthodes surchargeables :

17.1.4 Enregistrement d'une route

La nouvelle route de CRUD doit ensuite être enregistrée auprès de l'application HTTPAPI_V1, ceci se fait via l'ajout d'un fichier json dans le répertoire HTTPAPI_V1/rules.d/.

Ce paramètre doit contenir un tableau encodé en JSON semblable à :

[
    {
        "order" :        300,
        "class" :        "\\Dcp\\HttpApi\\V1\\Crud\\Document",
        "regExp" :       "%^/documents/?(?P<identifier>[^/]+)$%",
        "description" :  "Documents <documentId>",
        "canonicalURL" : "documents/<documentId>"
    },
    {
        "order" :        100,
        "class" :        "\\Dcp\\HttpApi\\V1\\Crud\\DocumentCollection",
        "regExp" :       "%^/documents/$%",
        "description" :  "List of all the documents",
        "canonicalURL" : "documents/"
    },
    {
        "order" :        100,
        "class" :        "\\Dcp\\HttpApi\\V1\\Crud\\Family",
        "regExp" :       "%^/families/(?P<identifier>[^/]+)$%",
        "description" :  "Family <familyId>",
        "canonicalURL" : "families/<familyId>"
    },
    {
        "order" :        100,
        "class" :        "\\Dcp\\HttpApi\\V1\\Crud\\ImageAsset",
        "regExp" :       "%^/images/assets/sizes/(?P<size>[0-9x]+[cfs]?)/(?P<identifier>.+)$%",
        "description" :  "Download resized file image",
        "canonicalURL" : "images/assets/sizes/<width>x<height>/<fileImageName>",
        "standalone" :    true,
        "acceptExtensions" : ["jpg","jpeg","png","gif"]
    }
]

Ce tableau contient des objets contenant chacun :

{"GET": {"application":"MYAPP", "acl":"MYGETACL"},
 "PUT": {"application":"MYAPP", "acl":"MYPUTACL"},
 "POST": {"application":"MYAPP", "acl":"MYPOSTACL"},
 "DELETE": {"application":"MYAPP", "acl":"MYDELETEACL"},
}

Si une route à égalité est ajoutée avec une route system (regexp positive et order égal), alors c'est la route custom qui est sélectionnée. Cela permet de surcharger les routes systèmes.

Une fois le fichier ajouté sur le serveur, la compilation des règles doit être réalisée en exécutant l'action INIT_RULES de l'application HTTAPI_V1.

17.2 Middleware

Les middlewares permettent de modifier le comportement d'une route enregistrée. Un middleware permet d'exécuter un code spécifique avant ou après l'éxécution du code de la route.

Les middlewares exécutés avant le code de la route ne peuvent pas modifier les données retournés par la route. Ils peuvent ajouter des messages ou modifier les entêtes HTTP de la réponse.

Les middlewares exécutés après le code de la route peuvent en plus modifier les données retournées.

17.2.1 Enregistrement d'un middleware

Le principe d'enregistrement d'un middleware est identique à celui de l'enregistrement d'une route.

La différence est que le fichier json de description doit être placé dans le répertoire HTTPAPI_V1/rules.d/middleware.d.

[
     {
         "order" :        300,
         "process":       "before"
         "class" :        "\\My\\Message",
         "regExp" :       "%^/documents/?(?P<identifier>[^/\\.]+)%",
         "description" :  "Add message",
         "canonicalURL" : "documents/<documentId>"
     },
     {
         "order" :        100,
         "process":       "after"
         "class" :        "\\My\\SayHello",
         "regExp" :       "%^/documents/?(?P<identifier>[^/\\.]+)$%",
         "description" :  "Say Hello World",
         "canonicalURL" : "documents/"
     },
     {
         "order" :        1000,
         "process":       "before"
         "class" :        "\\My\\Always",
         "regExp" :       "%%",
         "description" :  "Always do process",
         "canonicalURL" : "*"
     }
]

La clef process doit être indiquée. La valeur before indique que le middleware est exécuté avant la route. La valeur after indique que le middleware est exécuté après la route.

Tous les middlewares dont la rexExp correspond à l'url sont exécutés. L'ordre est donné par la clef order. L'ordre d'exécution est du plus grand au plus petit.

Les middlewares exécutés pour une requête sont indiqués dans les headers de la réponse http avec le mot-clef "X-Dcp-Middleware". La description du middleware est utilisé comme valeur de cet header.

17.2.2 Classe de middlewares

La clef class indique la classe de middleware qui doit être exécutée. Cette classe doit hériter de la classe Dcp\HttpApi\V1\Crud\MiddleWare.

Suivant la méthode de la requête http, les méthodes suivantes sont exécutées :

HTTP Method Middleware method
GET void ::read($identifier)
POST void ::create()
PUT void ::update($identifier)
DELETE void ::delete($identifier)

La variable $identifier correspond à la valeur du paramètre "identifier" présent dans l'expression régulière (regexp) de la déclaration. Le retour de ces méthodes n'est pas utilisé.

La classe de Middleware dispose de 2 méthodes pour consulter les informations sur la requête et pour manipuler la réponse.

17.2.2.1 getHttpRequest

La méthode getHttpRequest() retourne un objet Dcp\HttpApi\V1\Api\HttpRequest.

Cet objet permet d'accéder aux éléments de la requête reçue.

17.2.2.2 getHttpResponse

La méthode getHttpResponse() retourne un objet Dcp\HttpApi\V1\Api\HttpResponse.

Cet objet permet d'accéder aux éléments de la réponse en cours et permet la modification de celle-ci.

Méthodes d'accès : (getter)

Méthodes de modification : (setter)

L'objet retourné par la méthode ::getHttpResponse() est le même pour tous les middlewares. Le middleware suivant accède à la réponse du middleware précédent.

Attention : l'appel de la route principale écrase les éventuelles affectations effectuées par les middlewares "before" au moyen des méthodes setBody, setResponse et setStatusHeader.

Lorsque le contenu est de la donnée json, les méthodes getBody et setBody manipulent la partie data fournie par les méthodes CRUD.

Pour retourner des données personnalisées, il faut utiliser la méthode setResponse(). Lorsque cette méthode est utilisée, les messages et la partie data ne sont pas transmises dans le message. Pour les inclure, il faut explicitement les ajouter.

$httpResponse->setResponse([
             "data"=>$httpResponse->getBody(),
             "messages"=>$httpResponse->getMessages(),
             "myCustom"=> $myCustomValues
]);

Lorsque le contenu est du HTML, ces méthodes manipulent directement la chaîne de caractères correspondant au code HTML.

17.2.2.3 Exemple

Ajout d'un message dans un middleware "before".

namespace My;
 
use Dcp\HttpApi\V1\Crud\MiddleWare;
use Dcp\HttpApi\V1\DocManager\DocManager as DocManager;
use Dcp\HttpApi\V1\Api\RecordReturnMessage;
 
class Message extends MiddleWare
{
    public function read($resourceId)
    {
        $document=DocManager::getDocument($resourceId);
 
        if ($document) {
            $message=new RecordReturnMessage();
            $message->contentText=sprintf("Loading %s - %s", 
                                            $document->getTitle(), 
                                            date("Y-m-d"));
            $this->getHttpResponse()->addMessage($message);
        }
    }
}

Ajout d'un champ "myCustom" dans la réponse d'un middleware "after".

namespace My;
 
use Dcp\HttpApi\V1\Crud\MiddleWare;
use Dcp\HttpApi\V1\DocManager\DocManager as DocManager;
use Dcp\HttpApi\V1\Api\RecordReturnMessage;
 
class SayHello extends MiddleWare
{
    public function read($resourceId)
    {
        $document=DocManager::getDocument($resourceId);
 
        if ($document) {
            $httpResponse=$this->getHttpResponse();
            $response=$httpResponse->getBody();
            if (is_array($response)) {
                $response["myCustom"] = "Hello world";
                $httpResponse->setBody($response);
            } 
        }
    }
}

Le retour sera de la forme :

{
    "success":true,
    "messages":[
        {"type":"message",
        "contentText":"Loading Testing - 2017-03-15"}],
    "data":{
        "uri":"\/api\/v1\/documents\/35699\/locks\/permanent",
        "lock":null,
        "myCustom":"Hello world"}
    }
}

Construction d'une réponse personnalisée "myCustom" dans la réponse d'un middleware "after".

namespace My;
 
use Dcp\HttpApi\V1\Crud\MiddleWare;
use Dcp\HttpApi\V1\DocManager\DocManager as DocManager;
use Dcp\HttpApi\V1\Api\RecordReturnMessage;
 
class SayCustomHello extends MiddleWare
{
    public function read($resourceId)
    {
        $document=DocManager::getDocument($resourceId);
 
        if ($document) {
            $httpResponse=$this->getHttpResponse();
            $body=$httpResponse->getBody();
            if (is_array($body)) {
                $response["myCustom"] = "Hello world";
                $response["myData"] = $body;
                $httpResponse->setResponse($response);
            } 
        }
    }
}
Le retour sera de la forme :
{
    "myCustom":"Hello world",
    "myData":{
        "uri":"\/api\/v1\/documents\/35699\/locks\/permanent",
        "lock":null}
    }
}

17.3 Log

L'API REST possède un système de logging permettant de logger les cas d'erreur (accès à des ressources inexistantes, erreur PHP, erreur documentaire, etc.)

17.3.1 Système de log par défaut

Par défaut le système de log utilise la classe de log de Dynacase et les logs sont enregistrés à chaque erreur et envoyés dans syslog.

17.3.2 Ajout d'un système de log tiers

Il est possible d'ajouter un système de log tiers (mail, outil de supervision, etc.) Il y a deux étapes à suivre :

17.3.2.1 Création d'une classe de Log

Il faut réer une classe qui hérite de classe abstraite de log de l'API \Dcp\HttpApi\V1\Logger\Logger.

Ci-dessous un exemple avec une classe (fournie en standard par l'API mais non activée par défaut) qui log les erreurs dans error.log de Apache.

<?php
namespace Dcp\HttpApi\V1\Logger;
class ErrorLog extends Logger
{
    public function writeError($message, $context = null, $stack = null)
    {
        if ($context === null && \Doc::getUserId()) {
            $context = "User : " . $this->getUserInfo();
        }
        $stack = preg_replace('!\s+!', ' ', $stack);
        $logMessage = sprintf("Error : ## Message : %s ## Context : %s ## Stack : %s", $message, $context, $stack);
        error_log($logMessage);
    }
    public function writeMessage($message, $context)
    {
    }
    public function writeWarning($message, $context = null, $stack = null)
    {
        if ($context === null && \Doc::getUserId()) {
            $context = "User : " . $this->getUserInfo();
        }
        $stack = preg_replace('!\s+!', ' ', $stack);
        $logMessage = sprintf("Warning : ## Message : %s ## Context : %s ## Stack : %s", $message, $context, $stack);
        error_log($logMessage);
    }
    protected function getUserInfo()
    {
        return \Doc::getUserId() . " " . \Doc::getUserName();
    }
}

La classe ci-dessus log les erreurs de type Warning et Erreur et ignore les Message.

17.3.2.2 Enregistrement de la classe de log

La nouvelle classe de log doit ensuite être enregistrée auprès de l'application HTTPAPI_V1, ceci se fait via le paramètre applicatif CUSTOM_LOGGER.

Celui doit contenir un array json listant les classes de log que vous souhaitez ajouter, celle-ci seront initialisées lors d'une requête auprès de l'API et les messages seront envoyés si besoin.

Par exemple, pour enregistrer la classe ci-dessus, il faut ajouter le JSON suivant :

["\\Dcp\\HttpApi\\V1\\Logger\\ErrorLog"]

17.4 Cache

L'API inclut un système de cache par etag.

17.4.1 Principe de fonctionnement

Les etag sont une partie du standard HTTP 1.1 et permettent de ne pas recalculer les ressources systématiquement.

Le fonctionnement est le suivant :

Le cache n'est bien évidemment actif que pour les ressources accédées via la méthode GET.

Le cache fait partie du standard HTTP et est implémenté en standard (sans modification à apporter) sur les principaux navigateurs.

17.4.2 Désactivation du cache

Vous pouvez désactiver le cache :

Chapitre 18 Sandbox : Test de l'API

L'API est mise à disposition avec un module facultatif permettant de tester des requêtes REST.

Ce paquet se nomme Dynacase HTTP Api v1 : sandbox, il ajoute l'application HTTPAPI_V1_DEV et son interface est accessible via l'url : <contexte>/?app=HTTPAPI_V1_DEV.

18.1 Interface

L'interface se présente comme ci-dessous :

Interface sandbox

Figure 10. Interface sandbox

Elle est séparée en deux parties :

18.2 Précautions d'usage

Ce programme est mis à disposition à des fins pédagogique pour mieux comprendre l'API, son usage en production est à proscrire. La base de documents manipulée via l'application est la base réelle, si vous supprimez, modifiez, créez un document celui-ci est modifié en conséquence.

Liste des illustrations

Licence

Ce document est publié sous licence CC http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

Vous êtes libres :

Selon les conditions suivantes :

Édition

Manuel de référence
© Anakeen, Anakeen Labs <labs@anakeen.com>
Module API HTTP Core, version 1.0
Édition 3
Publié le 03/08/2018

Ce livre a été produit avec easybook 4.8, logiciel libre et open source développé par Javier Eguiluz à l'aide de différents composants Symfony.

Anakeen

Créé en 1998, Anakeen est un éditeur expert dans l'amélioration de la gestion des processus et de l'information avec pour objectif principal : valoriser les fonctions support en les libérant des tâches à faible valeur ajoutée. Le résultat opérationnel a toujours été recherché par toutes les entreprises et particulièrement aujourd'hui où le moindre détail peut faire la différence afin d'être ou de rester compétitif sur son marché. Pour chaque fonction support, être en situation de valoriser sa contribution au résultat global de l’entreprise est plus que jamais devenu une nécessité.

Impliqué depuis 1998 dans le logiciel libre, Anakeen est un acteur majeur de la gestion de l'information. Nos contributions pour l'utilisation des standards ouverts, la garantie de l'accès au code source et la grande diversité de nos partenaires vous assure pérennité et réversibilité.

L'ensemble du code PHP de Dynacase Platform est disponible sous licence Open Source, le modèle de données est documenté et public. Mais plus que ça, le code source est commenté dans l'objectif de faciliter sa compréhension pour la réutilisation ou la modification. Aussi toute la documentation concernant le produit est mise en ligne sur www.dynacase.org.

En choisissant un logiciel Open Source, vous faites le choix de la sécurité, car vous avez l'assurance de vérifier le fonctionnement du logiciel et la qualité du code.

Nos offres et services, nous permettent d'assurer le financement du développement produit mais aussi de contribuer chaque jour à l'adoption du business model Open Source.