66908154612e808468a138d997bf48a1043a241b
[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 * FROM (
77                     SELECT concat('r', r.id) as uniqueid, r.id, r.useridfrom, r.useridto,
78                         r.subject, r.fullmessage, r.fullmessageformat,
79                         r.fullmessagehtml, r.smallmessage, r.notification, r.contexturl,
80                         r.contexturlname, r.timecreated, r.timeuserfromdeleted, r.timeusertodeleted,
81                         r.component, r.eventtype, r.timeread
82                     FROM {message_read} r
83                     WHERE r.notification = 1
84                     AND r.id IN (SELECT messageid FROM {message_popup} WHERE isread = 1)
85                     AND r.useridto = :useridto1
86                 UNION ALL
87                     SELECT concat('u', u.id) as uniqueid, u.id, u.useridfrom, u.useridto,
88                         u.subject, u.fullmessage, u.fullmessageformat,
89                         u.fullmessagehtml, u.smallmessage, u.notification, u.contexturl,
90                         u.contexturlname, u.timecreated, u.timeuserfromdeleted, u.timeusertodeleted,
91                         u.component, u.eventtype, 0 as timeread
92                     FROM {message} u
93                     WHERE u.notification = 1
94                     AND u.id IN (SELECT messageid FROM {message_popup} WHERE isread = 0)
95                     AND u.useridto = :useridto2
96                 ) f ORDER BY timecreated $sort, timeread $sort, id $sort";
98         return array_values($DB->get_records_sql($sql, $params, $offset, $limit));
99     }
101     /**
102      * Count the unread notifications for a user.
103      *
104      * @param int $useridto the user id who received the notification
105      * @return int count of the unread notifications
106      * @since 3.2
107      */
108     public static function count_unread_popup_notifications($useridto = 0) {
109         global $USER, $DB;
111         if (empty($useridto)) {
112             $useridto = $USER->id;
113         }
115         return $DB->count_records_sql(
116             "SELECT count(id)
117             FROM {message}
118             WHERE id IN (SELECT messageid FROM {message_popup} WHERE isread = 0)
119             AND useridto = ?",
120             [$useridto]
121         );
122     }