identity_value] * example: [ 'email' => 'geo@roptron.gr' ] */ public static function checkUser($identity) { $indexKey = array_key_first($identity); $user = Registry::use('database')->query( "SELECT * FROM user WHERE {$indexKey} = :val", [ ':val' => $identity[$indexKey] ] )->getFirst(); // if no user, return false if ($user === false) return false; return $user; } /** get user (by index key) * * user detailed array * includes all user properties + granted roles + privileges * * @param $id (int) : user id * @param $value (string) */ public static function getUser($id) { $user = Registry::use('database')->query( "SELECT user.*, ( -- construct array (json) of roles granted to user SELECT CONCAT( '[', GROUP_CONCAT(role.id), ']' ) FROM `role` WHERE role.id IN ( SELECT user_role.role_id FROM user_role WHERE user_role.user_id = :id ) ) AS Roles_json, ( -- construct array of (root-)privileges granted to user SELECT CONCAT( '[', GROUP_CONCAT(privilege.id), ']' ) FROM privilege WHERE privilege.id IN ( SELECT user_privilege.privilege_id FROM user_privilege WHERE user_privilege.user_id = :id ) ) AS RootPrivileges_json, ( SELECT CONCAT( -- array of array of sub-privileges '[', GROUP_CONCAT( ( SELECT CONCAT( -- array (json) of subprivileges '[', GROUP_CONCAT(included_id), ']' ) FROM privilege_includes WHERE privilege_id = privilege.id ) ), ']' ) FROM privilege WHERE privilege.id IN ( SELECT user_privilege.privilege_id FROM user_privilege WHERE user_id = :id ) ) AS SubPrivileges_json FROM user WHERE id = :id", [ ':id' => $id ] )->getFirst(); // if no user, return false if ($user === false) return false; // TODO: // * merge root+sub privilede lists // * convert json strings to php arrays // TODO: // cache user super array return $user; } /** create user * * creates user record; * assigns privileged (usualy defaults); * creates activation_code * * @param $data (array): Request->POST array * @param $password (string): secure hashed password * * @return $activation_code * */ public static function registerUser($data, $password, $privileges = ['ec.1', 'pr.1']) { $required_fields = [ 'name', 'surname', 'email', 'password' ]; // check required fields $isOK = true; foreach($required_fields as $fi) { if (empty($data[$fi])) $isOK = false; } // if empty required fields exists ... return false if (!$isOK) { return [ "success" => false, 'error' => EMPTY_REQUIRED_FIELDS ]; } // TODO: // check if email exists // ... // create an activation code $activation_code = md5($data['email'].time().rand(0, 10000)); // if isOK go on and... // create user record $new_user_id = Registry::use('database')->query( "INSERT INTO user (`first_name`, `last_name`, `email`, `password`, `active`, `activation`) VALUES (:nam, :surname, :email, :pass, :act, :actcode)", [ ':nam' => $data['name'], ':surname' => $data['surname'], ':email' => $data['email'], ':pass' => $password, ':act' => 0, // needs email confirmation to be activated ... ':actcode' => $activation_code // ... with the activation code ] )->lastInsertID(); // set default privileges // self::set_user_privileges($privileges); // update history History::trackUserAccess($new_user_id, TRACK_ACCOUNT, 'Create User Account'); // return success and user id return [ "success" => true, 'id' => $new_user_id , 'activation' => $activation_code ]; } public static fuunction activate($ticket) { $user = Registry::use('database')->query( "SELECT * FROM user WHERE activation = :ticket", [ 'ticket' => $ticket] )->getFirst(); // if no user with this activation code, return false if ($user === false) return false; Registry::use('database')->runQuery( "UPDATE user SET activated = 1 WHERE activation = :ticket", [ 'ticket' => $ticket] ); return true; } /** inherited privileges * * list of all inhereted (sub-)privileges * from a list of root-privileges * * @param $list (array of int): list of root privilege id(s) */ public static function inheritedPrivileges($list) { $rootList = "(". implode(', ', $list) .")"; $subPrivileges = Registry::use('database')->runQuery( "SELECT privilege.id, ( SELECT CONCAT('[', GROUP_CONCAT(included_id), ']') FROM privilege_includes WHERE privilege_id = privilege.id ) as subprivilege_json FROM privilege WHERE privilege.id IN {$rootlist}", [] ); } } /* example query getUser (super-array) --- -- -- - - - SELECT user.*, ( -- array (json) of roles granted to user SELECT CONCAT('[', GROUP_CONCAT(role.id), ']') FROM `role` WHERE role.id IN ( SELECT user_role.role_id FROM user_role WHERE user_role.user_id = 1 ) ) AS Roles_json, ( SELECT CONCAT( '[', GROUP_CONCAT(privilege.id), ']' ) FROM privilege WHERE privilege.id IN ( SELECT user_privilege.privilege_id FROM user_privilege WHERE user_privilege.user_id = 1 ) ) AS RootPrivileges_json, ( SELECT CONCAT( -- array of array of sub-privileges '[', GROUP_CONCAT( -- array (json) of subprivileges ( SELECT CONCAT( '[', GROUP_CONCAT(included_id), ']' ) FROM privilege_includes WHERE privilege_id = privilege.id ) ), ']' ) FROM privilege WHERE privilege.id IN ( SELECT user_privilege.privilege_id FROM user_privilege WHERE user_id = 1 ) ) AS SubPrivileges_json FROM user WHERE id = 1 --- */