MDL-58332 message: remove concat in get_popup_notifications sql
[moodle.git] / message / output / popup / classes / api.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Contains class used to return information to display for the message popup.
19  *
20  * @package    message_popup
21  * @copyright  2016 Ryan Wyllie <ryan@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace message_popup;
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * Class used to return information to display for the message popup.
31  *
32  * @copyright  2016 Ryan Wyllie <ryan@moodle.com>
33  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class api {
36     /**
37      * Get popup notifications for the specified users. Nothing is returned if notifications are disabled.
38      *
39      * @param int $useridto the user id who received the notification
40      * @param string $sort the column name to order by including optionally direction
41      * @param int $limit limit the number of result returned
42      * @param int $offset offset the result set by this amount
43      * @return array notification records
44      * @throws \moodle_exception
45      * @since 3.2
46      */
47     public static function get_popup_notifications($useridto = 0, $sort = 'DESC', $limit = 0, $offset = 0) {
48         global $DB, $USER;
50         $sort = strtoupper($sort);
51         if ($sort != 'DESC' && $sort != 'ASC') {
52             throw new \moodle_exception('invalid parameter: sort: must be "DESC" or "ASC"');
53         }
55         if (empty($useridto)) {
56             $useridto = $USER->id;
57         }
59         $params = [
60             'useridto1' => $useridto,
61             'useridto2' => $useridto,
62         ];
64         // Is notification enabled ?
65         if ($useridto == $USER->id) {
66             $disabled = $USER->emailstop;
67         } else {
68             $user = \core_user::get_user($useridto, "emailstop", MUST_EXIST);
69             $disabled = $user->emailstop;
70         }
71         if ($disabled) {
72             // Notifications are disabled, no need to run giant queries.
73             return array();
74         }
76         $sql = "SELECT r.id, r.useridfrom, r.useridto,
77                        r.subject, r.fullmessage, r.fullmessageformat,
78                        r.fullmessagehtml, r.smallmessage, r.notification, r.contexturl,
79                        r.contexturlname, r.timecreated, r.timeuserfromdeleted, r.timeusertodeleted,
80                        r.component, r.eventtype, r.timeread
81                   FROM {message_read} r
82                  WHERE r.notification = 1
83                        AND r.id IN (SELECT messageid FROM {message_popup} WHERE isread = 1)
84                        AND r.useridto = :useridto1
85              UNION ALL
86                 SELECT u.id, u.useridfrom, u.useridto,
87                        u.subject, u.fullmessage, u.fullmessageformat,
88                        u.fullmessagehtml, u.smallmessage, u.notification, u.contexturl,
89                        u.contexturlname, u.timecreated, u.timeuserfromdeleted, u.timeusertodeleted,
90                        u.component, u.eventtype, 0 as timeread
91                   FROM {message} u
92                  WHERE u.notification = 1
93                        AND u.id IN (SELECT messageid FROM {message_popup} WHERE isread = 0)
94                        AND u.useridto = :useridto2
95               ORDER BY timecreated $sort, timeread $sort, id $sort";
97         $notifications = [];
98         // Use recordset here to ensure records with the same id aren't ignored because
99         // we can have id clashes between the message and message_read tables.
100         $records = $DB->get_recordset_sql($sql, $params, $offset, $limit);
101         foreach ($records as $record) {
102             $notifications[] = (object) $record;
103         }
104         $records->close();
106         return $notifications;
107     }
109     /**
110      * Count the unread notifications for a user.
111      *
112      * @param int $useridto the user id who received the notification
113      * @return int count of the unread notifications
114      * @since 3.2
115      */
116     public static function count_unread_popup_notifications($useridto = 0) {
117         global $USER, $DB;
119         if (empty($useridto)) {
120             $useridto = $USER->id;
121         }
123         return $DB->count_records_sql(
124             "SELECT count(id)
125             FROM {message}
126             WHERE id IN (SELECT messageid FROM {message_popup} WHERE isread = 0)
127             AND useridto = ?",
128             [$useridto]
129         );
130     }