Made user controller working mostly. Not everything is tested but seems good

This commit is contained in:
Christian Wolf 2019-06-05 16:02:36 +02:00
parent 16e7ed0bc0
commit fc85e6b322
8 changed files with 170 additions and 51 deletions

View File

@ -59,9 +59,9 @@ abstract class AbstractClubsController extends BaseController
try
{
// Fetch the posted data
$values = $this->loadData();
$values = $this->loadData($this->additionalData());
$this->filterRawCheck($values);
$this->filterRaw($values);
// Check the input data
if( ! $this->requiredDataIsAvailable($values) )
@ -70,7 +70,9 @@ abstract class AbstractClubsController extends BaseController
if( ! $this->rawDataIsValid($values) )
throw new DataParsingException();
$obj->setValues($values, true);
$obj->applyAndMergeValues($values, true);
$this->filterObject($obj, $values);
// Do some additional tests by the controller
if( ! $this->objectValid($obj) )
@ -103,7 +105,12 @@ abstract class AbstractClubsController extends BaseController
}
}
protected function loadData()
protected function additionalData()
{
return array();
}
protected function loadData($additionalData)
{
$values = array();
$factory = $this->getFactory();
@ -114,10 +121,17 @@ abstract class AbstractClubsController extends BaseController
$values[$column->getAlias()] = $column->getFilter()->getFilteredValue($input, $column->getAlias());
}
foreach($additionalData as $k => $v)
{
$values[$k] = $v->getFilteredValue($input, $k);
}
return $values;
}
protected function filterRawCheck(&$values){}
protected function filterRaw(&$values){}
protected function filterObject($obj){}
protected function objectValid($obj)
{

View File

@ -48,6 +48,27 @@ abstract class AbstractCommonClubsModel
$this->values = $values;
}
public function applyAndMergeValues($values, $unpack = true)
{
$vals = $this->getValues();
if($unpack)
$vals = $this->packExternalReferencesAsKeys($vals);
foreach($this->getFactory()->getAttributes() as $column)
{
if(array_key_exists($column->getAlias(), $values))
{
$vals[$column->getAlias()] = $values[$column->getAlias()];
}
}
if($unpack)
$vals = $this->unpackExternalReferencesFromKeys($vals);
$this->setValues($vals, false);
}
protected function setValue($key, $value)
{
if(is_null($this->values))
@ -134,6 +155,7 @@ abstract class AbstractCommonClubsModel
$vals[$alias] = $a->packValue($vals[$alias]);
}
// XXX Joins
return $vals;
}
@ -144,7 +166,8 @@ abstract class AbstractCommonClubsModel
foreach($factory->getAttributes() as $a)
{
$alias = $a->getAlias();
$vals[$alias] = $a->unpackValue($vals[$alias]);
if(isset($vals[$alias]))
$vals[$alias] = $a->unpackValue($vals[$alias]);
}
$joins = $factory->getJoins();

View File

