Upgraded to Error:2.0 + api:2.2

This commit is contained in:
xdrm-brackets 2017-01-30 18:39:21 +01:00
parent 6a483425ae
commit 812416a566
83 changed files with 1370 additions and 890 deletions

View File

@ -0,0 +1,21 @@
<?php
namespace api\core;
use \error\core\Err;
use \error\core\Error;
interface AuthSystem{
/* VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES
*
* @module<String> Module concerné
* @expected<array> Liste des permissions attendues
*
* @return error<Error> Erreur associée à la permission (Success/PermissionError/TokenError/etc)
*
*/
public static function permission($module, $expected);
}
?>

View File

@ -4,15 +4,17 @@
use \database\core\Repo;
use \error\core\Error;
use \error\core\Err;
use \api\core\AuthSystem;
class Authentification{
// Contiendra les erreurs
public $error;
class Authentification implements AuthSystem{
public function __construct(){
self::check();
}
@ -133,7 +135,7 @@
* @module<String> Module concerné
* @expected<array> Liste des permissions attendues
*
* @return status<Boolean> Si FALSE, pas la permission, sinon si
* @return error<Error> Si FALSE, pas la permission, sinon si
*
*/
public static function permission($module, $expected){
@ -148,12 +150,12 @@
/* (1) Si entrepot requis, mais manquant
---------------------------------------------------------*/
if( in_array('warehouse', $expected) && self::auth() < 1 )
return Error::PermissionError;
return new Error(Err::PermissionError);
/* (2) Si admin requis, mais manquant
---------------------------------------------------------*/
if( in_array('admin', $expected) && self::auth() < 2 )
return Error::PermissionError;
return new Error(Err::PermissionError);
/* (3) On retire 'warehouse' et 'admin' de @expected
---------------------------------------------------------*/
@ -169,7 +171,7 @@
foreach($expected as $permission)
// Si il manque au minimum une permission, on retourne FALSE
if( !in_array($permission, $_SESSION['PERM']) )
return Error::PermissionError;
return new Error(Err::PermissionError);
/* [3] Vérification que le module est actif pour l'entrepot
@ -185,12 +187,12 @@
/* (3) Si aucune autorisation et pas module "Default" */
if( !$allowedModule && !$defaultModule )
return Error::DisabledModule;
return new Error(Err::DisabledModule);
/* [4] Si on a toutes les permissions requises
=========================================================*/
return Error::Success;
return new Error(Err::Success);
}

9
build/api/core/Checker.php Executable file → Normal file
View File

@ -81,11 +81,6 @@
return $checker && is_numeric($value) && $value <= 2147483647 && $value >= 0;
break;
// Code RFID
case 'rfid':
return $checker && is_string($value) && preg_match('/^[\dA-F]{2}(\-[\dA-F]{2}){3,5}$/i', $value);
break;
// String quelconque (peut etre vide)
case 'text':
return $checker && is_string($value);
@ -132,6 +127,10 @@
return $checker && is_string($value) && json_decode($value, true) !== NULL;
break;
case 'numeric':
return $checker && (is_numeric($value) || $value == null || $value == 'null');
break;
default:
return false;
break;

View File

@ -0,0 +1,31 @@
<?php
namespace api\core;
class ModuleFactory{
/* INSTANCIE UN MODULE
*
* @module<String> Nom du module
* @arguments<Array> [OPTIONNEL] Arguments à passer au constructeur
*
* @return instance<Module> Instance du module en question
*
*/
public static function getModule($module, $arguments=[]){
/* (1) On gère les arguments */
$arguments = is_array($arguments) ? $arguments : [];
/* (1) On vérifie que la classe existe */
if( !file_exists(__BUILD__."/api/module/$module.php") )
return false;
/* (2) On récupère la classe */
$class_name = "\\api\\module\\$module";
/* (3) On retourne une instance */
return new $class_name($arguments);
}
}

View File

@ -2,17 +2,21 @@
namespace api\core;
use \database\core\DatabaseDriver;
use \api\core\Authentification;
use \api\core\AuthSystem;
use \api\core\ModuleFactory;
use \error\core\Error;
use \error\core\Err;
use \http\core\HttpRequest;
class ModuleRequest{
class Request{
// Constantes
public static function config_path(){ return __ROOT__.'/config/modules.json'; }
public static $default_options = [
private static function config_path(){ return __ROOT__.'/config/modules.json'; }
private static $default_options = [
'download' => false
];
private static $authsystem = null;
// Attributs prives utiles (initialisation)
private $path;
@ -39,66 +43,80 @@
*
*/
public function __construct($path=null, $params=null){
// Si pas parametre manquant, on quitte
/* [1] Fetch HttpRequest correct data
=========================================================*/
/* (1) Parse HttpRequest data because php doesn't parse it for non-POST HTTP method */
$httprequest = new HttpRequest();
$_POST = $httprequest->POST();
/* [2] Initialisation
=========================================================*/
/* (1) Erreur par défaut */
$this->error = new Error(Err::Success);
/* (2) Si pas parametre manquant, on quitte */
if( $path == null ){
$this->error = Error::MissingPath;
$this->error->set(Err::MissingPath);
return false;
}
/* [0] On met a jour la configuration
/* [3] On met a jour la configuration
=========================================================*/
// Modules specifies
/* (1) Section Title */
$this->modules = json_decode( file_get_contents(self::config_path()), true );
// Gestion de l'erreur de parsage
/* (2) Gestion de l'erreur de parsage */
if( $this->modules == null ){
$this->error = Error::ParsingFailed;
$this->error->set(Err::ParsingFailed, 'json');
return false;
}
/* [1] Verification des types des parametres
/* [4] Verification des types des parametres
=========================================================*/
// Type de @path
/* (1) Section Title */
if( !is_string($path) ){ // Si le type est incorrect
$this->error = Error::WrongPathModule;
$this->error->set(Err::WrongPathModule);
return false; // On retourne FALSE, si erreur
}
// Type de @data (optionnel)
/* (2) Section Title */
$params = (is_array($params)) ? $params : [];
/* (3) On définit en constante la méthode HTTP */
define('__HTTP_METHOD__', strtoupper($_SERVER['REQUEST_METHOD']));
/* [2] Verification du chemin (existence module+methode)
/* [5] Verification du chemin (existence module+methode)
=========================================================*/
if( !$this->checkPath($path) ) // Verification de la coherence du chemin + attribution
return false;
/* [3] Verification des droits
/* [6] Verification des droits
=========================================================*/
if( !$this->checkPermission() ) // Si on a pas les droits
return false;
/* [4] Verification des parametres (si @type est defini)
/* [7] Verification des parametres (si @type est defini)
=========================================================*/
if( !$this->checkParams($params) ){ // Verification de tous les types
$this->error = Error::ParamError;
if( !$this->checkParams($params) ) // Verification de tous les types
return false;
}
/* [5] Récupèration des options
/* [8] Récupèration des options
=========================================================*/
$this->buildOptions();
/* [6] Construction de l'objet
/* [9] Construction de l'objet
=========================================================*/
$this->params = $params;
$this->error = Error::Success;
$this->error->set(Err::Success);
return true; // On retourne que tout s'est bien passe
@ -106,9 +124,27 @@
/* DEFINIT LE SYSTEME D'AUTHENTIFICATION
*
* @instance<AuthSystem> Instance de type AuthSystem
*
* @return success<Boolean> Whether the AuthSystem is valid or not
*
*/
public static function setAuthSystem($instance=null){
/* (1) Check instance type */
if( !($instance instanceof AuthSystem) )
return false;
/* (2) Store instance */
self::$authsystem = $instance;
}
/* EXECUTE LE TRAITEMENT ASSOCIE ET REMPLIE LA REPONSE
*
* @return answer<ModuleResponse> Retourne une reponse de type <ModuleResponse> si tout s'est bien passe
* @return answer<Response> Retourne une reponse de type <Response> si tout s'est bien passe
*
*/
public function dispatch(){
@ -119,84 +155,108 @@
/* [1] On verifie qu'aucune erreur n'a ete signalee
=========================================================*/
if( $this->error != Error::Success ) // si il y a une erreur
return new ModuleResponse($this->error); // on la passe a la reponse
if( $this->error->get() !== Err::Success ) // si il y a une erreur
return new Response($this->error); // on la passe a la reponse
/* [2] On verifie que la methode est amorcable
/* [2] On essaie d'instancier le module
=========================================================*/
if( !is_callable($this->getFunctionCaller()) ){
$this->error = Error::UncallableMethod;
return new ModuleResponse($this->error);
$instance = ModuleFactory::getModule($this->path['module']);
if( $instance === false ){
$this->error->set(Err::UncallableModule, $this->path['module']);
return new Response($this->error);
}
/* [3] On verifie que la methode est amorcable
=========================================================*/
if( !is_callable([$instance, $this->getModuleMethod()]) ){
$this->error->set(Err::UncallableMethod, preg_replace('/\w+::/i', '', $this->path['method']) );
return new Response($this->error);
}
/* [3] On amorce la methode
/* [4] On amorce la methode
=========================================================*/
$returned = call_user_func( $this->getFunctionCaller(), $this->params );
/* (1) On lance la fonction */
$returned = call_user_func( [$instance, $this->getModuleMethod()], $this->params );
/* (2) On appelle le destructeur (si défini) */
$instance = null;
/* [4] Gestion de la reponse
/* [5] Gestion de la reponse
=========================================================*/
$response = new ModuleResponse($this->error);
/* (1) On construit la réponse avec l'erreur */
$response = new Response($this->error);
/* (2) On ajoute les données */
$response->appendAll($returned);
// On retourne la réponse
return $response;
}
/* EXECUTE LE TRAITEMENT ASSOCIE ET RENVOIE UN FICHIER AVEC LE HEADER ET LE BODY SPECIFIE
*
*/
public function download(){
/* [1] On verifie qu'aucune erreur n'a ete signalee
=========================================================*/
if( $this->error != Error::Success ) // si il y a une erreur
return new ModuleResponse($this->error); // on la passe a la reponse
if( $this->error->get() !== Err::Success ) // si il y a une erreur
return new Response($this->error); // on la passe a la reponse
/* [2] On verifie que la methode est amorcable
/* [2] On essaie d'instancier le module
=========================================================*/
if( !is_callable($this->getFunctionCaller()) ){
$this->error = Error::UncallableMethod;
return new ModuleResponse($this->error);
$instance = ModuleFactory::getModule($this->path['module']);
if( $instance === false ){
$this->error->set(Err::UncallableModule);
return new Response($this->error);
}
/* [3] On verifie que la methode est amorcable
=========================================================*/
if( !is_callable([$instance, $this->getModuleMethod()]) ){
$this->error->set(Err::UncallableMethod);
return new Response($this->error);
}
/* [3] On amorce la methode
/* [4] On amorce la methode
=========================================================*/
$returned = call_user_func( $this->getFunctionCaller(), $this->params );
/* (1) On lance la fonction */
$returned = call_user_func( [$instance, $this->getModuleMethod()], $this->params );
/* (2) On appelle le destructeur (si défini) */
$instance = null;
/* [4] Vérification des erreurs et paramètres
/* [5] Vérification des erreurs et paramètres
=========================================================*/
/* (1) Vérification de l'erreur retournée, si pas Success, on retourne l'erreur */
if( isset($returned['ModuleError']) && $returned['ModuleError'] != Error::Success ){
$this->error = $returned['ModuleError'];
return new ModuleResponse($this->error);
if( isset($returned['error']) && $returned['error'] instanceof Error && $returned['error']->get() != Err::Success ){
$this->error = $returned['error'];
return new Response($this->error);
}
/* (2) Vérification du contenu, si pas défini */
if( !isset($returned['body']) ){
$this->error = Error::ParamError;
return new ModuleResponse($this->error);
$this->error->set(Err::ParamError);
return new Response($this->error);
}
/* (3) Si @headers n'est pas défini on met par défaut */
if( !isset($returned['headers']) || !is_array($returned['headers']) )
$returned['headers'] = [];
$fromAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
/* [5] Si la requête vient d'ajax on crée un fichier temporaire et on renvoie son URL
/* [6.1] Si requête ajax on crée un fichier temporaire et on renvoie son URL
=========================================================*/
if( $fromAjax ){
@ -233,12 +293,12 @@
fclose($tmpfile);
chmod($tmpfnameroot, 0775);
$response = new ModuleResponse(Error::Success);
$response = new Response($this->error);
$response->append('link', $tmpfname);
return $response;
/* [6] Gestion du download direct si pas AJAX
/* [6.2] Gestion du download direct si pas AJAX
=========================================================*/
}else{
/* (1) On définit les headers */
@ -253,53 +313,77 @@
}
/* DESERIALISATION A PARTIR DES DONNEES POST
/* DESERIALISATION A PARTIR DE L'URL ET DES DONNEES POST (OPT)
*
* @url<String> Contenu de l'url après api/ (si existe)
* @post<Array> Tableau des donnes $_POST => @path + @data (opt)
* @url<String> Contenu de l'url formatté (commence à "/module/methode")
* @post<Array> [opt] Tableau des donnes
*
* @return instance<ModuleRequest> Retourne un objet de type <ModuleRequest>
* @return instance<Request> Retourne un objet de type <Request>
*
* @note
* 1. `path` peut être dans l'url : /method/module
* `path` peut être dans les données $_POST
* 2. les données peuvent être dans l'url : /module/method/data1/data2/...
* les données peuvent être dans les données $_POST
*
*/
public static function fromPost($url, $post){
public static function remote($url, $data=null){
is_null($data) && ($data = []);
/* [1] On verifie que le @path est renseigne
=========================================================*/
/* (1) Si le path est dans @url */
$pathInUrl = count($url) > 0 && is_string($url[0]) && strlen($url[0]) > 0 && preg_match('#^([\w_-]+)/([\w_-]+)/?$#', $url[0], $urlMatches);
$pathInUrl = is_string($url) && preg_match('#^/?([\w_-]+/[\w_-]+)(?:/?|/((?:\w+/)*(?:\w+/?)))$#', $url, $urlMatches);
/* (2) On récupère le @path + les arguments dans l'URL */
if( $pathInUrl ){
// {1} On ajoute le @path aux données //
$data['path'] = $urlMatches[1];
// {2} On ajoute les arguments d'URL aux données //
if( count($urlMatches) > 2 ){
$urlParams = explode('/', trim($urlMatches[2], '/'));
foreach($urlParams as $k=>$v)
$data["URL_$k"] = $v;
}
}
// On l'utilise pour le chemin
if( $pathInUrl )
$post['path'] = $urlMatches[1].'/'.$urlMatches[2];
/* (2) On vérifie dans tous les cas si le path existe */
if( !isset($post['path']) )
return new ModuleRequest();
if( !isset($data['path']) )
return new Request();
/* [2] On verifie que @data est renseigne
/* [3] On met les paramètres en JSON
=========================================================*/
// Si variable n'existe pas, on cree un tableau vide
$params = $post;
/* (1) On initialise les paramètres*/
$params = [];
// On retire le @path de @params
unset($params['path']);
/* (2) On met tous les paramètres en json (sauf @path) */
foreach($data as $name=>$value){
if( $name === 'path' )
continue;
/* [3] On met les paramètres JSON en JSON (si ils décodent sans erreur)
=========================================================*/
foreach($params as $name=>$value){
// {1} On met en JSON //
$json = json_decode( $value, true );
// Si aucune erreur, on affecte la valeur
// {2} Si ok -> on remplace //
if( !is_null($json) )
$params[$name] = $json;
// {3} Sinon, on laisse tel quel //
else
$params[$name] = $value;
}
/* [4] On retourne une instance de <ModuleRequest>
/* [4] On retourne une instance de <Request>
=========================================================*/
// On cree notre requete avec le token
return new ModuleRequest($post['path'], $params);
return new Request($data['path'], $params);
}
@ -317,19 +401,19 @@
/* [1] Verification format general
=========================================================*/
if( !preg_match('#^([\w_-]+)/([\w_-]+)$#i', $path, $matches) ){ // Si mauvais format
$this->error = Error::WrongPathModule;
$this->error->set(Err::WrongPathModule);
return false;
}
// On recupere les donnes de la regex
// On recupere les données de la regex
$module = $matches[1];
$method = $matches[2];
$method = __HTTP_METHOD__.'::'.$matches[2];
/* [2] Verification de l'existence du module (conf)
=========================================================*/
if( !array_key_exists($module, $this->modules) ){ // Si le module n'est pas specifie dans la conf
$this->error = Error::UnknownModule;
$this->error->set(Err::UnknownModule, $module);
return false; // On retourne FALSE, si erreur
}
@ -337,7 +421,7 @@
/* [3] Verification de l'existence de la methode (conf)
=========================================================*/
if( array_key_exists($method, $this->modules[$module]) === false ){ // Si la methode n'est pas specifie dans la conf
$this->error = Error::UnknownMethod;
$this->error->set(Err::UnknownMethod, preg_replace('/\w+::/i', '', $method) );
return false; // On retourne FALSE, si erreur
}
@ -370,17 +454,21 @@
$method = $this->modules[$this->path['module']][$this->path['method']];
// Si aucune permission n'est definie
if( !isset($method['permissions']) ) return true;
if( !isset($method['permissions']) || !is_array($method['permissions']) || count($method['permissions']) < 1 )
return true;
/* [2] Vérification des permissions et de l'authentification
=========================================================*/
$granted = Authentification::permission($this->path['module'], $method['permissions']);
$granted = self::$authsystem::permission( $this->path['module'], $method['permissions'] );
/* (1) On retourne FAUX si aucun droit n'a ete trouve */
if( $granted !== Error::Success )
$this->error = Error::PermissionError;
if( $granted->get() !== Err::Success ){
$this->error = $granted;
return false;
}
@ -403,7 +491,10 @@
/* [1] On verifie qu'il ne manque aucun parametre
=========================================================*/
// Si @params n'est pas un tableau
if( !is_array($params) ) return false;
if( !is_array($params) ){
$this->error->set(Err::ConfigError);
return false;
}
$method = $this->modules[$this->path['module']][$this->path['method']];
@ -418,8 +509,10 @@
$isFile = isset($paramsdata['type']) && $paramsdata['type'] == 'FILE' && isset($_FILES[$name]);
/* (3) Si le paramètre est obligatoire et qu'il n'est pas donné -> erreur */
if( !isset($params[$name]) && !$optional && !$isFile )
if( !isset($params[$name]) && !$optional && !$isFile ){
$this->error->set(Err::MissingParam, $name);
return false;
}
/* (4) Si le type n'est pas defini, on a pas besoin de le vérifier */
if( !isset($paramsdata['type']) )
@ -440,8 +533,10 @@
/* (6) Si le paramètre est renseigné */
}else
// Si la verification est fausse, on retourne faux
if( !Checker::run($paramsdata['type'], $params[$name]) )
if( !Checker::run($paramsdata['type'], $params[$name]) ){
$this->error->set(Err::WrongParam, $name, $paramsdata['type']);
return false;
}
}
@ -499,11 +594,12 @@
/* RENVOI LE CHEMIN D'AMORCAGE DE LA METHODE
*
* @return path<Array> Retourne le chemin d'amorcage de la requete
* @return method<String> Retourne le chemin d'amorcage de la method
*
*/
private function getFunctionCaller(){
return [ '\\api\\module\\'.$this->path['module'], $this->path['method'] ];
private function getModuleMethod(){
/* (1) On essaie de trouver le bon nom */
return preg_replace('/\w+::/i', '', $this->path['method']);
}

View File

@ -2,47 +2,30 @@
namespace api\core;
use \error\core\Error;
use \error\core\Err;
// FORMAT:
//
// path: "nomModule/nomMethode"
// data1: {donnee1}
// data2: {donnee2}
// ...
//
//
//
//
class ModuleResponse{
class Response{
// Attributs prives utiles (initialisation)
private $data;
public $error;
/* CONSTRUCTEUR D'UNE REPONSE DE MODULE
*
* @error<ModuleError> Erreur passee par la requete (si existe)
*
*/
public function __construct($error=Error::Success){
public function __construct($error=null){
if( !( $error instanceof Error ) )
$error = new Error(Err::Success);
$this->data = [];
$this->error = $error;
}
/* AJOUTE UNE DONNEE A LA REPONSE
/* AJOUTE UNE DONNEE A LA REPONSE
*
* @key<String> Le nom de la valeur a ajouter
* @value<mixed*> La valeur a ajouter
@ -56,12 +39,6 @@
}
/* AJOUTE TOUTES LES DONNEES A LA REPONSE
*
* @dataset<Array> Le tableau associatif correspondant a la reponse
@ -69,14 +46,15 @@
*/
public function appendAll($dataset){
// Si ce n'est pas un tableau, on ne fais rien
if( !is_array($dataset) ) return $this;
if( !is_array($dataset) )
return $this;
// Si une valeur contient une erreur
if( array_key_exists('ModuleError', $dataset) ){
if( array_key_exists('error', $dataset) && $dataset['error'] instanceof Error){
// On definit cette erreur
$this->error = $dataset['ModuleError'];
$this->error = $dataset['error'];
// On enleve cette entree des donnees
unset($dataset['ModuleError']);
unset($dataset['error']);
}
// Ajoute une entree pour la cle @key et de valeur @value
@ -84,14 +62,9 @@
return $this;
}
/* RECUPERE UNE DONNEE DE LA REPONSE
/* RECUPERE UNE DONNEE DE LA REPONSE
*
* @key<String> Le nom de la valeur a recuperer
*
@ -109,12 +82,6 @@
}
/* RECUPERE TOUTES LES DONNEES DE LA REPONSE
*
* @return data<Array> Les donnees de la reponse
@ -126,10 +93,6 @@
}
/* SERIALISATION A PARTIR DES DONNEES
*
* @return json<String> Retourne les donnees serialisees
@ -138,15 +101,15 @@
public function serialize(){
// Code Http
Error::setHttpCode($this->error);
$this->error->setHttpCode();
// Type de contenu
// header('Content-Type: application/json; charset=utf-8');
header('Content-Type: application/json; charset=utf-8');
// On rajoute l'erreur au message
$returnData = array_merge([
'ModuleError' => $this->error,
'ErrorDescription' => Error::explicit($this->error)
'error' => $this->error->get(),
'ErrorDescription' => $this->error->explicit()
],
$this->data
);
@ -154,9 +117,6 @@
return json_encode($returnData);
}
}
}
?>

View File

@ -4,12 +4,19 @@
use \database\core\DatabaseDriver;
use \manager\sessionManager;
use \api\core\Authentification;
use \error\core\Error;
use \database\core\Repo;
use \manager\repo\cluster as clusterRepo;
class authentificationDefault{
public function __construct(){
// Routine to execute before each call to authentificationDefault's method
}
public function __destruct(){
// Routine to execute after each call to authentificationDefault's method
}
/* CONNEXION A UN ENTREPOT
*
* @name<String> Nom de l'entrepot
@ -18,7 +25,7 @@
* @return status<Boolean> TRUE si les crédits sont bons, sinon FALSE
*
*/
public static function warehouse($params){
public function warehouse($params){
extract($params);
@ -70,7 +77,7 @@
* @return status<Boolean> TRUE si les crédits sont bons, sinon FALSE
*
*/
public static function admin($params){
public function admin($params){
extract($params);
/* [0] Par défaut, on déconnecte l'administrateur

View File

@ -10,6 +10,8 @@
class clusterDefault{
public function __construct(){}
public function __destruct(){}
/* CREATION D'UN NOUVEL UTILISATEUR DANS LA BDD
*
@ -19,7 +21,7 @@
* @return id_cluster<int> Retourne l'UID du groupe
*
*/
public static function create($params){
public function create($params){
extract($params);
/* [2] Creation du groupe
@ -35,7 +37,7 @@
// Si une erreur est retournee, on retourne une erreur
if( $id_cluster === false )
return ['ModuleError' => Error::ModuleError];
return ['ModuleError' => new Error(Err::ModuleError)];
/* [5] Gestion du retour
@ -57,7 +59,7 @@
* @return clusters<Array> Retourne la liste des groupes trouves
*
*/
public static function search($params){
public function search($params){
extract($params);
$result = [];
@ -101,7 +103,7 @@
* @return clusters<Array> Liste des groupes
*
*/
public static function getAll($params){
public function getAll($params){
extract($params);
$result = [];
@ -144,7 +146,7 @@
* @return cluster<Array> Groupe d'UID donne
*
*/
public static function getById($params){
public function getById($params){
extract($params);
$repoMethod = ($class==0) ? 'user_cluster/getById' : 'machine_cluster/getById';
@ -158,7 +160,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'cluster' => $answer ];
@ -176,7 +178,7 @@
* @return cluster<Array> Groupe de nom donne
*
*/
public static function getByName($params){
public function getByName($params){
extract($params);
$repoMethod = ($class==0) ? 'user_cluster/getByName' : 'machine_cluster/getByName';
@ -190,7 +192,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'cluster' => $answer ];
@ -208,7 +210,7 @@
* @return members<Array> Membres du groupe donne
*
*/
public static function getMembers($params){
public function getMembers($params){
extract($params);
$repoMethod = ($class==0) ? 'user_cluster/getMembers' : 'machine_cluster/getMembers';
@ -222,7 +224,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'members' => $answer ];
@ -241,7 +243,7 @@
* @return status<Boolean> Retourne si oui ou non tout s'est bien deroule
*
*/
public static function edit($params){
public function edit($params){
extract($params);
@ -257,7 +259,7 @@
// Si on a recupere aucun utilisateur, on retourne une erreur
if( $cluster_data === false )
return ['ModuleError' => Error::NoMatchFound];
return ['ModuleError' => new Error(Err::NoMatchFound)];
@ -298,7 +300,7 @@
* @return status<Boolean> Retourne si oui ou non tout s'est bien deroule
*
*/
public static function delete($params){
public function delete($params){
extract($params);
$repoMethod = ($class==0) ? 'user_cluster/delete' : 'machine_cluster/delete';
@ -322,7 +324,7 @@
* @id_action<int> UID de l'action en question
*
*/
public static function addPermission($params){
public function addPermission($params){
extract($params);
/* [1] On crée la relation via le repo
@ -346,7 +348,7 @@
* @id_action<int> UID de l'action en question
*
*/
public static function remPermission($params){
public function remPermission($params){
extract($params);
/* [1] On supprime la relation via le repo
@ -371,7 +373,7 @@
* @return permissions<Array> Liste des permissions du groupe
*
*/
public static function getPermissions($params){
public function getPermissions($params){
extract($params);
/* [1] On propage au repo
@ -384,7 +386,7 @@
// Gestion erreur
if( !is_array($res) )
return ['ModuleError' => Error::NoMatchFound];
return ['ModuleError' => new Error(Err::NoMatchFound)];
/* (3) On retourne le résultat */
return [ 'permissions' => $res ];
@ -399,7 +401,7 @@
* @return clusters<Array> Liste des user_cluster ayant la permission sur le groupe target
*
*/
public static function getAuthenticatedClusters($params){
public function getAuthenticatedClusters($params){
extract($params);
/* [1] On propage au repo
@ -410,7 +412,7 @@
// error
if( !is_array($res) )
return ['ModuleError' => Error::NoMatchFound];
return ['ModuleError' => new Error(Err::NoMatchFound)];
return ['clusters' => $res];
}

12
build/api/module/historyDefault.php Normal file → Executable file
View File

@ -8,6 +8,8 @@
class historyDefault{
public function __construct(){}
public function __destruct(){}
/* CREATION D'UNE NOUVELLE ENTREE DANS LA BDD
@ -20,7 +22,7 @@
* @return status<Boolean> Retourne si oui ou non, tout s'est bien passe
*
*/
public static function create($params){
public function create($params){
extract($params);
/* [1] Creation de l'utilisateur
@ -35,7 +37,7 @@
// Si une erreur est retournee, on retourne une erreur
if( $id_entry === false )
return ['ModuleError' => Error::ModuleError];
return ['ModuleError' => new Error(Err::ModuleError)];
/* [2] Gestion du retour
@ -56,7 +58,7 @@
* @return users<Array> Retourne la liste des utilisateurs trouves
*
*/
public static function search($params){
public function search($params){
extract($params);
// On recupere les donnees
@ -77,7 +79,7 @@
* @return history<Array> Liste des entrées de l'historique
*
*/
public static function getAll(){
public function getAll(){
// On recupere les donnees
$entries = new Repo('history/getAll', [ $_SESSION['WAREHOUSE']['id'] ]);
@ -92,7 +94,7 @@
* @return status<Boolean> Retourne si oui ou non tout s'est bien deroule
*
*/
public static function delete($params){
public function delete($params){
extract($params);
/* [1] On supprime l'utilisateur

View File

@ -9,6 +9,9 @@
class machineDefault{
public function __construct(){}
public function __destruct(){}
/* CREATION D'UNE NOUVELLE MACHINE DANS LA BDD
*
@ -17,7 +20,7 @@
* @return status<Boolean> Retourne si oui ou non, tout s'est bien passe
*
*/
public static function create($params){
public function create($params){
extract($params);
/* [1] Creation de la machine
@ -30,7 +33,7 @@
// Si une erreur est retournee, on retourne une erreur
if( $id_machine === false )
return ['ModuleError' => Error::ModuleError];
return ['ModuleError' => new Error(Err::ModuleError)];
@ -54,7 +57,7 @@
* Renvoie FALSE si une erreur occure
*
*/
public static function link($params){
public function link($params){
extract($params);
/* Creation de l'association */
@ -81,7 +84,7 @@
* Renvoie FALSE si une erreur occure
*
*/
public static function unlink($params){
public function unlink($params){
extract($params);
/* Suppression de l'association */
@ -106,7 +109,7 @@
* @return machines<Array> Retourne la liste des machines trouvees
*
*/
public static function search($params){
public function search($params){
extract($params);
// On recupere les donnees
@ -127,7 +130,7 @@
* @return machines<Array> Liste des machines
*
*/
public static function getAll(){
public function getAll(){
// On recupere les donnees
$machines = new Repo('machine/getAll', [$_SESSION['WAREHOUSE']['id']]);
@ -145,7 +148,7 @@
* @return machine<Array> Machine d'UID donne
*
*/
public static function getById($params){
public function getById($params){
extract($params);
// On recupere les donnees
@ -157,7 +160,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'machine' => $answer ];
@ -174,7 +177,7 @@
* @return machine<Array> Machine de name donne
*
*/
public static function getByName($params){
public function getByName($params){
extract($params);
@ -187,7 +190,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'machine' => $answer ];
@ -204,7 +207,7 @@
* @return clusters<Array> Groupes de la machine donne
*
*/
public static function getClusters($params){
public function getClusters($params){
extract($params);
// On recupere les donnees
@ -216,7 +219,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'clusters' => $answer ];
@ -234,7 +237,7 @@
* @return status<Boolean> Retourne si oui ou non tout s'est bien deroule
*
*/
public static function edit($params){
public function edit($params){
extract($params);
@ -248,7 +251,7 @@
// Si on a recupere aucune machine, on retourne une erreur
if( !is_array($machine_data) )
return ['ModuleError' => Error::NoMatchFound];
return ['ModuleError' => new Error(Err::NoMatchFound)];
@ -290,7 +293,7 @@
* @return status<Boolean> Retourne si oui ou non tout s'est bien deroule
*
*/
public static function delete($params){
public function delete($params){
extract($params);
// On recupere les donnees
@ -324,7 +327,7 @@
* @return data<Array> Données d'initialisation du système
*
*/
public static function init($params){
public function init($params){
extract($params);
/* [1] On récupére la liste des actions
@ -459,7 +462,7 @@
* @return data<Array> Données de retour de synchronisation
*
*/
public static function sync($params){
public function sync($params){
extract($params);
/* [0] Vérification du token
@ -468,7 +471,7 @@
// Si token incorrect, on envoie une erreur
if( $checkToken->answer() !== true )
return [ 'ModuleError' => Error::TokenError ];
return [ 'ModuleError' => new Error(Err::TokenError) ];

View File

@ -2,17 +2,21 @@
namespace api\module;
use \error\core\Error;
use \error\core\Err;
use \manager\ResourceDispatcher;
class module{
public function __construct(){}
public function __destruct(){}
/* PERMET DE TESTER L'API
*
*/
public static function method($params){
public function method($params){
return [
'ModuleError' => Error::Success,
'ModuleError' => new Error(Err::Success),
'ReceivedArguments' => $params
];
@ -23,7 +27,7 @@
* @return markdown<String> Description des modules
*
*/
public static function markdown(){
public function markdown(){
/* [1] Récupération de la configuration
=========================================================*/
// On récupère le fichier et on le parse
@ -31,7 +35,7 @@
// Gestion de l'erreur de parsage
if( $modules == null )
return [ 'ModuleError' => Error::ParsingFailed ];
return [ 'ModuleError' => new Error(Err::ParsingFailed) ];
/* [2] Mise en forme de la liste des modules
=========================================================*/
@ -61,7 +65,7 @@
/* [n] Gestion du retour
=========================================================*/
return [
'ModuleError' => Error::Success,
'ModuleError' => new Error(Err::Success),
'headers' => [
'Content-Type' => 'text/markdown; charset=utf-8',
'Content-Transfer-Encoding' => 'binary',
@ -79,7 +83,7 @@
* @return apiBlueprint<String> Description des modules au format API Blueprint
*
*/
public static function apiBlueprint(){
public function apiBlueprint(){
/* [0] Récupération de la configuration
=========================================================*/
// On récupère le fichier et on le parse
@ -87,7 +91,7 @@
// Gestion de l'erreur de parsage
if( $modules == null )
return [ 'ModuleError' => Error::ParsingFailed ];
return [ 'ModuleError' => new Error(Err::ParsingFailed) ];
/* [1] Début du fichier custom
@ -259,7 +263,7 @@
return [
'ModuleError' => Error::Success,
'ModuleError' => new Error(Err::Success),
'headers' => [
'Content-Type' => 'application/octet-stream; charset=utf-8',
'Content-Transfer-Encoding' => 'binary',

View File

@ -8,6 +8,8 @@
class userDefault{
public function __construct(){}
public function __destruct(){}
/* CREATION D'UN NOUVEL UTILISATEUR DANS LA BDD
*
@ -20,7 +22,7 @@
* @return status<Boolean> Retourne si oui ou non, tout s'est bien passe
*
*/
public static function create($params){
public function create($params){
extract($params);
/* [1] Creation de l'utilisateur
@ -37,7 +39,7 @@
// Si une erreur est retournee, on retourne une erreur
if( $id_user === false )
return ['ModuleError' => Error::ModuleError];
return ['ModuleError' => new Error(Err::ModuleError)];
/* [2] Gestion du retour
@ -60,7 +62,7 @@
* Renvoie FALSE si une erreur occure
*
*/
public static function link($params){
public function link($params){
extract($params);
/* [1] Creation de l'association
@ -88,7 +90,7 @@
* Renvoie FALSE si une erreur occure
*
*/
public static function unlink($params){
public function unlink($params){
extract($params);
/* [1] Suppression de l'association
@ -114,7 +116,7 @@
* @return users<Array> Retourne la liste des utilisateurs trouves
*
*/
public static function search($params){
public function search($params){
extract($params);
// On recupere les donnees
@ -135,7 +137,7 @@
* @return utilisateurs<Array> Liste des utilisateurs
*
*/
public static function getAll(){
public function getAll(){
// On recupere les donnees
$users = new Repo('user/getAll', [ $_SESSION['WAREHOUSE']['id'] ]);
@ -153,7 +155,7 @@
* @return utilisateur<Array> Utilisateur d'UID donne
*
*/
public static function getById($params){
public function getById($params){
extract($params);
// On recupere les donnees
@ -165,7 +167,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'user' => $answer ];
@ -182,7 +184,7 @@
* @return utilisateur<Array> Utilisateur de code donne
*
*/
public static function getByCode($params){
public function getByCode($params){
extract($params);
// On recupere les donnees
@ -194,7 +196,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'user' => $answer ];
@ -211,7 +213,7 @@
* @return utilisateur<Array> Utilisateur d'username donne
*
*/
public static function getByUsername($params){
public function getByUsername($params){
extract($params);
@ -224,7 +226,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'user' => $answer ];
@ -241,7 +243,7 @@
* @return clusters<Array> Groupes de l'utilisateur donne
*
*/
public static function getClusters($params){
public function getClusters($params){
extract($params);
@ -254,7 +256,7 @@
// Si aucun resultat, on retourne une erreur
if( $answer === false )
return [ 'ModuleError' => Error::NoMatchFound ];
return [ 'ModuleError' => new Error(Err::NoMatchFound) ];
return [ 'clusters' => $answer ];
@ -276,7 +278,7 @@
* @return status<Boolean> Retourne si oui ou non tout s'est bien deroule
*
*/
public static function edit($params){
public function edit($params){
extract($params);
/* [1] On verifie l'existence de l'utilisateur
@ -289,7 +291,7 @@
// Si on a recupere aucun utilisateur, on retourne une erreur
if( !is_array($user_data) )
return ['ModuleError' => Error::NoMatchFound];
return ['ModuleError' => new Error(Err::NoMatchFound)];
@ -343,7 +345,7 @@
* @return status<Boolean> Retourne si oui ou non tout s'est bien deroule
*
*/
public static function delete($params){
public function delete($params){
extract($params);
/* [1] On supprime l'utilisateur

View File

@ -2,6 +2,7 @@
namespace database\core;
use \error\core\Error;
use \error\core\Err;
class DataBaseDriver{
@ -62,11 +63,11 @@
$this->pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password, [\PDO::ATTR_TIMEOUT => 10]);
// On signale que tout s'est bien passe
$this->error = Error::Success;
$this->error = new Error(Err::Success);
}catch(Exception $e){
// On signale qu'il y a une erreur
$this->error = Error::PDOConnection;
$this->error = new Error(Err::PDOConnection);
}
}

View File

@ -3,6 +3,7 @@
namespace database\core;
use \error\core\Error;
use \error\core\Err;
use \api\core\Authentification;
@ -50,7 +51,7 @@
// Si pas parametre manquant, on quitte
if( $path == null ){
$this->error = Error::MissingPath;
$this->error = new Error(Err::MissingPath);
return false;
}
@ -61,7 +62,7 @@
// Gestion de l'erreur de parsage
if( $this->repositories == null ){
$this->error = Error::ParsingFailed;
$this->error = new Error(Err::ParsingFailed);
return false;
}
@ -71,7 +72,7 @@
=========================================================*/
// Type de @path
if( !is_string($path) ){ // Si le type est incorrect
$this->error = Error::WrongPathRepo;
$this->error = new Error(Err::WrongPathRepo);
return false; // On retourne FALSE, si erreur
}
@ -89,7 +90,7 @@
/* [3] Construction de l'objet
=========================================================*/
$this->params = $params;
$this->error = Error::Success;
$this->error = new Error(Err::Success);
/* [4] Enregistrement de la reponse
=========================================================*/
@ -105,7 +106,7 @@
public function answer(){
if( $this->error != Error::Success )
if( $this->error != new Error(Err::Success) )
return false;
return $this->answer;
@ -121,14 +122,14 @@
public function dispatch(){
/* [1] On verifie qu'aucune erreur n'a ete signalee
=========================================================*/
if( $this->error != Error::Success ) // si il y a une erreur
if( $this->error != new Error(Err::Success) ) // si il y a une erreur
return false; // on la passe a la reponse
/* [2] On verifie que la methode est amorcable
=========================================================*/
if( !is_callable($this->getFunctionCaller()) ){
$this->error = Error::UncallableMethod;
$this->error = new Error(Err::UncallableMethod);
return false;
}
@ -151,7 +152,7 @@
/* [1] Verification format general
=========================================================*/
if( !preg_match('#^([\w_-]+)/([\w_-]+)$#i', $path, $matches) ){ // Si mauvais format
$this->error = Error::WrongPathRepo;
$this->error = new Error(Err::WrongPathRepo);
return false;
}
@ -162,14 +163,14 @@
/* [2] Verification de l'existence du repo (conf)
=========================================================*/
if( !array_key_exists($repository, $this->repositories) ){ // Si le repo n'est pas specifie dans la conf
$this->error = Error::UnknownRepo;
$this->error = new Error(Err::UnknownRepo);
return false; // On retourne FALSE, si erreur
}
/* [3] Verification de l'existence de la methode (conf)
=========================================================*/
if( array_search($method, $this->repositories[$repository]) === false ){ // Si la methode n'est pas specifie dans la conf
$this->error = Error::UnknownMethod;
$this->error = new Error(Err::UnknownMethod);
return false; // On retourne FALSE, si erreur
}

View File

@ -3,7 +3,6 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \database\core\Repo;
use \error\core\Error;
use \manager\repo\cluster as clusterRepo;
class action extends parentRepo{

View File

@ -3,7 +3,7 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \database\core\Repo;
use \error\core\Error;
use \error\core\Err;
use \orm\core\Table;
use \orm\core\Rows;
@ -35,7 +35,7 @@
/* (2) Si aucun résultat, on retourne une erreur */
if( $targetCheck === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* [2] On vérifie l'existance du groupe 'source'
@ -49,7 +49,7 @@
/* (2) Si aucun résultat, on retourne une erreur */
if( $sourceCheck === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* [3] On vérifie l'existance de l'action
@ -60,7 +60,7 @@
/* (2) Si aucun résultat, on retourne une erreur */
if( $actionCheck === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* [4] On vérifie que l'entrée n'existe pas déja
@ -74,7 +74,7 @@
/* (3) Si les données sont identiques pour au moins une entrée, on retourne un succès */
foreach($checkAlready as $s=>$sameTarget)
if( $sameTarget['id_source'] == $id_source && $sameTarget['id_action'] == $id_action )
return Error::Success;
return Err::Success;
}
@ -92,10 +92,10 @@
/* (2) Si erreur SQL, on retourne une erreur */
if( !$inserted )
return Error::RepoError;
return Err::RepoError;
return Error::Success;
return Err::Success;
}
@ -134,7 +134,7 @@
/* (3) Si on a pas trouvé, on retourne une erreur */
if( is_null($existingId) )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* [2] On supprime la action
@ -150,10 +150,10 @@
/* (2) Si erreur SQL, on retourne une erreur */
if( !$deleted || self::getById($existingId) !== false )
return Error::RepoError;
return Err::RepoError;
return Error::Success;
return Err::Success;
}

View File

@ -3,7 +3,6 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \database\core\Repo;
use \error\core\Error;
use \orm\core\Table;
use \orm\core\Rows;

View File

@ -3,7 +3,6 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \database\core\Repo;
use \error\core\Error;
use \manager\repo\cluster as clusterRepo;
class global_state extends parentRepo{

0
build/database/repo/history.php Normal file → Executable file
View File

View File

@ -2,7 +2,7 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \error\core\Error;
use \error\core\Err;
use \database\core\Repo;
use \orm\core\Table;
use \orm\core\Rows;
@ -76,7 +76,7 @@
// Si le groupe n'existe pas
if( $cluster === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* (2) On récupère l'utilisateur */
$machineR = Table::get('machine')
@ -88,7 +88,7 @@
// Si l'utilisateur n'existe pas
if( $machine === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* (3) On vérifie qu'il n'y a pas déja d'appartenance */
$cluster_mergeR = Table::get('machine_cluster_merge')
@ -100,7 +100,7 @@
// Si la relation existe déja, on ne fait rien
if( $cluster_merge_exists !== false )
return Error::Success;
return Err::Success;
@ -117,13 +117,13 @@
/* (2) Si erreur, on la retourne */
if( !$inserted )
return Error::RepoError;
return Err::RepoError;
/* (3) On vérifie quand même que l'entrée existe */
$cluster_merge_inserted = $cluster_mergeR->fetch();
/* (4) Sinon, on renvoie que tout s'est bien passé */
return is_array($cluster_merge_inserted) ? Error::Success : Error::RepoError;
return is_array($cluster_merge_inserted) ? Err::Success : Err::RepoError;
}
@ -150,7 +150,7 @@
/* (2) Si on ne trouve rien */
if( $get_merge_id === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
@ -162,15 +162,15 @@
// Si erreur
if( !$deleted )
return Error::RepoError;
return Err::RepoError;
/* [2] On verifie que l'association n'existe plus
=========================================================*/
if( self::getMerge($id_warehouse, $id_machine_cluster, $id_machine) !== false )
return Error::RepoError;
return Err::RepoError;
return Error::Success;
return Err::Success;
}

View File

@ -3,7 +3,6 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \database\core\Repo;
use \error\core\Error;
use \manager\repo\cluster as clusterRepo;
class pin_merge extends parentRepo{

View File

@ -3,7 +3,6 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \database\core\Repo;
use \error\core\Error;
use \manager\repo\cluster as clusterRepo;
class state extends parentRepo{

View File

@ -2,7 +2,7 @@
namespace database\repo;
use \database\core\DatabaseDriver;
use \error\core\Error;
use \error\core\Err;
use \database\core\Repo;
use \orm\core\Table;
use \orm\core\Rows;
@ -76,7 +76,7 @@
// Si le groupe n'existe pas
if( $cluster === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* (2) On récupère l'utilisateur */
$userR = Table::get('user')
@ -88,7 +88,7 @@
// Si l'utilisateur n'existe pas
if( $user === false )
return Error::NoMatchFound;
return Err::NoMatchFound;
/* (3) On vérifie qu'il n'y a pas déja d'appartenance */
$cluster_mergeR = Table::get('user_cluster_merge')
@ -100,7 +100,7 @@
// Si la relation existe déja, on ne fait rien
if( $cluster_merge_exists !== false )
return Error::Success;
return Err::Success;
@ -117,13 +117,13 @@
/* (2) Si erreur, on la retourne */
if( !$inserted )
return Error::RepoError;
return Err::RepoError;
/* (3) On vérifie quand même que l'entrée existe */
$cluster_merge_inserted = $cluster_mergeR->fetch();
/* (4) Sinon, on renvoie que tout s'est bien passé */
return is_array($cluster_merge_inserted) ? Error::Success : Error::RepoError;
return is_array($cluster_merge_inserted) ? Err::Success : Err::RepoError;
}
@ -149,7 +149,7 @@
/* (2) Si on ne trouve rien */
if( $get_merge_id == false )
return Error::NoMatchFound;
return Err::NoMatchFound;
@ -161,15 +161,15 @@
// Si erreur
if( !$deleted )
return Error::RepoError;
return Err::RepoError;
/* [2] On verifie que l'association n'existe plus
=========================================================*/
if( self::getMerge($id_warehouse, $id_user_cluster, $id_user) !== false )
return Error::ModuleError;
return Err::ModuleError;
return Error::Success;
return Err::Success;
}

109
build/error/core/Err.php Normal file
View File

@ -0,0 +1,109 @@
<?php
namespace error\core;
class Err{
/* [1] Success
=========================================================*/
const Success = 0;
/* [2] Fichiers / Ressources
=========================================================*/
/* (1) Parsage json/xml */
const ParsingFailed = 1;
/* (2) Fichier inexistant */
const UnreachableResource = 2;
/* (3) Erreur d'upload */
const UploadError = 3;
/* (4) Mauvais format de fichier */
const FormatError = 4;
/* [3] Permissions
=========================================================*/
/* (1) Token inexistant ou incorrect */
const TokenError = 5;
/* (2) Permission non autorisée */
const PermissionError = 6;
/* [4] API
=========================================================*/
/* (1) Le module n'est pas activé */
const DisabledModule = 7;
/* (2) Le @path n'est pas renseigne */
const MissingPath = 8;
/* (3) Verification de la coherence du chemin (existe dans la conf) */
const WrongPathModule = 9;
/* (4) Module non specifie dans la conf */
const UnknownModule = 10;
/* (5) Methode non specifie pour ce Module dans la conf */
const UnknownMethod = 11;
/* (6) Module non amorcable */
const UncallableModule = 12;
/* (7) Methode non amorcable */
const UncallableMethod = 13;
/* (8) Erreur méthode HTTP */
const UnknownHttpMethod = 14;
/* (9) Erreur de configuration */
const ConfigError = 15;
/* (10) Paramètre manquant */
const MissingParam = 16;
/* (11) Paramètre incorrect */
const WrongParam = 17;
/* (12) Erreur dans le traitement */
const ModuleError = 18;
/* [5] Database
=========================================================*/
/* (1) Base de données
---------------------------------------------------------*/
/* (1) Erreur lors de la creation d'un objet PDO (connection) */
const PDOConnection = 19;
/* (2) Repositories
---------------------------------------------------------*/
/* (1) Verification de la coherence du chemin (existe dans la conf) */
const WrongPathRepo = 20;
/* (2) Module non specifie dans la conf */
const UnknownRepo = 21;
/* (3) Erreur dans le traitement */
const RepoError = 22;
/* (3) ORM
---------------------------------------------------------*/
/* (1) Table n'existe pas */
const UnknownTable = 23;
/* (2) Pas permissions de lire le schéma */
const NotAllowedSchema = 24;
/* [6] Erreurs diverses
=========================================================*/
/* (1) Aucune donnée trouvée */
const NoMatchFound = 25;
/* (2) Mauvais chemin de template */
const UnknownTemplate = 26;
/* (3) géolocalisation échouée */
const UnknownAddress = 27;
/* (4) Erreur inconnue */
const UnknownError = 28;
}
?>

283
build/error/core/Error.php Executable file → Normal file
View File

@ -3,148 +3,189 @@
namespace error\core;
use \error\core\Err;
class Error{
/* SUCCESS */
const Success = 0;
private $error = null;
private $arguments = [];
/* Parsage json */
const ParsingFailed = 1;
/* ERROR CONSTRUCTOR
*
* @error<const> Const error
* @arg1<String> [OPT] Argument 1
* @arg2<String> [OPT] Argument 2
* @arg...<String> [OPT] Argument ...
*
* @return instance<Error> Error instance
*
*/
public function __construct($const){
call_user_func_array([$this, 'set'], func_get_args());
}
/* ResourceDispatcher */
/* ERROR GETTER
*
* @return Err<Err::Constant> Error
*
*/
public function get(){ return $this->error; }
// Drapeaux invalides
const InvalidFlags = 2;
/* ERROR SETTER
*
* @error<const> Const error
* @arg1<String> [OPT] Argument 1
* @arg2<String> [OPT] Argument 2
* @arg...<String> [OPT] Argument ...
*
* @return instance<Error> Error instance
*
*/
public function set($const){
/* [1] On découpe les arguments
=========================================================*/
/* (1) On récupère l'erreur */
$this->error = !is_numeric($const) ? Err::UnknownError : $const;
// Fichier inexistant
const UnreachableResource = 3;
/* ModuleRequest */
// Le module n'est pas activé
const DisabledModule = 4;
// Le @path n'est pas renseigne
const MissingPath = 5;
// Verification de la coherence du chemin (existe dans la conf)
const WrongPathModule = 6;
// Module non specifie dans la conf
const UnknownModule = 7;
// Methode non specifie pour ce Module dans la conf
const UnknownMethod = 8;
// Methode inamorcable
const UncallableMethod = 9;
// Erreur de parametre(s)
const ParamError = 10;
// Erreur dans le traitement
const ModuleError = 11;
/* Repo */
// Verification de la coherence du chemin (existe dans la conf)
const WrongPathRepo = 12;
// Module non specifie dans la conf
const UnknownRepo = 13;
// Erreur dans le traitement
const RepoError = 14;
/* Database */
// Erreur lors de la creation d'un objet PDO (connection)
const PDOConnection = 15;
/* API token */
// Token inexistant ou faux
const TokenError = 16;
const PermissionError = 17;
/* Erreur d'UPLOAD */
const UploadError = 18;
// Mauvais format de fichier
const FormatError = 19;
/* Erreur de contenu */
// Aucune donnée trouvée
const NoMatchFound = 20;
/* Erreur de vues */
// Mauvais chemin de template
const UnknownTemplate = 21;
/* Erreur de l'ORM */
// Table n'existe pas
const UnknownTable = 22;
// Pas permissions de lire le schéma
const NotAllowedSchema = 23;
/* Erreur au niveau javascript */
//const JavascriptError = 20; // -> géré en js
/* (2) On récupère les arguments */
$this->arguments = array_slice(func_get_args(), 1);
}
/* EXPLICITE UN CODE D'ERREUR
*
* @error<Integer> Code d'erreur
*
* @return explicit<String> Description explicite du code d'erreur
*
*/
public static function explicit($error){
switch($error){
case self::Success: return "Tout s'est bien deroulé."; break;
public function explicit(){
switch($this->error){
case Err::Success: return $this->Success(); break;
case Err::ParsingFailed: return $this->ParsingFailed(); break;
case Err::UnreachableResource: return $this->UnreachableResource(); break;
case Err::UploadError: return $this->UploadError(); break;
case Err::FormatError: return $this->FormatError(); break;
case Err::TokenError: return $this->TokenError(); break;
case Err::PermissionError: return $this->PermissionError(); break;
case Err::DisabledModule: return $this->DisabledModule(); break;
case Err::MissingPath: return $this->MissingPath(); break;
case Err::WrongPathModule: return $this->WrongPathModule(); break;
case Err::UnknownModule: return $this->UnknownModule(); break;
case Err::UnknownMethod: return $this->UnknownMethod(); break;
case Err::UncallableModule: return $this->UncallableModule(); break;
case Err::UncallableMethod: return $this->UncallableMethod(); break;
case Err::UnknownHttpMethod: return $this->UnknownHttpMethod(); break;
case Err::ConfigError: return $this->ConfigError(); break;
case Err::MissingParam: return $this->MissingParam(); break;
case Err::WrongParam: return $this->WrongParam(); break;
case Err::ModuleError: return $this->ModuleError(); break;
case Err::PDOConnection: return $this->PDOConnection(); break;
case Err::WrongPathRepo: return $this->WrongPathRepo(); break;
case Err::UnknownRepo: return $this->UnknownRepo(); break;
case Err::RepoError: return $this->RepoError(); break;
case Err::UnknownTable: return $this->UnknownTable(); break;
case Err::NotAllowedSchema: return $this->NotAllowedSchema(); break;
case Err::NoMatchFound: return $this->NoMatchFound(); break;
case Err::UnknownTemplate: return $this->UnknownTemplate(); break;
case Err::UnknownAddress: return $this->UnknownAddress(); break;
case Err::UnknownError: return $this->UnknownError(); break;
case self::ParsingFailed: return "La lecture du fichier JSON ou XML a echouée."; break;
case self::InvalidFlags: return "Les spécifications (drapeaux) sont incorrects."; break;
case self::UnreachableResource: return "La ressource n'existe pas (404)."; break;
case self::DisabledModule: return "Vous n'avez pas accès au module demandé."; break;
case self::MissingPath: return "Le chemin de délégation n'a pas été renseigné."; break;
case self::WrongPathModule: return "Le chemin de délégation est incorrect ('nomModule/nomMethode')."; break;
case self::WrongPathRepo: return "Le chemin de délégation est incorrect ('nomRepo/nomMethode')."; break;
case self::UnknownModule: return "Le module n'existe pas."; break;
case self::UnknownRepo: return "Le repo n'existe pas."; break;
case self::UnknownMethod: return "Le méthode n'existe pas."; break;
case self::UncallableMethod: return "Le méthode n'est pas amorçable."; break;
case self::ParamError: return "Un ou plusieurs paramètres sont manquants ou incorrects."; break;
case self::ModuleError: return "Erreur lors du traitement du module."; break;
case self::RepoError: return "Erreur lors du traitement du repo."; break;
case self::PDOConnection: return "La connexion avec la base de données a echouée."; break;
case self::TokenError: return "Le token de connection est absent, érroné ou expiré."; break;
case self::PermissionError: return "Vous n'avez pas la permission d'effectuer cette action."; break;
case self::UploadError: return "Une erreur d'upload est survenue."; break;
case self::FormatError: return "Le fichier n'est pas au bon format."; break;
case self::NoMatchFound: return "Aucun résultat correspondant à la requête."; break;
case self::UnknownTemplate: return "Modèle inconnu."; break;
default: return "Erreur inconnue..."; break;
default: return $this->UnknownDebugError(); break;
}
// Erreur inconnue
return null;
}
public static function setHttpCode($error){
http_response_code( $error == self::Success ? 200 : 417 );
private function Success(){
return 'all right';
}private function ParsingFailed(){
if( count($this->arguments) > 0 )
return $this->arguments[0].' parsing failed';
else
return 'parsing failed';
}private function UnreachableResource(){
return 'unreachable resource';
}private function UploadError(){
return 'upload error';
}private function FormatError(){
return 'format error';
}private function TokenError(){
return 'bad or expired token';
}private function PermissionError(){
return 'permission error';
}private function DisabledModule(){
return 'disabled module';
}private function MissingPath(){
return 'missing path';
}private function WrongPathModule(){
return 'wrong module\'s path';
}private function UnknownModule(){
if( count($this->arguments) > 0 )
return 'unknown module \''.$this->arguments[0].'\'';
else
return 'unknown module';
}private function UnknownMethod(){
if( count($this->arguments) > 0 )
return 'unknown method \''.$this->arguments[0].'\'';
else
return 'unknown method';
}private function UncallableModule(){
if( count($this->arguments) > 0 )
return 'uncallable module \''.$this->arguments[0].'\'';
else
return 'uncallable module';
}private function UncallableMethod(){
if( count($this->arguments) > 0 )
return 'uncallable method \''.$this->arguments[0].'\'';
else
return 'uncallable method';
}private function UnknownHttpMethod(){
return 'unknown HTTP method';
}private function ConfigError(){
return 'configuration error';
}private function MissingParam(){
if( count($this->arguments) > 0 )
return 'missing param \''.$this->arguments[0].'\'';
else
return 'missing param';
}private function WrongParam(){
if( count($this->arguments) > 0 )
if( count($this->arguments) > 1 )
return 'wrong param \''.$this->arguments[0].'\' expected to be of type \''.$this->arguments[1].'\'';
else
return 'wrong param \''.$this->arguments[0].'\'';
else
return 'wrong param';
}private function ModuleError(){
return 'module error';
}private function PDOConnection(){
return 'database error';
}private function WrongPathRepo(){
return 'wrong repository\'s path';
}private function UnknownRepo(){
return 'unknown repository';
}private function RepoError(){
return 'repository error';
}private function UnknownTable(){
return 'unknown table';
}private function NotAllowedSchema(){
return 'schema browsing not allowed';
}private function NoMatchFound(){
return 'no match found';
}private function UnknownTemplate(){
return 'unknown template';
}private function UnknownAddress(){
return 'unknown';
}private function UnknownError(){
return 'unknown error';
}private function UnknownDebugError(){
return 'unknown debug error';
}
public function setHttpCode(){
http_response_code( $this->error == Err::Success ? 200 : 417 );
}
}
?>

View File

@ -0,0 +1,198 @@
<?php
namespace http\core;
class HttpRequest{
/* [0] Constants
=========================================================*/
/* (1) Content-Type */
const CT_BINARY = 0; // unknown
const CT_TEXT = 1;
const CT_JSON = 2;
const CT_YAML = 3;
const CT_MULTIPART_FORM_DATA = 4;
const CT_X_WWW_FORM_URLENCODED = 5;
/* [1] Attributes
=========================================================*/
private $uri;
private $headers;
private $method;
private $postdata;
private $getdata;
private $type;
private $body;
/* [2] Constructs an HTTP Request based on environment
*
* @return instance<HttpRequest> auto-filled HTTP Request
*
=========================================================*/
public function __construct(){
/* [1] Define URI & Status Code & method
=========================================================*/
$this->uri = $_SERVER['REQUEST_URI'];
$this->method = $_SERVER['REQUEST_METHOD'];
/* [2] Define headers
=========================================================*/
$this->headers = \getallheaders();
/* [3] Define default datasets (GET, POST)
=========================================================*/
$this->getdata = $_GET;
$this->postdata = $_POST;
/* [4] Define BODY & its type
=========================================================*/
/* (1) Default: set plain/text body */
$this->body = \file_get_contents('php://input');
/* (2) Fetch content type */
$this->type = self::getContentType($this->headers['Content-Type']);
/* [5] Parse BODY data -> POST
=========================================================*/
$this->parseBody();
}
/* GET CONSTANT CT_* FROM `Content-Type` HEADER
*
* @pContentType<String> `Content-Type` header value
*
* @return type<int> Constant value
*
*/
private static function getContentType($pContentType=null){
/* [1] Checks argv
=========================================================*/
if( is_null($pContentType) )
$pContentType = $_SERVER['CONTENT_TYPE'];
/* [2] Checks types
=========================================================*/
/* (1) Form Data Types
---------------------------------------------------------*/
/* (1) multipart/form-data */
if( preg_match('/^multipart\/form\-data; boundary=(.+)$/i', $pContentType) )
return self::CT_MULTIPART_FORM_DATA;
/* (2) application/x-www-form-urlencoded */
if( preg_match('/^application\/x\-www\-form\-urlencoded/i', $pContentType) )
return self::CT_X_WWW_FORM_URLENCODED;
/* (2) Data types
---------------------------------------------------------*/
/* (1) Basic JSON content type */
if( preg_match('/^application\/json/i', $pContentType) )
return self::CT_JSON;
/* (2) Basic YAML content type */
if( preg_match('/^application\/yaml/i', $pContentType) )
return self::CT_YAML;
/* (3) Basic TEXT content type */
if( preg_match('/text\/[a-z]+/', $pContentType) )
return self::CT_TEXT;
/* (3) Default Type
---------------------------------------------------------*/
return self::CT_BINARY;
}
/* PARSES BODY DATA
*
*/
private function parseBody(){
/* [1] If empty body -> do nothing
=========================================================*/
if( strlen($this->body) === 0 )
return true;
/* [2] Management for each ContentType
=========================================================*/
switch($this->type){
/* (1) multipart/form-data -> parse for not-POST methods
---------------------------------------------------------*/
case self::CT_MULTIPART_FORM_DATA:
/* (1) Fetch the boundary */
if( !preg_match('/boundary=(.+)$/i', $this->headers['Content-Type'], $match) )
return false;
$boundary = $match[1];
/* (2) Break body into parts */
$splitter = "/(?:\n|\r\n|--)*$boundary(?:\n|\r\n|--)?/im";
$parts = preg_split($splitter, $this->body);
/* (3) Process parts */
foreach($parts as $part)
if( preg_match('/^Content\-Disposition: form\-data; name=\"([^"]+)\"(?:\n|\r\n){2}(.+)$/mi', $part, $match) )
$this->postdata[$match[1]] = $match[2];
/* (4) Erases body */
$this->body = '';
break;
/* (2) application/x-www-form-urlencoded -> parse for not-POST methods
---------------------------------------------------------*/
case self::CT_X_WWW_FORM_URLENCODED:
/* Auto parse builtin-php function */
parse_str($this->body, $this->postdata);
/* Erases body */
$this->body = '';
break;
/* (3) application/json -> parse if no error
---------------------------------------------------------*/
case self::CT_JSON:
/* (1) Decode body content */
$decoded = json_decode($this->body, true);
/* (2) If error -> do nothing */
if( is_null($decoded) )
return;
/* (3) Parse body into body */
$this->body = $decoded;
break;
/* (4) application/yaml -> parse if no error
---------------------------------------------------------*/
case self::CT_YAML:
break;
}
}
public function BODY(){ return $this->body; }
public function POST(){ return $this->postdata; }
public function GET(){ return $this->getdata; }
public function HEADERS(){ return $this->headers; }
public function METHOD(){ return $this->method; }
public function URI(){ return $this->uri; }
}

View File

@ -3,10 +3,11 @@
namespace viewer\core;
use \error\core\Error;
use \error\core\Err;
class Viewer{
public $error = Error::Success;
public $error;
private $template;
@ -25,9 +26,12 @@
*
*/
public function __construct($template, $args){
$this->error = new Error(Err::Success);
// Si pas parametre manquant, on quitte
if( $template == null ){
$this->error = Error::MissingPath;
$this->error = new Error(Err::MissingPath);
return false;
}
@ -94,7 +98,7 @@
/* [1] On vérifie le format
=========================================================*/
if( !preg_match('/^(\w+)\.(\w+)$/i', $template, $match) ){
$this->error = Error::ParamError;
$this->error = new Error(Err::ParamError);
return false;
}
@ -106,13 +110,13 @@
/* (1) On vérifie que la classe existe */
if( !class_exists($class) ){
$this->error = Error::UnknownTemplate;
$this->error = new Error(Err::UnknownTemplate);
return false;
}
/* (2) On vérifie que la méthode existe */
if( !method_exists($class, $method) ){
$this->error = Error::UnknownTemplate;
$this->error = new Error(Err::UnknownTemplate);
return false;
}

View File

@ -1,8 +1,9 @@
<?php
namespace viewer\view\group;
use \api\core\ModuleRequest;
use \api\core\Request;
use \error\core\Error;
use \error\core\Err;
use \api\core\Authentification;
class group_choice{
@ -24,11 +25,11 @@
=========================================================*/
$twig->addFunction(new \Twig_Function('f_clusters', function($class){
/* (1) On récupère les groupes */
$getClustersReq = new ModuleRequest('clusterDefault/getAll', ['class' => $class]);
$getClustersReq = new Request('clusterDefault/getAll', ['class' => $class]);
$getClusters = $getClustersReq->dispatch();
/* (2) si erreur, on retourne rien par défaut */
if( $getClusters->error != Error::Success )
if( $getClusters->error->get() != Err::Success )
return [];
/* (3) On enregistre le résultat */

0
build/viewer/view/group/group_choice.twig Normal file → Executable file
View File

19
build/viewer/view/group/members_choice.php Normal file → Executable file
View File

@ -2,7 +2,8 @@
namespace viewer\view\group;
use \viewer\core\Viewer;
use \api\core\ModuleRequest;
use \api\core\Request;
use \error\core\Err;
use \error\core\Error;
use \api\core\Authentification;
@ -16,14 +17,14 @@
return Viewer::$htmlError;
/* (2) On récupère le groupe */
$checktypeRequest = new ModuleRequest('clusterDefault/getById', [
$checktypeRequest = new Request('clusterDefault/getById', [
'id_cluster' => $params['id_cluster'],
'class' => $params['class']
]);
$checktypeResponse = $checktypeRequest->dispatch();
/* (3) Si on ne le trouve pas, on retourne une erreur */
if( $checktypeResponse->error != Error::Success )
if( $checktypeResponse->error->get() != Err::Success )
return Viewer::$htmlError;
/* (4) On récupère les données du groupe */
@ -52,14 +53,14 @@
=========================================================*/
/* (1) On exécute la requête */
$getmembersRequest = new ModuleRequest('clusterDefault/getMembers', [
$getmembersRequest = new Request('clusterDefault/getMembers', [
'id_cluster' => $id_cluster,
'class' => $class
]);
$getmembersResponse = $getmembersRequest->dispatch();
/* (2) Si erreur, on retourne rien par défaut */
if( $getmembersResponse->error != Error::Success )
if( $getmembersResponse->error->get() != Err::Success )
return [];
/* (3) On récupère la liste des UID uniquement */
@ -74,12 +75,12 @@
if( $class == 0 ){
/* (2) On exécute la requête */
$getusersRequest = new ModuleRequest('userDefault/getAll');
$getusersRequest = new Request('userDefault/getAll');
// On recupere la reponse
$getusersResponse = $getusersRequest->dispatch();
/* (3) si erreur, on affiche l'explicitation */
if( $getusersResponse->error != Error::Success )
if( $getusersResponse->error->get() != Err::Success )
return [];
/* (4) On récupère la liste des utilisateurs */
@ -97,12 +98,12 @@
}else{
/* (2) On exécute la requête */
$getmachinesRequest = new ModuleRequest('machineDefault/getAll');
$getmachinesRequest = new Request('machineDefault/getAll');
// On recupere la reponse
$getmachinesResponse = $getmachinesRequest->dispatch();
/* (3) si erreur, on affiche l'explicitation */
if( $getmachinesResponse->error != Error::Success )
if( $getmachinesResponse->error->get() != Err::Success )
return [];
/* (4) On récupère la liste des machines */

0
build/viewer/view/group/members_choice.twig Normal file → Executable file
View File

View File

@ -2,8 +2,9 @@
namespace viewer\view\group;
use \viewer\core\Viewer;
use \api\core\ModuleRequest;
use \api\core\Request;
use \api\core\Authentification;
use \error\core\Err;
use \error\core\Error;
class permission{
@ -32,14 +33,14 @@
/* [3] Store functions
=========================================================*/
$twig->addFunction(new \Twig_Function('f_clusters', function(){
$request = new ModuleRequest('clusterDefault/getAll', [
$request = new Request('clusterDefault/getAll', [
'class' => 1
]);
$answer = $request->dispatch();
// si erreur, on affiche rien par défaut
if( $answer->error != Error::Success )
if( $answer->error->get() != Err::Success )
return [];
return $answer->get('clusters');
@ -47,7 +48,7 @@
}));
$twig->addFunction(new \Twig_Function('f_nbmachines', function($id_cluster){
$machineReq = new ModuleRequest('clusterDefault/getMembers', [
$machineReq = new Request('clusterDefault/getMembers', [
'id_cluster' => (int) $id_cluster,
'class' => 1
]);
@ -55,26 +56,26 @@
$machineRes = $machineReq->dispatch();
// si erreur, on affiche rien par défaut
if( $machineRes->error != Error::Success )
if( $machineRes->error->get() != Err::Success )
return [];
return count($machineRes->get('members'));
}));
$twig->addFunction(new \Twig_Function('f_permissions', function(){
$permReq = new ModuleRequest('clusterDefault/getPermissions', []);
$permReq = new Request('clusterDefault/getPermissions', []);
$permRes = $permReq->dispatch();
// si erreur, on affiche rien par défaut
if( $permRes->error != Error::Success )
if( $permRes->error->get() != Err::Success )
return [];
return $permRes->get('permissions');
}));
$twig->addFunction(new \Twig_Function('f_userclusters', function($id_cluster, $id_permission){
$ucReq = new ModuleRequest('clusterDefault/getAuthenticatedClusters', [
$ucReq = new Request('clusterDefault/getAuthenticatedClusters', [
'id_target' => $id_cluster,
'id_action' => $id_permission
]);
@ -82,7 +83,7 @@
$ucRes = $ucReq->dispatch();
// si erreur, on affiche rien par défaut
if( $ucRes->error != Error::Success )
if( $ucRes->error->get() != Err::Success )
return [];
return $ucRes->get('clusters');

0
build/viewer/view/group/permission.twig Normal file → Executable file
View File

View File

@ -1,8 +1,9 @@
<?php
namespace viewer\view\group;
use \api\core\ModuleRequest;
use \api\core\Request;
use \api\core\Authentification;
use \error\core\Err;
use \error\core\Error;
class view{
@ -31,11 +32,11 @@
=========================================================*/
$twig->addFunction(new \Twig_Function('f_clusters', function($class){
/* (1) On récupère les groupes */
$getClustersReq = new ModuleRequest('clusterDefault/getAll', ['class' => $class]);
$getClustersReq = new Request('clusterDefault/getAll', ['class' => $class]);
$getClusters = $getClustersReq->dispatch();
/* (2) si erreur, on retourne rien par défaut */
if( $getClusters->error != Error::Success )
if( $getClusters->error->get() != Err::Success )
return [];
/* (3) On enregistre le résultat */
@ -43,7 +44,7 @@
}));
$twig->addFunction(new \Twig_Function('f_members', function($id_cluster, $class){
$membersReq = new ModuleRequest('clusterDefault/getMembers', [
$membersReq = new Request('clusterDefault/getMembers', [
'id_cluster' => (int) $id_cluster,
'class' => $class
]);
@ -51,7 +52,7 @@
$membersRes = $membersReq->dispatch();
//
// si erreur, on affiche rien par défaut
if( $membersRes->error != Error::Success )
if( $membersRes->error->get() != Err::Success )
return [];
return $membersRes->get('members');

0
build/viewer/view/group/view.twig Normal file → Executable file
View File

7
build/viewer/view/history/view.php Normal file → Executable file
View File

@ -2,8 +2,9 @@
namespace viewer\view\history;
use \api\core\ModuleRequest;
use \api\core\Request;
use \error\core\Error;
use \error\core\Err;
class view{
@ -24,12 +25,12 @@
/* [3] Store functions
=========================================================*/
$twig->addFunction(new \Twig_Function('f_history', function(){
$req = new ModuleRequest('historyDefault/getAll', []);
$req = new Request('historyDefault/getAll', []);
$res = $req->dispatch();
// si erreur, on retourne rien par défaut
if( $res->error != Error::Success )
if( $res->error->get() != Err::Success )
return [];
return $res->get('history');

0
build/viewer/view/history/view.twig Normal file → Executable file
View File

View File

@ -2,9 +2,10 @@
namespace viewer\view\machine;
use \viewer\core\Viewer;
use \api\core\ModuleRequest;
use \api\core\Request;
use \api\core\Authentification;
use \error\core\Error;
use \error\core\Err;
class groups{
@ -31,14 +32,14 @@
/* [3] Store functions
=========================================================*/
$twig->addFunction(new \Twig_Function('f_clusters', function(){
$request = new ModuleRequest('clusterDefault/getAll', [
$request = new Request('clusterDefault/getAll', [
'class' => 1
]);
$answer = $request->dispatch();
// si erreur, on affiche rien par défaut
if( $answer->error != Error::Success )
if( $answer->error->get() != Err::Success )
return [];
return $answer->get('clusters');
@ -46,14 +47,14 @@
}));
$twig->addFunction(new \Twig_Function('f_machines', function($id_cluster){
$usersReq = new ModuleRequest('clusterDefault/getMembers', [
$usersReq = new Request('clusterDefault/getMembers', [
'id_cluster' => (int) $id_cluster,
'class' => 1
]);
$usersRes = $usersReq->dispatch();
// si erreur, on affiche rien par défaut
if( $usersRes->error != Error::Success )
if( $usersRes->error->get() != Err::Success )
return [];
return $usersRes->get('members');

0
build/viewer/view/machine/groups.twig Normal file → Executable file
View File

View File

@ -2,9 +2,9 @@
namespace viewer\view\machine;
use \viewer\core\Viewer;
use \api\core\ModuleRequest;
use \api\core\Authentification;
use \api\core\Request;
use \error\core\Error;
use \error\core\Err;
class view{
@ -30,24 +30,24 @@
/* [3] Store functions
=========================================================*/
$twig->addFunction(new \Twig_Function('f_machines', function(){
$request = new ModuleRequest('machineDefault/getAll'); // On utilise la methode 'getAll' du module 'machineDefault'
$request = new Request('machineDefault/getAll'); // On utilise la methode 'getAll' du module 'machineDefault'
$answer = $request->dispatch(); // On recupere la reponse
// si erreur, on affiche rien par défaut
if( $answer->error != Error::Success )
if( $answer->error->get() != Err::Success )
return [];
return $answer->get('machines');
}));
$twig->addFunction(new \Twig_Function('f_clusters', function($id_machine){
$clustersReq = new ModuleRequest('machineDefault/getClusters', [
$clustersReq = new Request('machineDefault/getClusters', [
'id_machine' => (int) $id_machine
]);
$clustersRes = $clustersReq->dispatch();
// si erreur, on affiche rien par défaut
if( $clustersRes->error != Error::Success )
if( $clustersRes->error->get() != Err::Success )
return [];
return $clustersRes->get('clusters');

0
build/viewer/view/machine/view.twig Normal file → Executable file
View File

View File

@ -2,9 +2,10 @@
namespace viewer\view\user;
use \viewer\core\Viewer;
use \api\core\ModuleRequest;
use \api\core\Request;
use \api\core\Authentification;
use \error\core\Error;
use \error\core\Err;
class groups{
@ -31,14 +32,14 @@
/* [3] Store functions
=========================================================*/
$twig->addFunction(new \Twig_Function('f_clusters', function(){
$request = new ModuleRequest('clusterDefault/getAll', [
$request = new Request('clusterDefault/getAll', [
'class' => 0
]);
$answer = $request->dispatch();
// si erreur, on affiche rien par défaut
if( $answer->error != Error::Success )
if( $answer->error->get() != Err::Success )
return [];
return $answer->get('clusters');
@ -46,14 +47,14 @@
}));
$twig->addFunction(new \Twig_Function('f_users', function($id_cluster){
$usersReq = new ModuleRequest('clusterDefault/getMembers', [
$usersReq = new Request('clusterDefault/getMembers', [
'id_cluster' => (int) $id_cluster,
'class' => 0
]);
$usersRes = $usersReq->dispatch();
// si erreur, on affiche rien par défaut
if( $usersRes->error != Error::Success )
if( $usersRes->error->get() != Err::Success )
return [];
return $usersRes->get('members');

0
build/viewer/view/user/groups.twig Normal file → Executable file
View File

View File

@ -1,9 +1,10 @@
<?php
namespace viewer\view\user;
use \api\core\ModuleRequest;
use \api\core\Request;
use \api\core\Authentification;
use \error\core\Error;
use \error\core\Err;
class view{
@ -32,22 +33,22 @@
=========================================================*/
$twig->addFunction(new \Twig_Function('f_users', function(){
$request = new ModuleRequest('userDefault/getAll'); // On utilise la methode 'getAll' du module 'userDefault'
$request = new Request('userDefault/getAll'); // On utilise la methode 'getAll' du module 'userDefault'
$answer = $request->dispatch(); // On recupere la reponse
// si erreur, on affiche rien
if( $answer->error != Error::Success )
if( $answer->error->get() != Err::Success )
return [];
return $answer->get('users');
}));
$twig->addFunction(new \Twig_Function('f_clusters', function($id_user){
$clustersReq = new ModuleRequest('userDefault/getClusters', [ 'id_user' => $id_user ]);
$clustersReq = new Request('userDefault/getClusters', [ 'id_user' => $id_user ]);
$clustersRes = $clustersReq->dispatch();
/* (2) Gestion si erreur */
if( $clustersRes->error != Error::Success )
if( $clustersRes->error->get() != Err::Success )
return [];
return $clustersRes->get('clusters');

0
build/viewer/view/user/view.twig Normal file → Executable file
View File

View File

@ -1,20 +1,20 @@
{
"module": {
"method": {
"POST::method": {
"description": "Test de l'API",
"permissions": ["warehouse"],
"permissions": [],
"parameters": {}
},
"markdown": {
"POST::markdown": {
"description": "Retourne une description en markdown des différents modules de l'API",
"permissions": ["warehouse", "admin"],
"options": { "download": true },
"parameters": {}
},
"apiBlueprint": {
"POST::apiBlueprint": {
"description": "Retourne une documentation de l'API au format API Blueprint.",
"permissions": ["warehouse", "admin"],
"options": { "download": true },
@ -25,7 +25,7 @@
"upload": {
"call_log": {
"POST::call_log": {
"description": "Upload d'un journal d'appel au format .xml. Retour des données de call_log/unserialize",
"permissions": ["admin"],
"parameters": {
@ -42,7 +42,7 @@
"download": {
"multiple": {
"POST::multiple": {
"description": "Download des données relatives aux sujets donnés.",
"permissions": ["admin"],
"options": { "download": true },
@ -58,7 +58,7 @@
"authentificationDefault": {
"warehouse": {
"POST::warehouse": {
"description": "Connexion de premier niveau : entrepot.",
"permissions": [],
"parameters": {
@ -70,7 +70,7 @@
}
},
"admin": {
"POST::admin": {
"description": "Connexion de second niveau : administrateur.",
"permissions": ["warehouse"],
"parameters": {
@ -86,7 +86,7 @@
"userDefault": {
"create": {
"POST::create": {
"description": "Création d'un nouvel utilisateur.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -101,7 +101,7 @@
}
},
"link": {
"POST::link": {
"description": "Ajout d'un utilisateur à un groupe.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -112,7 +112,7 @@
},
"unlink": {
"POST::unlink": {
"description": "Retrait d'un utilisateur d'un groupe",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -122,7 +122,7 @@
"output": {}
},
"search": {
"POST::search": {
"description": "Recherche d'un utilisateur par mots-clés.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -133,7 +133,7 @@
}
},
"getAll": {
"POST::getAll": {
"description": "Liste de tous les utilisateurs",
"permissions": ["warehouse", "admin"],
"parameters": {},
@ -142,7 +142,7 @@
}
},
"getById": {
"POST::getById": {
"description": "Retourne un utilisateur spécifique.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -153,7 +153,7 @@
}
},
"getByCode": {
"POST::getByCode": {
"description": "Retourne un utilisateur de Code RFID donné.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -164,7 +164,7 @@
}
},
"getByUsername": {
"POST::getByUsername": {
"description": "Retourne un utilisateur d'identifiant donné.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -175,7 +175,7 @@
}
},
"getClusters": {
"POST::getClusters": {
"description": "Retourne les groupes d'un utilisateur.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -186,7 +186,7 @@
}
},
"edit": {
"POST::edit": {
"description": "Modifie les attributs d'un utilisateur.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -205,7 +205,7 @@
}
},
"delete": {
"POST::delete": {
"description": "Suppression d'un utilisateur.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -221,7 +221,7 @@
"machineDefault": {
"sync": {
"POST::sync": {
"description": "Synchronisation d'une machine.",
"permissions": ["warehouse"],
"parameters": {
@ -234,7 +234,7 @@
}
},
"init": {
"POST::init": {
"description": "Données d'initialisation d'une machine.",
"permissions": ["warehouse"],
"parameters": {
@ -245,7 +245,7 @@
}
},
"create": {
"POST::create": {
"description": "Création d'une nouvelle machine.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -256,7 +256,7 @@
}
},
"link": {
"POST::link": {
"description": "Ajout d'une machine à un groupe.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -266,7 +266,7 @@
"output": {}
},
"unlink": {
"POST::unlink": {
"description": "Retrait d'une machine d'un groupe.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -276,7 +276,7 @@
"output": {}
},
"search": {
"POST::search": {
"description": "Recherche une machine par mots-clés.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -287,7 +287,7 @@
}
},
"getAll": {
"POST::getAll": {
"description": "Retourne la liste de toutes les machines.",
"permissions": ["warehouse", "admin"],
"parameters": {},
@ -296,7 +296,7 @@
}
},
"getById": {
"POST::getById": {
"description": "Retourne les données d'une machine.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -307,7 +307,7 @@
}
},
"getByName": {
"POST::getByName": {
"description": "Retourne les données d'une machine de nom donné.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -318,7 +318,7 @@
}
},
"getClusters": {
"POST::getClusters": {
"description": "Retourne les groupes d'une machine.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -329,7 +329,7 @@
}
},
"edit": {
"POST::edit": {
"description": "Modifie les attributs d'une machine.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -339,7 +339,7 @@
"output": {}
},
"delete": {
"POST::delete": {
"description": "Supprime une machine.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -355,7 +355,7 @@
"clusterDefault": {
"create": {
"POST::create": {
"description": "Création d'un nouveau groupe.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -367,7 +367,7 @@
}
},
"search": {
"POST::search": {
"description": "Recherche d'un groupe par mots-clés.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -379,7 +379,7 @@
}
},
"getAll": {
"POST::getAll": {
"description": "Liste de tous les groupes",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -391,7 +391,7 @@
}
},
"getById": {
"POST::getById": {
"description": "Retourne un groupe spécifique.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -403,7 +403,7 @@
}
},
"getByName": {
"POST::getByName": {
"description": "Retourne un groupe de nom donné.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -415,7 +415,7 @@
}
},
"getMembers": {
"POST::getMembers": {
"description": "Retourne les membres d'un groupe.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -427,7 +427,7 @@
}
},
"edit": {
"POST::edit": {
"description": "Modifie le nom d'un groupe.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -440,7 +440,7 @@
}
},
"delete": {
"POST::delete": {
"description": "Suppression d'un groupe.",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -452,7 +452,7 @@
}
},
"addPermission": {
"POST::addPermission": {
"description": "Ajout d'une permission",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -463,7 +463,7 @@
"output": {}
},
"remPermission": {
"POST::remPermission": {
"description": "Suppression d'une permission",
"permissions": ["warehouse", "admin"],
"parameters": {
@ -474,7 +474,7 @@
"output": {}
},
"getPermissions": {
"POST::getPermissions": {
"description": "Retourne la liste des permissions",
"permissions": ["warehouse","admin"],
"parameters": {},
@ -483,7 +483,7 @@
}
},
"getAuthenticatedClusters": {
"POST::getAuthenticatedClusters": {
"description": "Retourne les groupes d'utilisateurs ayant une action sur un groupe de machine.",
"permissions": ["warehouse","admin"],
"parameters": {
@ -498,7 +498,7 @@
},
"historyDefault": {
"getAll": {
"POST::getAll": {
"description": "Retourne l'historique complet",
"permissions": ["warehouse", "admin"],
"parameters": {},

0
lib/composer.json Normal file → Executable file
View File

0
public_html/css/font.scss Normal file → Executable file
View File

0
public_html/css/font/Open Sans/Apache License.txt Normal file → Executable file
View File

0
public_html/css/font/Open Sans/L.ttf Normal file → Executable file
View File

0
public_html/css/font/Open Sans/Li.ttf Normal file → Executable file
View File

0
public_html/css/font/Open Sans/R.ttf Normal file → Executable file
View File

0
public_html/css/font/Open Sans/SB.ttf Normal file → Executable file
View File

0
public_html/css/font/Open Sans/b.ttf Normal file → Executable file
View File

0
public_html/css/font/Open Sans/bi.ttf Normal file → Executable file
View File

0
public_html/css/font/Open Sans/i.ttf Normal file → Executable file
View File

0
public_html/css/min/fonts.css Normal file → Executable file
View File

View File

@ -4,11 +4,9 @@
debug();
use \router\core\Router;
use \api\core\ModuleRequest;
use \api\core\ModuleResponse;
use \api\core\Request;
use \api\core\Response;
use \database\core\DatabaseDriver;
use \error\core\Error;
use \api\core\Authentification;
@ -26,8 +24,10 @@
/* [1] Gestion des authentifications et des droits
=========================================================*/
/* (1) On met à jour l'authentification et les permissions */
Authentification::check();
$auth = Authentification::auth();
$authsys = new Authentification();
$auth = $authsys::auth();
Request::setAuthSystem($authsys);
/* (2) On définit la page d'accueil */
@ -87,7 +87,7 @@
// logout from admin
$R->get('logout/?', function(){
(new ModuleRequest('authentificationDefault/admin', ['username' => '0', 'password' => '']))->dispatch();
(new Request('authentificationDefault/admin', ['username' => '0', 'password' => '']))->dispatch();
header('Location: /');
});
@ -109,7 +109,7 @@
// warehouse logout
$R->get('logout/?', function(){
(new ModuleRequest('authentificationDefault/warehouse', ['name' => '000', 'password' => '']))->dispatch();
(new Request('authentificationDefault/warehouse', ['name' => '000', 'password' => '']))->dispatch();
header('Location: /');
});
@ -133,12 +133,12 @@
/* (4) api/module/method -> Api */
$R->post('api(?:/(.*))/?', function($url){
$request = ModuleRequest::fromPost($url, $_POST);
$R->post('api(?:(/.*))/?', function($url){
$request = Request::remote($url[0], $_POST);
$answer = $request->dispatch();
// Si c'est une réponse (et non un download)
if( $answer instanceof ModuleResponse ){
if( $answer instanceof Response ){
header('Content-Type: application/json; charset=UTF-8');
echo $answer->serialize();
}

View File

@ -1,17 +1,17 @@
<?php define('__ROOT__', dirname(dirname(dirname(__FILE__))) );
require_once __ROOT__.'/autoloader.php';
<?php define('__ROOT__', dirname(dirname(dirname(__DIR__))) );
require_once __ROOT__.'/autoloader.php';
$_SESSION['history'] = [];
$_SESSION['history'] = [];
if( !isset($_COOKIE['mac_password']) || !isset($_COOKIE['mac_count']) ){
$_COOKIE['mac_count'] = 10;
$_COOKIE['mac_password'] = 'macPassword';
if( !isset($_COOKIE['mac_password']) || !isset($_COOKIE['mac_count']) ){
$_COOKIE['mac_count'] = 10;
$_COOKIE['mac_password'] = 'macPassword';
setcookie('mac_count', $_COOKIE['mac_count'], time()+3600*24*365, '/');
setcookie('mac_password', $_COOKIE['mac_password'], time()+3600*24*365, '/');
setcookie('mac_count', $_COOKIE['mac_count'], time()+3600*24*365, '/');
setcookie('mac_password', $_COOKIE['mac_password'], time()+3600*24*365, '/');
header('Refresh: 0');
}
header('Refresh: 0');
}
?>
@ -21,402 +21,402 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Virtual Client</title>
<head>
<meta charset="utf-8">
<title>Virtual Client</title>
<script type='text/javascript' src='/js/lib/reset.js' ></script> <!-- Corrections Javascript natif (ajouts) -->
<script type='text/javascript' src='/js/lib/api.js' ></script> <!-- Gestion des transactions avec le serveur -->
<script type='text/javascript' src='/js/lib/page-manager.js' ></script> <!-- Gestion réseau/chargement/liens/URL -->
<script type='text/javascript' src='/js/lib/form-deflater.js' ></script> <!-- Gestion des formulaires (Object) -->
<script type='text/javascript' src='/js/lib/local-storage-interface.js' ></script> <!-- Interface pour le 'localStorage' -->
<script type='text/javascript' src='/test/client/lib.js' ></script> <!-- Dépendance Directe -->
<style type='text/css'>
body{
background: #1c384b;
font-size: 16px;
font-family: 'Roboto';
}
<script type='text/javascript' src='/js/lib/reset.js' ></script> <!-- Corrections Javascript natif (ajouts) -->
<script type='text/javascript' src='/js/lib/api.js' ></script> <!-- Gestion des transactions avec le serveur -->
<script type='text/javascript' src='/js/lib/page-manager.js' ></script> <!-- Gestion réseau/chargement/liens/URL -->
<script type='text/javascript' src='/js/lib/form-deflater.js' ></script> <!-- Gestion des formulaires (Object) -->
<script type='text/javascript' src='/js/lib/local-storage-interface.js' ></script> <!-- Interface pour le 'localStorage' -->
<script type='text/javascript' src='/test/client/lib.js' ></script> <!-- Dépendance Directe -->
<style type='text/css'>
body{
background: #1c384b;
font-size: 16px;
font-family: 'Roboto';
}
#machine-box{
position: absolute;
top: 40%;
left: 60%;
width: 20em;
height: 35em;
#machine-box{
position: absolute;
top: 40%;
left: 60%;
width: 20em;
height: 35em;
border-radius: 10px;
border: 2px solid #1a1a1a;
box-shadow: 0 0 2em #172e3d;
border-radius: 10px;
border: 2px solid #1a1a1a;
box-shadow: 0 0 2em #172e3d;
background: #222;
background: #222;
transform: translateX(-50%) translateY(-50%);
transform: translateX(-50%) translateY(-50%);
cursor: pointer;
}
cursor: pointer;
}
#machine-box > #led{
position: absolute;
top: calc( 20% - 1.5em/2 - 2px/2 );
left: calc( 75% - 1.5em/2 - 2px/2 );
width: 1.5em;
height: 1.5em;
#machine-box > #led{
position: absolute;
top: calc( 20% - 1.5em/2 - 2px/2 );
left: calc( 75% - 1.5em/2 - 2px/2 );
width: 1.5em;
height: 1.5em;
border-radius: 50% / 50%;
border: 2px solid #111;
border-radius: 50% / 50%;
border: 2px solid #111;
background: #000;
}
background: #000;
}
#machine-box > #r1,
#machine-box > #r2{
position: absolute;
top: calc( 25% - 3em/2 );
left: 100%;
width: 4em;
height: 3em;
#machine-box > #r1,
#machine-box > #r2{
position: absolute;
top: calc( 25% - 3em/2 );
left: 100%;
width: 4em;
height: 3em;
background: #000;
background: #000;
color: #ccc;
text-align: center;
line-height: 3em;
}
#machine-box > #r2{
top: calc( 50% - 3em/2 );
}
#machine-box > #r1.active,
#machine-box > #r2.active{
font-weight: bold;
color: #18eea9;
}
#card-stack{
position: absolute;
top: 50%;
left: 20%;
width: 20em;
height: 35em;
transform: translateX(-50%) translateY(-50%);
}
#card-stack > .card{
display: inline-block;
position: relative;
width: 100%;
height: 4em;
margin-bottom: .2em;
border-radius: 10px 10px 0 0;
box-shadow: 0 2px 10px #111;
background: #eee;
color: #333;
font-weight: bold;
line-height: 4em;
color: #ccc;
text-align: center;
transition: all .2s ease-in-out;
cursor: pointer;
}
#card-stack > .card:hover{
background: #fff;
color: #000;
}
#card-stack > .card.active{
background: #aaa;
color: #000;
}
#card-stack > input{
display: inline-block;
position: relative;
width: calc( 100% - 1em*2 );
height: calc( 3em - 1em*2 );
padding: 1em;
margin-bottom: 2em;
border-radius: 3px;
border: 0;
background: #eee;
}
#sync-button,
#card-pass{
position: absolute;
top: calc( 50% + 29em );
left: 60%;
padding: 1.5em;
border-radius: 3px;
border: 2px solid #fff;
background: #1ee18e;
color: #fff;
font-weight: bold;
letter-spacing: .15em;
text-transform: uppercase;
transition: all .2s ease-in-out;
transform: translateX(-50%) translateY(-50%);
cursor: pointer;
}
#card-pass{
top: calc( 40% + 29em );
background: #3595ce;
}
#sync-button:hover{
background: #1ac47c;
}
#card-pass:hover{
background: #2d7dad;
}
line-height: 3em;
}
#machine-box > #r2{
top: calc( 50% - 3em/2 );
}
</style>
#machine-box > #r1.active,
#machine-box > #r2.active{
font-weight: bold;
color: #18eea9;
}
</head>
<body>
#card-stack{
position: absolute;
top: 50%;
left: 20%;
width: 20em;
height: 35em;
transform: translateX(-50%) translateY(-50%);
}
#card-stack > .card{
display: inline-block;
position: relative;
width: 100%;
height: 4em;
margin-bottom: .2em;
border-radius: 10px 10px 0 0;
box-shadow: 0 2px 10px #111;
background: #eee;
color: #333;
font-weight: bold;
line-height: 4em;
text-align: center;
transition: all .2s ease-in-out;
cursor: pointer;
}
#card-stack > .card:hover{
background: #fff;
color: #000;
}
#card-stack > .card.active{
background: #aaa;
color: #000;
}
#card-stack > input{
display: inline-block;
position: relative;
width: calc( 100% - 1em*2 );
height: calc( 3em - 1em*2 );
padding: 1em;
margin-bottom: 2em;
border-radius: 3px;
border: 0;
background: #eee;
}
#sync-button,
#card-pass{
position: absolute;
top: calc( 50% + 29em );
left: 60%;
padding: 1.5em;
border-radius: 3px;
border: 2px solid #fff;
background: #1ee18e;
color: #fff;
font-weight: bold;
letter-spacing: .15em;
text-transform: uppercase;
transition: all .2s ease-in-out;
transform: translateX(-50%) translateY(-50%);
cursor: pointer;
}
#card-pass{
top: calc( 40% + 29em );
background: #3595ce;
}
#sync-button:hover{
background: #1ac47c;
}
#card-pass:hover{
background: #2d7dad;
}
<div id='machine-box'>
<div id='led'></div>
<div id='r1'>r1</div>
<div id='r2'>r2</div>
</div>
</style>
</head>
<body>
<div id='card-stack'>
<input id='add-card' placeholder='Code RFID' type='text'>
<div class='card'>AB-CD-EF-GH</div>
<div class='card'>10-FE-BD-61</div>
<div class='card'>92-55-B9-B3</div>
</div>
<div id='machine-box'>
<div id='led'></div>
<div id='r1'>r1</div>
<div id='r2'>r2</div>
</div>
<input type='button' id='card-pass' value='Passer la carte'>
<input type='button' id='sync-button' value='Synchronisation'>
<div id='card-stack'>
<input id='add-card' placeholder='Code RFID' type='text'>
<div class='card'>AB-CD-EF-GH</div>
<div class='card'>10-FE-BD-61</div>
<div class='card'>92-55-B9-B3</div>
</div>
<input type='button' id='card-pass' value='Passer la carte'>
<input type='button' id='sync-button' value='Synchronisation'>
<script type='text/javascript'>
/* [0] Initialisation et éléments
=========================================================*/
/* (1) Etats du système */
var STATE = [ 0, 0, 0 ];
<script type='text/javascript'>
/* [0] Initialisation et éléments
=========================================================*/
/* (1) Etats du système */
var STATE = [ 0, 0, 0 ];
/* (2) Elements du DOM */
var mBox = document.getElementById('machine-box');
var led = document.getElementById('led');
var r1 = document.getElementById('r1');
var r2 = document.getElementById('r2');
var cBox = document.getElementById('card-stack');
var cAdd = document.getElementById('add-card');
var sync = document.getElementById('sync-button');
var pass = document.getElementById('card-pass');
/* (2) Elements du DOM */
var mBox = document.getElementById('machine-box');
var led = document.getElementById('led');
var r1 = document.getElementById('r1');
var r2 = document.getElementById('r2');
var cBox = document.getElementById('card-stack');
var cAdd = document.getElementById('add-card');
var sync = document.getElementById('sync-button');
var pass = document.getElementById('card-pass');
/* (3) Variables de suivi */
var CARD = null;
var lastCard = null;
var lsi = new localStorageInterface();
lsi.createDataset('STATES.CNF' );
lsi.createDataset('ACTIONS.CNF');
lsi.createDataset('CHIPS.CNF');
lsi.createDataset('PERMISSIONS.CNF');
lsi.createDataset('SERVER.CNF' );
lsi.createDataset('HISTORY.LOG');
lsi.createDataset('STATES.LOG' );
/* (3) Variables de suivi */
var CARD = null;
var lastCard = null;
var lsi = new localStorageInterface();
lsi.createDataset('STATES.CNF' );
lsi.createDataset('ACTIONS.CNF');
lsi.createDataset('CHIPS.CNF');
lsi.createDataset('PERMISSIONS.CNF');
lsi.createDataset('SERVER.CNF' );
lsi.createDataset('HISTORY.LOG');
lsi.createDataset('STATES.LOG' );
/* (4) Récupération des données de fonctionnement */
var api = new APIClass('/api/');
/* (4) Récupération des données de fonctionnement */
var api = new APIClass('/api/');
var ACTIONS, STATES, CHIPS, PERMISSIONS;
var ACTIONS, STATES, CHIPS, PERMISSIONS;
api.send({path: 'machineDefault/init', id_machine: 1}, function(response){
lsi.import('ACTIONS.CNF', response.actions);
lsi.import('STATES.CNF', response.states);
lsi.import('CHIPS.CNF', response.chips);
lsi.import('PERMISSIONS.CNF', response.permissions);
api.send({path: 'machineDefault/init', id_machine: 1}, function(response){
lsi.import('ACTIONS.CNF', response.actions);
lsi.import('STATES.CNF', response.states);
lsi.import('CHIPS.CNF', response.chips);
lsi.import('PERMISSIONS.CNF', response.permissions);
ACTIONS = lsi.export('ACTIONS.CNF');
STATES = lsi.export('STATES.CNF');
CHIPS = lsi.export('CHIPS.CNF');
PERMISSIONS = lsi.export('PERMISSIONS.CNF');
}, '643405e1004845c2291c244faab192e3ad493b9dec147c8030475794b0f2fa23');
ACTIONS = lsi.export('ACTIONS.CNF');
STATES = lsi.export('STATES.CNF');
CHIPS = lsi.export('CHIPS.CNF');
PERMISSIONS = lsi.export('PERMISSIONS.CNF');
}, '643405e1004845c2291c244faab192e3ad493b9dec147c8030475794b0f2fa23');
/* (5) On initialise la carte + les puces */
var board = new Board(50);
/* (5) On initialise la carte + les puces */
var board = new Board(50);
var CHIP = {
led: new LedInterface( new Chip('serial', [1, 2, 3]), led ),
r1: new RelayInterface( new Chip('serial', [4]), r1 ),
r2: new RelayInterface( new Chip('serial', [5]), r2 )
};
var CHIP = {
led: new LedInterface( new Chip('serial', [1, 2, 3]), led ),
r1: new RelayInterface( new Chip('serial', [4]), r1 ),
r2: new RelayInterface( new Chip('serial', [5]), r2 )
};
var chipList = Object.keys(CHIP);
var chipList = Object.keys(CHIP);
// Branchement des puces
for( var i = 0 ; i < chipList.length ; i++ )
board.plug( CHIP[chipList[i]] );
// Branchement des puces
for( var i = 0 ; i < chipList.length ; i++ )
board.plug( CHIP[chipList[i]] );
/* [1] Fonctions
=========================================================*/
/* (1) Gestion de mise à jour de la led en fonction de l'état
---------------------------------------------------------*/
function updateChips(){
var STATES = lsi.export('STATES.CNF');
var CHIPS = lsi.export('CHIPS.CNF');
/* [1] Fonctions
=========================================================*/
/* (1) Gestion de mise à jour de la led en fonction de l'état
---------------------------------------------------------*/
function updateChips(){
var STATES = lsi.export('STATES.CNF');
var CHIPS = lsi.export('CHIPS.CNF');
/* (1) On vérifie quel état correspond */
for( var s in STATES ){
/* (1) On vérifie quel état correspond */
for( var s in STATES ){
/* (2) Si l'état correspond */
if( previous(STATES[s].global_state, STATE) ){
/* (2) Si l'état correspond */
if( previous(STATES[s].global_state, STATE) ){
console.log('STATE', STATE.join(''), 'matches', STATES[s].global_state);
console.log('STATE', STATE.join(''), 'matches', STATES[s].global_state);
/* (3) On applique l'état à chaque CHIP */
for( var c in CHIPS ){
/* (3) On applique l'état à chaque CHIP */
for( var c in CHIPS ){
/* (4) Si la puce a bien cet été de défini */
if( !CHIPS[c].states.hasOwnProperty(STATES[s].chips[c]) )
break;
/* (4) Si la puce a bien cet été de défini */
if( !CHIPS[c].states.hasOwnProperty(STATES[s].chips[c]) )
break;
/* (5) On récupère les PIN + les VALUES */
var pins = CHIPS[c].pins;
var values = CHIPS[c].states[STATES[s].chips[c]];
/* (5) On récupère les PIN + les VALUES */
var pins = CHIPS[c].pins;
var values = CHIPS[c].states[STATES[s].chips[c]];
/* (6) On applique les valeurs */
for( var p in pins )
board.set( parseInt(pins[p]), parseInt(values[p]) );
/* (6) On applique les valeurs */
for( var p in pins )
board.set( parseInt(pins[p]), parseInt(values[p]) );
}
break;
}
break;
}
}
}
/* [2] Gestion de l'ajout de carte
=========================================================*/
cAdd.addEventListener('keyup', function(e){
if( e.keyCode == 13 ) cBox.innerHTML += "<div class='card'>"+e.target.value+"</div>";
}, false);
/* [3] Gestion de la sélection de carte
=========================================================*/
cBox.addEventListener('click', function(e){
if( e.target.className == 'card' ){
CARD = e.target.innerHTML;
var allCards = document.querySelectorAll('#card-stack .card');
for( var i = 0 ; i < allCards.length ; i++ )
allCards[i].remClass('active');
e.target.addClass('active');
}
}, false);
CARD = document.querySelector('#card-stack .card').innerHTML;
document.querySelector('#card-stack .card').addClass('active');
/* [4] Passage de carte
=========================================================*/
var INTERVAL = null;
var COUNT = 0;
/* (0) Routine de comptage de temps
---------------------------------------------------------*/
function countRoutine(){
/* (1) Si le TIMEOUT actuel n'est pas défini, on quitte */
var exists = false;
for( var t in Object.keys(ACTIONS) )
if( t == COUNT ) exists = true;
// Si aucune action pour ce timeout, on quitte
if( !exists ) return;
/* (2) Pour chaque action de ce timeout */
for( var a in Object.keys(ACTIONS[COUNT]) ){
/* (3) On vérifie que l'utilisateur a la permissions d'effectuer l'action */
var hasPermission = PERMISSIONS.hasOwnProperty(CARD) && PERMISSIONS[CARD].actions.indexOf( ACTIONS[COUNT][a].id_action.toString() ) > -1;
// Si on a pas la permission, on quitte
if( !hasPermission ) continue;
/* (4) Si la condition est correcte, On applique la modification de l'état */
if( previous(ACTIONS[COUNT][a].previous, STATE) ){
action(ACTIONS[COUNT][a].action, STATE);
/* (5) On enregistre l'action dans l'historique */
var historyKeys = lsi.keys('HISTORY.LOG').length;
lsi.set('HISTORY.LOG', historyKeys+1, {
id_user: parseInt(PERMISSIONS[CARD].id_user),
id_machine: 1,
id_action: parseInt(ACTIONS[COUNT][a].id_action)
});
break;
}
}
updateChips();
COUNT++;
}
/* (1) Appui carte
---------------------------------------------------------*/
pass.addEventListener('mousedown', function(e){
COUNT = 0;
countRoutine();
INTERVAL = setInterval( countRoutine, 1000 );
}, false);
/* (2) Levé carte
---------------------------------------------------------*/
window.addEventListener('mouseup', function(e){
clearInterval(INTERVAL);
}, false);
/* [5] Synchronisation
=========================================================*/
sync.addEventListener('click', function(e){
/* [2] Gestion de l'ajout de carte
=========================================================*/
cAdd.addEventListener('keyup', function(e){
if( e.keyCode == 13 ) cBox.innerHTML += "<div class='card'>"+e.target.value+"</div>";
}, false);
}, false);
/* [3] Gestion de la sélection de carte
=========================================================*/
cBox.addEventListener('click', function(e){
if( e.target.className == 'card' ){
CARD = e.target.innerHTML;
var allCards = document.querySelectorAll('#card-stack .card');
for( var i = 0 ; i < allCards.length ; i++ )
allCards[i].remClass('active');
e.target.addClass('active');
}
}, false);
CARD = document.querySelector('#card-stack .card').innerHTML;
document.querySelector('#card-stack .card').addClass('active');
/* [4] Passage de carte
=========================================================*/
var INTERVAL = null;
var COUNT = 0;
/* (0) Routine de comptage de temps
---------------------------------------------------------*/
function countRoutine(){
/* (1) Si le TIMEOUT actuel n'est pas défini, on quitte */
var exists = false;
for( var t in Object.keys(ACTIONS) )
if( t == COUNT ) exists = true;
// Si aucune action pour ce timeout, on quitte
if( !exists ) return;
/* (2) Pour chaque action de ce timeout */
for( var a in Object.keys(ACTIONS[COUNT]) ){
/* (3) On vérifie que l'utilisateur a la permissions d'effectuer l'action */
var hasPermission = PERMISSIONS.hasOwnProperty(CARD) && PERMISSIONS[CARD].actions.indexOf( ACTIONS[COUNT][a].id_action.toString() ) > -1;
// Si on a pas la permission, on quitte
if( !hasPermission ) continue;
/* (4) Si la condition est correcte, On applique la modification de l'état */
if( previous(ACTIONS[COUNT][a].previous, STATE) ){
action(ACTIONS[COUNT][a].action, STATE);
/* (5) On enregistre l'action dans l'historique */
var historyKeys = lsi.keys('HISTORY.LOG').length;
lsi.set('HISTORY.LOG', historyKeys+1, {
id_user: parseInt(PERMISSIONS[CARD].id_user),
id_machine: 1,
id_action: parseInt(ACTIONS[COUNT][a].id_action)
});
break;
}
}
updateChips();
COUNT++;
}
/* (1) Appui carte
---------------------------------------------------------*/
pass.addEventListener('mousedown', function(e){
COUNT = 0;
countRoutine();
INTERVAL = setInterval( countRoutine, 1000 );
}, false);
/* (2) Levé carte
---------------------------------------------------------*/
window.addEventListener('mouseup', function(e){
clearInterval(INTERVAL);
}, false);
/* [5] Synchronisation
=========================================================*/
sync.addEventListener('click', function(e){
}, false);
</script>
</body>
</script>
</body>
</html>

View File

@ -152,7 +152,7 @@
api.send(request, function(response){
// Si erreur de module
if( response.ModuleError != 0 ){
if( response.error != 0 ){
errBox.innerHTML = 'Format des champs incorrect.';
aPassword.value = '';
return false;
@ -189,7 +189,7 @@
/* (2) On envoie la requête */
api.send(request, function(response){
if( response.ModuleError == 0 ){
if( response.error == 0 ){
if( response.status == false )
document.location = '/';
}

View File

@ -1,7 +1,6 @@
<?php define('__ROOT__', dirname(dirname(dirname(__FILE__))) );
require_once __ROOT__.'/autoloader.php';
use \api\core\ModuleRequest;
use \error\core\Error;
use \api\core\Request;
use \orm\core\Table;
?>

0
public_html/view/css/admin.css Normal file → Executable file
View File

0
public_html/view/css/analytics.css Normal file → Executable file
View File

0
public_html/view/css/groups.css Normal file → Executable file
View File

0
public_html/view/css/history.css Normal file → Executable file
View File

0
public_html/view/css/machines.css Normal file → Executable file
View File

0
public_html/view/css/profile.css Normal file → Executable file
View File

0
public_html/view/css/settings.css Normal file → Executable file
View File

0
public_html/view/css/users.css Normal file → Executable file
View File

0
public_html/view/css/view.css Normal file → Executable file
View File

0
public_html/view/css/warehouse.css Normal file → Executable file
View File

View File

@ -1,8 +1,7 @@
<?php define('__ROOT__', dirname(dirname(dirname(__FILE__))) );
require_once __ROOT__.'/autoloader.php';
use \viewer\core\Viewer;
use \api\core\ModuleRequest;
use \error\core\Error;
use \api\core\Request;
use \database\core\Repo;
?>
@ -56,7 +55,7 @@
/* [1] VIEW -> Liste des groupes
=========================================================*/
$request = new ModuleRequest('clusterDefault/getAll'); // On utilise la methode 'getAll' du module 'groupDefault'
$request = new Request('clusterDefault/getAll'); // On utilise la methode 'getAll' du module 'groupDefault'
$answer = $request->dispatch(); // On recupere la reponse
echo "<section data-sublink='view' class='list'>";

View File

@ -1,7 +1,6 @@
<?php define('__ROOT__', dirname(dirname(dirname(__FILE__))) );
require_once __ROOT__.'/autoloader.php';
use \api\core\ModuleRequest;
use \error\core\Error;
use \api\core\Request;
use \database\core\DatabaseDriver;
use \database\core\Repo;
use \viewer\core\Viewer;

0
public_html/view/js/admin.js Normal file → Executable file
View File

0
public_html/view/js/profile.js Normal file → Executable file
View File

0
public_html/view/js/settings.js Normal file → Executable file
View File

0
public_html/view/js/view.js Normal file → Executable file
View File

0
public_html/view/js/warehouse.js Normal file → Executable file
View File

View File

@ -1,8 +1,7 @@
<?php define('__ROOT__', dirname(dirname(dirname(__FILE__))) );
require_once __ROOT__.'/autoloader.php';
use \viewer\core\Viewer;
use \api\core\ModuleRequest;
use \error\core\Error;
use \api\core\Request;
use \database\core\Repo;
?>

View File

@ -1,7 +1,6 @@
<?php define('__ROOT__', dirname(dirname(dirname(__FILE__))) );
require_once __ROOT__.'/autoloader.php';
use \api\core\ModuleRequest;
use \error\core\Error;
use \api\core\Request;
?>

View File

@ -1,7 +1,6 @@
<?php define('__ROOT__', dirname(dirname(dirname(__FILE__))) );
require_once __ROOT__.'/autoloader.php';
use \api\core\ModuleRequest;
use \error\core\Error;
use \api\core\Request;
?>
<!-- [1] Gestion du sous-menu de gauche -->

View File

@ -1,7 +1,6 @@
<?php
require_once '../../autoloader.php';
use \api\core\ModuleRequest;
use \error\core\Error;
use \api\core\Request;
use \viewer\core\Viewer;
use \database\core\Repo;
?>

View File

@ -138,8 +138,9 @@
api.send(request, function(response){
console.warn(response);
// Si erreur de module
if( response.ModuleError != 0 ){
if( response.error != 0 ){
errBox.innerHTML = 'Format des champs incorrect.';
wPassword.value = '';
return false;