MDL-58399 webservice: Return additional file fields for repositories
authorJuan Leyva <juanleyvadelgado@gmail.com>
Mon, 27 Mar 2017 12:20:37 +0000 (14:20 +0200)
committerJuan Leyva <juanleyvadelgado@gmail.com>
Tue, 28 Mar 2017 18:23:16 +0000 (20:23 +0200)
We should be detecting when we are treating files that are linked to
external repositories.
For doing that we'd need to return some additional fields via Web
Services:
- isexternalfile
- mimetype (google docs files use an special one)
- repositorytype (the repository plugin name)

course/externallib.php
lib/externallib.php
lib/filestorage/stored_file.php
lib/tests/externallib_test.php
mod/book/lib.php
mod/folder/lib.php
mod/forum/tests/externallib_test.php
mod/imscp/lib.php
mod/page/lib.php
mod/resource/lib.php
mod/wiki/tests/externallib_test.php

index 73370ac..26b6cc5 100644 (file)
@@ -363,6 +363,11 @@ class core_course_external extends external_api {
                                                   'timecreated' => new external_value(PARAM_INT, 'Time created'),
                                                   'timemodified' => new external_value(PARAM_INT, 'Time modified'),
                                                   'sortorder' => new external_value(PARAM_INT, 'Content sort order'),
+                                                  'mimetype' => new external_value(PARAM_RAW, 'File mime type.', VALUE_OPTIONAL),
+                                                  'isexternalfile' => new external_value(PARAM_BOOL, 'Whether is an external file.',
+                                                    VALUE_OPTIONAL),
+                                                  'repositorytype' => new external_value(PARAM_PLUGIN, 'The repository type for external files.',
+                                                    VALUE_OPTIONAL),
 
                                                   // copyright related info
                                                   'userid' => new external_value(PARAM_INT, 'User who added this content to moodle'),
index 896a175..4114ad6 100644 (file)
@@ -1309,6 +1309,10 @@ class external_util {
                 $file['mimetype'] = $areafile->get_mimetype();
                 $file['filesize'] = $areafile->get_filesize();
                 $file['timemodified'] = $areafile->get_timemodified();
+                $file['isexternalfile'] = $areafile->is_external_file();
+                if ($file['isexternalfile']) {
+                    $file['repositorytype'] = $areafile->get_repository_type();
+                }
                 $fileitemid = $useitemidinurl ? $areafile->get_itemid() : null;
                 $file['fileurl'] = moodle_url::make_webservice_pluginfile_url($contextid, $component, $filearea,
                                     $fileitemid, $areafile->get_filepath(), $areafile->get_filename())->out(false);
@@ -1345,6 +1349,8 @@ class external_files extends external_multiple_structure {
                     'fileurl' => new external_value(PARAM_URL, 'Downloadable file url.', VALUE_OPTIONAL),
                     'timemodified' => new external_value(PARAM_INT, 'Time modified.', VALUE_OPTIONAL),
                     'mimetype' => new external_value(PARAM_RAW, 'File mime type.', VALUE_OPTIONAL),
+                    'isexternalfile' => new external_value(PARAM_BOOL, 'Whether is an external file.', VALUE_OPTIONAL),
+                    'repositorytype' => new external_value(PARAM_PLUGIN, 'The repository type for external files.', VALUE_OPTIONAL),
                 ),
                 'File.'
             ),
@@ -1397,6 +1403,18 @@ class external_files extends external_multiple_structure {
                 'optional' => true,
                 'null' => NULL_NOT_ALLOWED,
             ),
+            'isexternalfile' => array(
+                'type' => PARAM_BOOL,
+                'description' => 'Whether is an external file.',
+                'optional' => true,
+                'null' => NULL_NOT_ALLOWED,
+            ),
+            'repositorytype' => array(
+                'type' => PARAM_PLUGIN,
+                'description' => 'The repository type for the external files.',
+                'optional' => true,
+                'null' => NULL_ALLOWED,
+            ),
         ];
     }
 }
index 192e7b8..481fa35 100644 (file)
@@ -806,6 +806,22 @@ class stored_file {
         }
     }
 
