From 2a736d636b6314eb7c3d29f767739c346aa4292e Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Tue, 12 Apr 2016 15:16:10 +0200 Subject: [PATCH] Gestion pour les modules des types de parametres MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tous les params (s'ils ont un type défini) sont vérifiés + les params sont nommés et envoyés en POST au lieu de tous dans le tableau post "data" --- config/modules.json | 70 ++++++++++++++++++++++--------- js/lib/api.js | 6 +-- manager/ModuleRequest.php | 88 +++++++++++++++++++++++++++++---------- view/js/settings.js | 5 ++- 4 files changed, 122 insertions(+), 47 deletions(-) diff --git a/config/modules.json b/config/modules.json index c75dae7..60d84c9 100755 --- a/config/modules.json +++ b/config/modules.json @@ -1,28 +1,58 @@ { - "users": [ - "login", - "getById", - "getAll", - - "create", - "edit", - "remove" - ], + "users": { + "login": { + "description": "Test de connexion avec un login (identifiant ou adresse mail) et un mot de passe.", + "parameters": { + "login": { "description": "Identifiant ou adresse mail", "type": "varchar(255)" }, + "password": { "description": "Mot de passe", "type":"text" } + } + } + }, - "call_log": [ - "unserialize" - ], + "call_log": { + "unserialize": { + "description": "Recupere le contenu d'un fichier XML de journal d'appel.", + "parameters": { + "filecontent": { "description": "Contenu du fichier XML", "type": "text" } + } + } + }, - "charts": [ - "network_data", - "network_render" - ], + "charts": { - "token" :[ - "remove", - "generate" - ] + "network_data": { + "description": "Renvoie un jeu de donnees fictif pour un graphique de type #network.", + "parameters": {} + }, + + "network_render": { + "description": "Renvoie le contenu du svg representant un graphique de type #network avec les donnees recues.", + "parameters": { + "dataset": { "description": "Dataset au bon format pour un graphique de type #network." } + } + } + }, + + "token": { + + + "remove": { + "description": "Suppression d'un token d'id donne.", + "parameters": { + "token_id": { "description": "UID du token a supprimer", "type": "id" } + } + }, + + + "generate": { + "description": "Creation d'un token de nom et de duree donnee", + "parameters": { + "name": { "description": "Nom attribue au token", "type": "varchar(50)" }, + "duration": { "description": "Duree du token en nombre de jours", "type": "int" } + } + } + } } \ No newline at end of file diff --git a/js/lib/api.js b/js/lib/api.js index ba2df59..7a1e279 100755 --- a/js/lib/api.js +++ b/js/lib/api.js @@ -73,10 +73,10 @@ APIClass.prototype = { // on créé un formulaire POST (virtuel) var form = new FormData(); - form.append('path', pRequest.path ); // on créé la variable $_POST['json']=>request - if( pRequest.hasOwnProperty('data') ) - form.append('data', JSON.stringify(pRequest.data) ); + // On ajoute tous les attributs en POST + for( var key in pRequest ) + form.append(key, pRequest[key]); diff --git a/manager/ModuleRequest.php b/manager/ModuleRequest.php index 5171a5e..9e32de0 100755 --- a/manager/ModuleRequest.php +++ b/manager/ModuleRequest.php @@ -1,6 +1,7 @@ Chemin de delegation ("module/methode") - * @data Tableau contenant les parametres utiles au traitement + * @param Tableau associatif contenant les parametres utiles au traitement * * @return status Retourne si oui ou non tout s'est bien passe * */ - public function __construct($path=null, $data=null){ + public function __construct($path=null, $params=null){ // Si pas parametre manquant, on quitte if( $path == null ){ $this->error = ManagerError::MissingPath; @@ -71,19 +72,24 @@ } // Type de @data (optionnel) - $data = (is_array($data)) ? $data : array(); + $params = (is_array($params)) ? $params : array(); /* [2] Verification du chemin (existence module+methode) =========================================================*/ if( !$this->checkPath($path) ) // Verification de la coherence du chemin + attribution return false; - // Gestion d'erreur interne - - /* [3] Construction de l'objet + /* [3] Verification des parametres (si @type est defini) =========================================================*/ - $this->data = $data; + if( !$this->checkParams($params) ){ // Verification de tous les types + $this->error = ManagerError::ParamError; + return false; + } + + /* [4] Construction de l'objet + =========================================================*/ + $this->params = $params; $this->error = ManagerError::Success; return true; // On retourne que tout s'est bien passe @@ -114,7 +120,7 @@ /* [3] On amorce la methode =========================================================*/ - $returned = call_user_func_array( $this->getFunctionCaller(), $this->data ); + $returned = call_user_func_array( $this->getFunctionCaller(), $this->params ); /* [4] Gestion de la reponse @@ -148,10 +154,12 @@ if( !isset($json['path']) ) return new ModuleRequest(); - // On definit $data au cas ou il soit vide - $data = (isset($json['data'])) ? $json['data'] : array(); + // On definit $params au cas ou il soit vide + $params = $json; + // On retire le @path de @params + unset($params['path']); - return new ModuleRequest($json['path'], $data); + return new ModuleRequest($json['path'], $params); } @@ -194,18 +202,13 @@ /* [2] On verifie que @data est renseigne =========================================================*/ // Si variable n'existe pas, on cree un tableau vide - $data = (isset($post['data'])) ? $post['data'] : array(); - - // Si c'est toujours pas un tableau, on essaie de voir si c'est un json - $data = (!is_array($data)) ? json_decode($data, true) : $data; - - // Si toujours pas de tableau, on cree un tableau vide - $data = (!is_array($data)) ? array() : $data; - + $params = $post; + // On retire le @path de @params + unset($params['path']); /* [3] On retourne une instance de =========================================================*/ - return new ModuleRequest($post['path'], $data); + return new ModuleRequest($post['path'], $params); } @@ -242,7 +245,7 @@ /* [3] Verification de l'existence de la methode (conf) =========================================================*/ - if( array_search($method, $this->modules[$module]) === false ){ // Si la methode n'est pas specifie dans la conf + if( array_key_exists($method, $this->modules[$module]) === false ){ // Si la methode n'est pas specifie dans la conf $this->error = ManagerError::UnknownMethod; return false; // On retourne FALSE, si erreur } @@ -262,6 +265,47 @@ + /* VERIFICATION DU TYPE DES PARAMETRES ENVOYES + * + * @params Tableau associatif contenant les parametres + * + * @return correct Retourne si oui ou non les parametres ont le bon type + * + */ + private function checkParams($params){ + /* [1] On verifie qu'il ne manque aucun parametre + =========================================================*/ + // Si @params n'est pas un tableau + if( !is_array($params) ) return false; + + $method = $this->modules[$this->path['module']][$this->path['method']]; + + // Si le nombre de parametre en entree et requis est different + if( count($method['parameters']) > count($params) ) return false; + + + + /* [2] Si le type est defini, pour chaque param, on teste + =========================================================*/ + foreach($method['parameters'] as $name=>$paramsdata){ + // Si le parametre n'existe pas dans le tableau recu + if( !isset($params[$name]) ) return false; + + // Si le type n'est pas defini, on reboucle + if( !isset($paramsdata['type']) ) continue; + + // Si la verification est fausse, on retourne faux + if( !Database::check($paramsdata['type'], $params[$name]) ) return false; + } + + /* [3] Gestion du retour, si tout s'est bien passe + =========================================================*/ + return true; + } + + + + /* RENVOI LE CHEMIN D'AMORCAGE DE LA METHODE * diff --git a/view/js/settings.js b/view/js/settings.js index e31f884..5d7044f 100644 --- a/view/js/settings.js +++ b/view/js/settings.js @@ -35,7 +35,8 @@ var TOKEN = { // On redige la requete var request = { // on ecrit la requete 'path': 'token/generate', - 'data': [TOKEN.add.name.value, TOKEN.add.duration.value] + 'name': TOKEN.add.name.value, + 'duration': TOKEN.add.duration.value }; // On lance la requete @@ -67,7 +68,7 @@ for( var i = 0 ; i < TOKEN.remove.buttons.length ; i++ ){ /* (2.2) On lance la suppression */ var request = { // on ecrit la requete 'path': 'token/remove', - 'data': [token_id] + 'token_id': token_id }; // On lance la requete