418b1216b98f7347ecc9902305692ba06b6bd38a
[moodle.git] / mod / forum / classes / local / entities / discussion.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  * Discussion class.
19  *
20  * @package    mod_forum
21  * @copyright  2019 Ryan Wyllie <ryan@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace mod_forum\local\entities;
27 defined('MOODLE_INTERNAL') || die();
29 use mod_forum\local\entities\post as post_entity;
31 /**
32  * Discussion class.
33  *
34  * @copyright  2019 Ryan Wyllie <ryan@moodle.com>
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class discussion {
38     /** @var int $id ID */
39     private $id;
40     /** @var int $courseid Course id */
41     private $courseid;
42     /** @var int $forumid Forum id */
43     private $forumid;
44     /** @var string $name Discussion name */
45     private $name;
46     /** @var int $firstpostid Id of the first post in the discussion */
47     private $firstpostid;
48     /** @var int $userid Id of the user that created the discussion */
49     private $userid;
50     /** @var int $groupid Group id if it's a group dicussion */
51     private $groupid;
52     /** @var bool $assessed Is the discussion assessed? */
53     private $assessed;
54     /** @var int $timemodified Timestamp for last modification to the discussion */
55     private $timemodified;
56     /** @var int $usermodified Id of user that last modified the discussion */
57     private $usermodified;
58     /** @var int $timestart Start time for the discussion */
59     private $timestart;
60     /** @var int $timeend End time for the discussion */
61     private $timeend;
62     /** @var bool $pinned Is the discussion pinned? */
63     private $pinned;
64     /** @var int $locked The timestamp of when the discussion was locked */
65     private $timelocked;
67     /**
68      * Constructor.
69      *
70      * @param int $id ID
71      * @param int $courseid Course id
72      * @param int $forumid Forum id
73      * @param string $name Discussion name
74      * @param int $firstpostid Id of the first post in the discussion
75      * @param int $userid Id of the user that created the discussion
76      * @param int $groupid Group id if it's a group dicussion
77      * @param bool $assessed Is the discussion assessed?
78      * @param int $timemodified Timestamp for last modification to the discussion
79      * @param int $usermodified Id of user that last modified the discussion
80      * @param int $timestart Start time for the discussion
81      * @param int $timeend End time for the discussion
82      * @param bool $pinned Is the discussion pinned?
83      * @param int $locked Time this discussion was locked
84      */
85     public function __construct(
86         int $id,
87         int $courseid,
88         int $forumid,
89         string $name,
90         int $firstpostid,
91         int $userid,
92         int $groupid,
93         bool $assessed,
94         int $timemodified,
95         int $usermodified,
96         int $timestart,
97         int $timeend,
98         bool $pinned,
99         int $locked
100     ) {
101         $this->id = $id;
102         $this->courseid = $courseid;
103         $this->forumid = $forumid;
104         $this->name = $name;
105         $this->firstpostid = $firstpostid;
106         $this->userid = $userid;
107         $this->groupid = $groupid;
108         $this->assessed = $assessed;
109         $this->timemodified = $timemodified;
110         $this->usermodified = $usermodified;
111         $this->timestart = $timestart;
112         $this->timeend = $timeend;
113         $this->pinned = $pinned;
114         $this->timelocked = $locked;
115     }
117     /**
118      * Get the discussion id.
119      *
120      * @return int
121      */
122     public function get_id() : int {
123         return $this->id;
124     }
126     /**
127      * Get the course id.
128      *
129      * @return int
130      */
131     public function get_course_id() : int {
132         return $this->courseid;
133     }
135     /**
136      * Get the forum id.
137      *
138      * @return int
139      */
140     public function get_forum_id() : int {
141         return $this->forumid;
142     }
144     /**
145      * Get the name of the discussion.
146      *
147      * @return string
148      */
149     public function get_name() : string {
150         return $this->name;
151     }
153     /**
154      * Get the id of the fist post in the discussion.
155      *
156      * @return int
157      */
158     public function get_first_post_id() : int {
159         return $this->firstpostid;
160     }
162     /**
163      * Get the id of the user that created the discussion.
164      *
165      * @return int
166      */
167     public function get_user_id() : int {
168         return $this->userid;
169     }
171     /**
172      * Get the id of the group that this discussion belongs to.
173      *
174      * @return int
175      */
176     public function get_group_id() : int {
177         return $this->groupid;
178     }
180     /**
181      * Check if this discussion is assessed.
182      *
183      * @return bool
184      */
185     public function is_assessed() : bool {
186         return $this->assessed;
187     }
189     /**
190      * Get the timestamp for when this discussion was last modified.
191      *
192      * @return int
193      */
194     public function get_time_modified() : int {
195         return $this->timemodified;
196     }
198     /**
199      * Get the id of the user that last modified this discussion.
200      *
201      * @return int
202      */
203     public function get_user_modified() : int {
204         return $this->usermodified;
205     }
207     /**
208      * Get the start time of this discussion. Returns zero if the discussion
209      * has no designated start time.
210      *
211      * @return int
212      */
213     public function get_time_start() : int {
214         return $this->timestart;
215     }
217     /**
218      * Get the end time of this discussion. Returns zero if the discussion
219      * has no designated end time.
220      *
221      * @return int
222      */
223     public function get_time_end() : int {
224         return $this->timeend;
225     }
227     /**
228      * Check if this discussion is pinned.
229      *
230      * @return bool
231      */
232     public function is_pinned() : bool {
233         return $this->pinned;
234     }
236     /**
237      * Check if this discussion is pinned.
238      *
239      * @return bool
240      */
241     public function get_locked() : int {
242         return $this->timelocked;
243     }
245     /**
246      * Is this discussion locked based on it's locked attribute
247      *
248      * @return bool
249      */
250     public function is_locked() : bool {
251         return ($this->timelocked ? true : false);
252     }
254     /**
255      * Set the locked timestamp
256      *
257      * @param int $timestamp
258      */
259     public function toggle_locked_state(int $timestamp) {
260         // If it is locked already then unlock else set it to the timestamp.
261         $this->timelocked = ($this->timelocked ? 0 : $timestamp);
262     }
264     /**
265      * Check if the given post is the first post in this discussion.
266      *
267      * @param post_entity $post The post to check
268      * @return bool
269      */
270     public function is_first_post(post_entity $post) : bool {
271         return $this->get_first_post_id() === $post->get_id();
272     }
274     /**
275      * Check if the discussion has started yet. DEFAULTS: true if not set
276      *
277      * @return bool
278      */
279     public function has_started() : bool {
280         $startime = $this->get_time_start();
281         return empty($startime) || $startime < time();
282     }
284     /**
285      * Check if the discussion has ended. DEFAULTS: false if not set
286      *
287      * @return bool
288      */
289     public function has_ended() : bool {
290         $endtime = $this->get_time_end();
291         return !empty($endtime) && $endtime < time();
292     }
294     /**
295      * Check if the discussion belongs to a group.
296      *
297      * @return bool
298      */
299     public function has_group() : bool {
300         return $this->get_group_id() > 0;
301     }
303     /**
304      * Check if the discussion is timed.
305      *
306      * @return bool
307      */
308     public function is_timed_discussion() : bool {
309         global $CFG;
311         return !empty($CFG->forum_enabletimedposts) &&
312               ($this->get_time_start() || $this->get_time_end());
313     }
315     /**
316      * Check if the timed discussion is visible.
317      *
318      * @return bool
319      */
320     public function is_timed_discussion_visible() : bool {
321         return !$this->is_timed_discussion() || ($this->has_started() && !$this->has_ended());
322     }