From 13f4aba25d71886c2113ccbe034f57c2d25fe7ec Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sun, 10 Dec 2017 21:24:39 +0100 Subject: [PATCH] upd: api.core.Request (Added URI_ARGUMENTS management (URL#) + Now can rename parameters) | upd: config.modules (Added 'rename' parameters option to rename before function call) --- build/api/core/Request.php | 71 ++++++++++++++++++++++++-------------- config/modules.json | 9 +++-- 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/build/api/core/Request.php b/build/api/core/Request.php index 08ebd82..305861b 100755 --- a/build/api/core/Request.php +++ b/build/api/core/Request.php @@ -20,7 +20,8 @@ // Attributs prives utiles (initialisation) private $path; // chemin de base (uri) - private $params; // paramètres (POST+GET) + private $raw_params; // paramètres reçus + private $params; // paramètres donnés à la fonction private $schema; // schema configuration private $options; // options private $http_method; // methode HTTP appelante @@ -87,7 +88,7 @@ return $this->error->set(Err::WrongPathModule); /* (2) Formattage @params en tableau */ - $params = (is_array($params)) ? $params : []; + $this->raw_params = (is_array($params)) ? $params : []; /* (3) On définit en constante la méthode HTTP */ if( !isset($_SERVER['REQUEST_METHOD']) && !is_string($forced_method) ) @@ -110,7 +111,7 @@ /* (6) Verification des parametres (si @type est defini) ---------------------------------------------------------*/ - if( !$this->checkParams($params) ) // Verification de tous les types + if( !$this->checkParams() ) // Verification de tous les types return false; // checkParams() sets the error itself @@ -121,7 +122,6 @@ /* (8) Construction de l'objet (add http method to params) ---------------------------------------------------------*/ - $this->params = $params; $this->params['HTTP_METHOD'] = $this->http_method; $this->error->set(Err::Success); @@ -246,7 +246,22 @@ return $this->error->set(Err::UnknownModule); - /* (3) Verification de l'existence de la methode (conf) + /* (3) Extract URI parameters + ---------------------------------------------------------*/ + /* (1) Extract URI string after @path */ + $uri_end = substr($uri, $exists_size); + + /* (2) If invalid format, return error */ + if( !preg_match('@^((?:\/[^\/]+)*)\/?$@', $uri_end, $uri_match) ) + return $this->error->set(Err::InvalidURI); + + /* (3) Add each URI parameter to the parameter store */ + $uri_args = array_slice( explode('/', $uri_match[1]), 1); + + foreach($uri_args as $index=>$value) + $this->raw_params["URL$index"] = $value; + + /* (4) Verification de l'existence de la methode (conf) ---------------------------------------------------------*/ /* (1) Check if HTTP method is in allowed methods */ if( !in_array($this->http_method, self::$allowed_http_methods) ) @@ -258,7 +273,7 @@ - /* (4) Enregistrement du chemin et renvoi de SUCCESS + /* (5) Enregistrement du chemin et renvoi de SUCCESS ---------------------------------------------------------*/ $this->path = [ 'path'=> $path, @@ -319,18 +334,15 @@ /* (6) Verification du type des parametres envoyes * - * @params Tableau associatif contenant les parametres - * @params peut se voir rajouter les paramètres optionnels s'ils ne sont pas renseignés (initialisés à NULL) - * * @return correct Retourne si oui ou non les parametres ont le bon type * ---------------------------------------------------------*/ - private function checkParams(&$params){ + private function checkParams(){ /* (1) On verifie qu'il ne manque aucun parametre ---------------------------------------------------------*/ /* (1) Si @params n'est pas un tableau */ - if( !is_array($params) ) + if( !is_array($this->raw_params) ) return $this->error->set(Err::MissingParam); /* (2) On récupère les données de la méthode */ @@ -343,7 +355,7 @@ /* (2) Si le type est defini, pour chaque param, on teste ---------------------------------------------------------*/ - foreach($method['parameters'] as $name=>$paramsdata){ + foreach($method['parameters'] as $name=>$config){ /* (2.1) Vérification des données ---------------------------------------------------------*/ @@ -351,43 +363,52 @@ if( !is_string($name) ) return $this->error->set(Err::ConfigError); - /* (2) Si @paramsdata n'est pas un tableau */ - if( !is_array($paramsdata) ) + /* (2) Si @config n'est pas un tableau */ + if( !is_array($config) ) return $this->error->set(Err::ConfigError); - /* (3) So @paramsdata['type] manquant ou incorrect */ - if( !isset($paramsdata['type']) || !is_string($paramsdata['type']) ) + /* (3) So @config['type] manquant ou incorrect */ + if( !isset($config['type']) || !is_string($config['type']) ) return $this->error->set(Err::ConfigError); /* (2.2) Gestion des spécifications ---------------------------------------------------------*/ + /* (1) On récupère le paramètre RENAME */ + $rename = $name; + if( isset($config['rename']) && is_string($config['rename']) && preg_match('@^\w+$@', $config['rename']) ) + $rename = $config['rename']; + /* (1) On récupère si le paramètre est optionnel ou pas */ - $optional = isset($paramsdata['optional']) && $paramsdata['optional'] === true; + $optional = isset($config['optional']) && $config['optional'] === true; /* (2) Si de type 'FILE' + fichier existe => on enregistre la ref. */ - if( $paramsdata['type'] == 'FILE' && isset($_FILES[$name]) ) - $params[$name] = &$_FILES[$name]; + if( $config['type'] == 'FILE' && isset($_FILES[$name]) ) + $this->params[$rename] = &$_FILES[$name]; /* (3) Si param obligatoire et manquant -> erreur */ - if( !isset($params[$name]) && !$optional ) + if( !isset($this->raw_params[$name]) && !$optional ) return $this->error->set(Err::MissingParam, $name); /* (2.3) Gestion des valeurs ---------------------------------------------------------*/ /* (1) Si le paramètre est optionnel et manquant */ - if( $optional && !isset($params[$name]) ){ + if( $optional && !isset($this->raw_params[$name]) ){ // On le crée le param optionnel avec la valeur NULL - $params[$name] = null; + $this->params[$rename] = null; /* (2) Si le paramètre est renseigné (sauf FILE) */ - }elseif( $paramsdata['type'] != 'FILE'){ + }elseif( $config['type'] != 'FILE'){ // Si la verification est fausse, on retourne faux - if( !Checker::run($paramsdata['type'], $params[$name]) ) - return $this->error->set(Err::WrongParam, $name, $paramsdata['type']); + if( !Checker::run($config['type'], $this->raw_params[$name]) ) + return $this->error->set(Err::WrongParam, $name, $config['type']); + + // Sinon, on ajoute aux params qu'on enverra à l'appel + else + $this->params[$rename] = $this->raw_params[$name]; } diff --git a/config/modules.json b/config/modules.json index 71ed342..3145330 100755 --- a/config/modules.json +++ b/config/modules.json @@ -12,10 +12,13 @@ } }, - "GET": { + "PUT": { "description": "Gets an administrator's data", "permissions": [], - "parameters": {} + "parameters": { + "URL0": { "description": "Some string token", "type": "text", "rename": "id_article" }, + "postdata": { "description": "Some string token", "type": "text" } + } }, "DELETE": { @@ -24,7 +27,7 @@ "parameters": {} }, - "PUT": { + "GET": { "description": "Deletes an administrator", "permissions": [["admin"]], "parameters": {}