From d2c5d261905207cdbf543e6819bbc7fc5fafeedb Mon Sep 17 00:00:00 2001 From: Safat Date: Thu, 4 Jan 2024 12:47:12 +1100 Subject: [PATCH] MDL-78551 core_user: Add hooks api for user updates --- user/classes/hook/before_user_deleted.php | 59 +++++++++++++++++++++++ user/classes/hook/before_user_update.php | 43 +++++++++++++++++ user/lib.php | 28 +++-------- 3 files changed, 109 insertions(+), 21 deletions(-) create mode 100644 user/classes/hook/before_user_deleted.php create mode 100644 user/classes/hook/before_user_update.php diff --git a/user/classes/hook/before_user_deleted.php b/user/classes/hook/before_user_deleted.php new file mode 100644 index 00000000000..29042a2520a --- /dev/null +++ b/user/classes/hook/before_user_deleted.php @@ -0,0 +1,59 @@ +. + +namespace core_user\hook; + +use stdClass; +use Psr\EventDispatcher\StoppableEventInterface; + +/** + * Hook before user deletion. + * + * @package core_user + * @copyright 2024 Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +#[\core\attribute\label('Allows plugins or features to perform actions before a user is deleted.')] +#[\core\attribute\tags('user')] +class before_user_deleted implements + StoppableEventInterface { + + /** + * @var bool Whether the propagation of this event has been stopped. + */ + protected bool $stopped = false; + + /** + * Constructor for the hook. + * + * @param stdClass $user The user instance + */ + public function __construct( + public readonly stdClass $user, + ) { + } + + public function isPropagationStopped(): bool { + return $this->stopped; + } + + /** + * Stop the propagation of this event. + */ + public function stop(): void { + $this->stopped = true; + } +} diff --git a/user/classes/hook/before_user_update.php b/user/classes/hook/before_user_update.php new file mode 100644 index 00000000000..53dbf4c7bcc --- /dev/null +++ b/user/classes/hook/before_user_update.php @@ -0,0 +1,43 @@ +. + +namespace core_user\hook; + +use stdClass; + +/** + * Hook before user information and data updates. + * + * @package core_user + * @copyright 2024 Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +#[\core\attribute\label('Allows plugins or features to perform actions before a user is updated.')] +#[\core\attribute\tags('user')] +class before_user_update { + + /** + * Constructor for the hook. + * + * @param stdClass $user The user instance + * @param stdClass $currentuserdata The old user instance + */ + public function __construct( + public readonly stdClass $user, + public readonly stdClass $currentuserdata, + ) { + } +} diff --git a/user/lib.php b/user/lib.php index e7e46e2de08..3576a5109b3 100644 --- a/user/lib.php +++ b/user/lib.php @@ -150,7 +150,7 @@ function user_create_user($user, $updatepassword = true, $triggerevent = true) { * This will not affect user_password_updated event triggering. */ function user_update_user($user, $updatepassword = true, $triggerevent = true) { - global $DB, $CFG; + global $DB; // Set the timecreate field to the current time. if (!is_object($user)) { @@ -159,26 +159,12 @@ function user_update_user($user, $updatepassword = true, $triggerevent = true) { $currentrecord = $DB->get_record('user', ['id' => $user->id]); - // Communication api update for user. - if (core_communication\api::is_available()) { - $usercourses = enrol_get_users_courses($user->id); - if (!empty($currentrecord) && isset($user->suspended) && $currentrecord->suspended !== $user->suspended) { - foreach ($usercourses as $usercourse) { - $communication = \core_communication\api::load_by_instance( - context: \core\context\course::instance($usercourse->id), - component: 'core_course', - instancetype: 'coursecommunication', - instanceid: $usercourse->id - ); - // If the record updated the suspended for a user. - if ($user->suspended === 0) { - $communication->add_members_to_room([$user->id]); - } else if ($user->suspended === 1) { - $communication->remove_members_from_room([$user->id]); - } - } - } - } + // Dispatch the hook for pre user update actions. + $hook = new \core_user\hook\before_user_update( + user: $user, + currentuserdata: $currentrecord, + ); + \core\di::get(\core\hook\manager::class)->dispatch($hook); // Check username. if (isset($user->username)) {