diff --git a/mod/forum/classes/local/exporters/discussion.php b/mod/forum/classes/local/exporters/discussion.php index afb66b92cf7..690a24f0101 100644 --- a/mod/forum/classes/local/exporters/discussion.php +++ b/mod/forum/classes/local/exporters/discussion.php @@ -213,7 +213,7 @@ class discussion extends exporter { 'pin' => $capabilitymanager->can_pin_discussion($user, $discussion), 'post' => $capabilitymanager->can_post_in_discussion($user, $discussion), 'manage' => $capabilitymanager->can_manage_forum($user), - 'favourite' => $capabilitymanager->can_favourite_discussion($user, $discussion) // Defaulting to true until we get capabilities sorted + 'favourite' => $capabilitymanager->can_favourite_discussion($user) // Defaulting to true until we get capabilities sorted ], 'urls' => [ 'view' => $urlfactory->get_discussion_view_url_from_discussion($discussion)->out(false), diff --git a/mod/forum/classes/local/managers/capability.php b/mod/forum/classes/local/managers/capability.php index db465d6b175..5709c71293b 100644 --- a/mod/forum/classes/local/managers/capability.php +++ b/mod/forum/classes/local/managers/capability.php @@ -325,11 +325,9 @@ class capability { * Can the user favourite the discussion * * @param stdClass $user The user to check - * @param discussion_entity $discussion The discussion to check * @return bool */ - public function can_favourite_discussion(stdClass $user, discussion_entity $discussion) : bool - { + public function can_favourite_discussion(stdClass $user) : bool { $context = $this->get_context(); return has_capability('mod/forum:cantogglefavourite', $context, $user); } diff --git a/mod/forum/classes/local/vaults/author.php b/mod/forum/classes/local/vaults/author.php index bd0f78b90a0..2e69e7588b0 100644 --- a/mod/forum/classes/local/vaults/author.php +++ b/mod/forum/classes/local/vaults/author.php @@ -55,10 +55,10 @@ class author extends db_table_vault { * * @param string|null $wheresql Where conditions for the SQL * @param string|null $sortsql Order by conditions for the SQL - * @param \stdClass|null $user The user object + * @param int|null $userid The user ID * @return string */ - protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string { + protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, ?int $userid = null) : string { $selectsql = 'SELECT * FROM {' . self::TABLE . '} ' . $this->get_table_alias(); $selectsql .= $wheresql ? ' WHERE ' . $wheresql : ''; $selectsql .= $sortsql ? ' ORDER BY ' . $sortsql : ''; diff --git a/mod/forum/classes/local/vaults/db_table_vault.php b/mod/forum/classes/local/vaults/db_table_vault.php index 862ad362635..34edcc02f54 100644 --- a/mod/forum/classes/local/vaults/db_table_vault.php +++ b/mod/forum/classes/local/vaults/db_table_vault.php @@ -76,7 +76,7 @@ abstract class db_table_vault { * @return string */ abstract protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, - \stdClass $user = null) : string; + ?int $userid = null) : string; /** * Convert the DB records into entities. The list of records will have been diff --git a/mod/forum/classes/local/vaults/discussion.php b/mod/forum/classes/local/vaults/discussion.php index d6aa04945ab..f5a60bc4b6d 100644 --- a/mod/forum/classes/local/vaults/discussion.php +++ b/mod/forum/classes/local/vaults/discussion.php @@ -58,10 +58,10 @@ class discussion extends db_table_vault { * * @param string|null $wheresql Where conditions for the SQL * @param string|null $sortsql Order by conditions for the SQL - * @param \stdClass|null $user The user object + * @param int|null $userid The user ID * @return string */ - protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string { + protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, ?int $userid = null) : string { $selectsql = 'SELECT * FROM {' . self::TABLE . '} ' . $this->get_table_alias(); $selectsql .= $wheresql ? ' WHERE ' . $wheresql : ''; $selectsql .= $sortsql ? ' ORDER BY ' . $sortsql : ''; diff --git a/mod/forum/classes/local/vaults/discussion_list.php b/mod/forum/classes/local/vaults/discussion_list.php index 7fa4a56a3a8..9bd2aca9e65 100644 --- a/mod/forum/classes/local/vaults/discussion_list.php +++ b/mod/forum/classes/local/vaults/discussion_list.php @@ -95,17 +95,22 @@ class discussion_list extends db_table_vault { * @param string|null $wheresql Where conditions for the SQL * @param string|null $sortsql Order by conditions for the SQL * @param string|null $joinsql Additional join conditions for the sql - * @param stdClass|null $user User we are performing this query for + * @param int|null $userid The ID of the user we are performing this query for * * @return string */ - protected function generate_get_records_sql(string $wheresql = null, ?string $sortsql = null, stdClass $user = null) : string { + protected function generate_get_records_sql(string $wheresql = null, ?string $sortsql = null, ?int $userid = null) : string { $alias = $this->get_table_alias(); $db = $this->get_db(); - list($favsql, $favparams) = $this->get_favourite_sql($user); - foreach ($favparams as $key => $param) { - $favsql = str_replace(":$key", "'$param'", $favsql); + $includefavourites = $userid ? true : false; + + $favsql = ''; + if ($includefavourites) { + list($favsql, $favparams) = $this->get_favourite_sql($userid); + foreach ($favparams as $key => $param) { + $favsql = str_replace(":$key", "'$param'", $favsql); + } } // Fetch: @@ -126,8 +131,8 @@ class discussion_list extends db_table_vault { ]); $sortkeys = [ - $this->get_sort_order(self::SORTORDER_REPLIES_DESC), - $this->get_sort_order(self::SORTORDER_REPLIES_ASC) + $this->get_sort_order(self::SORTORDER_REPLIES_DESC, $includefavourites), + $this->get_sort_order(self::SORTORDER_REPLIES_ASC, $includefavourites) ]; $issortbyreplies = in_array($sortsql, $sortkeys); @@ -135,7 +140,7 @@ class discussion_list extends db_table_vault { $tables .= ' JOIN {user} fa ON fa.id = ' . $alias . '.userid'; $tables .= ' JOIN {user} la ON la.id = ' . $alias . '.usermodified'; $tables .= ' JOIN ' . $posttable->get_from_sql() . ' ON fp.id = ' . $alias . '.firstpost'; - $tables .= isset($favsql) ? $favsql : ''; + $tables .= $favsql; if ($issortbyreplies) { // Join the discussion replies. @@ -263,10 +268,11 @@ class discussion_list extends db_table_vault { /** * Get the sort order SQL for a sort method. * - * @param int|null $sortmethod + * @param int|null $sortmethod + * @param bool|null $includefavourites * @return string */ - public function get_sort_order(?int $sortmethod, $includefavourites = true) : string { + private function get_sort_order(?int $sortmethod, bool $includefavourites = true) : string { $alias = $this->get_table_alias(); // TODO consider user favourites... @@ -284,7 +290,7 @@ class discussion_list extends db_table_vault { // After the null favourite fields are deprioritised and appear below the favourited discussions we // need to order the favourited discussions by id so that the most recently favourited discussions // appear at the top of the list. - $favouritesort .= ", {$favalias}.id DESC"; + $favouritesort .= ", {$favalias}.itemtype DESC"; } return "{$alias}.pinned DESC $favouritesort , {$keyfield} {$direction}"; @@ -294,7 +300,7 @@ class discussion_list extends db_table_vault { * Fetch any required SQL to respect timed posts. * * @param bool $includehiddendiscussions Whether to include hidden discussions or not - * @param int $includepostsforuser Which user to include posts for, if any + * @param int|null $includepostsforuser Which user to include posts for, if any * @return array The SQL and parameters to include */ protected function get_hidden_post_sql(bool $includehiddendiscussions, ?int $includepostsforuser) { @@ -336,8 +342,7 @@ class discussion_list extends db_table_vault { ?int $includepostsforuser, ?int $sortorder, int $limit, - int $offset, - stdClass $user + int $offset ) { $alias = $this->get_table_alias(); $wheresql = "{$alias}.forum = :forumid"; @@ -351,7 +356,9 @@ class discussion_list extends db_table_vault { 'forumid' => $forumid, ]); - $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder, isloggedin()), $user); + $includefavourites = $includepostsforuser ? true : false; + $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder, $includefavourites), + $includepostsforuser); $records = $this->get_db()->get_records_sql($sql, $params, $offset, $limit); return $this->transform_db_records_to_entities($records); @@ -377,8 +384,7 @@ class discussion_list extends db_table_vault { ?int $includepostsforuser, ?int $sortorder, int $limit, - int $offset, - stdClass $user + int $offset ) { $alias = $this->get_table_alias(); @@ -402,7 +408,9 @@ class discussion_list extends db_table_vault { 'allgroupsid' => -1, ]); - $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder, isloggedin()), $user); + $includefavourites = $includepostsforuser ? true : false; + $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder, $includefavourites), + $includepostsforuser); $records = $this->get_db()->get_records_sql($sql, $params, $offset, $limit); return $this->transform_db_records_to_entities($records); @@ -483,20 +491,16 @@ class discussion_list extends db_table_vault { /** * Get the standard favouriting sql. * - * @param stdClass $user The user we are getting the sql for + * @param int $userid The ID of the user we are getting the sql for * @return [$sql, $params] An array comprising of the sql and any associated params */ - private function get_favourite_sql(?stdClass $user): array { - $favsql = ""; - $favparams = []; + private function get_favourite_sql(int $userid): array { - if ($user && isloggedin()) { - $usercontext = \context_user::instance($user->id); - $alias = $this->get_table_alias(); - $ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext); - list($favsql, $favparams) = $ufservice->get_join_sql_by_type('mod_forum', 'discussions', - $this->get_favourite_alias(), "$alias.id"); - } + $usercontext = \context_user::instance($userid); + $alias = $this->get_table_alias(); + $ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext); + list($favsql, $favparams) = $ufservice->get_join_sql_by_type('mod_forum', 'discussions', + $this->get_favourite_alias(), "$alias.id"); return [$favsql, $favparams]; } diff --git a/mod/forum/classes/local/vaults/forum.php b/mod/forum/classes/local/vaults/forum.php index 1fb21f715b0..d16a0997cb6 100644 --- a/mod/forum/classes/local/vaults/forum.php +++ b/mod/forum/classes/local/vaults/forum.php @@ -61,10 +61,10 @@ class forum extends db_table_vault { * * @param string|null $wheresql Where conditions for the SQL * @param string|null $sortsql Order by conditions for the SQL - * @param \stdClass|null $user The user object + * @param int|null $userid The user ID * @return string */ - protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string { + protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, ?int $userid = null) : string { $db = $this->get_db(); $alias = $this->get_table_alias(); diff --git a/mod/forum/classes/local/vaults/post.php b/mod/forum/classes/local/vaults/post.php index a7c17108071..18ef42b0c7e 100644 --- a/mod/forum/classes/local/vaults/post.php +++ b/mod/forum/classes/local/vaults/post.php @@ -63,10 +63,10 @@ class post extends db_table_vault { * * @param string|null $wheresql Where conditions for the SQL * @param string|null $sortsql Order by conditions for the SQL - * @param \stdClass|null $user The user object + * @param int|null $userid The user ID * @return string */ - protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, stdClass $user = null) : string { + protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, ?int $userid = null) : string { $table = self::TABLE; $alias = $this->get_table_alias(); $fields = $alias . '.*'; diff --git a/mod/forum/classes/local/vaults/post_read_receipt_collection.php b/mod/forum/classes/local/vaults/post_read_receipt_collection.php index 28b1db82151..6d8aea57e39 100644 --- a/mod/forum/classes/local/vaults/post_read_receipt_collection.php +++ b/mod/forum/classes/local/vaults/post_read_receipt_collection.php @@ -57,10 +57,10 @@ class post_read_receipt_collection extends db_table_vault { * * @param string|null $wheresql Where conditions for the SQL * @param string|null $sortsql Order by conditions for the SQL - * @param \stdClass|null $user The user object + * @param int|null $userid The user ID * @return string */ - protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string { + protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, ?int $userid = null) : string { $selectsql = 'SELECT * FROM {' . self::TABLE . '} ' . $this->get_table_alias(); $selectsql .= $wheresql ? ' WHERE ' . $wheresql : ''; $selectsql .= $sortsql ? ' ORDER BY ' . $sortsql : ''; diff --git a/mod/forum/externallib.php b/mod/forum/externallib.php index ab256d6b46b..4757cf338ad 100644 --- a/mod/forum/externallib.php +++ b/mod/forum/externallib.php @@ -1407,7 +1407,7 @@ class mod_forum_external extends external_api { $capabilitymanager = $managerfactory->get_capability_manager($forum); // Does the user have the ability to favourite the discussion? - if (!$capabilitymanager->can_favourite_discussion($USER, $discussion)) { + if (!$capabilitymanager->can_favourite_discussion($USER)) { throw new moodle_exception('cannotfavourite', 'forum'); } $usercontext = context_user::instance($USER->id);