MDL-64820 forum: fix up issues from review
[moodle.git] / mod / forum / classes / local / factories / exporter.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  * Forum Exporter 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  */
25 namespace mod_forum\local\factories;
27 defined('MOODLE_INTERNAL') || die();
29 use mod_forum\local\entities\discussion as discussion_entity;
30 use mod_forum\local\entities\forum as forum_entity;
31 use mod_forum\local\entities\post as post_entity;
32 use mod_forum\local\entities\post_read_receipt_collection as post_read_receipt_collection_entity;
33 use mod_forum\local\factories\legacy_data_mapper as legacy_data_mapper_factory;
34 use mod_forum\local\factories\manager as manager_factory;
35 use mod_forum\local\factories\url as url_factory;
36 use mod_forum\local\exporters\forum as forum_exporter;
37 use mod_forum\local\exporters\discussion as discussion_exporter;
38 use mod_forum\local\exporters\discussion_summaries as discussion_summaries_exporter;
39 use mod_forum\local\exporters\post as post_exporter;
40 use mod_forum\local\exporters\posts as posts_exporter;
41 use context;
42 use rating;
43 use stdClass;
45 /**
46  * The exporter factory class used to fetch an instance of the different exporter types.
47  *
48  * See:
49  * https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html
50  *
51  * @copyright  2019 Ryan Wyllie <ryan@moodle.com>
52  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
53  */
54 class exporter {
55     /** @var legacy_data_mapper_factory The factory to fetch a legacy data mapper */
56     private $legacydatamapperfactory;
58     /** @var manager_factory The factory to fetch a new manager */
59     private $managerfactory;
61     /** @var url_factory The factory to create urls */
62     private $urlfactory;
64     /**
65      * Constructor for the exporter factory.
66      *
67      * @param legacy_data_mapper_factory $legacydatamapperfactory The factory to fetch a legacy data mapper instance
68      * @param manager_factory $managerfactory The factory fo fetch a manager instance
69      * @param url_factory $urlfactory The factory to create urls
70      */
71     public function __construct(
72         legacy_data_mapper_factory $legacydatamapperfactory,
73         manager_factory $managerfactory,
74         url_factory $urlfactory
75     ) {
76         $this->legacydatamapperfactory = $legacydatamapperfactory;
77         $this->managerfactory = $managerfactory;
78         $this->urlfactory = $urlfactory;
79     }
81     /**
82      * Construct a new forum exporter for the specified user and forum.
83      *
84      * @param   stdClass        $user The user viewing the forum
85      * @param   forum_entity    $forum The forum being viewed
86      * @param   int             $currentgroup The group currently being viewed
87      * @return  forum_exporter
88      */
89     public function get_forum_exporter(
90         stdClass $user,
91         forum_entity $forum,
92         ?int $currentgroup
93     ) : forum_exporter {
94         return new forum_exporter($forum, [
95             'legacydatamapperfactory' => $this->legacydatamapperfactory,
96             'capabilitymanager' => $this->managerfactory->get_capability_manager($forum),
97             'urlfactory' => $this->urlfactory,
98             'user' => $user,
99             'currentgroup' => $currentgroup,
100         ]);
101     }
103     /**
104      * Fetch the structure of the forum exporter.
105      *
106      * @return  array
107      */
108     public static function get_forum_export_structure() : array {
109         return forum_exporter::read_properties_definition();
110     }
112     /**
113      * Construct a new discussion exporter for the specified user and forum discussion.
114      *
115      * @param   stdClass          $user The user viewing the forum
116      * @param   forum_entity      $forum The forum being viewed
117      * @param   discussion_entity $discussion The discussion being viewed
118      * @param   stdClass[]        $groupsbyid The list of groups in the forum
119      * @return  discussion_exporter
120      */
121     public function get_discussion_exporter(
122         stdClass $user,
123         forum_entity $forum,
124         discussion_entity $discussion,
125         array $groupsbyid = []
126     ) : discussion_exporter {
127         return new discussion_exporter($discussion, [
128             'context' => $forum->get_context(),
129             'forum' => $forum,
130             'capabilitymanager' => $this->managerfactory->get_capability_manager($forum),
131             'urlfactory' => $this->urlfactory,
132             'user' => $user,
133             'legacydatamapperfactory' => $this->legacydatamapperfactory,
134             'latestpostid' => null,
135             'groupsbyid' => $groupsbyid
136         ]);
137     }
139     /**
140      * Fetch the structure of the discussion exporter.
141      *
142      * @return  array
143      */
144     public static function get_discussion_export_structure() {
145         return discussion_exporter::read_properties_definition();
146     }
148     /**
149      * Construct a new discussion summaries exporter for the specified user and set of discussions.
150      *
151      * @param   stdClass        $user The user viewing the forum
152      * @param   forum_entity    $forum The forum being viewed
153      * @param   discussion_entity[] $discussions The set of discussions to be shown
154      * @param   stdClass[]      $groupsbyauthorid The set of groups in an associative array for each author
155      * @param   stdClass[]      $groupsbyid The set of groups in the forum in an associative array for each group
156      * @param   int[]           $discussionreplycount The number of replies for each discussion
157      * @param   int[]           $discussionunreadcount The number of unread posts for each discussion
158      * @param   int[]           $latestpostids The latest post id for each discussion
159      * @return  discussion_summaries_exporter
160      */
161     public function get_discussion_summaries_exporter(
162         stdClass $user,
163         forum_entity $forum,
164         array $discussions,
165         array $groupsbyid = [],
166         array $groupsbyauthorid = [],
167         array $discussionreplycount = [],
168         array $discussionunreadcount = [],
169         array $latestpostid = []
170     ) : discussion_summaries_exporter {
171         return new discussion_summaries_exporter(
172             $discussions,
173             $groupsbyid,
174             $groupsbyauthorid,
175             $discussionreplycount,
176             $discussionunreadcount,
177             $latestpostid,
178             [
179                 'legacydatamapperfactory' => $this->legacydatamapperfactory,
180                 'context' => $forum->get_context(),
181                 'forum' => $forum,
182                 'capabilitymanager' => $this->managerfactory->get_capability_manager($forum),
183                 'urlfactory' => $this->urlfactory,
184                 'user' => $user,
185             ]
186         );
187     }
189     /**
190      * Fetch the structure of the discussion summaries exporter.
191      *
192      * @return  array
193      */
194     public static function get_discussion_summaries_export_structure() {
195         return discussion_summaries_exporter::read_properties_definition();
196     }
198     /**
199      * Construct a new post exporter for the specified user and set of post.
200      *
201      * @param   stdClass        $user The user viewing the forum
202      * @param   forum_entity    $forum The forum being viewed
203      * @param   discussion_entity $discussion The discussion that the post is in
204      * @param   post_entity[]   $posts The set of posts to be exported
205      * @param   author_entity[] $authorsbyid List of authors indexed by author id
206      * @param   array           $attachmentsbypostid List of attachments for each post indexed by post id
207      * @param   array           $groupsbyauthorid List of groups for the post authors indexed by author id
208      * @param   post_read_receipt_collection_entity|null $readreceiptcollection Details of read receipts for each post
209      * @param   array           $tagsbypostid List of tags for each post indexed by post id
210      * @param   rating[]        $ratingbypostid List of ratings for each post indexed by post id
211      * @param   bool            $includehtml Include some pre-constructed HTML in the export
212      * @return  post_exporter
213      */
214     public function get_posts_exporter(
215         stdClass $user,
216         forum_entity $forum,
217         discussion_entity $discussion,
218         array $posts,
219         array $authorsbyid = [],
220         array $attachmentsbypostid = [],
221         array $groupsbyauthorid = [],
222         post_read_receipt_collection_entity $readreceiptcollection = null,
223         array $tagsbypostid = [],
224         array $ratingbypostid = [],
225         bool $includehtml = false
226     ) : posts_exporter {
227         return new posts_exporter($posts, $authorsbyid, $attachmentsbypostid, $groupsbyauthorid, $tagsbypostid, $ratingbypostid, [
228             'capabilitymanager' => $this->managerfactory->get_capability_manager($forum),
229             'urlfactory' => $this->urlfactory,
230             'forum' => $forum,
231             'discussion' => $discussion,
232             'user' => $user,
233             'context' => $forum->get_context(),
234             'readreceiptcollection' => $readreceiptcollection,
235             'includehtml' => $includehtml
236         ]);
237     }
239     /**
240      * Fetch the structure of the posts exporter.
241      *
242      * @return  array
243      */
244     public static function get_posts_export_structure() {
245         return posts_exporter::read_properties_definition();
246     }