MDL-67585 core_course: new web service to return course content items

This commit is contained in:
Jake Dallimore
2020-02-20 11:42:23 +08:00
parent a826857844
commit 85b4eec5b7
3 changed files with 102 additions and 0 deletions
+51
View File
@@ -4329,4 +4329,55 @@ class core_course_external extends external_api {
public static function remove_content_item_from_user_favourites_returns() {
return \core_course\local\exporters\course_content_item_exporter::get_read_structure();
}
/**
* Returns description of method result value
*
* @return external_description
*/
public static function get_course_content_items_returns() {
return new external_single_structure([
'content_items' => new external_multiple_structure(
\core_course\local\exporters\course_content_item_exporter::get_read_structure()
),
]);
}
/**
* Returns description of method parameters
*
* @return external_function_parameters
*/
public static function get_course_content_items_parameters() {
return new external_function_parameters([
'courseid' => new external_value(PARAM_INT, 'ID of the course', VALUE_REQUIRED),
]);
}
/**
* Given a course ID fetch all accessible modules for that course
*
* @param int $courseid The course we want to fetch the modules for
* @return array Contains array of modules and their metadata
*/
public static function get_course_content_items(int $courseid) {
global $USER;
[
'courseid' => $courseid,
] = self::validate_parameters(self::get_course_content_items_parameters(), [
'courseid' => $courseid,
]);
$coursecontext = context_course::instance($courseid);
self::validate_context($coursecontext);
$course = get_course($courseid);
$contentitemservice = new \core_course\local\service\content_item_service(
new \core_course\local\repository\content_item_readonly_repository()
);
$contentitems = $contentitemservice->get_content_items_for_user_in_course($USER, $course);
return ['content_items' => $contentitems];
}
}
+43
View File
@@ -3162,4 +3162,47 @@ class core_course_externallib_testcase extends externallib_advanced_testcase {
});
$this->assertCount(0, $favourited);
}
/**
* Test the web service returning course content items for inclusion in activity choosers, etc.
*/
public function test_get_course_content_items() {
$this->resetAfterTest();
$course = self::getDataGenerator()->create_course();
$user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
// Fetch available content items as the editing teacher.
$this->setUser($user);
$result = core_course_external::get_course_content_items($course->id);
$result = external_api::clean_returnvalue(core_course_external::get_course_content_items_returns(), $result);
$contentitemservice = new \core_course\local\service\content_item_service(
new \core_course\local\repository\content_item_readonly_repository()
);
// Check if the webservice returns exactly what the service defines, albeit in array form.
$serviceitemsasarray = array_map(function($item) {
return (array) $item;
}, $contentitemservice->get_content_items_for_user_in_course($user, $course));
$this->assertEquals($serviceitemsasarray, $result['content_items']);
}
/**
* Test the web service returning course content items, specifically in case where the user can't manage activities.
*/
public function test_get_course_content_items_no_permission_to_manage() {
$this->resetAfterTest();
$course = self::getDataGenerator()->create_course();
$user = self::getDataGenerator()->create_and_enrol($course, 'student');
// Fetch available content items as a student, who won't have the permission to manage activities.
$this->setUser($user);
$result = core_course_external::get_course_content_items($course->id);
$result = external_api::clean_returnvalue(core_course_external::get_course_content_items_returns(), $result);
$this->assertEmpty($result['content_items']);
}
}
+8
View File
@@ -653,6 +653,14 @@ $functions = array(
'type' => 'read',
'ajax' => true,
),
'core_course_get_course_content_items' => array(
'classname' => 'core_course_external',
'methodname' => 'get_course_content_items',
'classpath' => 'course/externallib.php',
'description' => 'Fetch all the content items (activities, resources and their subtypes) for the activity picker',
'type' => 'read',
'ajax' => true,
),
'core_enrol_get_course_enrolment_methods' => array(
'classname' => 'core_enrol_external',
'methodname' => 'get_course_enrolment_methods',