diff --git a/bin/update.php b/bin/update.php index 4290922..67b5dcd 100644 --- a/bin/update.php +++ b/bin/update.php @@ -3,6 +3,10 @@ use \service\Updater; debug(); + if( !isset($argv[1]) ) + die("Missing argument (server url)\n"); + + $_SERVER = [ 'SERVER_NAME' => $argv[1] ]; $upd = new Updater(); $upd->update(); diff --git a/build/database/core/DatabaseDriver.php b/build/database/core/DatabaseDriver.php new file mode 100644 index 0000000..5388dce --- /dev/null +++ b/build/database/core/DatabaseDriver.php @@ -0,0 +1,180 @@ + Database Server's host + * @dbname Database name + * @username Database username + * @password Database password + * + */ + private function __construct($host, $dbname, $username, $password){ + /* (2) Stores configuration */ + $this->host = $host; + $this->dbname = $dbname; + $this->username = $username; + $this->password = $password; + + try{ + + $this->pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password); + $this->pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC); + + // On signale que tout s'est bien passe + $this->error = new Error(Err::Success); + + }catch(Exception $e){ + // On signale qu'il y a une erreur + $this->error = new Error(Err::PDOConnection); + } + } + + + + /************************************************ + **** Multiton Management (static) **** + ************************************************/ + + /* ADDS A NEW CONNECTION + * + * @label [optional] Database Label + * + * @return status If added successfully + * + */ + private static function add($label=null){ + $conf = self::conf(); + + /* [1] Default values + =========================================================*/ + /* (1) If label isn't given */ + is_null($label) && ($label = 'default'); + + /* (2) If label and no path */ + if( $label !== 'default' && !isset($conf[$label]) ) + return false; + + + /* [3] Instanciates the driver + =========================================================*/ + try{ + + /* (1) If local -> instanciates with local configuration */ + if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') ) + self::$instance[$label] = new DatabaseDriver($conf[$label]['local']['host'], $conf[$label]['local']['dbname'], $conf[$label]['local']['user'], $conf[$label]['local']['password']); + /* (2) If Remote -> instanciates with Remote configuration */ + else + self::$instance[$label] = new DatabaseDriver($conf[$label]['remote']['host'], $conf[$label]['remote']['dbname'], $conf[$label]['remote']['user'], $conf[$label]['remote']['password']); + + return true; + + }catch(\Exception $e){ + + /* (3) If fails */ + return false; + + } + + } + + + /* GET A DATABASE DRIVER INSTANCE + * + * @label [optional] Driver's label + * + * @return driver Multiton + * + */ + public static function get($label=null){ + $conf = self::conf(); + + /* [1] Checks arguments + =========================================================*/ + /* (1) Label default value */ + is_null($label) && ($label = 'default'); + + /* (2) If no label, or unknown label */ + if( is_null($label) || !isset(self::$instance[$label]) ){ + + /* (2.1) Try to add the configuration if exists */ + if( isset($conf[$label]) ){ + self::add($label); + return self::get($label); + } + + + throw new \Exception('Database @label is incorrect.'); + } + + + /* [2] Returns instance + =========================================================*/ + return self::$instance[$label]; + } + + + /** retourne la connection statique + * @param null $label + * @return \PDO + */ + public static function getPDO($label=null){ + $instance = self::get($label); + + return $instance->pdo; + } + + + public function getConfig(){ + return [ + 'host' => $this->host, + 'dbname' => $this->dbname, + 'username' => $this->username + ]; + } + + + + } +?> diff --git a/build/error/core/Err.php b/build/error/core/Err.php new file mode 100644 index 0000000..bd7a56c --- /dev/null +++ b/build/error/core/Err.php @@ -0,0 +1,109 @@ + diff --git a/build/error/core/Error.php b/build/error/core/Error.php new file mode 100644 index 0000000..70f9944 --- /dev/null +++ b/build/error/core/Error.php @@ -0,0 +1,191 @@ + Const error + * @arg1 [OPT] Argument 1 + * @arg2 [OPT] Argument 2 + * @arg... [OPT] Argument ... + * + * @return instance Error instance + * + */ + public function __construct($const){ + call_user_func_array([$this, 'set'], func_get_args()); + } + + /* ERROR GETTER + * + * @return Err Error + * + */ + public function get(){ return $this->error; } + + /* ERROR SETTER + * + * @error Const error + * @arg1 [OPT] Argument 1 + * @arg2 [OPT] Argument 2 + * @arg... [OPT] Argument ... + * + * @return instance 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; + + /* (2) On récupère les arguments */ + $this->arguments = array_slice(func_get_args(), 1); + } + + + /* EXPLICITE UN CODE D'ERREUR + * + * @return explicit Description explicite du code d'erreur + * + */ + 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; + + default: return $this->UnknownDebugError(); break; + } + } + + + 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 ); + } + + } + + +?> diff --git a/build/lightdb/core/lightdb.php b/build/lightdb/core/lightdb.php deleted file mode 100644 index 2363c70..0000000 --- a/build/lightdb/core/lightdb.php +++ /dev/null @@ -1,467 +0,0 @@ - CREER LES FICHIERS S'ILS N'EXISTENT PAS SINON, RECUPERE LES DONNES - * - * @dbname Nom de la base de données - * - */ - public function __construct($dbname, $root=null){ - /* [0] On récupère les attributs - =========================================================*/ - $this->root = is_null($root) ? self::default_root().'/' : $root; - $this->dbname = $dbname; - $this->dir = $this->root.$dbname.'/'; - - - /* [1] Création du répertoire s'il n'existe pas - =========================================================*/ - if( !is_dir($this->dir) ){ - mkdir($this->dir); - \chmod($this->dir, 0775); - } - - /* [2] Création du fichier d'index ou récupération - =========================================================*/ - /* (1) Si le fichier n'existe pas, on le crée */ - if( !file_exists($this->dir.'index') ){ - $fIndex = new \SplFileObject($this->dir.'index', 'w'); - $fIndex->fwrite('[]'); - $fIndex = null; - \chmod($this->dir.'index', 0775); - } - - - /* (2) On récupère le contenu du fichier */ - $fIndex = new \SplFileObject($this->dir.'index'); - $fIndex->seek(0); - - $index = json_decode( $fIndex->fgets(), true ); - - // Si erreur de parsage, on retourne une erreur - if( is_null($index) ) - throw new \Exception("Cannot parse index"); - - $this->index = $index; - - /* [3] Initialisation du gestionnaire d'acces (SplFileObject) - =========================================================*/ - /* (1) Si le fichier n'existe pas, on le crée */ - if( !file_exists($this->dir.'data') ){ - file_put_contents($this->dir.'data', '' ); - \chmod($this->dir.'data', 0775); - } - - /* (2) On place un 'driver' sur le fichier */ - $this->driver = new \SplFileObject($this->dir.'data', 'r+'); - // $this->driver->setFlags( \SplFileObject::SKIP_EMPTY ); - - /* (3) On récupère le nombre de lignes */ - $this->line = -1; - while( !$this->driver->eof() ){ - $this->line++; - $this->driver->fgetcsv(); - } - } - - - public function close(){ $this->driver = null; } - - - - /* [x] Flush the database - * - =========================================================*/ - public function flush(){ - file_put_contents($this->dir.'index', '[]' ); - file_put_contents($this->dir.'data', '' ); - - \chmod($this->dir.'index', 0775); - \chmod($this->dir.'data', 0775); - } - - - /* RETOURNE LA LISTE DES INDEX - * - * @i Index pour lequel on veut la ligne et le hash - * - * @return Index Tableau associatif contenant le hash et la ligne - * - */ - public function index($i=null){ - if( is_null($i) ) - return $this->index; - - return isset($this->index[$i]) ? $this->index[$i] : NULL; - } - - - /* INSERTION D'UNE ENTREE DANS LA BASE DE DONNEES - * - * @key Clé qui permettra l'accès direct - * @data Objet qui sera enregistré dans la base - * - * @return status Retourne TRUE si tout s'est bien passé, sinon FALSE - * - */ - public function insert($key, $data){ - /* (1) On vérifie que la clé est unique */ - if( array_key_exists($key, $this->index) ) - return false; - - $key = (string) $key; - - /* (2) On ajoute les données aux fichier */ - $json_data = json_encode($data); - $this->driver->seek($this->line); - $this->line++; - $written = $this->driver->fwrite( $json_data.PHP_EOL ); - - // Si erreur d'écriture, on retourne FALSE - if( is_null($written) ) - return false; - - /* (3) On enregistre l'index */ - $this->index[$key] = [ - 'line' => $this->line - 1, - 'hash' => sha1($json_data) - ]; - - /* (4) On enregistre le fichier index */ - $fIndex = new \SplFileObject($this->dir.'index', 'w'); - $fIndex->fwrite( json_encode($this->index) ); - $fIndex = null; - - return true; - } - - - /* INSERTION D'UNE ENTREE DANS LA BASE DE DONNEES - * - * @dataset Tableau de 'clés'->'valeurs' à insérer - * @data Objet qui sera enregistré dans la base - * - * @return status Retourne TRUE si tout s'est bien passé, sinon FALSE - * - */ - public function insertAll($dataset){ - /* (1) On vérifie que la clé est unique */ - foreach($dataset as $key=>$data) - if( array_key_exists($key, $this->index) ) - unset($dataset[$key]); - - - /* (2) On ajoute les données aux fichier */ - $this->driver->seek($this->line); - foreach($dataset as $key=>$data){ - $json_data = json_encode($data); - $this->line++; - $written = $this->driver->fwrite( $json_data.PHP_EOL ); - - - /* (3) On enregistre les index */ - $this->index[$key] = [ - 'line' => $this->line - 1, - 'hash' => sha1($json_data) - ]; - } - - - - /* (4) On enregistre le fichier index */ - $fIndex = new \SplFileObject($this->dir.'index', 'w'); - $fIndex->fwrite( json_encode($this->index) ); - $fIndex = null; - - return true; - } - - - /* RENVOIE LES DONNEES ASSOCIEES A UNE CLE DONNEE - * - * @key Clé associée à la valeur à récupérer - * - * @return data Renvoie la valeur associée à la clé, FALSE si erreur - * - */ - public function fetch($key){ - /* (1) On vérifie que la clé existe bien */ - if( !array_key_exists($key, $this->index) ) - return false; - - /* (2) On récupère la ligne */ - $line = $this->index[$key]['line']; - - /* (3) On récupère le contenu */ - $this->driver->seek($line); - $json = json_decode( $this->driver->current(), true ); - - // Si erreur de parsage - if( is_null($json) ) - return false; - - return $json; - } - - - - - /* RENVOIE LES DONNEES ASSOCIEES AUX CLES DONNEES - * - * @keys Clés associées aux valeurs à récupérer - * - * @return data Renvoie les valeurs associées aux clé, ou un tableau vide si erreur - * - */ - public function fetchAll($keys){ - $data = []; - - /* (0) Pour chaque clé */ - foreach($keys as $i=>$key){ - - /* (1) On ne prend pas en compte les clés qui n'existent pas */ - if( !array_key_exists($key, $this->index) ) - continue; - - /* (2) On récupère la ligne */ - $line = $this->index[$key]['line']; - - /* (3) On récupère le contenu */ - $this->driver->seek($line); - $json = json_decode( $this->driver->current(), true ); - - /* (4) Si pas d'erreur de parsage, On enregistre */ - if( !is_null($json) ) - $data[$key] = $json; - - } - - - - return $data; - } - - - /* SUPPRIME UNE ENTREE DE CLE DONNEE DE LA BASE DE DONNEES - * - * @key Clé de l'entrée à supprimer - * - * @return status Retourne TRUE si tout s'est bien passé, sinon FALSE - * - */ - public function delete($key){ - /* (1) On vérifie l'existence de la clé */ - if( !array_key_exists($key, $this->index) ) - return true; // On considère que l'action souhaitée est effectuée - - $line = $this->index[$key]['line']; - - /* (2) On réarrange la bd pour supprimer la ligne */ - $tmpfilename = __ROOT__.'/tmp/'.uniqid().'.dat'; - $tmpfile = new \SplFileObject($tmpfilename, 'w'); - \chmod($tmpfilename, 0775); - $this->driver->seek(0); - - // On recopie toutes les lignes sauf celle à supprimer dans un fichier temporaire - while( $this->driver->key() < $this->line ){ - - if( $this->driver->key() != $line ) - $tmpfile->fwrite( $this->driver->current() ); - - $this->driver->next(); - } - - // On décrémente le nb de lignes - $this->line--; - - $tmpfile = null; - - /* (3) On remplace le fichier original par le fichier temporaire */ - $this->driver = null; - rename($tmpfilename, $this->dir.'data'); - \chmod($this->dir.'data', 0775); - $this->driver = new \SplFileObject($this->dir.'data', 'r+'); - - /* (3) On supprime la ligne de l'index */ - unset( $this->index[$key] ); - - /* (4) On met à jour les index des lignes déplacées */ - foreach($this->index as $i=>$indexData) - if( $indexData['line'] > $line ) - $this->index[$i]['line']--; // on décrémente les lignes au dessus de la ligne supprimée - - - /* (5) On enregistre le fichier index */ - $fIndex = new \SplFileObject($this->dir.'index', 'w'); - $fIndex->fwrite( json_encode($this->index) ); - $fIndex = null; - - - return true; - } - - - - /* SUPPRIME PLUSIEURS ENTREES DE CLES DONNEES DE LA BASE DE DONNEES - * - * @keys Clés des entrées à supprimer - * - * @return status Retourne TRUE si tout s'est bien passé, sinon FALSE - * - */ - public function deleteAll($keys){ - $keyLines = []; - - /* [1] On récupère la ligne associée à chaque clé - =========================================================*/ - foreach($keys as $k=>$key){ - /* (1) Si la clé n'existe pas, on passe à la suivante */ - if( !array_key_exists($key, $this->index) ) - continue; - - /* (2) On récupère la ligne de la clé */ - $keyLines[$key] = $this->index[$key]['line']; - } - - /* [2] On trie les clés en fonction de leur ligne - =========================================================*/ - $sorted = []; - - // Tant que toute les clés ne sont pas triées - while( count($keyLines) > 0 ){ - // Contiendra la clé de la plus petite valeur - $min = null; - - // On cherche la ligne la plus petite - foreach($keyLines as $key=>$line) - if( is_null($min) || $line < $keyLines[$min] ) // Si valeur inf à min - $min = $key; - - // On ajoute la plus petite clé trouvée a la liste - $sorted[$min] = $keyLines[$min]; - - // On la supprime du tableau à trier - unset($keyLines[$min]); - - } - - /* [3] On supprime les lignes à supprimer - =========================================================*/ - /* (1) On réarrange la bd pour supprimer la ligne */ - $tmpfilename = __ROOT__.'/tmp/'.uniqid().'.dat'; - $tmpfile = new \SplFileObject($tmpfilename, 'w'); - \chmod($tmpfilename, 0775); - $this->driver->seek(0); - - /* (2) On recopie toutes les lignes sauf celles à supprimer dans un fichier temporaire */ - while( $this->driver->key() < $this->line ){ - - // Si la ligne en cours n'est pas dans la liste des lignes à supprimer - if( !in_array($this->driver->key(), $sorted) ) - $tmpfile->fwrite( $this->driver->current() ); // On l'écrit dans le nouveau fichier - - $this->driver->next(); - } - - $tmpfile = null; - - /* (3) On remplace le fichier original par le fichier temporaire */ - $this->driver = null; - rename($tmpfilename, $this->dir.'data'); - \chmod($this->dir.'data', 0775); - $this->driver = new \SplFileObject($this->dir.'data', 'r+'); - - - /* [4] On met à jour les index - =========================================================*/ - $step = 0; - foreach($sorted as $key=>$line){ - - /* (1) On décrémente le nb de lignes */ - $this->line--; - - /* (2) On supprime la ligne de l'index */ - unset( $this->index[$key] ); - - /* (3) On met à jour les index des lignes déplacées du nombre d'index qu'on a supprimé */ - foreach($this->index as $i=>$indexData) - if( $indexData['line'] > $line-$step ) - $this->index[$i]['line']--; // on décrémente les lignes au dessus de la ligne supprimée - - $step++; - } - - /* (4) On enregistre le fichier index */ - $fIndex = new \SplFileObject($this->dir.'index', 'w'); - $fIndex->fwrite( json_encode($this->index) ); - $fIndex = null; - - - return true; - } - - - - - - - /* RENVOIE LES DONNEES ASSOCIEES A UN CHAMP DE RECHERCHE - * - * @nomParam Description du param - * - * @return nomRetour Description du retour - * - */ - public function filter($data){ - /* (1) Si @data est un tableau associatif */ - if( is_array($data) ){ - - $filtered = []; - foreach($this->index as $i=>$indexData){ - $this->driver->seek( $indexData['line'] ); - $dbData = json_decode( $this->driver->fgets(), true ); - - foreach($data as $key=>$value) - if( isset($dbData[$key]) && preg_match("#$value#", $dbData[$key]) ){ - $filtered[$i] = $dbData; - break; - } - } - - return $filtered; - - - /* (2) Sinon on compare @data en tant que valeur simple */ - }else{ - - $this->tmp = sha1( json_encode($data) ); - return array_filter($this->index, [$this, 'simpleFilter']); - - } - - } - protected function simpleFilter($e){ return $e['hash'] == $this->tmp; } - - - - - - - } diff --git a/build/router/controller/ics.php b/build/router/controller/ics.php index aa326fb..e62207f 100644 --- a/build/router/controller/ics.php +++ b/build/router/controller/ics.php @@ -2,7 +2,7 @@ namespace router\controller; - use \lightdb\core\lightdb; + use \database\core\DatabaseDriver; class ics{ @@ -52,31 +52,60 @@ public function info(){ - /* [1] Get database colors + /* [1] Get database data =========================================================*/ - /* (1) Open instance */ - try{ - $ldb = new lightdb('config'); - }catch(\Exception $e){ - die("An error occured. Please contact the developers.\n"); - } + /* (1) Get the list of available events */ + $sqlr = DatabaseDriver::getPDO()->prepare("SELECT * FROM event WHERE id_diplome = :idd"); + $sqlr->execute([ ':idd' => $this->diplome_id ]); + $d_cols = $sqlr->fetchAll(); - /* (2) Fetch diplome data */ - $d_cols = $ldb->fetch($this->diplome_id); - - /* (3) Error */ - if( $d_cols == false ) - die("No color found for this diplome"); + /* (2) Manage error */ + if( !$d_cols ) + die("Correction not available for this diplome"); - foreach($d_cols as $col=>$name){ - echo "PLANNING COLOR => "; + echo "
"; - if( $col == $name ) - echo "no name
"; - else - echo "$name
"; + foreach($d_cols as $data){ + + $id = $data['id_event']; + $basename = $data['basename']; + $color = $data['color']; + $name = $data['name']; + + echo "$basename
"; + + } + + echo ""; + echo "
"; + + } + + + + public function correct(){ + + + /* [1] Update data + =========================================================*/ { + + /* (1) Check $_POST['name'] */ + if( !isset($_POST['name']) || !is_array($_POST['name']) ) + die("No data received"); + + /* (2) Store corrections */ + foreach($_POST['name'] as $id=>$correct){ + + if( !empty(trim($correct)) ){ + + $sqlr = DatabaseDriver::getPDO()->prepare("UPDATE event SET name = :name WHERE id_event = :ide"); + $sqlr->execute([ ':name' => $correct, ':ide' => $id ]); + + } + + } } diff --git a/build/router/controller/page.php b/build/router/controller/page.php index 38c3080..32937b8 100644 --- a/build/router/controller/page.php +++ b/build/router/controller/page.php @@ -41,21 +41,25 @@ /* [2] Display the links =========================================================*/ - echo ""; + echo "
DiplomeConfigLink
"; - foreach($diplomes as $id=>$name){ + foreach($diplomes as $id=>$data){ + $name = $data[0]; + $upda = $data[1]; echo ""; $URI = $_SERVER['REQUEST_URI']; - $link = $_SERVER['HTTP_HOST']."{$URI}ics/$id.ics"; - echo ""; + $url = $_SERVER['HTTP_HOST'].$URI."ics/$id.ics"; + $link = __ROOT__."/tmp/$id.ics"; + echo ""; echo ""; + echo ">https://$url"; + echo ""; echo ""; } diff --git a/build/service/CalendarExtractor.php b/build/service/CalendarExtractor.php index b3250d6..1f371ff 100644 --- a/build/service/CalendarExtractor.php +++ b/build/service/CalendarExtractor.php @@ -2,7 +2,7 @@ namespace service; - use \lightdb\core\lightdb; + use \database\core\DatabaseDriver; use \service\Tesseract; @@ -109,28 +109,6 @@ 'h' => $img_siz[1] ]; - - /* (2) Light database - ---------------------------------------------------------*/ - - /* (1) Create/Open database */ - try{ - $ldb = new lightdb('config'); - - /* (2) Manage error */ - }catch(\Exception $e){ - throw new \Exception("Cannot access database"); - } - - /* (3) Fetch diplome data */ - $d_db = $ldb->fetch($this->d_uid); - - /* (4) Manage error */ - if( $d_db == false ) - $d_db = []; - - - } } @@ -173,7 +151,7 @@ /* (3) Get current color + next */ $p = $this->getColor($col_x, $y); $p1 = $this->getColor($col_x, $y+1); - $p1e = '#'.dechex($p1); + $color = '#'.str_pad(dechex($p1), 6, '0', STR_PAD_LEFT); /* (4) If on black pixel and next not white */ if( $p == 0 && $p1 != 0xffffff ){ @@ -201,7 +179,19 @@ $ev = $this->extractEvent("$time-$uid", [$col_x, $start_y+1], [$col_ind[$day_n+1]-1, $y]); $this->event[$uid][$time][1] = $ev[0]; $this->event[$uid][$time][2] = $ev[1]; + $this->event[$uid][$time][3] = $color; + // {7} Check if already exists // + $sqlr = DatabaseDriver::getPDO()->prepare("SELECT basename, color, id_diplome FROM event WHERE basename = :bd AND color = :c AND id_diplome = :idd"); + $sqlr->execute([ ':bd' => $ev[0], ':c' => $color, ':idd' => $this->d_uid ]); + + // {7.1} If does not -> insert // + if( !$sqlr->fetch() ){ + + $sqlr = DatabaseDriver::getPDO()->prepare("INSERT INTO event(id_event,basename,color,id_diplome,name) VALUES(DEFAULT,:bd,:c,:idd,:n)"); + $sqlr->execute([ ':bd' => $ev[0], ':c' => $color, ':idd' => $this->d_uid, ':n' => $ev[0] ]); + + } } @@ -215,16 +205,6 @@ } - /* [4] Save db changes - =========================================================*/ - /* (1) Update data */ - $ldb->delete($this->d_uid); - $ldb->insert($this->d_uid, $d_db); - - /* (2) Close connection */ - $ldb->close(); - - } @@ -266,7 +246,7 @@ /* (2) Manage copy error */ if( !$copied ) - return [ null, null ]; + return [ '?', null ]; /* (3) Save to jpeg */ \imagesavealpha($clip, true); @@ -292,7 +272,7 @@ /* (2) Manage error */ }catch(\Exception $e){ - $read = [ null, null ]; + $read = [ '?', null ]; } @@ -398,42 +378,29 @@ $RAW = ""; - - /* [1] Get light-database - =========================================================*/ - /* (1) Create/Open database */ - try{ - $ldb = new lightdb('config'); - - /* (2) Manage error */ - }catch(\Exception $e){ - throw new \Exception("Cannot access database"); - } - - /* (3) Get color association if available */ - $col_assoc = []; - if( !is_null($ldb->index($this->d_uid)) ) - $col_assoc = $ldb->fetch($this->d_uid); - - // var_dump($col_assoc); - // die(1); - - /* [2] For each event + /* [1] For each event =========================================================*/ foreach($this->event as $event_col=>$events){ /* (2) For each event of each type ---------------------------------------------------------*/ foreach($events as $start_t=>$data){ + + /* (1) Search if there is a correction in the database */ + $sqlr = DatabaseDriver::getPDO()->prepare("SELECT name FROM event WHERE basename = :bn AND id_diplome = :idd AND color = :col"); + $sqlr->execute([ ':bn' => $data[1], ':idd' => $this->d_uid, ':col' => $data[3] ]); + + /* (2) If there's a traduction */ + if( ($fetched=$sqlr->fetch()) ) + $data[1] = $fetched['name']; + + /* (3) Build ICS event */ $RAW .= "BEGIN:VEVENT\n"; $RAW .= "DTSTAMP:".gmdate("Ymd\THis\Z", time())."\n"; // required $RAW .= "DTSTART:${start_t}\n"; $RAW .= "DTEND:${data[0]}\n"; - $RAW .= "UID:$start_t-univ-pau-ics\n"; // required - if( !is_null($data[1]) ) - $RAW .= "SUMMARY:${data[1]}\n"; - else - $RAW .= "SUMMARY:?\n"; + $RAW .= "UID:$start_t\n"; // required + $RAW .= "SUMMARY:${data[1]}\n"; if( !is_null($data[2]) ){ $RAW .= "LOCATION:${data[2]}\n"; $RAW .= "DESCRIPTION:${data[2]}\n"; diff --git a/build/service/Config.php b/build/service/Config.php index 1e75335..59d4125 100644 --- a/build/service/Config.php +++ b/build/service/Config.php @@ -3,7 +3,7 @@ namespace service; - use \lightdb\core\lightdb; + use \database\core\DatabaseDriver; @@ -179,22 +179,59 @@ /* [4] Cache into light-database =========================================================*/ { - /* (1) Open/Create light-database */ - try{ - $ldb = new lightdb("config"); - $ldb->flush(); + /* (1) Get diplome ids */ + $sqlr = DatabaseDriver::getPDO()->query("SELECT id_diplome from diplome"); + $db_ids_raw = $sqlr->fetchAll(); + + /* (2) Format data */ + $db_ids = []; + foreach($db_ids_raw as $data) + $db_ids[$data['id_diplome']] = null; + + + /* (3) For each diplome */ + foreach($d_list as $id=>$name){ + + // {1} Add if not in db // + if( !isset($db_ids[$id]) ){ + $sqlr = DatabaseDriver::getPDO()->prepare("INSERT INTO `diplome`(`id_diplome`, `name`, `updated_at`) VALUES(:id, :name, DEFAULT)"); + $sqlr->execute([ ':id' => $id, ':name' => $name ]); + + // {2} If update // + }else{ + $sqlr = DatabaseDriver::getPDO()->prepare("UPDATE diplome SET name = :name, updated_at = :upd WHERE id_diplome = :id"); + $sqlr->execute([ ':id' => $id, ':name' => $name, 'upd' => gmmktime() ]); + + } - /* (2) Manage error */ - }catch(\Exception $e){ - throw new \Exception("Cannot open light-database"); } - /* (3) Update data */ - $ldb->insert('diplomes', $d_list); - $ldb->insert('periods', $p_list); + /* (4) Get period ids */ + $sqlr = DatabaseDriver::getPDO()->query("SELECT id_period from period"); + $db_ids_raw = $sqlr->fetchAll(); - /* (4) Close the database */ - $ldb->close(); + /* (5) Format data */ + $db_ids = []; + foreach($db_ids_raw as $data) + $db_ids[$data['id_period']] = null; + + + /* (6) For each period */ + foreach($p_list as $id=>$monday){ + + // {1} Add if not in db // + if( !isset($db_ids[$id]) ){ + $sqlr = DatabaseDriver::getPDO()->prepare("INSERT INTO `period`(`id_period`, `monday`) VALUES(:id, :monday)"); + $sqlr->execute([ ':id' => $id, ':monday' => $monday ]); + + // {2} If update // + }else{ + $sqlr = DatabaseDriver::getPDO()->prepare("UPDATE period SET monday = :monday WHERE id_period = :id"); + $sqlr->execute([ ':id' => $id, ':monday' => $monday ]); + + } + + } } @@ -218,25 +255,26 @@ /* [1] Load cache =========================================================*/ { - /* (1) Open/Create light-database */ - try{ - $ldb = new lightdb("config"); + /* (1) Get diplome list */ + $d_list_raw = DatabaseDriver::getPDO()->query("SELECT * FROM diplome")->fetchAll(); - /* (2) Manage error */ - }catch(\Exception $e){ - throw new \Exception("Cannot open light-database"); - } + /* (2) Format data */ + $d_list = []; - /* (3) Fetch data */ - $d_list = $ldb->fetch('diplomes'); - $p_list = $ldb->fetch('periods'); + foreach($d_list_raw as $data) + $d_list[$data['id_diplome']] = [ $data['name'], $data['updated_at'] ]; + + + /* (1) Get diplome list */ + $p_list_raw = DatabaseDriver::getPDO()->query("SELECT * FROM period")->fetchAll(); + + /* (2) Format data */ + $p_list = []; + + foreach($p_list_raw as $data) + $p_list[$data['id_period']] = $data['monday']; - /* (4) Check error */ - if( $d_list == false || $p_list == false ) - throw new \Exception("Cannot read data"); - /* (5) Close the database */ - $ldb->close(); } diff --git a/build/service/Updater.php b/build/service/Updater.php index 8bf69ee..a1923a7 100644 --- a/build/service/Updater.php +++ b/build/service/Updater.php @@ -2,6 +2,10 @@ namespace service; + use \database\core\DatabaseDriver; + + + class Updater{ /* [1] Attributes @@ -65,6 +69,12 @@ file_put_contents(__ROOT__."/tmp/$d_id.ics", "END:VCALENDAR", FILE_APPEND); + /* (2) Register update + ---------------------------------------------------------*/ + $sqlr = DatabaseDriver::getPDO()->prepare("UPDATE diplome SET updated_at = CURRENT_TIMESTAMP WHERE id_diplome = :idd"); + $sqlr->execute([ ':idd' => $d_id ]); + + } } diff --git a/config/database-driver.json b/config/database-driver.json new file mode 100644 index 0000000..acfe1b4 --- /dev/null +++ b/config/database-driver.json @@ -0,0 +1,16 @@ +{ + "default": { + "local": { + "host" : "localhost", + "dbname" : "univ-pau-ics", + "user" : "univ-pau-ics", + "password" : "nxBn1Cn5JgaHYW8n" + }, + "remote": { + "host" : "localhost", + "dbname" : "univ-pau-ics", + "user" : "univ-pau-ics", + "password" : "nxBn1Cn5JgaHYW8n" + } + } +} diff --git a/config/routes.json b/config/routes.json index 7db87fd..9c7a4b2 100644 --- a/config/routes.json +++ b/config/routes.json @@ -1,6 +1,6 @@ { - "methods": [ "GET" ], + "methods": [ "GET", "POST" ], "routes": { @@ -28,6 +28,14 @@ } }, + "/correct/{diplome_id}": { + "methods": ["POST"], + "controller": "ics:correct", + "arguments": { + "diplome_id": "T\\d+" + } + }, + "/{any}": { "methods": ["GET"], "controller": "redirect:homepage",
DiplomeConfigLinkLast Update
$nameSet colorsCorrecthttps://$link$upda