Gestion pour les modules des types de parametres

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"
This commit is contained in:
xdrm-brackets 2016-04-12 15:16:10 +02:00
parent 2f642c7087
commit 2a736d636b
4 changed files with 122 additions and 47 deletions

View File

@ -1,28 +1,58 @@
{ {
"users": [ "users": {
"login", "login": {
"getById", "description": "Test de connexion avec un login (identifiant ou adresse mail) et un mot de passe.",
"getAll", "parameters": {
"login": { "description": "Identifiant ou adresse mail", "type": "varchar(255)" },
"create", "password": { "description": "Mot de passe", "type":"text" }
"edit", }
"remove" }
], },
"call_log": [ "call_log": {
"unserialize" "unserialize": {
], "description": "Recupere le contenu d'un fichier XML de journal d'appel.",
"parameters": {
"filecontent": { "description": "Contenu du fichier XML", "type": "text" }
}
}
},
"charts": [ "charts": {
"network_data",
"network_render"
],
"token" :[ "network_data": {
"remove", "description": "Renvoie un jeu de donnees fictif pour un graphique de type #network.",
"generate" "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" }
}
}
}
} }

View File

@ -73,10 +73,10 @@ APIClass.prototype = {
// on créé un formulaire POST (virtuel) // on créé un formulaire POST (virtuel)
var form = new FormData(); var form = new FormData();
form.append('path', pRequest.path ); // on créé la variable $_POST['json']=>request
if( pRequest.hasOwnProperty('data') ) // On ajoute tous les attributs en POST
form.append('data', JSON.stringify(pRequest.data) ); for( var key in pRequest )
form.append(key, pRequest[key]);

View File

@ -1,6 +1,7 @@
<?php <?php
namespace manager; namespace manager;
use \manager\Database;
// FORMAT: // FORMAT:
// //
@ -21,7 +22,7 @@
// Attributs prives utiles (initialisation) // Attributs prives utiles (initialisation)
private $path; private $path;
private $data; private $params;
private $modules; private $modules;
// Contiendra la reponse a la requete // Contiendra la reponse a la requete
@ -37,12 +38,12 @@
/* CONSTRUCTEUR D'UNE REQUETE DE MODULE /* CONSTRUCTEUR D'UNE REQUETE DE MODULE
* *
* @path<String> Chemin de delegation ("module/methode") * @path<String> Chemin de delegation ("module/methode")
* @data<Array> Tableau contenant les parametres utiles au traitement * @param<Array> Tableau associatif contenant les parametres utiles au traitement
* *
* @return status<Boolean> Retourne si oui ou non tout s'est bien passe * @return status<Boolean> 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 // Si pas parametre manquant, on quitte
if( $path == null ){ if( $path == null ){
$this->error = ManagerError::MissingPath; $this->error = ManagerError::MissingPath;
@ -71,19 +72,24 @@
} }
// Type de @data (optionnel) // Type de @data (optionnel)
$data = (is_array($data)) ? $data : array(); $params = (is_array($params)) ? $params : array();
/* [2] Verification du chemin (existence module+methode) /* [2] Verification du chemin (existence module+methode)
=========================================================*/ =========================================================*/
if( !$this->checkPath($path) ) // Verification de la coherence du chemin + attribution if( !$this->checkPath($path) ) // Verification de la coherence du chemin + attribution
return false; return false;
// Gestion d'erreur interne
/* [3] Verification des parametres (si @type est defini)
/* [3] Construction de l'objet
=========================================================*/ =========================================================*/
$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; $this->error = ManagerError::Success;
return true; // On retourne que tout s'est bien passe return true; // On retourne que tout s'est bien passe
@ -114,7 +120,7 @@
/* [3] On amorce la methode /* [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 /* [4] Gestion de la reponse
@ -148,10 +154,12 @@
if( !isset($json['path']) ) if( !isset($json['path']) )
return new ModuleRequest(); return new ModuleRequest();
// On definit $data au cas ou il soit vide // On definit $params au cas ou il soit vide
$data = (isset($json['data'])) ? $json['data'] : array(); $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 /* [2] On verifie que @data est renseigne
=========================================================*/ =========================================================*/
// Si variable n'existe pas, on cree un tableau vide // Si variable n'existe pas, on cree un tableau vide
$data = (isset($post['data'])) ? $post['data'] : array(); $params = $post;
// On retire le @path de @params
// Si c'est toujours pas un tableau, on essaie de voir si c'est un json unset($params['path']);
$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;
/* [3] On retourne une instance de <ModuleRequest> /* [3] On retourne une instance de <ModuleRequest>
=========================================================*/ =========================================================*/
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) /* [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; $this->error = ManagerError::UnknownMethod;
return false; // On retourne FALSE, si erreur return false; // On retourne FALSE, si erreur
} }
@ -262,6 +265,47 @@
/* VERIFICATION DU TYPE DES PARAMETRES ENVOYES
*
* @params<Array> Tableau associatif contenant les parametres
*
* @return correct<bool> 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 /* RENVOI LE CHEMIN D'AMORCAGE DE LA METHODE
* *

View File

@ -35,7 +35,8 @@ var TOKEN = {
// On redige la requete // On redige la requete
var request = { // on ecrit la requete var request = { // on ecrit la requete
'path': 'token/generate', '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 // On lance la requete
@ -67,7 +68,7 @@ for( var i = 0 ; i < TOKEN.remove.buttons.length ; i++ ){
/* (2.2) On lance la suppression */ /* (2.2) On lance la suppression */
var request = { // on ecrit la requete var request = { // on ecrit la requete
'path': 'token/remove', 'path': 'token/remove',
'data': [token_id] 'token_id': token_id
}; };
// On lance la requete // On lance la requete