MDL-64820 forum: fix up issues from review
[moodle.git] / mod / forum / classes / local / exporters / posts.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  * Posts exporter 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\exporters;
27 defined('MOODLE_INTERNAL') || die();
29 use mod_forum\local\entities\author as author_entity;
30 use mod_forum\local\entities\post as post_entity;
31 use mod_forum\local\exporters\post as post_exporter;
32 use core\external\exporter;
33 use renderer_base;
35 require_once($CFG->dirroot . '/mod/forum/lib.php');
37 /**
38  * Posts exporter class.
39  *
40  * @copyright  2019 Ryan Wyllie <ryan@moodle.com>
41  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
42  */
43 class posts extends exporter {
44     /** @var post_entity[] $posts List of posts to export */
45     private $posts;
46     /** @var author_entity[] $authorsbyid List of authors for the posts indexed by author id */
47     private $authorsbyid;
48     /** @var array $attachmentsbypostid List of attachments indexed by post id */
49     private $attachmentsbypostid;
50     /** @var array $groupsbyauthorid List of author's groups indexed by author id */
51     private $groupsbyauthorid;
52     /** @var array $tagsbypostid List of tags indexed by post id */
53     private $tagsbypostid;
54     /** @var array $ratingbypostid List of ratings indexed by post id */
55     private $ratingbypostid;
57     /**
58      * Constructor.
59      *
60      * @param post_entity[] $posts List of posts to export
61      * @param author_entity[] $authorsbyid List of authors for the posts indexed by author id
62      * @param array $attachmentsbypostid List of attachments indexed by post id
63      * @param array $groupsbyauthorid List of author's groups indexed by author id
64      * @param array $tagsbypostid List of tags indexed by post id
65      * @param array $ratingbypostid List of ratings indexed by post id
66      * @param array $related The related objects for exporting
67      */
68     public function __construct(
69         array $posts,
70         array $authorsbyid = [],
71         array $attachmentsbypostid = [],
72         array $groupsbyauthorid = [],
73         array $tagsbypostid = [],
74         array $ratingbypostid = [],
75         array $related = []
76     ) {
77         $this->posts = $posts;
78         $this->authorsbyid = $authorsbyid;
79         $this->attachmentsbypostid = $attachmentsbypostid;
80         $this->groupsbyauthorid = $groupsbyauthorid;
81         $this->tagsbypostid = $tagsbypostid;
82         $this->ratingbypostid = $ratingbypostid;
83         return parent::__construct([], $related);
84     }
86     /**
87      * Return the list of additional properties.
88      *
89      * @return array
90      */
91     protected static function define_other_properties() {
92         return [
93             'posts' => [
94                 'type' => post_exporter::read_properties_definition(),
95                 'multiple' => true
96             ]
97         ];
98     }
100     /**
101      * Get the additional values to inject while exporting.
102      *
103      * @param renderer_base $output The renderer.
104      * @return array Keys are the property names, values are their values.
105      */
106     protected function get_other_values(renderer_base $output) {
107         $related = $this->related;
108         $authorsbyid = $this->authorsbyid;
109         $attachmentsbypostid = $this->attachmentsbypostid;
110         $groupsbyauthorid = $this->groupsbyauthorid;
111         $tagsbypostid = $this->tagsbypostid;
112         $ratingbypostid = $this->ratingbypostid;
113         $exportedposts = array_map(
114             function($post) use (
115                 $related,
116                 $authorsbyid,
117                 $attachmentsbypostid,
118                 $groupsbyauthorid,
119                 $tagsbypostid,
120                 $ratingbypostid,
121                 $output
122             ) {
123                 $authorid = $post->get_author_id();
124                 $postid = $post->get_id();
125                 $author = isset($authorsbyid[$authorid]) ? $authorsbyid[$authorid] : [];
126                 $attachments = isset($attachmentsbypostid[$postid]) ? $attachmentsbypostid[$postid] : [];
127                 $authorgroups = isset($groupsbyauthorid[$authorid]) ? $groupsbyauthorid[$authorid] : [];
128                 $tags = isset($tagsbypostid[$postid]) ? $tagsbypostid[$postid] : [];
129                 $rating = isset($ratingbypostid[$postid]) ? $ratingbypostid[$postid] : null;
130                 $exporter = new post_exporter($post, array_merge($related, [
131                     'author' => $author,
132                     'attachments' => $attachments,
133                     'authorgroups' => $authorgroups,
134                     'tags' => $tags,
135                     'rating' => $rating
136                 ]));
137                 return $exporter->export($output);
138             },
139             $this->posts
140         );
142         return [
143             'posts' => $exportedposts
144         ];
145     }
147     /**
148      * Returns a list of objects that are related.
149      *
150      * @return array
151      */
152     protected static function define_related() {
153         return [
154             'capabilitymanager' => 'mod_forum\local\managers\capability',
155             'urlfactory' => 'mod_forum\local\factories\url',
156             'forum' => 'mod_forum\local\entities\forum',
157             'discussion' => 'mod_forum\local\entities\discussion',
158             'readreceiptcollection' => 'mod_forum\local\entities\post_read_receipt_collection?',
159             'user' => 'stdClass',
160             'context' => 'context',
161             'includehtml' => 'bool'
162         ];
163     }