From d27a59f807ef9a4410070c54fab3fed96c97889b Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Mon, 8 Feb 2021 12:42:00 +0100 Subject: [PATCH] Add LSobject import/export API methods --- doc/api/api.docbook | 146 +++++++++++++++++++++++++++++++++++++ doc/conf/conf.entities.xml | 1 + src/includes/routes.php | 85 ++++++++++++++++++++- 3 files changed, 230 insertions(+), 2 deletions(-) diff --git a/doc/api/api.docbook b/doc/api/api.docbook index b0330e75..3c28206c 100644 --- a/doc/api/api.docbook +++ b/doc/api/api.docbook @@ -397,6 +397,152 @@ + + /api/1.0/object/[object type]/import + + Cette méthode permet d'importer des objets d'un type en particulier à partir de données + d'import formatées selon un &ioFormat; configuré pour ce type d'objets. Le type de l'objet + est précisé dans l'URL et doit être encodé en conséquence. Par mimétisme du comportement de + l'interface web, cette méthode accepte des paramètres similaires et s'attend à récupérer les + données d'import dans le corps de la requête. + + Paramètres acceptés + + + ioFormat + Le nom de l'&ioFormat; des données d'import. + + + + updateIfExists + Booléen permettant d'activer/désactiver la mise à jour des données + des objets s'ils existent déjà. Si ce mode est inactif et qu'un objet des données + d'import existe déjà, une erreur sera remontée. Les valeurs acceptées sont 1 + ou 0. + + + + + justTry + Booléen permettant d'activer/désactiver le mode de vérification des + données d'import uniquement. Si ce mode est actif, les données d'import seront analysées + pour vérifier qu'elles sont correctes, mais l'import en lui-même ne sera pas effectué. + Les valeurs acceptées sont 1 ou 0. + + Le retour de cette méthode en mode justTry est identique + à une exécution en mode normal. Ce mode permet donc d'anticiper le résultat d'un import à + partir d'un jeu de données sources. + En mode justTry, seul la vérification syntaxique des + données est fiable, car les informations doublonnées au sein des données d'import ne pourront + être détectées. + + + + + + En cas d'erreurs détectées dans les informations des objets des données d'import, le tableau + errors du retour de la méthode contiendra une entrée pour chaque objet en erreur + sous le format d'un dictionnaire dont la clé data reprendra les informations de + l'objet telle que chargé (ou générée) depuis les données sources, ainsi qu'un dictionnaire sous la + clé errors qui contiendra les erreurs globales concernant l'objet sous la clé + globals et les erreurs propres à ses attributs dans un dictionnaire sous la clé + attrs. + + Les erreurs d'importation sur un objet sont non-bloquantes : l'importation des autres + objets ne sera pas interrompue. + + + Exemple + + + + + + + /api/1.0/object/[object type]/export + + Cette méthode permet d'exporter les objets d'un type en particulier dans un &ioFormat; + configuré pour ce type d'objets. Le type de l'objet est précisé dans l'URL et doit être encodé + en conséquence. + + Paramètres acceptés + + + ioFormat + Le nom de l'&ioFormat;. + + + + En tant normal, le retour de cette méthode sera directement le fichier d'export demandé. + Cependant, si une erreur survient, les paramètres d'export seront repris dans le retour + JSON de la méthode qui contiendra également les erreurs survenues. + + + Exemple + + + + + /api/1.0/object/[object type]/[dn]/relation/[relation] diff --git a/doc/conf/conf.entities.xml b/doc/conf/conf.entities.xml index 079a8a7b..f1c3514a 100644 --- a/doc/conf/conf.entities.xml +++ b/doc/conf/conf.entities.xml @@ -29,3 +29,4 @@ +ioFormat"> diff --git a/src/includes/routes.php b/src/includes/routes.php index 6fbf5011..381cb287 100644 --- a/src/includes/routes.php +++ b/src/includes/routes.php @@ -840,7 +840,6 @@ function handle_old_import_php($request) { } LSurl :: add_handler('#^import\.php#', 'handle_old_import_php', false); - /* * Handle LSobject export request * @@ -854,7 +853,6 @@ function handle_LSobject_export($request) { return; $ioFormats = array(); - $result = null; if ( LSsession :: loadLSclass('LSio', null, true)) { // Load class with warning $ioFormats = $object->listValidIOformats(); if (!is_array($ioFormats) || empty($ioFormats)) { @@ -1675,6 +1673,89 @@ function handle_api_LSobject_create($request) { } LSurl :: add_handler('#^api/1.0/object/(?P[^/]+)/create/?$#', 'handle_api_LSobject_create', true, false, true); +/* + * Handle API LSobject import request + * + * @param[in] $request LSurlRequest The request + * + * @retval void +**/ +function handle_api_LSobject_import($request) { + $object = get_LSobject_from_API_request($request, true); + $data = array( + 'success' => false, + 'LSobject' => $object -> type, + 'ioFormat' => (isset($_REQUEST['ioFormat'])?$_REQUEST['ioFormat']:null), + 'updateIfExists' => (isset($_REQUEST['updateIfExists'])?boolval($_REQUEST['updateIfExists']):false), + 'justTry' => (isset($_REQUEST['justTry'])?boolval($_REQUEST['justTry']):false), + ); + + if (!LSsession :: loadLSclass('LSio', null, true)) { // Load LSio class (with warning) + LSsession :: displayAjaxReturn($data); + return; + } + + $ioFormats = $object->listValidIOformats(); + if (!is_array($ioFormats) || empty($ioFormats)) { + $ioFormats = array(); + LSerror :: addErrorCode('LSsession_16'); + } + else { + $data = LSio::import( + $data['LSobject'], + $data['ioFormat'], + 'php://input', + $data['updateIfExists'], + $data['justTry'] + ); + LSlog :: debug("LSio::importFromPostData(): result = ".varDump($result)); + } + + LSsession :: displayAjaxReturn($data); + return $data['success']; +} +LSurl :: add_handler('#^api/1.0/object/(?P[^/]+)/import/?$#', 'handle_api_LSobject_import', true, false, true); + +/* + * Handle API LSobject export request + * + * @param[in] $request LSurlRequest The request + * + * @retval void +**/ +function handle_api_LSobject_export($request) { + $object = get_LSobject_from_API_request($request, true); + if (!$object) + return; + $data = array( + 'success' => false, + 'LSobject' => $object -> type, + 'ioFormat' => (isset($_REQUEST['ioFormat'])?$_REQUEST['ioFormat']:null), + ); + + if (!LSsession :: loadLSclass('LSio', null, true)) { // Load LSio class (with warning) + LSsession :: displayAjaxReturn($data); + return; + } + + if (!$data['ioFormat']) { + LSerror :: addErrorCode(null, "ioFormat not specified"); + LSsession :: displayAjaxReturn($data); + return; + } + + $ioFormats = $object->listValidIOformats(); + if (!is_array($ioFormats) || empty($ioFormats)) { + $ioFormats = array(); + LSerror :: addErrorCode('LSsession_16'); + } + else if (!LSio::export($object, $data['ioFormat'])) { + LSlog :: error("An error occurred exporting ".$object -> type); + } + LSsession :: displayAjaxReturn($data); +} +LSurl :: add_handler('#^api/1.0/object/(?P[^/]+)/export/?$#', 'handle_api_LSobject_export', true, false, true); + /* * Handle API LSobject show request *