Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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/>.
16
 
17
/**
18
 * Entity factory.
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
 */
24
 
25
namespace mod_forum\local\factories;
26
 
27
defined('MOODLE_INTERNAL') || die();
28
 
29
use mod_forum\local\entities\author as author_entity;
30
use mod_forum\local\entities\discussion as discussion_entity;
31
use mod_forum\local\entities\discussion_summary as discussion_summary_entity;
32
use mod_forum\local\entities\forum as forum_entity;
33
use mod_forum\local\entities\post as post_entity;
34
use mod_forum\local\entities\post_read_receipt_collection as post_read_receipt_collection_entity;
35
use mod_forum\local\entities\sorter as sorter_entity;
36
use stdClass;
37
use context;
38
use cm_info;
39
use user_picture;
40
use moodle_url;
41
 
42
/**
43
 * Entity factory to create the forum entities.
44
 *
45
 * See:
46
 * https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html
47
 *
48
 * @copyright  2019 Ryan Wyllie <ryan@moodle.com>
49
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
50
 */
51
class entity {
52
    /**
53
     * Create a forum entity from a stdClass (legacy forum object).
54
     *
55
     * @param stdClass $record The forum record
56
     * @param context $context The forum module context
57
     * @param stdClass $coursemodule Course module record for the forum
58
     * @param stdClass $course Course the forum belongs to
59
     * @return forum_entity
60
     */
61
    public function get_forum_from_stdclass(
62
        stdClass $record,
63
        context $context,
64
        stdClass $coursemodule,
65
        stdClass $course
66
    ): forum_entity {
67
        // Note: cm_info::create loads a cm_info in the context of the current user which
68
        // creates hidden dependency on the logged in user (very bad) however it's the best
69
        // option to load some data we need which doesn't require the logged in user.
70
        // Only use properties which do not require the logged in user.
71
        $cm = \cm_info::create($coursemodule);
72
 
73
        return new forum_entity(
74
            $context,
75
            $coursemodule,
76
            $course,
77
            // This property is a general module property that isn't affected by the logged in user.
78
            $cm->effectivegroupmode,
79
            $record->id,
80
            $record->course,
81
            $record->type,
82
            $record->name,
83
            $record->intro,
84
            $record->introformat,
85
            $record->assessed,
86
            $record->assesstimestart,
87
            $record->assesstimefinish,
88
            $record->scale,
89
            $record->grade_forum,
90
            $record->grade_forum_notify,
91
            $record->maxbytes,
92
            $record->maxattachments,
93
            $record->forcesubscribe,
94
            $record->trackingtype,
95
            $record->rsstype,
96
            $record->rssarticles,
97
            $record->timemodified,
98
            $record->warnafter,
99
            $record->blockafter,
100
            $record->blockperiod,
101
            $record->completiondiscussions,
102
            $record->completionreplies,
103
            $record->completionposts,
104
            $record->displaywordcount,
105
            $record->lockdiscussionafter,
106
            $record->duedate,
107
            $record->cutoffdate
108
        );
109
    }
110
 
111
    /**
112
     * Create a discussion entity from an stdClass (legacy dicussion object).
113
     *
114
     * @param stdClass $record Discussion record
115
     * @return discussion_entity
116
     */
117
    public function get_discussion_from_stdclass(stdClass $record): discussion_entity {
118
        return new discussion_entity(
119
            $record->id,
120
            $record->course,
121
            $record->forum,
122
            $record->name,
123
            $record->firstpost,
124
            $record->userid,
125
            $record->groupid,
126
            $record->assessed,
127
            $record->timemodified,
128
            $record->usermodified,
129
            $record->timestart,
130
            $record->timeend,
131
            $record->pinned,
132
            $record->timelocked
133
        );
134
    }
135
 
136
    /**
137
     * Create a post entity from an stdClass (legacy post object).
138
     *
139
     * @param stdClass $record The post record
140
     * @return post_entity
141
     */
142
    public function get_post_from_stdclass(stdClass $record): post_entity {
143
        return new post_entity(
144
            $record->id,
145
            $record->discussion,
146
            $record->parent,
147
            $record->userid,
148
            $record->created,
149
            $record->modified,
150
            $record->mailed,
151
            $record->subject,
152
            $record->message,
153
            $record->messageformat,
154
            $record->messagetrust,
155
            $record->attachment,
156
            $record->totalscore,
157
            $record->mailnow,
158
            $record->deleted,
159
            $record->privatereplyto,
160
            $record->wordcount,
161
            $record->charcount
162
        );
163
    }
164
 
165
    /**
166
     * Create an author entity from a user record.
167
     *
168
     * @param stdClass $record The user record
169
     * @return author_entity
170
     */
171
    public function get_author_from_stdclass(stdClass $record): author_entity {
172
        return new author_entity(
173
            $record->id,
174
            $record->picture,
175
            $record->firstname,
176
            $record->lastname,
177
            fullname($record),
178
            $record->email,
179
            $record->deleted,
180
            $record->middlename,
181
            $record->firstnamephonetic,
182
            $record->lastnamephonetic,
183
            $record->alternatename,
184
            $record->imagealt
185
        );
186
    }
187
 
188
    /**
189
     * Create a discussion summary enttiy from stdClasses.
190
     *
191
     * @param stdClass $discussion The discussion record
192
     * @param stdClass $firstpost A post record for the first post in the discussion
193
     * @param stdClass $firstpostauthor A user record for the author of the first post
194
     * @param stdClass $latestpostauthor A user record for the author of the latest post in the discussion
195
     * @return discussion_summary_entity
196
     */
197
    public function get_discussion_summary_from_stdclass(
198
        stdClass $discussion,
199
        stdClass $firstpost,
200
        stdClass $firstpostauthor,
201
        stdClass $latestpostauthor
202
    ): discussion_summary_entity {
203
 
204
        $firstpostauthorentity = $this->get_author_from_stdclass($firstpostauthor);
205
        return new discussion_summary_entity(
206
            $this->get_discussion_from_stdclass($discussion),
207
            $this->get_post_from_stdclass($firstpost, $firstpostauthorentity),
208
            $firstpostauthorentity,
209
            $this->get_author_from_stdclass($latestpostauthor)
210
        );
211
    }
212
 
213
    /**
214
     * Create a post read receipt collection entity from a list of read receipt records.
215
     *
216
     * @param array $records A list of read receipt records.
217
     * @return post_read_receipt_collection_entity
218
     */
219
    public function get_post_read_receipt_collection_from_stdclasses(array $records): post_read_receipt_collection_entity {
220
        return new post_read_receipt_collection_entity($records);
221
    }
222
 
223
    /**
224
     * Create a sorter entity to sort post entities.
225
     *
226
     * @return sorter_entity
227
     */
228
    public function get_posts_sorter(): sorter_entity {
229
        return new sorter_entity(
230
            // Get id function for a post_entity.
231
            function(post_entity $post) {
232
                return $post->get_id();
233
            },
234
            // Get parent id function for a post_entity.
235
            function(post_entity $post) {
236
                return $post->get_parent_id();
237
            }
238
        );
239
    }
240
 
241
    /**
242
     * Create a sorter entity to sort exported posts.
243
     *
244
     * @return sorter_entity
245
     */
246
    public function get_exported_posts_sorter(): sorter_entity {
247
        return new sorter_entity(
248
            // Get id function for an exported post.
249
            function(stdClass $post) {
250
                return $post->id;
251
            },
252
            // Get parent id function for an exported post.
253
            function(stdClass $post) {
254
                return $post->parentid;
255
            }
256
        );
257
    }
258
}