+    /**
+     * Returns repository type.
+     *
+     * @return mixed str|null the repository type or null if is not an external file
+     * @since  Moodle 3.3
+     */
+    public function get_repository_type() {
+
+        if (!empty($this->repository)) {
+            return $this->repository->get_typename();
+        } else {
+            return null;
+        }
+    }
+
+
     /**
      * get reference file id
      * @return int
index d6a922c..088e40a 100644 (file)
@@ -510,6 +510,7 @@ class core_externallib_testcase extends advanced_testcase {
             'timemodified' => $timemodified,
             'filesize' => $filesize,
             'mimetype' => 'text/plain',
+            'isexternalfile' => false,
         );
         // Get all the files for the area.
         $files = external_util::get_area_files($context, $component, $filearea, false);
@@ -529,7 +530,8 @@ class core_externallib_testcase extends advanced_testcase {
         $description = new external_files();
 
         // First check that the expected default values and keys are returned.
-        $expectedkeys = array_flip(array('filename', 'filepath', 'filesize', 'fileurl', 'timemodified', 'mimetype'));
+        $expectedkeys = array_flip(array('filename', 'filepath', 'filesize', 'fileurl', 'timemodified', 'mimetype',
+            'isexternalfile', 'repositorytype'));
         $returnedkeys = array_flip(array_keys($description->content->keys));
         $this->assertEquals($expectedkeys, $returnedkeys);
         $this->assertEquals('List of files.', $description->desc);
index 7f1fb35..e44bc69 100644 (file)
@@ -584,6 +584,11 @@ function book_export_contents($cm, $baseurl) {
             $file['userid']       = $fileinfo->get_userid();
             $file['author']       = $fileinfo->get_author();
             $file['license']      = $fileinfo->get_license();
+            $file['mimetype']     = $fileinfo->get_mimetype();
+            $file['isexternalfile'] = $fileinfo->is_external_file();
+            if ($file['isexternalfile']) {
+                $file['repositorytype'] = $fileinfo->get_repository_type();
+            }
             $contents[] = $file;
         }
     }
index eba3377..afeb969 100644 (file)
@@ -317,6 +317,11 @@ function folder_export_contents($cm, $baseurl) {
         $file['userid']       = $fileinfo->get_userid();
         $file['author']       = $fileinfo->get_author();
         $file['license']      = $fileinfo->get_license();
+        $file['mimetype']     = $fileinfo->get_mimetype();
+        $file['isexternalfile'] = $fileinfo->is_external_file();
+        if ($file['isexternalfile']) {
+            $file['repositorytype'] = $fileinfo->get_repository_type();
+        }
         $contents[] = $file;
     }
 
index ea1ca6d..3f141b9 100644 (file)
@@ -323,6 +323,7 @@ class mod_forum_external_testcase extends externallib_advanced_testcase {
                                     $discussion1reply1->id, '/', $filename),
                     'timemodified' => $timepost,
                     'mimetype' => 'image/jpeg',
+                    'isexternalfile' => false,
                 )
             ),
             'totalscore' => $discussion1reply1->totalscore,
index a7bdb71..35e6e7e 100644 (file)
@@ -411,6 +411,11 @@ function imscp_export_contents($cm, $baseurl) {
         $file['userid']       = $fileinfo->get_userid();
         $file['author']       = $fileinfo->get_author();
         $file['license']      = $fileinfo->get_license();
+        $file['mimetype']     = $fileinfo->get_mimetype();
+        $file['isexternalfile'] = $fileinfo->is_external_file();
+        if ($file['isexternalfile']) {
+            $file['repositorytype'] = $fileinfo->get_repository_type();
+        }
         $contents[] = $file;
     }
 
index f389010..34155c3 100644 (file)
@@ -415,6 +415,11 @@ function page_export_contents($cm, $baseurl) {
         $file['userid']       = $fileinfo->get_userid();
         $file['author']       = $fileinfo->get_author();
         $file['license']      = $fileinfo->get_license();
+        $file['mimetype']     = $fileinfo->get_mimetype();
+        $file['isexternalfile'] = $fileinfo->is_external_file();
+        if ($file['isexternalfile']) {
+            $file['repositorytype'] = $fileinfo->get_repository_type();
+        }
         $contents[] = $file;
     }
 
index 468e838..b44e585 100644 (file)
@@ -449,6 +449,11 @@ function resource_export_contents($cm, $baseurl) {
         $file['userid']       = $fileinfo->get_userid();
         $file['author']       = $fileinfo->get_author();
         $file['license']      = $fileinfo->get_license();
+        $file['mimetype']     = $fileinfo->get_mimetype();
+        $file['isexternalfile'] = $fileinfo->is_external_file();
+        if ($file['isexternalfile']) {
+            $file['repositorytype'] = $fileinfo->get_repository_type();
+        }
         $contents[] = $file;
     }
 
index cbe4967..3e3c9dc 100644 (file)
@@ -1074,6 +1074,7 @@ class mod_wiki_external_testcase extends externallib_advanced_testcase {
             'filename' => $file['filename'],
             'filepath' => $file['filepath'],
             'mimetype' => 'image/jpeg',
+            'isexternalfile' => false,
             'filesize' => strlen($content),
             'timemodified' => $file['timemodified'],
             'fileurl' => moodle_url::make_webservice_pluginfile_url($file['contextid'], $file['component'],
@@ -1128,6 +1129,7 @@ class mod_wiki_external_testcase extends externallib_advanced_testcase {
             'filename' => $file['filename'],
             'filepath' => $file['filepath'],
             'mimetype' => 'image/jpeg',
+            'isexternalfile' => false,
             'filesize' => strlen($content),
             'timemodified' => $file['timemodified'],
             'fileurl' => moodle_url::make_webservice_pluginfile_url($file['contextid'], $file['component'],