251 lines
7.2 KiB
PHP
251 lines
7.2 KiB
PHP
<?php
|
|
|
|
require_once 'participoLib/participo.php';
|
|
|
|
/** Frame for a User if the Participo system
|
|
*/
|
|
class User
|
|
{
|
|
/** Constructor
|
|
* @todo Document parameter
|
|
* @todo Input sanitation
|
|
*/
|
|
public function __construct($id, $loginName, $name, $firstName, $dateOfBirth=null, $eMail=null, $config=null, $pwHash=null)
|
|
{
|
|
$this->id = filterId($id);
|
|
$this->loginName = $loginName;
|
|
$this->name = $name;
|
|
$this->firstName = $firstName;
|
|
$this->dateOfBirth = ($dateOfBirth != null) ? DateTime::createFromFormat('Y-m-d', $dateOfBirth) : null;
|
|
$this->eMail = ($eMail!=null) ? filter_var($eMail, FILTER_VALIDATE_EMAIL,['options'=>['default'=>null]]):null;
|
|
$this->config = $config;
|
|
$this->pwHash = $pwHash;
|
|
}
|
|
|
|
////
|
|
// dbInterface
|
|
////
|
|
|
|
public function addToDb(){
|
|
// if the user has an Id set it has to come from the Db. Hence don't add an User that is already added.
|
|
if(isset($this->id) || !participo::isUserAdmin()){
|
|
return;
|
|
}
|
|
$this->id = self::dbInsert(
|
|
$this->loginName
|
|
, $this->name
|
|
, $this->firstName
|
|
, (isset($this->dateOfBirth))?($this->dateOfBirth->format('Y-m-d')):null
|
|
, $this->eMail
|
|
, $this->config
|
|
, $this->pwHash
|
|
);
|
|
return $this->id;
|
|
}
|
|
|
|
private static function dbInsert($loginName, $name, $firstName, $dateOfBirth=null, $eMail=null, $config=null, $pwHash=null){
|
|
$query = 'INSERT INTO `'.self::$tableName.'` '
|
|
.'(loginName, name, vorname, gebDatum, eMail, config, pwHash) '
|
|
.' VALUES (:loginName, :name, :vorname, :gebDatum, :eMail, :config, :pwHash);';
|
|
$params = [
|
|
':loginName'=>['value'=>$loginName, 'data_type' => self::$dbColumns['loginName']],
|
|
':name'=>['value'=>$name, 'data_type' => self::$dbColumns['name']],
|
|
':vorname'=>['value'=>$firstName, 'data_type' => self::$dbColumns['vorname']],
|
|
':gebDatum'=>['value'=>$dateOfBirth, 'data_type' => self::$dbColumns['gebDatum']],
|
|
':eMail'=>['value'=>$eMail, 'data_type' => self::$dbColumns['eMail']],
|
|
':config'=>['value'=>$config, 'data_type' => self::$dbColumns['config']],
|
|
':pwHash'=>['value'=>$pwHash, 'data_type' => self::$dbColumns['pwHash']],
|
|
];
|
|
$response = dbConnector::query($query, $params);
|
|
return dbConnector::getLastInsertId();
|
|
}
|
|
|
|
/** Name of the table with all the Users
|
|
*
|
|
* @var string
|
|
*/
|
|
private static $tableName = 'wkParticipo_Users';
|
|
|
|
/** columns in the User table (in the database) with their type
|
|
*
|
|
* @var array
|
|
*/
|
|
private static $dbColumns = [
|
|
'id' => PDO::PARAM_INT,
|
|
'loginName' => PDO::PARAM_STR,
|
|
'name' => PDO::PARAM_STR,
|
|
'vorname' => PDO::PARAM_STR,
|
|
'gebDatum' => PDO::PARAM_STR,
|
|
'eMail' => PDO::PARAM_STR,
|
|
'config' => PDO::PARAM_STR,
|
|
'pwHash' => PDO::PARAM_STR
|
|
];
|
|
|
|
|
|
////
|
|
// html interface
|
|
////
|
|
|
|
public static function getHtmlFormAddUser($options = [])
|
|
{
|
|
$returnToUrl = $options['returnToUrl'] ?? urlencode(getCurPagesUrl());
|
|
$formClass = isset($options['formClass']) ? 'class="'.$options['formClass'].'"' : '';
|
|
|
|
$form =
|
|
'<form ' . $formClass . ' action="api.user.add.php" method="post">'
|
|
. '<input type="hidden" name="returnToUrl" id="returnToUrl" value="' . $returnToUrl . '" >'
|
|
.'<div><label for="loginName">Benutzername</label> <input type="text" name="loginName" id="loginName"></div>'
|
|
.'<div><label for="name">Nachname</label> <input type="text" name="name" id="name"></div>'
|
|
.'<div><label for="firstName">Vorname</label> <input type="text" name="firstName" id="firstName"></div>'
|
|
.'<div><label for="dateOfBirth">Geb.Datum</label> <input type="text" name="dateOfBirth" id="dateOfBirth"></div>'
|
|
.'<div><label for="eMail">eMail</label> <input type="text" name="eMail" id="eMail"></div>'
|
|
. '<button class="btn" type="submit" name="submit">erstellen</button>'
|
|
. '</form>';
|
|
return $form;
|
|
}
|
|
|
|
public static function htmlFormAddUser($options = []){
|
|
echo(self::getHtmlFormAddUser($options));
|
|
}
|
|
|
|
|
|
// member variables
|
|
private $id;
|
|
private $loginName;
|
|
private $name;
|
|
private $firstName;
|
|
private $dateOfBirth;
|
|
private $eMail;
|
|
private $config;
|
|
private $pwHash;
|
|
|
|
/** Export the User data into an associative array
|
|
*
|
|
* @return array associative array representing the user
|
|
*/
|
|
public function toAssoc()
|
|
{
|
|
return [
|
|
'id' => $this->id,
|
|
'loginName' => $this->loginName,
|
|
'name' => $this->name,
|
|
'vorname' => $this->firstName,
|
|
'gebDatum' => $this->dateOfBirth,
|
|
'eMail' => $this->eMail,
|
|
'config' => $this->config,
|
|
'pwHash' => $this->pwHash
|
|
];
|
|
}
|
|
|
|
/** verify the users password
|
|
*
|
|
* @param [string] $password the password to verify
|
|
* @return true if password is verified, false otherwise
|
|
*/
|
|
public function verifyPassword($password)
|
|
{
|
|
return password_verify($password, $this->pwHash);
|
|
}
|
|
|
|
// getter functions
|
|
|
|
public function getId()
|
|
{
|
|
return $this->id;
|
|
}
|
|
|
|
public function getLoginName()
|
|
{
|
|
return $this->loginName;
|
|
}
|
|
|
|
public function getName()
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function getFirstname()
|
|
{
|
|
return $this->firstName;
|
|
}
|
|
|
|
public function getConfig()
|
|
{
|
|
return $this->$config;
|
|
}
|
|
|
|
// static functions
|
|
|
|
/** Create a User from an assoziative array like it is returned from db requests
|
|
*
|
|
* @param array $member associative array with the UserData from the dbRequest
|
|
* @param $columnMappings renaming of columnNames, e.g., if the id isn't under 'id' in the array but under 'userID', add 'id'=>'userId' to the mappings
|
|
* @return User initialized user
|
|
*/
|
|
public static function fromDbArray($member, $columnMappings = [])
|
|
{
|
|
// if it isn't remapped, take default column name
|
|
foreach (self::$dbColumns as $columnName => $columnDataType) {
|
|
if (!array_key_exists($columnName, $columnMappings)) {
|
|
$columnMappings[$columnName] = $columnName;
|
|
}
|
|
}
|
|
|
|
return new User(
|
|
$member[$columnMappings['id']] ?? null,
|
|
$member[$columnMappings['loginName']] ?? null,
|
|
$member[$columnMappings['name']] ?? null,
|
|
$member[$columnMappings['vorname']] ?? null,
|
|
$member[$columnMappings['gebDatum']] ?? null,
|
|
array_key_exists($columnMappings['eMail'], $member) ? explode(',', $member['eMail']) : null,
|
|
array_key_exists($columnMappings['config'], $member) ? json_decode($member['config']) : null,
|
|
array_key_exists($columnMappings['pwHash'], $member) ? $member['pwHash'] : null
|
|
);
|
|
}
|
|
|
|
/** Load an User from the db via an id
|
|
*
|
|
* @param int $userId
|
|
* @return loaded user or null (if sth. wrong)
|
|
*/
|
|
public static function loadFromDb($userId)
|
|
{
|
|
return self::loadFromDbBy('id', $userId);
|
|
}
|
|
|
|
/** Load an User from the db via the loginName
|
|
*
|
|
* @param int $login
|
|
* @return loaded user or null (if sth. wrong)
|
|
*/
|
|
public static function loadFromDbByLoginName($login)
|
|
{
|
|
return self::loadFromDbBy('loginName', $login);
|
|
}
|
|
|
|
/** Load a user from the db by a column
|
|
*
|
|
* @param [string] $name name of the column
|
|
* @param [mixed] $value value to look for
|
|
* @param [bool] $unique if the value is unique (true->return single value) or not (false->return array)
|
|
* @return loaded user or null (if sth. wrong)
|
|
*/
|
|
public static function loadFromDbBy($name, $value)
|
|
{
|
|
if (!array_key_exists($name, self::$dbColumns)) {
|
|
return null;
|
|
}
|
|
|
|
$response = dbConnector::query(
|
|
'SELECT * FROM `wkParticipo_Users` WHERE `' . $name . '` = :' . $name,
|
|
[$name => ['value' => $value, 'data_type' => self::$dbColumns[$name]]]
|
|
);
|
|
|
|
if (count($response) != 1) {
|
|
return null;
|
|
}
|
|
|
|
return User::fromDbArray($response[0]);
|
|
}
|
|
}
|