NxTIC/manager/repo/user.php

293 lines
9.2 KiB
PHP
Executable File

<?php
namespace manager\repo;
use \manager\Database;
use \manager\sessionManager;
class user{
private static $table_name = 'users';
private static $columns = null;
// Getters dynamiques
public static function __callStatic($method, $args){
/* [0] Si les colonnes valides ne sont pas chargées, on les charges
=========================================================*/
if( is_null(self::$columns) ){
$getColumns = Database::getPDO()->query('SHOW COLUMNS FROM '.self::$table_name);
$cols = $getColumns->fetchAll();
self::$columns = array();
// On ajoute la liste des colonnes
foreach($cols as $column)
array_push(self::$columns, $column['Field']);
}
/* [1] On vérifie que la méthode est 'getX', avec X une chaine
=========================================================*/
// Si c'est pas le bon format, on retourne une erreur
if( !preg_match('/^getBy(\w+)$/', $method, $matches) ) return false;
/* [2] On vérifie que la valeur après 'get' est dans self::$columns
=========================================================*/
$columnName = strtolower($matches[1]);
$getAll = $columnName == 'all'; // Si 'getAll'
$getSomething = count($args) > 0 && in_array($columnName, self::$columns); // Si 'getX', et 'X' dans la liste des colonnes
// Si ni 'getAll' ni 'getSomething' -> erreur
if( !$getAll && !$getSomething ) return false;
/* [3] On rédige la requête
=========================================================*/
$getRequestString = 'SELECT * FROM '.self::$table_name;
// Si c'est 'getSomething', on ajoute une condition
if( $getSomething ) $getRequestString .= ' WHERE '.$columnName.' = :value';
$getRequest = Database::getPDO()->prepare($getRequestString);
/* [4] On exécute la requête
=========================================================*/
// Si 'getSomething', on ajoute le champ
$getRequest->execute(array(
':value' => $getSomething ? $args[0] : null
));
/* [5] On récupère le résultat
=========================================================*/
return Database::delNumeric( $getRequest->fetchAll() );
}
/* VERIFICATION DU LOGIN/PASSWORD D'UN UTILISATEUR
*
* @login<String> Username ou Adresse mail de l'utilisateur
* @password<String> Password de l'utilisateur
*
* @return id_user<int> Retourne l'id de l'utilisateur si ses credentials sont bons
*
*/
public static function login($login, $password){
/* [0] Gestion des INPUT
=========================================================*/
$checker = Database::check('varchar(3,50)', $login);
$checker = $checker && Database::check('text', $password);
// Si les parametres sont incorrects, on retourne une erreur
if( !$checker ) return false;
/* [1] On verifie son login/password dans la BDD
=========================================================*/
$check = Database::getPDO()->prepare("SELECT id_user, login, permission
FROM users
WHERE ( login = :username OR mail = :mail ) AND password = :password");
$check->execute(array(
':username' => $login,
':mail' => $login,
':password' => sessionManager::sha1($password)
));
$result = $check->fetch();
/* [2] Gestion du retour
=========================================================*/
// Si on a rien trouve, on retourne une erreur
if( $result === false ) return false;
// On retourne le resultat
return Database::delNumeric( $result );
}
/* RETOURNE LES DONNEES D'UN UTILISATEUR D'ID DONNE
*
* @id_user<int> UID de l'utilisateur en question
*
* @return user<Array> Tableau contenant les donnees de l'utilisateur s'il existe sinon retourne FALSE
*
*/
public static function getById($id_user){
/* [0] On formatte et vérifie les INPUT
=========================================================*/
if( !Database::check('id', $id_user) ) return false;
/* [1] On effectue la requete
=========================================================*/
$getUser = Database::getPDO()->prepare("SELECT id_user, login, mail, permission
FROM users
WHERE id_user = :id_user");
$getUser->execute(array( ':id_user' => $id_user ));
/* [2] On recupere le resultat de la requete
=========================================================*/
$userData = $getUser->fetch();
// Si l'utilisateur n'existe pas, on retourne FALSE
if( $userData === false ) return false;
/* [3] Gestion du retour
=========================================================*/
return Database::delNumeric( $userData, true );
}
/* RETOURNE LES DONNEES DE TOUS LES UTILISATEURS
*
* @return users<Array> Tableau contenant les donnees des utilisateurs, retourne FALSE si erreur
*
*/
public static function getAll(){
/* [1] On effectue la requete
=========================================================*/
$getUsers = Database::getPDO()->query("SELECT id_user, login, mail, permission
FROM users
ORDER BY login ASC");
/* [2] On recupere le resultat de la requete
=========================================================*/
$usersData = $getUsers->fetchAll();
// Si l'utilisateur n'existe pas, on retourne FALSE
if( $usersData === false ) return false;
/* [3] Gestion du retour
=========================================================*/
return Database::delNumeric( $usersData );
}
/* CREE UN UTILISATEUR
*
* @login<String> Login (identifiant) de l'utilisateur
* @password<String> Password de l'utilisateur
* @mail<String> Adresse mail de l'utilisateur
* @reference<int> Reference vers une Personne (sinon NULL)
* @permissions<Array> Liste des permissions de l'utilisateur
*
* @return id_user<int> Renvoie l'id de l'utilisateur cree ou FALSE si erreur
*
*/
public static function create($login, $password, $mail, $reference, $permission){
/* [0] Verification et formattage des INPUT
=========================================================*/
$checkInput = Database::check('sha1', $password);
$checkInput = $checkInput && Database::check('varchar(3, 30)', $login);
$checkInput = $checkInput && Database::check('mail', $mail);
$checkInput = $checkInput && ( Database::check('id', $reference) || is_null($reference) );
$checkInput = $checkInput && in_array($permission, array('admin', 'subject'));
// Si erreur en entree, on retourne FAUX
if( !$checkInput ) return false;
/* [1] On verifie que le login/mail et reference sont uniques
=========================================================*/
$checkUnique = Database::getPDO()->prepare("SELECT id_user
FROM users
WHERE login = :login
OR mail = :mail
OR ( reference = :reference AND reference is not NULL )");
$checkUnique->execute(array(
':login' => $login,
':mail' => $mail,
':reference' => $reference
));
// Si un utilisateur a le meme LOGIN/MAIL ou REFERENCE qu'un autre, on retourne une erreur
if( $checkUnique->fetch() !== false ) return false;
/* [2] Creation de l'utilisateur
=========================================================*/
/* (1) Si reference NULL */
if( $reference == null ){
$create = Database::getPDO()->prepare("INSERT INTO users(id_user, login, password, mail, reference, permission)
VALUES(DEFAULT, :login, :password, :mail, NULL, :permission)");
$create->execute(array(
':login' => $login,
':password' => $password,
':mail' => $mail,
':permission' => $permission
));
/* (2) Si reference est defini */
}else{
$create = Database::getPDO()->prepare("INSERT INTO users(id_user, login, password, mail, reference, permission)
VALUES(DEFAULT, :login, :password, :mail, :reference, :permission)");
$create->execute(array(
':login' => $login,
':password' => $password,
':mail' => $mail,
':reference' => (int) $reference,
':permission' => $permission
));
}
/* [3] Verification de la creation + recuperation id
=========================================================*/
$checkCreate = Database::getPDO()->prepare("SELECT id_user
FROM users
WHERE login = :login
AND password = :password
AND mail = :mail
AND ( reference = :reference OR reference is NULL )
AND permission = :permission");
$checkCreate->execute(array(
':login' => $login,
':password' => $password,
':mail' => $mail,
':reference' => (int) $reference,
':permission' => $permission
));
// On recupere l'id de l'utilisateur
$id_user = $checkCreate->fetch();
// Si erreur, on retourne FALSE
if( $id_user === false ) return false;
/* [4] Gestion du retour
=========================================================*/
return $id_user['id_user'];
}
/* SUPRESSION D'UN UTILISATEUR D'ID DONNE
*
* @id_user<int> UID de l'utilisateur en question
*
*/
public static function remove($id_user){
/* [1] On effectue la suppression
=========================================================*/
$getUser = Database::getPDO()->prepare("DELETE FROM users WHERE id_user = :id_user");
$getUser->execute(array( ':id_user' => $id_user ));
}
}
?>