MDL-64882 repository_filesystem: convert cron to scheduled task
[moodle.git] / repository / filesystem / classes / task / cron_task.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 namespace repository_filesystem\task;
18 defined('MOODLE_INTERNAL') || die();
20 /**
21  * A schedule task for file system repository cron.
22  *
23  * @package   repository_filesystem
24  * @copyright 2019 Simey Lameze <simey@moodle.com>
25  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26  */
27 class cron_task extends \core\task\scheduled_task {
28     /**
29      * Get a descriptive name for this task (shown to admins).
30      *
31      * @return string
32      */
33     public function get_name() {
34         return get_string('crontask', 'repository_filesystem');
35     }
37     /**
38      * Run file system repository cron.
39      */
40     public function execute() {
41         global $CFG;
42         require_once($CFG->dirroot . '/repository/lib.php');
43         
44         $fs = get_file_storage();
45         // Find all generated thumbnails and group them in array by itemid (itemid == repository instance id).
46         $allfiles = array_merge(
47             $fs->get_area_files(SYSCONTEXTID, 'repository_filesystem', 'thumb'),
48             $fs->get_area_files(SYSCONTEXTID, 'repository_filesystem', 'icon')
49         );
50         $filesbyitem = array();
51         foreach ($allfiles as $file) {
52             if (!isset($filesbyitem[$file->get_itemid()])) {
53                 $filesbyitem[$file->get_itemid()] = array();
54             }
55             $filesbyitem[$file->get_itemid()][] = $file;
56         }
57         // Find all instances of repository_filesystem.
58         $instances = \repository::get_instances(array('type' => 'filesystem'));
59         // Loop through all itemids of generated thumbnails.
60         foreach ($filesbyitem as $itemid => $files) {
61             if (!isset($instances[$itemid]) || !($instances[$itemid] instanceof repository_filesystem)) {
62                 // Instance was deleted.
63                 $fs->delete_area_files(SYSCONTEXTID, 'repository_filesystem', 'thumb', $itemid);
64                 $fs->delete_area_files(SYSCONTEXTID, 'repository_filesystem', 'icon', $itemid);
65                 mtrace(" instance $itemid does not exist: deleted all thumbnails");
66             } else {
67                 // Instance has some generated thumbnails, check that they are not outdated.
68                 $instances[$itemid]->remove_obsolete_thumbnails($files);
69             }
70         }
71     }
72 }