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": [
"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" }
}
}
}
}

View File

@ -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]);

View File

@ -1,6 +1,7 @@
<?php
namespace manager;
use \manager\Database;
// FORMAT:
//
@ -21,7 +22,7 @@
// Attributs prives utiles (initialisation)
private $path;
private $data;
private $params;
private $modules;
// Contiendra la reponse a la requete
@ -37,12 +38,12 @@
/* CONSTRUCTEUR D'UNE REQUETE DE MODULE
*
* @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
*
*/
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 <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)
=========================================================*/
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<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
*

View File

@ -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