Merge branch 'MDL-67062-master' of git://github.com/sarjona/moodle
[moodle.git] / h5p / 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 API class for the H5P area.
19  *
20  * @package    core_h5p
21  * @copyright  2020 Sara Arjona <sara@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_h5p;
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * Contains API class for the H5P area.
31  *
32  * @copyright  2020 Sara Arjona <sara@moodle.com>
33  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class api {
37     /**
38      * Delete a library and also all the libraries depending on it and the H5P contents using it. For the H5P content, only the
39      * database entries in {h5p} are removed (the .h5p files are not removed in order to let users to deploy them again).
40      *
41      * @param  factory   $factory The H5P factory.
42      * @param  \stdClass $library The library to delete.
43      */
44     public static function delete_library(factory $factory, \stdClass $library): void {
45         global $DB;
47         // Get the H5P contents using this library, to remove them from DB. The .h5p files won't be removed
48         // so they will be displayed by the player next time a user with the proper permissions accesses it.
49         $sql = 'SELECT DISTINCT hcl.h5pid
50                   FROM {h5p_contents_libraries} hcl
51                  WHERE hcl.libraryid = :libraryid';
52         $params = ['libraryid' => $library->id];
53         $h5pcontents = $DB->get_records_sql($sql, $params);
54         foreach ($h5pcontents as $h5pcontent) {
55             $factory->get_framework()->deleteContentData($h5pcontent->h5pid);
56         }
58         $fs = $factory->get_core()->fs;
59         $framework = $factory->get_framework();
60         // Delete the library from the file system.
61         $fs->delete_library(array('libraryId' => $library->id));
62         // Delete also the cache assets to rebuild them next time.
63         $framework->deleteCachedAssets($library->id);
65         // Remove library data from database.
66         $DB->delete_records('h5p_library_dependencies', array('libraryid' => $library->id));
67         $DB->delete_records('h5p_libraries', array('id' => $library->id));
69         // Remove the libraries using this library.
70         $requiredlibraries = self::get_dependent_libraries($library->id);
71         foreach ($requiredlibraries as $requiredlibrary) {
72             self::delete_library($factory, $requiredlibrary);
73         }
74     }
76     /**
77      * Get all the libraries using a defined library.
78      *
79      * @param  int    $libraryid The library to get its dependencies.
80      * @return array  List of libraryid with all the libraries required by a defined library.
81      */
82     public static function get_dependent_libraries(int $libraryid): array {
83         global $DB;
85         $sql = 'SELECT DISTINCT hl.*
86                   FROM {h5p_library_dependencies} hld
87                   JOIN {h5p_libraries} hl ON hl.id = hld.libraryid
88                  WHERE hld.requiredlibraryid = :libraryid';
89         $params = ['libraryid' => $libraryid];
91         return $DB->get_records_sql($sql, $params);
92     }
94     /**
95      * Get a library from an identifier.
96      *
97      * @param  int    $libraryid The library identifier.
98      * @return \stdClass The library object having the library identifier defined.
99      * @throws dml_exception A DML specific exception is thrown if the libraryid doesn't exist.
100      */
101     public static function get_library(int $libraryid): \stdClass {
102         global $DB;
104         return $DB->get_record('h5p_libraries', ['id' => $libraryid], '*', MUST_EXIST);
105     }