query( "SELECT * FROM user WHERE {$indexKey} = :val", [ ':val' => $value ] )->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 * */ public static function createUser($data, $privileges = ['ec.1', 'pr.1']) { $user = [ 'prefix' => $data['prefix'], 'name' => $data['name'], 'surname' => $data['surname'], 'email' => $data['email'], 'password' => $data['password'], 'active' => 0 // needs email confirmation ]; $sql = "INSERT INTO user (`prefix`, `name`, `surname`, email, `password`, user_id) VALUES (:prrfic, :name, :surname, :email, :password, :userid)"; $stmt = $this->pdo->prepare($sql); $stmt->execute($user); $inserted_id = $this->pdo->lastInsertId(); // set default privileges self::set_user_privileges($privileges); // update history return [ "success" => true, 'id' => $inserted_id ]; } /** 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 --- */