@ -141,10 +141,16 @@ abstract class AbstractCommonClubsModelFactory
* @param int $id
* @return AbstractCommonClubsModel
*/
public function loadById($id) {
public function loadById($id, $throwErr = true)
{
$arr = $this->loadElements("main.id = " . ((int)$id) );
if(sizeof($arr) == 0)
throw new ElementNotFoundException();
{
if($throwErr)
throw new ElementNotFoundException();
else
return null;
}
return $arr[0];
}

View File

@ -8,14 +8,14 @@ class CommonClubsModelFactoryUser extends AbstractCommonClubsModelFactory
public function fetchAttributes()
{
return array(
new CommonClubsModelColumnString('user'),
new CommonClubsModelColumnString('name'),
new CommonClubsModelColumnString('password'),
new CommonClubsModelColumnString('address'),
new CommonClubsModelColumnString('city'),
new CommonClubsModelColumnString('mail'),
new CommonClubsModelColumnString('phone'),
new CommonClubsModelColumnString('mobile')
new CommonClubsModelColumnString('user', new CommonClubsControllerMappingCmd('Benutzername')),
new CommonClubsModelColumnString('name', new CommonClubsControllerMappingString('Bürgerlicher Name')),
new CommonClubsModelColumnString('password', new CommonClubsControllerMappingString('Passwort', false)),
new CommonClubsModelColumnString('address', new CommonClubsControllerMappingString('Adresse')),
new CommonClubsModelColumnString('city', new CommonClubsControllerMappingString('Stadt')),
new CommonClubsModelColumnString('mail', new CommonClubsControllerMappingString('E-Mail')),
new CommonClubsModelColumnString('phone', new CommonClubsControllerMappingString('Telefonnummer', false)),
new CommonClubsModelColumnString('mobile', new CommonClubsControllerMappingString('Handynummer', false))
);
}

View File

@ -114,6 +114,12 @@ class CommonClubsModelUser extends AbstractCommonClubsModel
$this->setValue('password', $hash);
}
public function isPasswordSet()
{
$password = $this->getValues()['password'];
return isset($password) && strlen($password) > 0;
}
public function getPositions()
{
return $this->fetchAssociatedElements(new CommonClubsModelFactoryUserassoc(), 'userid');
@ -139,7 +145,7 @@ class CommonClubsModelUser extends AbstractCommonClubsModel
return true;
}
public function isUsernameSuitable($user)
public function isUsernameFree($user)
{
$factory = new CommonClubsModelFactoryUser();
$users = $factory->loadElements(null, null, function($q) use ($user){
@ -167,5 +173,33 @@ class CommonClubsModelUser extends AbstractCommonClubsModel
$db->execute();
}
public function dataIsValid()
{
if(! parent::dataIsValid())
return false;
if(! $this->usernameIsValid())
{
return false;
}
return true;
}
private function usernameIsValid()
{
$factory = $this->getFactory();
$medb = $factory->loadById($this->getId(), false);
if($medb !== null && $medb->getUserName() === $this->getUsername())
// No change was made
return true;
if(! $this->isUsernameFree($this->getUsername()) )
return false;
return true;
}
}

View File

@ -28,7 +28,7 @@ class ClubsControllerClub extends AbstractClubsController
);
}
protected function filterRawCheck(&$values)
protected function filterRaw(&$values)
{
if(is_null($values['charitable']))
$values['charitable'] = false;

View File

@ -18,7 +18,7 @@ class ClubsControllerUser extends AbstractClubsController
return ClubsUser::isUserNameFree($username, $id);
}
protected function getNameOfElement()
protected function getSingleBaseName()
{
return 'user';
}
@ -38,49 +38,44 @@ class ClubsControllerUser extends AbstractClubsController
);
}
/**
* {@inheritDoc}
* @see AbstractClubsController::checkData()
*/
protected function rawDataIsValid($values, $isNew, $obj)
protected function rawDataIsValid($values)
{
if(! parent::rawDataIsValid($values, $isNew, $obj))
if(! parent::rawDataIsValid($values))
return false;
// TODO Auto-generated method stub
if(isset($values['pwd']) && strlen($values['pwd']) > 0)
if($this->passwordIsSet($values))
{
$pwd = $values['pwd'];
$pwdConfirm = $values['pwdConfirm'];
if(trim($pwd) != trim($pwdConfirm))
{
Factory::getApplication()->enqueueMessage('Die Passwörter stimmen nicht überein.', 'error');
if( ! $this->passwordIsValid($values))
return false;
}
if(! ClubsUser::checkPasswordStrength(trim($pwd)))
{
Factory::getApplication()->enqueueMessage('Das Passwort ist zu schwach.', 'error');
return false;
}
}
else
{
if($isNew)
{
Factory::getApplication()->enqueueMessage('Für einen neuen Benutzer muss ein Passwort vergeben werden.', 'error');
return false;
}
}
if(! $this->checkUserName(trim($values['user']), $obj))
return true;
}
private function passwordIsSet($values)
{
return isset($values['pwd']) && strlen($values['pwd']) > 0;
}
private function passwordIsValid($values)
{
$pwd = $values['pwd'];
$pwdConfirm = $values['pwdConfirm'];
if(trim($pwd) != trim($pwdConfirm))
{
Factory::getApplication()->enqueueMessage('Username ' . $$values['user'] . ' ist nicht gültig.', 'error');
Factory::getApplication()->enqueueMessage('Die Passwörter stimmen nicht überein.', 'error');
return false;
}
// FIXME Check password strength
// if(! ClubsUser::checkPasswordStrength(trim($pwd)))
// {
// Factory::getApplication()->enqueueMessage('Das Passwort ist zu schwach.', 'error');
// return false;
// }
return true;
}
@ -112,8 +107,55 @@ class ClubsControllerUser extends AbstractClubsController
$this->applyDataToObject($obj, $values, $mapping);
}
protected function getFactory()
{
return new CommonClubsModelFactoryUser();
}
/**
*
* {@inheritDoc}
* @see AbstractClubsController::filterObject()
* @param CommonClubsModelUser $obj
*/
protected function filterObject($obj, $values)
{
// if($obj->isNew() && (empty($values['pwd']) || strlen($values['pwd']) == 0) )
if(isset($values['pwd']) && strlen($values['pwd']) > 0)
{
$obj->setPassword($values['pwd']);
}
}
/**
* {@inheritDoc}
* @see AbstractClubsController::objectValid()
* @param CommonClubsModelUser $obj
*/
protected function objectValid($obj)
{
if(! $obj->isPasswordSet())
{
Factory::getApplication()->enqueueMessage('Kein Passwort wurde vergeben.', 'error');
return false;
}
return true;
}
protected function filterRaw(&$values)
{
unset($values['password']);
}
protected function additionalData()
{
return array(
'pwd' => new CommonClubsControllerMappingString('Passwort'),
'pwdConfirm' => new CommonClubsControllerMappingString('Passwortwiederholung')
);
}
}