Skip to content
Snippets Groups Projects
UserModelAbstract.php 18.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * Copyright Maarch since 2008 under licence GPLv3.
     * See LICENCE.txt file at the root folder for more details.
     * This file is part of Maarch software.
    
     * @brief User Model
     * @author dev@maarch.org
     */
    
    Damien's avatar
    Damien committed
    namespace User\models;
    
    use SrcCore\models\AuthenticationModel;
    
    use SrcCore\models\DatabaseModel;
    
    Damien's avatar
    Damien committed
    use SrcCore\models\ValidatorModel;
    
    Damien's avatar
    Damien committed
    require_once 'core/class/Url.php';
    
    
    Damien's avatar
    Damien committed
    abstract class UserModelAbstract
    
        public static function get(array $aArgs)
    
            ValidatorModel::arrayType($aArgs, ['select', 'where', 'data', 'orderBy']);
    
    Damien's avatar
    Damien committed
            ValidatorModel::intType($aArgs, ['limit']);
    
    Damien's avatar
    Damien committed
            $aUsers = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
                'table'     => ['users'],
    
    Damien's avatar
    Damien committed
                'where'     => empty($aArgs['where']) ? [] : $aArgs['where'],
                'data'      => empty($aArgs['data']) ? [] : $aArgs['data'],
                'order_by'  => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy'],
                'limit'     => empty($aArgs['limit']) ? 0 : $aArgs['limit']
    
    Damien's avatar
    Damien committed
            ]);
    
            return $aUsers;
        }
    
    
        public static function getById(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id']);
            ValidatorModel::intVal($aArgs, ['id']);
    
    Damien's avatar
    Damien committed
            $aUser = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
                'table'     => ['users'],
                'where'     => ['id = ?'],
                'data'      => [$aArgs['id']]
    
    Damien's avatar
    Damien committed
            if (empty($aUser)) {
                return [];
            }
    
    
            return $aUser[0];
    
        public static function getByExternalId(array $aArgs)
        {
    
            ValidatorModel::notEmpty($aArgs, ['externalId', 'externalName']);
    
            ValidatorModel::intVal($aArgs, ['externalId']);
    
            $aUser = DatabaseModel::select([
                'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
                'table'     => ['users'],
    
                'where'     => ['external_id->>\''.$aArgs['externalName'].'\' = ?'],
    
                'data'      => [$aArgs['externalId']]
            ]);
    
            if (empty($aUser)) {
                return [];
            }
    
            return $aUser[0];
        }
    
    
    Damien's avatar
    Damien committed
        public static function create(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['user']);
            ValidatorModel::notEmpty($aArgs['user'], ['userId', 'firstname', 'lastname']);
    
            ValidatorModel::stringType($aArgs['user'], ['userId', 'firstname', 'lastname', 'mail', 'initials', 'phone', 'changePassword', 'loginmode']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::insert([
    
    Damien's avatar
    Damien committed
                'table'         => 'users',
    
    Damien's avatar
    Damien committed
                'columnsValues' => [
    
    Vinciane's avatar
    Vinciane committed
                    'user_id'                       => strtolower($aArgs['user']['userId']),
    
                    'firstname'                     => $aArgs['user']['firstname'],
                    'lastname'                      => $aArgs['user']['lastname'],
                    'mail'                          => $aArgs['user']['mail'],
                    'phone'                         => $aArgs['user']['phone'],
                    'initials'                      => $aArgs['user']['initials'],
                    'status'                        => 'OK',
                    'change_password'               => empty($aArgs['user']['changePassword']) ? 'Y' : $aArgs['user']['changePassword'],
                    'loginmode'                     => empty($aArgs['user']['loginmode']) ? 'standard' : $aArgs['user']['loginmode'],
    
                    'password'                      => AuthenticationModel::getPasswordHash('maarch'),
    
                    'password_modification_date'    => 'CURRENT_TIMESTAMP'
    
    Damien's avatar
    Damien committed
            ]);
    
    Damien's avatar
    Damien committed
        public static function update(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['set', 'where', 'data']);
            ValidatorModel::arrayType($aArgs, ['set', 'where', 'data']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::update([
    
    Damien's avatar
    Damien committed
                'table' => 'users',
                'set'   => $aArgs['set'],
                'where' => $aArgs['where'],
                'data'  => $aArgs['data']
    
    Damien's avatar
    Damien committed
            return true;
    
    Damien's avatar
    Damien committed
        public static function delete(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id']);
            ValidatorModel::intVal($aArgs, ['id']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::update([
    
    Damien's avatar
    Damien committed
                'table'     => 'users',
                'set'       => [
                    'status'    => 'DEL',
    
    Damien's avatar
    Damien committed
                'where'     => ['id = ?'],
                'data'      => [$aArgs['id']]
    
    Damien's avatar
    Damien committed
            return true;
    
        public static function getByLogin(array $args)
    
            ValidatorModel::notEmpty($args, ['login']);
            ValidatorModel::stringType($args, ['login']);
    
    Damien's avatar
    Damien committed
            ValidatorModel::arrayType($args, ['select']);
    
            static $users;
    
    
    Damien's avatar
    Damien committed
            if (!empty($users[$args['login']]) && !empty($args['select']) && $args['select'] == ['id']) {
    
                return $users[$args['login']];
            }
    
            $user = DatabaseModel::select([
    
                'select'    => empty($args['select']) ? ['*'] : $args['select'],
    
    Damien's avatar
    Damien committed
                'table'     => ['users'],
                'where'     => ['user_id = ?'],
    
                'data'      => [$args['login']]
    
            if (empty($user)) {
    
            if (empty($args['select']) || in_array('id', $args['select'])) {
                $users[$args['login']] = $user[0];
            }
    
    Vinciane's avatar
    Vinciane committed
        
        public static function getByLowerLogin(array $aArgs)
        {
            ValidatorModel::notEmpty($aArgs, ['login']);
            ValidatorModel::stringType($aArgs, ['login']);
    
            $aUser = DatabaseModel::select([
                'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
                'table'     => ['users'],
                'where'     => ['lower(user_id) = lower(?)'],
                'data'      => [$aArgs['login']]
            ]);
    
            if (empty($aUser)) {
                return [];
            }
    
            return $aUser[0];
        }
    
    Damien's avatar
    Damien committed
        public static function getByEmail(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['mail']);
            ValidatorModel::stringType($aArgs, ['mail']);
    
    Damien's avatar
    Damien committed
            $aUser = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
                'table'     => ['users'],
                'where'     => ['mail = ? and status = ?'],
                'data'      => [$aArgs['mail'], 'OK'],
                'limit'     => 1
    
        public static function updateExternalId(array $aArgs)
        {
            ValidatorModel::notEmpty($aArgs, ['id', 'externalId']);
            ValidatorModel::intVal($aArgs, ['id']);
            ValidatorModel::json($aArgs, ['externalId']);
    
            DatabaseModel::update([
                'table'     => 'users',
                'set'       => [
                    'external_id' => $aArgs['externalId']
                ],
                'where'     => ['id = ?'],
                'data'      => [$aArgs['id']]
            ]);
    
            return true;
        }
    
    
    Damien's avatar
    Damien committed
        public static function updatePassword(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id', 'password']);
            ValidatorModel::intVal($aArgs, ['id']);
            ValidatorModel::stringType($aArgs, ['password']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::update([
    
    Damien's avatar
    Damien committed
                'table'     => 'users',
                'set'       => [
    
                    'password'                      => AuthenticationModel::getPasswordHash($aArgs['password']),
    
                    'password_modification_date'    => 'CURRENT_TIMESTAMP',
                    'change_password'               => 'N',
    
    Damien's avatar
    Damien committed
                'where'     => ['id = ?'],
                'data'      => [$aArgs['id']]
    
    Damien's avatar
    Damien committed
            return true;
    
        public static function resetPassword(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id']);
            ValidatorModel::intVal($aArgs, ['id']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::update([
    
    Damien's avatar
    Damien committed
                'table'     => 'users',
                'set'       => [
    
                    'password'                      => AuthenticationModel::getPasswordHash('maarch'),
    
                    'change_password'               => 'Y',
                    'password_modification_date'    => 'CURRENT_TIMESTAMP'
    
    Damien's avatar
    Damien committed
                'where'     => ['id = ?'],
                'data'      => [$aArgs['id']]
    
    Damien's avatar
    Damien committed
            return true;
    
    Damien's avatar
    Damien committed
        public static function createEmailSignature(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['userId', 'title', 'htmlBody']);
            ValidatorModel::stringType($aArgs, ['userId', 'title', 'htmlBody']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::insert([
    
    Damien's avatar
    Damien committed
                'table'         => 'users_email_signatures',
    
    Damien's avatar
    Damien committed
                'columnsValues' => [
    
    Damien's avatar
    Damien committed
                    'user_id'   => $aArgs['userId'],
                    'title'     => $aArgs['title'],
                    'html_body' => $aArgs['htmlBody']
                ]
    
    Damien's avatar
    Damien committed
            ]);
    
    Damien's avatar
    Damien committed
        public static function updateEmailSignature(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id','userId', 'title', 'htmlBody']);
    
    Damien's avatar
    Damien committed
            ValidatorModel::stringType($aArgs, ['userId', 'title', 'htmlBody']);
            ValidatorModel::intVal($aArgs, ['id']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::update([
    
    Damien's avatar
    Damien committed
                'table'     => 'users_email_signatures',
                'set'       => [
                    'title'     => $aArgs['title'],
    
    Damien's avatar
    Damien committed
                'where'     => ['user_id = ?', 'id = ?'],
                'data'      => [$aArgs['userId'], $aArgs['id']]
    
    Damien's avatar
    Damien committed
        public static function deleteEmailSignature(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id', 'userId']);
            ValidatorModel::stringType($aArgs, ['userId']);
    
    Damien's avatar
    Damien committed
            DatabaseModel::delete([
    
    Damien's avatar
    Damien committed
                'table'     => 'users_email_signatures',
                'where'     => ['user_id = ?', 'id = ?'],
                'data'      => [$aArgs['userId'], $aArgs['id']]
    
    Damien's avatar
    Damien committed
        public static function getEmailSignaturesById(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['userId']);
            ValidatorModel::stringType($aArgs, ['userId']);
    
    Damien's avatar
    Damien committed
            $aReturn = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
                'table'     => ['users_email_signatures'],
                'where'     => ['user_id = ?'],
                'data'      => [$aArgs['userId']],
                'order_by'  => ['id']
    
    Damien's avatar
    Damien committed
        public static function getEmailSignatureWithSignatureIdById(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['userId', 'signatureId']);
            ValidatorModel::stringType($aArgs, ['userId']);
            ValidatorModel::intVal($aArgs, ['signatureId']);
    
    Damien's avatar
    Damien committed
            $aReturn = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
                'table'     => ['users_email_signatures'],
                'where'     => ['user_id = ?', 'id = ?'],
                'data'      => [$aArgs['userId'], $aArgs['signatureId']],
    
    Damien's avatar
    Damien committed
        public static function getLabelledUserById(array $aArgs)
    
    Damien's avatar
    Damien committed
        {
    
    Damien's avatar
    Damien committed
            ValidatorModel::intVal($aArgs, ['id']);
    
    Damien's avatar
    Damien committed
            ValidatorModel::stringType($aArgs, ['login']);
    
    Damien's avatar
    Damien committed
            if (!empty($aArgs['id'])) {
                $rawUser = UserModel::getById(['id' => $aArgs['id'], 'select' => ['firstname', 'lastname']]);
    
    Damien's avatar
    Damien committed
            } elseif (!empty($aArgs['login'])) {
                $rawUser = UserModel::getByLogin(['login' => $aArgs['login'], 'select' => ['firstname', 'lastname']]);
    
    Damien's avatar
    Damien committed
            }
    
    Damien's avatar
    Damien committed
    
            $labelledUser = '';
            if (!empty($rawUser)) {
    
    Damien's avatar
    Damien committed
                $labelledUser = $rawUser['firstname']. ' ' .$rawUser['lastname'];
    
    Damien's avatar
    Damien committed
            }
    
            return $labelledUser;
        }
    
    
    Damien's avatar
    Damien committed
        public static function getCurrentConsigneById(array $aArgs)
    
    Damien's avatar
    Damien committed
        {
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['resId']);
            ValidatorModel::intVal($aArgs, ['resId']);
    
    Damien's avatar
    Damien committed
            $aReturn = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => ['process_comment'],
                'table'     => ['listinstance'],
                'where'     => ['res_id = ?', 'process_date is null', 'item_mode in (?)'],
                'data'      => [$aArgs['resId'], ['visa', 'sign']],
                'order_by'  => ['listinstance_id ASC'],
                'limit'     => 1
    
    Damien's avatar
    Damien committed
            ]);
    
            if (empty($aReturn[0])) {
                return '';
            }
    
            return $aReturn[0]['process_comment'];
        }
    
    Damien's avatar
    Damien committed
        public static function getPrimaryEntityByUserId(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['userId']);
            ValidatorModel::stringType($aArgs, ['userId']);
    
    Damien's avatar
    Damien committed
            $aEntity = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => ['users_entities.entity_id', 'entities.entity_label', 'users_entities.user_role', 'users_entities.primary_entity'],
                'table'     => ['users_entities, entities'],
                'where'     => ['users_entities.entity_id = entities.entity_id', 'users_entities.user_id = ?', 'users_entities.primary_entity = ?'],
                'data'      => [$aArgs['userId'], 'Y']
    
            ]);
    
            if (empty($aEntity[0])) {
                return [];
            }
    
            return $aEntity[0];
        }
    
    
        public static function getPrimaryEntityById(array $aArgs)
        {
            ValidatorModel::notEmpty($aArgs, ['id']);
            ValidatorModel::intVal($aArgs, ['id']);
    
            $aEntity = DatabaseModel::select([
                'select'    => ['users_entities.entity_id', 'entities.entity_label', 'users_entities.user_role', 'users_entities.primary_entity'],
                'table'     => ['users, users_entities, entities'],
                'where'     => ['users.user_id = users_entities.user_id', 'users_entities.entity_id = entities.entity_id', 'users.id = ?', 'users_entities.primary_entity = ?'],
                'data'      => [$aArgs['id'], 'Y']
            ]);
    
            if (empty($aEntity[0])) {
                return [];
            }
    
            return $aEntity[0];
        }
    
    
        public static function getGroupsByUserId(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['userId']);
            ValidatorModel::stringType($aArgs, ['userId']);
    
    Damien's avatar
    Damien committed
            $aGroups = DatabaseModel::select([
    
                'select'    => ['usergroups.id', 'usergroups.can_index', 'usergroup_content.group_id', 'usergroups.group_desc', 'usergroup_content.primary_group', 'usergroup_content.role', 'security.maarch_comment', 'security.where_clause'],
    
    Damien's avatar
    Damien committed
                'table'     => ['usergroup_content, usergroups, security'],
                'where'     => ['usergroup_content.group_id = usergroups.group_id', 'usergroup_content.user_id = ?','usergroups.group_id = security.group_id'],
                'data'      => [$aArgs['userId']]
    
        public static function getEntitiesById(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['userId']);
            ValidatorModel::stringType($aArgs, ['userId']);
    
    Damien's avatar
    Damien committed
            $aEntities = DatabaseModel::select([
    
    Damien's avatar
    Damien committed
                'select'    => ['users_entities.entity_id', 'entities.entity_label', 'users_entities.user_role', 'users_entities.primary_entity'],
                'table'     => ['users_entities, entities'],
                'where'     => ['users_entities.entity_id = entities.entity_id', 'users_entities.user_id = ?'],
                'data'      => [$aArgs['userId']],
                'order_by'  => ['users_entities.primary_entity DESC']
    
        public static function updateStatus(array $aArgs)
    
            ValidatorModel::notEmpty($aArgs, ['id', 'status']);
    
    Damien's avatar
    Damien committed
            ValidatorModel::intVal($aArgs, ['id']);
    
            ValidatorModel::stringType($aArgs, ['status']);
    
    Damien's avatar
    Damien committed
    
            DatabaseModel::update([
    
    Damien's avatar
    Damien committed
                'table'     => 'users',
                'set'       => [
                    'status'    => $aArgs['status']
    
    Damien's avatar
    Damien committed
                ],
    
    Damien's avatar
    Damien committed
                'where'     => ['id = ?'],
                'data'      => [$aArgs['id']]
    
    Damien's avatar
    Damien committed
        public static function hasGroup(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id', 'groupId']);
            ValidatorModel::intVal($aArgs, ['id']);
            ValidatorModel::stringType($aArgs, ['groupId']);
    
    Damien's avatar
    Damien committed
            $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]);
            $groups = UserModel::getGroupsByUserId(['userId' => $user['user_id']]);
    
            foreach ($groups as $value) {
                if ($value['group_id'] == $aArgs['groupId']) {
                    return true;
                }
            }
    
            return false;
        }
    
    
    Damien's avatar
    Damien committed
        public static function addGroup(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id', 'groupId']);
            ValidatorModel::intVal($aArgs, ['id']);
            ValidatorModel::stringType($aArgs, ['groupId', 'role']);
    
    Damien's avatar
    Damien committed
            $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]);
            DatabaseModel::insert([
    
    Damien's avatar
    Damien committed
                'table'         => 'usergroup_content',
    
    Damien's avatar
    Damien committed
                'columnsValues' => [
    
    Damien's avatar
    Damien committed
                    'user_id'       => $user['user_id'],
                    'group_id'      => $aArgs['groupId'],
                    'role'          => $aArgs['role'],
                    'primary_group' => 'Y'
                ]
    
    Damien's avatar
    Damien committed
            ]);
    
    Damien's avatar
    Damien committed
        public static function updateGroup(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id', 'groupId']);
            ValidatorModel::intVal($aArgs, ['id']);
            ValidatorModel::stringType($aArgs, ['groupId', 'role']);
    
    Damien's avatar
    Damien committed
            $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]);
            DatabaseModel::update([
    
    Damien's avatar
    Damien committed
                'table'     => 'usergroup_content',
                'set'       => [
                    'role'      => $aArgs['role']
    
    Damien's avatar
    Damien committed
                'where'     => ['user_id = ?', 'group_id = ?'],
                'data'      => [$user['user_id'], $aArgs['groupId']]
    
    Damien's avatar
    Damien committed
        public static function deleteGroup(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id', 'groupId']);
            ValidatorModel::intVal($aArgs, ['id']);
            ValidatorModel::stringType($aArgs, ['groupId']);
    
    Damien's avatar
    Damien committed
            $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]);
            DatabaseModel::delete([
    
    Damien's avatar
    Damien committed
                'table'     => 'usergroup_content',
                'where'     => ['group_id = ?', 'user_id = ?'],
                'data'      => [$aArgs['groupId'], $user['user_id']]
    
    Damien's avatar
    Damien committed
            ]);
    
            return true;
        }
    
    Damien's avatar
    Damien committed
        public static function hasEntity(array $aArgs)
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['id', 'entityId']);
            ValidatorModel::intVal($aArgs, ['id']);
            ValidatorModel::stringType($aArgs, ['entityId']);
    
    Damien's avatar
    Damien committed
            $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]);
            $entities = UserModel::getEntitiesById(['userId' => $user['user_id']]);
    
            foreach ($entities as $value) {
                if ($value['entity_id'] == $aArgs['entityId']) {
                    return true;
                }
            }
    
            return false;
        }