From 1e2a51af0a78ff106a4dc67066aa0011cc651994 Mon Sep 17 00:00:00 2001 From: Riedler Date: Tue, 28 Jan 2025 17:33:46 +0100 Subject: [PATCH 1/3] fix: ensure user exists in user_helper::get_user() --- lbplanner/classes/helpers/user_helper.php | 35 ++++++++++++++++++++--- lbplanner/services/user/get_user.php | 35 +++-------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/lbplanner/classes/helpers/user_helper.php b/lbplanner/classes/helpers/user_helper.php index e57aaf1e..f561f8b5 100644 --- a/lbplanner/classes/helpers/user_helper.php +++ b/lbplanner/classes/helpers/user_helper.php @@ -16,13 +16,12 @@ namespace local_lbplanner\helpers; -use core\context\system as context_system; use dml_exception; -use moodle_exception; use stdClass; use core_user; -use local_lbplanner\enums\CAPABILITY; +use local_lbplanner\enums\NOTIF_TRIGGER; +use local_lbplanner\enums\PLAN_ACCESS_TYPE; use local_lbplanner\model\user; /** @@ -55,6 +54,7 @@ public static function check_user_exists(int $userid): bool { /** * Retrieves the user with the given id. + * If user doesn't exist in the DB yet, it will be created. * * @param int $userid The id of the user to retrieve. * @@ -63,7 +63,34 @@ public static function check_user_exists(int $userid): bool { */ public static function get_user(int $userid): user { global $DB; - return user::from_db($DB->get_record(self::LB_PLANNER_USER_TABLE, ['userid' => $userid], '*', MUST_EXIST)); + $dbuser = $DB->get_record(self::LB_PLANNER_USER_TABLE, ['userid' => $userid]); + + if ($dbuser !== false) { + return user::from_db($dbuser); + } + + // Register user if not found. + $lbplanneruser = new user(0, $userid, 'default', 'none', 1, false); + $lbpid = $DB->insert_record(user_helper::LB_PLANNER_USER_TABLE, $lbplanneruser->prepare_for_db()); + $lbplanneruser->set_fresh($lbpid); + + // Create empty plan for newly registered user. + $plan = new \stdClass(); + $plan->name = 'Plan for ' . ($lbplanneruser->get_mdluser()->username); + $planid = $DB->insert_record(plan_helper::TABLE, $plan); + $lbplanneruser->set_planid($planid); + + // Set user as owner of new plan. + $planaccess = new \stdClass(); + $planaccess->userid = $userid; + $planaccess->accesstype = PLAN_ACCESS_TYPE::OWNER; + $planaccess->planid = $planid; + $DB->insert_record(plan_helper::ACCESS_TABLE, $planaccess); + + // Notify the FE that this user likely hasn't used LBP before. + notifications_helper::notify_user($userid, -1, NOTIF_TRIGGER::USER_REGISTERED); + + return $lbplanneruser; } /** diff --git a/lbplanner/services/user/get_user.php b/lbplanner/services/user/get_user.php index 2a1c7e37..d7cc827b 100644 --- a/lbplanner/services/user/get_user.php +++ b/lbplanner/services/user/get_user.php @@ -18,11 +18,10 @@ use coding_exception; use dml_exception; -use core_external\{external_function_parameters, external_single_structure, external_value}; +use core_external\{external_function_parameters, external_single_structure}; use moodle_exception; -use local_lbplanner\helpers\{user_helper, plan_helper, notifications_helper}; -use local_lbplanner\enums\{PLAN_ACCESS_TYPE, NOTIF_TRIGGER}; +use local_lbplanner\helpers\user_helper; use local_lbplanner\model\user; /** @@ -52,35 +51,9 @@ public static function get_user_parameters(): external_function_parameters { * @return array The data of the user */ public static function get_user(): array { - global $USER, $DB; + global $USER; - // Checks if the user is enrolled in LB Planner. - if (!user_helper::check_user_exists($USER->id)) { - // Register user if not found. - $lbplanneruser = new user(0, $USER->id, 'default', 'none', 1, false); - $lbpid = $DB->insert_record(user_helper::LB_PLANNER_USER_TABLE, $lbplanneruser->prepare_for_db()); - $lbplanneruser->set_fresh($lbpid); - - // Create empty plan for newly registered user. - $plan = new \stdClass(); - $plan->name = 'Plan for ' . $USER->username; - $planid = $DB->insert_record(plan_helper::TABLE, $plan); - $lbplanneruser->set_planid($planid); - - // Set user as owner of new plan. - $planaccess = new \stdClass(); - $planaccess->userid = $USER->id; - $planaccess->accesstype = PLAN_ACCESS_TYPE::OWNER; - $planaccess->planid = $planid; - $DB->insert_record(plan_helper::ACCESS_TABLE, $planaccess); - - // Notify the FE that this user likely hasn't used LBP before. - notifications_helper::notify_user($USER->id, -1, NOTIF_TRIGGER::USER_REGISTERED); - } else { - $lbplanneruser = user_helper::get_user($USER->id); - } - - return $lbplanneruser->prepare_for_api(); + return user_helper::get_user($USER->id)->prepare_for_api(); } /** From 6abf213925787cf740482148303bc2e93a7ad016 Mon Sep 17 00:00:00 2001 From: Riedler Date: Tue, 28 Jan 2025 18:00:01 +0100 Subject: [PATCH 2/3] feat: actually get all users in get_all_users --- lbplanner/classes/helpers/user_helper.php | 6 ++++++ lbplanner/services/user/get_all_users.php | 23 ++++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lbplanner/classes/helpers/user_helper.php b/lbplanner/classes/helpers/user_helper.php index f561f8b5..adf7e3a5 100644 --- a/lbplanner/classes/helpers/user_helper.php +++ b/lbplanner/classes/helpers/user_helper.php @@ -39,6 +39,12 @@ class user_helper { */ const LB_PLANNER_USER_TABLE = 'local_lbplanner_users'; + /** + * Name of the moodle's database + * WARNING: DO NOT USE UNLESS ABSOLUTELY NECESSARY! + */ + const MOODLE_USER_TABLE = 'user'; + /** * Checks if the given user exists in the LB_PLANNER_USER database. * diff --git a/lbplanner/services/user/get_all_users.php b/lbplanner/services/user/get_all_users.php index 5f380469..863eecdb 100644 --- a/lbplanner/services/user/get_all_users.php +++ b/lbplanner/services/user/get_all_users.php @@ -19,13 +19,15 @@ use dml_exception; use core_external\{external_api, external_function_parameters, external_multiple_structure, external_value}; use invalid_parameter_exception; +use local_lbplanner\enums\CAPABILITY; use moodle_exception; +use core\context\system as context_system; use local_lbplanner\helpers\user_helper; use local_lbplanner\model\user; /** - * Gets all users registered by the lbplanner app. + * Gets all users with one or several LBP capabilities. * * @package local_lbplanner * @subpackage services_user @@ -44,7 +46,7 @@ public static function get_all_users_parameters(): external_function_parameters } /** - * Gives back all users registered by the lbplanner app. + * Gives back all users. * @param ?string $vintage (optional) gives back all users with the given vintage * @throws moodle_exception * @throws dml_exception @@ -55,12 +57,23 @@ public static function get_all_users(?string $vintage): array { self::validate_parameters(self::get_all_users_parameters(), ['vintage' => $vintage]); - $users = $DB->get_records(user_helper::LB_PLANNER_USER_TABLE); + $syscontext = context_system::instance(); + + $alluserids = $DB->get_fieldset(user_helper::MOODLE_USER_TABLE, 'id'); $results = []; - foreach ($users as $userdata) { - $user = user::from_db($userdata); + foreach ($alluserids as $userid) { + $user = null; + foreach (CAPABILITY::cases() as $case) { + if (has_capability($case->value, $syscontext, $userid)) { + $user = user_helper::get_user($userid); + break; + } + } + if ($user === null) { + continue; + } if ($vintage === null || $vintage == $user->get_mdluser()->vintage) { array_push($results, $user->prepare_for_api_short()); } From c4e8099b7cbceb6e003e9021b238cf4202a98ff0 Mon Sep 17 00:00:00 2001 From: Riedler Date: Tue, 28 Jan 2025 18:12:12 +0100 Subject: [PATCH 3/3] fix: appease code chekcer --- lbplanner/classes/helpers/user_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lbplanner/classes/helpers/user_helper.php b/lbplanner/classes/helpers/user_helper.php index adf7e3a5..ff419249 100644 --- a/lbplanner/classes/helpers/user_helper.php +++ b/lbplanner/classes/helpers/user_helper.php @@ -77,7 +77,7 @@ public static function get_user(int $userid): user { // Register user if not found. $lbplanneruser = new user(0, $userid, 'default', 'none', 1, false); - $lbpid = $DB->insert_record(user_helper::LB_PLANNER_USER_TABLE, $lbplanneruser->prepare_for_db()); + $lbpid = $DB->insert_record(self::LB_PLANNER_USER_TABLE, $lbplanneruser->prepare_for_db()); $lbplanneruser->set_fresh($lbpid); // Create empty plan for newly registered user.