<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.


/**
 * Core external functions and service definitions.
 *
 * The functions and services defined on this file are
 * processed and registered into the Moodle DB after any
 * install or upgrade operation. All plugins support this.
 *
 * For more information, take a look to the documentation available:
 *     - Webservices API: {@link http://docs.moodle.org/dev/Web_services_API}
 *     - External API: {@link http://docs.moodle.org/dev/External_functions_API}
 *     - Upgrade API: {@link http://docs.moodle.org/dev/Upgrade_API}
 *
 * @package    core_webservice
 * @category   webservice
 * @copyright  2009 Petr Skodak
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

$functions = array(
    'core_auth_confirm_user' => array(
        'classname'   => 'core_auth_external',
        'methodname'  => 'confirm_user',
        'description' => 'Confirm a user account.',
        'type'        => 'write',
        'ajax'          => true,
        'loginrequired' => false,
    ),
    'core_auth_request_password_reset' => array(
        'classname'   => 'core_auth_external',
        'methodname'  => 'request_password_reset',
        'description' => 'Requests a password reset.',
        'type'        => 'write',
        'ajax'          => true,
        'loginrequired' => false,
    ),
    'core_auth_is_minor' => array(
        'classname'   => 'core_auth_external',
        'methodname'  => 'is_minor',
        'description' => 'Requests a check if a user is a digital minor.',
        'type'        => 'read',
        'ajax'          => true,
        'loginrequired' => false,
    ),
    'core_auth_is_age_digital_consent_verification_enabled' => array(
        'classname'   => 'core_auth_external',
        'methodname'  => 'is_age_digital_consent_verification_enabled',
        'description' => 'Checks if age digital consent verification is enabled.',
        'type'        => 'read',
        'ajax'          => true,
        'loginrequired' => false,
    ),
    'core_auth_resend_confirmation_email' => array(
        'classname'   => 'core_auth_external',
        'methodname'  => 'resend_confirmation_email',
        'description' => 'Resend confirmation email.',
        'type'        => 'write',
        'ajax'          => true,
        'loginrequired' => false,
    ),
    'core_badges_get_user_badges' => array(
        'classname'     => 'core_badges_external',
        'methodname'    => 'get_user_badges',
        'description'   => 'Returns the list of badges awarded to a user.',
        'type'          => 'read',
        'capabilities'  => 'moodle/badges:viewotherbadges',
        'services'      => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_blog_get_entries' => array(
        'classname'   => 'core_blog\external',
        'methodname'  => 'get_entries',
        'description' => 'Returns blog entries.',
        'type'        => 'read',
        'services'    => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax'          => true,
        'loginrequired' => false,
    ),
    'core_blog_view_entries' => array(
        'classname'   => 'core_blog\external',
        'methodname'  => 'view_entries',
        'description' => 'Trigger the blog_entries_viewed event.',
        'type'        => 'read',
        'services'    => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax'          => true,
        'loginrequired' => false,
    ),
    'core_calendar_get_calendar_monthly_view' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_monthly_view',
        'description' => 'Fetch the monthly view data for a calendar',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => '',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_get_calendar_day_view' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_day_view',
        'description' => 'Fetch the day view data for a calendar',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => '',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_get_calendar_upcoming_view' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_upcoming_view',
        'description' => 'Fetch the upcoming view data for a calendar',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => '',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_update_event_start_day' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'update_event_start_day',
        'description' => 'Update the start day (but not time) for an event.',
        'classpath' => 'calendar/externallib.php',
        'type' => 'write',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'ajax' => true,
    ),
    'core_calendar_create_calendar_events' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'create_calendar_events',
        'description' => 'Create calendar events',
        'classpath' => 'calendar/externallib.php',
        'type' => 'write',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_delete_calendar_events' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'delete_calendar_events',
        'description' => 'Delete calendar events',
        'classpath' => 'calendar/externallib.php',
        'type' => 'write',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_get_calendar_events' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_events',
        'description' => 'Get calendar events',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_get_action_events_by_timesort' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_action_events_by_timesort',
        'description' => 'Get calendar action events by tiemsort',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_get_action_events_by_course' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_action_events_by_course',
        'description' => 'Get calendar action events by course',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_get_action_events_by_courses' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_action_events_by_courses',
        'description' => 'Get calendar action events by courses',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_get_calendar_event_by_id' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'get_calendar_event_by_id',
        'description' => 'Get calendar event by id',
        'classpath' => 'calendar/externallib.php',
        'type' => 'read',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_calendar_submit_create_update_form' => array(
        'classname' => 'core_calendar_external',
        'methodname' => 'submit_create_update_form',
        'description' => 'Submit form data for event form',
        'classpath' => 'calendar/externallib.php',
        'type' => 'write',
        'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
        'ajax' => true,
    ),
    'core_cohort_add_cohort_members' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'add_cohort_members',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Adds cohort members.',
        'type' => 'write',
        'capabilities' => 'moodle/cohort:assign'
    ),
    'core_cohort_create_cohorts' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'create_cohorts',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Creates new cohorts.',
        'type' => 'write',
        'capabilities' => 'moodle/cohort:manage'
    ),
    'core_cohort_delete_cohort_members' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'delete_cohort_members',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Deletes cohort members.',
        'type' => 'write',
        'capabilities' => 'moodle/cohort:assign'
    ),
    'core_cohort_delete_cohorts' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'delete_cohorts',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Deletes all specified cohorts.',
        'type' => 'write',
        'capabilities' => 'moodle/cohort:manage'
    ),
    'core_cohort_get_cohort_members' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'get_cohort_members',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Returns cohort members.',
        'type' => 'read',
        'capabilities' => 'moodle/cohort:view'
    ),
    'core_cohort_search_cohorts' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'search_cohorts',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Search for cohorts.',
        'type' => 'read',
        'ajax' => true,
        'capabilities' => 'moodle/cohort:view'
    ),
    'core_cohort_get_cohorts' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'get_cohorts',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Returns cohort details.',
        'type' => 'read',
        'capabilities' => 'moodle/cohort:view'
    ),
    'core_cohort_update_cohorts' => array(
        'classname' => 'core_cohort_external',
        'methodname' => 'update_cohorts',
        'classpath' => 'cohort/externallib.php',
        'description' => 'Updates existing cohorts.',
        'type' => 'write',
        'capabilities' => 'moodle/cohort:manage'
    ),
    'core_comment_get_comments' => array(
        'classname' => 'core_comment_external',
        'methodname' => 'get_comments',
        'description' => 'Returns comments.',
        'type' => 'read',
        'capabilities' => 'moodle/comment:view',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_completion_get_activities_completion_status' => array(
        'classname' => 'core_completion_external',
        'methodname' => 'get_activities_completion_status',
        'description' => 'Return the activities completion status for a user in a course.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_completion_get_course_completion_status' => array(
        'classname' => 'core_completion_external',
        'methodname' => 'get_course_completion_status',
        'description' => 'Returns course completion status.',
        'type' => 'read',
        'capabilities' => 'report/completion:view',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_completion_mark_course_self_completed' => array(
        'classname' => 'core_completion_external',
        'methodname' => 'mark_course_self_completed',
        'description' => 'Update the course completion status for the current user (if course self-completion is enabled).',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_completion_update_activity_completion_status_manually' => array(
        'classname' => 'core_completion_external',
        'methodname' => 'update_activity_completion_status_manually',
        'description' => 'Update completion status for the current user in an activity, only for activities with manual tracking.',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_completion_override_activity_completion_status' => array(
        'classname'     => 'core_completion_external',
        'methodname'    => 'override_activity_completion_status',
        'description'   => 'Update completion status for a user in an activity by overriding it.',
        'type'          => 'write',
        'capabilities'  => 'moodle/course:overridecompletion',
        'ajax'          => true,
    ),
    'core_course_create_categories' => array(
        'classname' => 'core_course_external',
        'methodname' => 'create_categories',
        'classpath' => 'course/externallib.php',
        'description' => 'Create course categories',
        'type' => 'write',
        'capabilities' => 'moodle/category:manage'
    ),
    'core_course_create_courses' => array(
        'classname' => 'core_course_external',
        'methodname' => 'create_courses',
        'classpath' => 'course/externallib.php',
        'description' => 'Create new courses',
        'type' => 'write',
        'capabilities' => 'moodle/course:create, moodle/course:visibility'
    ),
    'core_course_delete_categories' => array(
        'classname' => 'core_course_external',
        'methodname' => 'delete_categories',
        'classpath' => 'course/externallib.php',
        'description' => 'Delete course categories',
        'type' => 'write',
        'capabilities' => 'moodle/category:manage'
    ),
    'core_course_delete_courses' => array(
        'classname' => 'core_course_external',
        'methodname' => 'delete_courses',
        'classpath' => 'course/externallib.php',
        'description' => 'Deletes all specified courses',
        'type' => 'write',
        'capabilities' => 'moodle/course:delete'
    ),
    'core_course_delete_modules' => array(
        'classname' => 'core_course_external',
        'methodname' => 'delete_modules',
        'classpath' => 'course/externallib.php',
        'description' => 'Deletes all specified module instances',
        'type' => 'write',
        'capabilities' => 'moodle/course:manageactivities'
    ),
    'core_course_duplicate_course' => array(
        'classname' => 'core_course_external',
        'methodname' => 'duplicate_course',
        'classpath' => 'course/externallib.php',
        'description' => 'Duplicate an existing course (creating a new one).',
        'type' => 'write',
        'capabilities' => 'moodle/backup:backupcourse, moodle/restore:restorecourse, moodle/course:create'
    ),
    'core_course_get_categories' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_categories',
        'classpath' => 'course/externallib.php',
        'description' => 'Return category details',
        'type' => 'read',
        'capabilities' => 'moodle/category:viewhiddencategories',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_contents' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_course_contents',
        'classpath' => 'course/externallib.php',
        'description' => 'Get course contents',
        'type' => 'read',
        'capabilities' => 'moodle/course:update, moodle/course:viewhiddencourses',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_course_module' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_course_module',
        'classpath' => 'course/externallib.php',
        'description' => 'Return information about a course module',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_course_module_by_instance' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_course_module_by_instance',
        'classpath' => 'course/externallib.php',
        'description' => 'Return information about a given module name and instance id',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_module' => array(
        'classname'   => 'core_course_external',
        'methodname'  => 'get_module',
        'classpath'   => 'course/externallib.php',
        'description' => 'Returns html with one activity module on course page',
        'type'        => 'read',
        'ajax'        => true,
    ),
    'core_course_edit_module' => array(
        'classname'   => 'core_course_external',
        'methodname'  => 'edit_module',
        'classpath'   => 'course/externallib.php',
        'description' => 'Performs an action on course module (change visibility, duplicate, delete, etc.)',
        'type'        => 'write',
        'ajax'        => true,
    ),
    'core_course_edit_section' => array(
        'classname'   => 'core_course_external',
        'methodname'  => 'edit_section',
        'classpath'   => 'course/externallib.php',
        'description' => 'Performs an action on course section (change visibility, set marker, delete)',
        'type'        => 'write',
        'ajax'        => true,
    ),
    'core_course_get_courses' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_courses',
        'classpath' => 'course/externallib.php',
        'description' => 'Return course details',
        'type' => 'read',
        'capabilities' => 'moodle/course:view, moodle/course:update, moodle/course:viewhiddencourses',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_import_course' => array(
        'classname' => 'core_course_external',
        'methodname' => 'import_course',
        'classpath' => 'course/externallib.php',
        'description' => 'Import course data from a course into another course. Does not include any user data.',
        'type' => 'write',
        'capabilities' => 'moodle/backup:backuptargetimport, moodle/restore:restoretargetimport'
    ),
    'core_course_search_courses' => array(
        'classname' => 'core_course_external',
        'methodname' => 'search_courses',
        'classpath' => 'course/externallib.php',
        'description' => 'Search courses by (name, module, block, tag)',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_update_categories' => array(
        'classname' => 'core_course_external',
        'methodname' => 'update_categories',
        'classpath' => 'course/externallib.php',
        'description' => 'Update categories',
        'type' => 'write',
        'capabilities' => 'moodle/category:manage',
    ),
    'core_course_update_courses' => array(
        'classname' => 'core_course_external',
        'methodname' => 'update_courses',
        'classpath' => 'course/externallib.php',
        'description' => 'Update courses',
        'type' => 'write',
        'capabilities' => 'moodle/course:update, moodle/course:changecategory, moodle/course:changefullname, '
            . 'moodle/course:changeshortname, moodle/course:changeidnumber, moodle/course:changesummary, moodle/course:visibility'
    ),
    'core_course_view_course' => array(
        'classname' => 'core_course_external',
        'methodname' => 'view_course',
        'classpath' => 'course/externallib.php',
        'description' => 'Log that the course was viewed',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_activities_overview' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_activities_overview',
        'classpath' => 'course/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Return activities overview for the given courses.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_user_navigation_options' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_user_navigation_options',
        'classpath' => 'course/externallib.php',
        'description' => 'Return a list of navigation options in a set of courses that are avaialable or not for the current user.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_user_administration_options' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_user_administration_options',
        'classpath' => 'course/externallib.php',
        'description' => 'Return a list of administration options in a set of courses that are avaialable or not for the current
                            user.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_courses_by_field' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_courses_by_field',
        'classpath' => 'course/externallib.php',
        'description' => 'Get courses matching a specific field (id/s, shortname, idnumber, category)',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_check_updates' => array(
        'classname' => 'core_course_external',
        'methodname' => 'check_updates',
        'classpath' => 'course/externallib.php',
        'description' => 'Check if there is updates affecting the user for the given course and contexts.',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_updates_since' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_updates_since',
        'classpath' => 'course/externallib.php',
        'description' => 'Check if there are updates affecting the user for the given course since the given time stamp.',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_enrolled_courses_by_timeline_classification' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_enrolled_courses_by_timeline_classification',
        'classpath' => 'course/externallib.php',
        'description' => 'List of enrolled courses for the given timeline classification (past, inprogress, or future).',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_get_recent_courses' => array(
        'classname' => 'core_course_external',
        'methodname' => 'get_recent_courses',
        'classpath' => 'course/externallib.php',
        'description' => 'List of courses a user has accessed most recently.',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_course_set_favourite_courses' => array(
        'classname' => 'core_course_external',
        'methodname' => 'set_favourite_courses',
        'classpath' => 'course/externallib.php',
        'description' => 'Add a list of courses to the list of favourite courses.',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_enrol_get_course_enrolment_methods' => array(
        'classname' => 'core_enrol_external',
        'methodname' => 'get_course_enrolment_methods',
        'classpath' => 'enrol/externallib.php',
        'description' => 'Get the list of course enrolment methods',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_enrol_get_enrolled_users' => array(
        'classname' => 'core_enrol_external',
        'methodname' => 'get_enrolled_users',
        'classpath' => 'enrol/externallib.php',
        'description' => 'Get enrolled users by course id.',
        'type' => 'read',
        'capabilities' => 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update, '
            . 'moodle/site:accessallgroups',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_enrol_get_enrolled_users_with_capability' => array(
        'classname' => 'core_enrol_external',
        'methodname' => 'get_enrolled_users_with_capability',
        'classpath' => 'enrol/externallib.php',
        'description' => 'For each course and capability specified, return a list of the users that are enrolled in the course
                                  and have that capability',
        'type' => 'read',
    ),
    'core_enrol_get_potential_users' => array(
        'classname' => 'core_enrol_external',
        'methodname' => 'get_potential_users',
        'classpath' => 'enrol/externallib.php',
        'description' => 'Get the list of potential users to enrol',
        'ajax' => true,
        'type' => 'read',
        'capabilities' => 'moodle/course:enrolreview'
    ),
    'core_enrol_get_users_courses' => array(
        'classname' => 'core_enrol_external',
        'methodname' => 'get_users_courses',
        'classpath' => 'enrol/externallib.php',
        'description' => 'Get the list of courses where a user is enrolled in',
        'type' => 'read',
        'capabilities' => 'moodle/course:viewparticipants',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_enrol_edit_user_enrolment' => array(
        'classname' => 'core_enrol_external',
        'methodname' => 'edit_user_enrolment',
        'classpath' => 'enrol/externallib.php',
        'description' => 'External function that updates a given user enrolment',
        'type' => 'write',
        'ajax' => true,
    ),
    'core_enrol_unenrol_user_enrolment' => array(
        'classname' => 'core_enrol_external',
        'methodname' => 'unenrol_user_enrolment',
        'classpath' => 'enrol/externallib.php',
        'description' => 'External function that unenrols a given user enrolment',
        'type' => 'write',
        'ajax' => true,
    ),
    'core_fetch_notifications' => array(
        'classname' => 'core_external',
        'methodname' => 'fetch_notifications',
        'classpath' => 'lib/external/externallib.php',
        'description' => 'Return a list of notifications for the current session',
        'type' => 'read',
        'loginrequired' => false,
        'ajax' => true,
    ),
    'core_files_get_files' => array(
        'classname' => 'core_files_external',
        'methodname' => 'get_files',
        'description' => 'browse moodle files',
        'type' => 'read',
        'classpath' => 'files/externallib.php',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_files_upload' => array(
        'classname' => 'core_files_external',
        'methodname' => 'upload',
        'description' => 'upload a file to moodle',
        'type'        => 'write',
        'classpath'   => 'files/externallib.php',
    ),
    'core_form_get_filetypes_browser_data' => array(
        'classname' => 'core_form\external',
        'methodname' => 'get_filetypes_browser_data',
        'classpath' => '',
        'description' => 'Provides data for the filetypes element browser.',
        'type' => 'read',
        'loginrequired' => false,
        'ajax' => true,
    ),
    'core_get_component_strings' => array(
        'classname' => 'core_external',
        'methodname' => 'get_component_strings',
        'classpath' => 'lib/external/externallib.php',
        'description' => 'Return all raw strings (with {$a->xxx}), for a specific component ' .
            '- similar to core get_component_strings(), call',
        'type' => 'read',
        'loginrequired' => false,
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_get_fragment' => array(
        'classname' => 'core_external',
        'methodname' => 'get_fragment',
        'classpath' => 'lib/external/externallib.php',
        'description' => 'Return a fragment for inclusion, such as a JavaScript page.',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_get_string' => array(
        'classname' => 'core_external',
        'methodname' => 'get_string',
        'classpath' => 'lib/external/externallib.php',
        'description' => 'Return a translated string - similar to core get_string(), call',
        'type' => 'read',
        'loginrequired' => false,
        'ajax' => true,
    ),
    'core_get_strings' => array(
        'classname' => 'core_external',
        'methodname' => 'get_strings',
        'classpath' => 'lib/external/externallib.php',
        'description' => 'Return some translated strings - like several core get_string(), calls',
        'type' => 'read',
        'loginrequired' => false,
        'ajax' => true,
    ),
    'core_get_user_dates' => array(
        'classname' => 'core_external',
        'methodname' => 'get_user_dates',
        'classpath' => 'lib/external/externallib.php',
        'description' => 'Return formatted timestamps',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_grades_get_grades' => array(
        'classname' => 'core_grades_external',
        'methodname' => 'get_grades',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                                     Returns student course total grade and grades for activities.
                                     This function does not return category or manual items.
                                     This function is suitable for managers or teachers not students.',
        'type' => 'read',
        'capabilities' => 'moodle/grade:view, moodle/grade:viewall, moodle/grade:viewhidden'
    ),
    'core_grades_update_grades' => array(
        'classname' => 'core_grades_external',
        'methodname' => 'update_grades',
        'description' => 'Update a grade item and associated student grades.',
        'type' => 'write',
    ),
    'core_grading_get_definitions' => array(
        'classname' => 'core_grading_external',
        'methodname' => 'get_definitions',
        'description' => 'Get grading definitions',
        'type' => 'read',
    ),
    'core_grading_get_gradingform_instances' => array(
        'classname' => 'core_grading_external',
        'methodname' => 'get_gradingform_instances',
        'description' => 'Get grading form instances',
        'type' => 'read',
    ),
    'core_grading_save_definitions' => array(
        'classname' => 'core_grading_external',
        'methodname' => 'save_definitions',
        'description' => 'Save grading definitions',
        'type' => 'write',
    ),
    'core_group_add_group_members' => array(
        'classname' => 'core_group_external',
        'methodname' => 'add_group_members',
        'classpath' => 'group/externallib.php',
        'description' => 'Adds group members.',
        'type' => 'write',
        'capabilities' => 'moodle/course:managegroups',
    ),
    'core_group_assign_grouping' => array(
        'classname' => 'core_group_external',
        'methodname' => 'assign_grouping',
        'classpath' => 'group/externallib.php',
        'description' => 'Assing groups from groupings',
        'type' => 'write',
    ),
    'core_group_create_groupings' => array(
        'classname' => 'core_group_external',
        'methodname' => 'create_groupings',
        'classpath' => 'group/externallib.php',
        'description' => 'Creates new groupings',
        'type' => 'write',
    ),
    'core_group_create_groups' => array(
        'classname' => 'core_group_external',
        'methodname' => 'create_groups',
        'classpath' => 'group/externallib.php',
        'description' => 'Creates new groups.',
        'type' => 'write',
        'capabilities' => 'moodle/course:managegroups'
    ),
    'core_group_delete_group_members' => array(
        'classname' => 'core_group_external',
        'methodname' => 'delete_group_members',
        'classpath' => 'group/externallib.php',
        'description' => 'Deletes group members.',
        'type' => 'write',
        'capabilities' => 'moodle/course:managegroups'
    ),
    'core_group_delete_groupings' => array(
        'classname' => 'core_group_external',
        'methodname' => 'delete_groupings',
        'classpath' => 'group/externallib.php',
        'description' => 'Deletes all specified groupings.',
        'type' => 'write',
    ),
    'core_group_delete_groups' => array(
        'classname' => 'core_group_external',
        'methodname' => 'delete_groups',
        'classpath' => 'group/externallib.php',
        'description' => 'Deletes all specified groups.',
        'type' => 'write',
        'capabilities' => 'moodle/course:managegroups'
    ),
    'core_group_get_activity_allowed_groups' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_activity_allowed_groups',
        'classpath' => 'group/externallib.php',
        'description' => 'Gets a list of groups that the user is allowed to access within the specified activity.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_group_get_activity_groupmode' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_activity_groupmode',
        'classpath' => 'group/externallib.php',
        'description' => 'Returns effective groupmode used in a given activity.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_group_get_course_groupings' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_course_groupings',
        'classpath' => 'group/externallib.php',
        'description' => 'Returns all groupings in specified course.',
        'type' => 'read',
    ),
    'core_group_get_course_groups' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_course_groups',
        'classpath' => 'group/externallib.php',
        'description' => 'Returns all groups in specified course.',
        'type' => 'read',
        'ajax' => true,
        'capabilities' => 'moodle/course:managegroups'
    ),
    'core_group_get_course_user_groups' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_course_user_groups',
        'classpath' => 'group/externallib.php',
        'description' => 'Returns all groups in specified course for the specified user.',
        'type' => 'read',
        'capabilities' => 'moodle/course:managegroups',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_group_get_group_members' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_group_members',
        'classpath' => 'group/externallib.php',
        'description' => 'Returns group members.',
        'type' => 'read',
        'capabilities' => 'moodle/course:managegroups'
    ),
    'core_group_get_groupings' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_groupings',
        'classpath' => 'group/externallib.php',
        'description' => 'Returns groupings details.',
        'type' => 'read',
    ),
    'core_group_get_groups' => array(
        'classname' => 'core_group_external',
        'methodname' => 'get_groups',
        'classpath' => 'group/externallib.php',
        'description' => 'Returns group details.',
        'type' => 'read',
        'capabilities' => 'moodle/course:managegroups'
    ),
    'core_group_unassign_grouping' => array(
        'classname' => 'core_group_external',
        'methodname' => 'unassign_grouping',
        'classpath' => 'group/externallib.php',
        'description' => 'Unassing groups from groupings',
        'type' => 'write',
    ),
    'core_group_update_groupings' => array(
        'classname' => 'core_group_external',
        'methodname' => 'update_groupings',
        'classpath' => 'group/externallib.php',
        'description' => 'Updates existing groupings',
        'type' => 'write',
    ),
    'core_group_update_groups' => array(
        'classname' => 'core_group_external',
        'methodname' => 'update_groups',
        'classpath' => 'group/externallib.php',
        'description' => 'Updates existing groups.',
        'type' => 'write',
        'capabilities' => 'moodle/course:managegroups'
    ),
    'core_message_block_user' => array(
        'classname' => 'core_message_external',
        'methodname' => 'block_user',
        'classpath' => 'message/externallib.php',
        'description' => 'Blocks a user',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_block_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'block_contacts',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Block contacts',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_create_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'create_contacts',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Add contacts to the contact list',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_contact_requests' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_contact_requests',
        'classpath' => 'message/externallib.php',
        'description' => 'Returns contact requests for a user',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_create_contact_request' => array(
        'classname' => 'core_message_external',
        'methodname' => 'create_contact_request',
        'classpath' => 'message/externallib.php',
        'description' => 'Creates a contact request',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_confirm_contact_request' => array(
        'classname' => 'core_message_external',
        'methodname' => 'confirm_contact_request',
        'classpath' => 'message/externallib.php',
        'description' => 'Confirms a contact request',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_decline_contact_request' => array(
        'classname' => 'core_message_external',
        'methodname' => 'decline_contact_request',
        'classpath' => 'message/externallib.php',
        'description' => 'Declines a contact request',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_received_contact_requests_count' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_received_contact_requests_count',
        'classpath' => 'message/externallib.php',
        'description' => 'Gets the number of received contact requests',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_delete_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'delete_contacts',
        'classpath' => 'message/externallib.php',
        'description' => 'Remove contacts from the contact list',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_delete_conversation' => array(
        'classname' => 'core_message_external',
        'methodname' => 'delete_conversation',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Deletes a conversation.',
        'type' => 'write',
        'capabilities' => 'moodle/site:deleteownmessage',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_delete_conversations_by_id' => array(
        'classname' => 'core_message_external',
        'methodname' => 'delete_conversations_by_id',
        'classpath' => 'message/externallib.php',
        'description' => 'Deletes a list of conversations.',
        'type' => 'write',
        'capabilities' => 'moodle/site:deleteownmessage',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_delete_message' => array(
        'classname' => 'core_message_external',
        'methodname' => 'delete_message',
        'classpath' => 'message/externallib.php',
        'description' => 'Deletes a message.',
        'type' => 'write',
        'capabilities' => 'moodle/site:deleteownmessage',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_blocked_users' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_blocked_users',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a list of users blocked',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_data_for_messagearea_search_messages' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_search_messages',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve the template data for searching for messages',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_data_for_messagearea_search_users' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_search_users',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the template data for searching for people',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_message_data_for_messagearea_search_users_in_course' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_search_users_in_course',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the template data for searching for people in a course',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_message_message_search_users' => array(
        'classname' => 'core_message_external',
        'methodname' => 'message_search_users',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve the data for searching for people',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_data_for_messagearea_conversations' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_conversations',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the template data for the conversation list',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_data_for_messagearea_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_contacts',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the template data for the contact list',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_data_for_messagearea_messages' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_messages',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the template data for the messages',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_data_for_messagearea_get_most_recent_message' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_get_most_recent_message',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the template data for the most recent message',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_message_data_for_messagearea_get_profile' => array(
        'classname' => 'core_message_external',
        'methodname' => 'data_for_messagearea_get_profile',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the template data for the users\'s profile',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_message_get_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_contacts',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Retrieve the contact list',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_user_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_user_contacts',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve the contact list',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_conversations' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_conversations',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a list of conversations for a user',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true
    ),
    'core_message_get_conversation' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_conversation',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a conversation for a user',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true
    ),
    'core_message_get_conversation_between_users' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_conversation_between_users',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a conversation for a user between another user',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true
    ),
    'core_message_get_messages' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_messages',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a list of messages sent and received by a user (conversations, notifications or both)',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true,
    ),
    'core_message_get_conversation_counts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_conversation_counts',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a list of conversation counts, indexed by type.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true,
    ),
    'core_message_get_unread_conversation_counts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_unread_conversation_counts',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a list of unread conversation counts, indexed by type.',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true,
    ),
    'core_message_get_conversation_members' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_conversation_members',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a list of members in a conversation',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true,
    ),
    'core_message_get_member_info' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_member_info',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve a user message profiles',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true,
    ),
    'core_message_get_unread_conversations_count' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_unread_conversations_count',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve the count of unread conversations for a given user',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_mark_all_notifications_as_read' => array(
        'classname' => 'core_message_external',
        'methodname' => 'mark_all_notifications_as_read',
        'classpath' => 'message/externallib.php',
        'description' => 'Mark all notifications as read for a given user',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_mark_all_messages_as_read' => array(
        'classname' => 'core_message_external',
        'methodname' => 'mark_all_messages_as_read',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                          Mark all messages as read for a given user',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_mark_all_conversation_messages_as_read' => array(
        'classname' => 'core_message_external',
        'methodname' => 'mark_all_conversation_messages_as_read',
        'classpath' => 'message/externallib.php',
        'description' => 'Mark all conversation messages as read for a given user',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_mark_message_read' => array(
        'classname' => 'core_message_external',
        'methodname' => 'mark_message_read',
        'classpath' => 'message/externallib.php',
        'description' => 'Mark a single message as read, trigger message_viewed event.',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true,
    ),
    'core_message_mark_notification_read' => array(
        'classname' => 'core_message_external',
        'methodname' => 'mark_notification_read',
        'classpath' => 'message/externallib.php',
        'description' => 'Mark a single notification as read, trigger notification_viewed event.',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true,
    ),
    'core_message_message_processor_config_form' => array(
        'classname' => 'core_message_external',
        'methodname' => 'message_processor_config_form',
        'classpath' => 'message/externallib.php',
        'description' => 'Process the message processor config form',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_message_processor' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_message_processor',
        'classpath' => 'message/externallib.php',
        'description' => 'Get a message processor',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_message_search_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'search_contacts',
        'classpath' => 'message/externallib.php',
        'description' => 'Search for contacts',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_send_instant_messages' => array(
        'classname' => 'core_message_external',
        'methodname' => 'send_instant_messages',
        'classpath' => 'message/externallib.php',
        'description' => 'Send instant messages',
        'type' => 'write',
        'capabilities' => 'moodle/site:sendmessage',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_send_messages_to_conversation' => array(
        'classname' => 'core_message_external',
        'methodname' => 'send_messages_to_conversation',
        'classpath' => 'message/externallib.php',
        'description' => 'Send messages to an existing conversation between users',
        'type' => 'write',
        'capabilities' => 'moodle/site:sendmessage',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_conversation_messages' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_conversation_messages',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve the conversation messages and relevant member information',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_unblock_user' => array(
        'classname' => 'core_message_external',
        'methodname' => 'unblock_user',
        'classpath' => 'message/externallib.php',
        'description' => 'Unblocks a user',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_unblock_contacts' => array(
        'classname' => 'core_message_external',
        'methodname' => 'unblock_contacts',
        'classpath' => 'message/externallib.php',
        'description' => '** DEPRECATED ** Please do not call this function any more.
                         Unblock contacts',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_user_notification_preferences' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_user_notification_preferences',
        'classpath' => 'message/externallib.php',
        'description' => 'Get the notification preferences for a given user.',
        'type' => 'read',
        'capabilities' => 'moodle/user:editownmessageprofile',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_get_user_message_preferences' => array(
        'classname' => 'core_message_external',
        'methodname' => 'get_user_message_preferences',
        'classpath' => 'message/externallib.php',
        'description' => 'Get the message preferences for a given user.',
        'type' => 'read',
        'capabilities' => 'moodle/user:editownmessageprofile',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'ajax' => true
    ),
    'core_message_set_favourite_conversations' => array(
        'classname' => 'core_message_external',
        'methodname' => 'set_favourite_conversations',
        'classpath' => 'message/externallib.php',
        'description' => 'Mark a conversation or group of conversations as favourites/starred conversations.',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_message_unset_favourite_conversations' => array(
        'classname' => 'core_message_external',
        'methodname' => 'unset_favourite_conversations',
        'classpath' => 'message/externallib.php',
        'description' => 'Unset a conversation or group of conversations as favourites/starred conversations.',
        'type' => 'write',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_notes_create_notes' => array(
        'classname' => 'core_notes_external',
        'methodname' => 'create_notes',
        'classpath' => 'notes/externallib.php',
        'description' => 'Create notes',
        'type' => 'write',
        'ajax' => true,
        'capabilities' => 'moodle/notes:manage',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_notes_delete_notes' => array(
        'classname' => 'core_notes_external',
        'methodname' => 'delete_notes',
        'classpath' => 'notes/externallib.php',
        'description' => 'Delete notes',
        'type' => 'write',
        'capabilities' => 'moodle/notes:manage',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_notes_get_course_notes' => array(
        'classname' => 'core_notes_external',
        'methodname' => 'get_course_notes',
        'classpath' => 'notes/externallib.php',
        'description' => 'Returns all notes in specified course (or site), for the specified user.',
        'type' => 'read',
        'capabilities' => 'moodle/notes:view',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_notes_get_notes' => array(
        'classname' => 'core_notes_external',
        'methodname' => 'get_notes',
        'classpath' => 'notes/externallib.php',
        'description' => 'Get notes',
        'type' => 'read',
        'capabilities' => 'moodle/notes:view'
    ),
    'core_notes_update_notes' => array(
        'classname' => 'core_notes_external',
        'methodname' => 'update_notes',
        'classpath' => 'notes/externallib.php',
        'description' => 'Update notes',
        'type' => 'write',
        'capabilities' => 'moodle/notes:manage'
    ),
    'core_notes_view_notes' => array(
        'classname' => 'core_notes_external',
        'methodname' => 'view_notes',
        'classpath' => 'notes/externallib.php',
        'description' => 'Simulates the web interface view of notes/index.php: trigger events.',
        'type' => 'write',
        'capabilities' => 'moodle/notes:view',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_output_load_template' => array(
        'classname' => 'core\output\external',
        'methodname' => 'load_template',
        'description' => 'Load a template for a renderable',
        'type' => 'read',
        'loginrequired' => false,
        'ajax' => true,
    ),
    'core_output_load_fontawesome_icon_map' => array(
        'classname' => 'core\output\external',
        'methodname' => 'load_fontawesome_icon_map',
        'description' => 'Load the mapping of names to icons',
        'type' => 'read',
        'loginrequired' => false,
        'ajax' => true,
    ),
    // Question related functions.
    'core_question_update_flag' => array(
        'classname'     => 'core_question_external',
        'methodname'    => 'update_flag',
        'description'   => 'Update the flag state of a question attempt.',
        'type'          => 'write',
        'capabilities'  => 'moodle/question:flag',
        'services'      => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_question_submit_tags_form' => array(
        'classname'     => 'core_question_external',
        'methodname'    => 'submit_tags_form',
        'description'   => 'Update the question tags.',
        'type'          => 'write',
        'ajax' => true,
    ),
    'core_question_get_random_question_summaries' => array(
        'classname' => 'core_question_external',
        'methodname' => 'get_random_question_summaries',
        'description' => 'Get the random question set for a criteria',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_rating_get_item_ratings' => array(
        'classname' => 'core_rating_external',
        'methodname' => 'get_item_ratings',
        'description' => 'Retrieve all the ratings for an item.',
        'type' => 'read',
        'capabilities' => 'moodle/rating:view',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_rating_add_rating' => array(
        'classname' => 'core_rating_external',
        'methodname' => 'add_rating',
        'description' => 'Rates an item.',
        'type' => 'write',
        'capabilities' => 'moodle/rating:rate',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_role_assign_roles' => array(
        'classname' => 'core_role_external',
        'methodname' => 'assign_roles',
        'classpath' => 'enrol/externallib.php',
        'description' => 'Manual role assignments.',
        'type' => 'write',
        'capabilities' => 'moodle/role:assign'
    ),
    'core_role_unassign_roles' => array(
        'classname' => 'core_role_external',
        'methodname' => 'unassign_roles',
        'classpath' => 'enrol/externallib.php',
        'description' => 'Manual role unassignments.',
        'type' => 'write',
        'capabilities' => 'moodle/role:assign'
    ),
    'core_search_get_relevant_users' => array(
        'classname' => '\core_search\external',
        'methodname' => 'get_relevant_users',
        'description' => 'Gets relevant users for a search request.',
        'type' => 'read',
        'ajax' => true
    ),
    'core_tag_get_tagindex' => array(
        'classname' => 'core_tag_external',
        'methodname' => 'get_tagindex',
        'description' => 'Gets tag index page for one tag and one tag area',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_tag_get_tags' => array(
        'classname' => 'core_tag_external',
        'methodname' => 'get_tags',
        'description' => 'Gets tags by their ids',
        'type' => 'read',
        'ajax' => true,
    ),
    'core_tag_update_tags' => array(
        'classname' => 'core_tag_external',
        'methodname' => 'update_tags',
        'description' => 'Updates tags',
        'type' => 'write',
        'ajax' => true,
    ),
    'core_update_inplace_editable' => array(
        'classname' => 'core_external',
        'methodname' => 'update_inplace_editable',
        'classpath' => 'lib/external/externallib.php',
        'description' => 'Generic service to update title',
        'type' => 'write',
        'loginrequired' => true,
        'ajax' => true,
    ),
    'core_user_add_user_device' => array(
        'classname' => 'core_user_external',
        'methodname' => 'add_user_device',
        'classpath' => 'user/externallib.php',
        'description' => 'Store mobile user devices information for PUSH Notifications.',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_add_user_private_files' => array(
        'classname' => 'core_user_external',
        'methodname' => 'add_user_private_files',
        'classpath' => 'user/externallib.php',
        'description' => 'Copy files from a draft area to users private files area.',
        'type' => 'write',
        'capabilities' => 'moodle/user:manageownfiles',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_create_users' => array(
        'classname' => 'core_user_external',
        'methodname' => 'create_users',
        'classpath' => 'user/externallib.php',
        'description' => 'Create users.',
        'type' => 'write',
        'capabilities' => 'moodle/user:create'
    ),
    'core_user_delete_users' => array(
        'classname' => 'core_user_external',
        'methodname' => 'delete_users',
        'classpath' => 'user/externallib.php',
        'description' => 'Delete users.',
        'type' => 'write',
        'capabilities' => 'moodle/user:delete'
    ),
    'core_user_get_course_user_profiles' => array(
        'classname' => 'core_user_external',
        'methodname' => 'get_course_user_profiles',
        'classpath' => 'user/externallib.php',
        'description' => 'Get course user profiles (each of the profils matching a course id and a user id),.',
        'type' => 'read',
        'capabilities' => 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update, '
            . 'moodle/site:accessallgroups',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_get_users' => array(
        'classname' => 'core_user_external',
        'methodname' => 'get_users',
        'classpath' => 'user/externallib.php',
        'description' => 'search for users matching the parameters',
        'type' => 'read',
        'capabilities' => 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update'
    ),
    'core_user_get_users_by_field' => array(
        'classname' => 'core_user_external',
        'methodname' => 'get_users_by_field',
        'classpath' => 'user/externallib.php',
        'description' => 'Retrieve users\' information for a specified unique field - If you want to do a user search, use '
            . 'core_user_get_users()',
        'type' => 'read',
        'capabilities' => 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_remove_user_device' => array(
        'classname' => 'core_user_external',
        'methodname' => 'remove_user_device',
        'classpath' => 'user/externallib.php',
        'description' => 'Remove a user device from the Moodle database.',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_update_users' => array(
        'classname' => 'core_user_external',
        'methodname' => 'update_users',
        'classpath' => 'user/externallib.php',
        'description' => 'Update users.',
        'type' => 'write',
        'capabilities' => 'moodle/user:update',
        'ajax' => true,
    ),
    'core_user_update_user_preferences' => array(
        'classname' => 'core_user_external',
        'methodname' => 'update_user_preferences',
        'classpath' => 'user/externallib.php',
        'description' => 'Update a user\'s preferences',
        'type' => 'write',
        'capabilities' => 'moodle/user:editownmessageprofile, moodle/user:editmessageprofile',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_view_user_list' => array(
        'classname' => 'core_user_external',
        'methodname' => 'view_user_list',
        'classpath' => 'user/externallib.php',
        'description' => 'Simulates the web-interface view of user/index.php (triggering events),.',
        'type' => 'write',
        'capabilities' => 'moodle/course:viewparticipants',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_view_user_profile' => array(
        'classname' => 'core_user_external',
        'methodname' => 'view_user_profile',
        'classpath' => 'user/externallib.php',
        'description' => 'Simulates the web-interface view of user/view.php and user/profile.php (triggering events),.',
        'type' => 'write',
        'capabilities' => 'moodle/user:viewdetails',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_get_user_preferences' => array(
        'classname' => 'core_user_external',
        'methodname' => 'get_user_preferences',
        'classpath' => 'user/externallib.php',
        'description' => 'Return user preferences.',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_update_picture' => array(
        'classname' => 'core_user_external',
        'methodname' => 'update_picture',
        'classpath' => 'user/externallib.php',
        'description' => 'Update or delete the user picture in the site',
        'type' => 'write',
        'capabilities' => 'moodle/user:editownprofile, moodle/user:editprofile',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_set_user_preferences' => array(
        'classname' => 'core_user_external',
        'methodname' => 'set_user_preferences',
        'classpath' => 'user/externallib.php',
        'description' => 'Set user preferences.',
        'type' => 'write',
        'capabilities' => 'moodle/site:config',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_agree_site_policy' => array(
        'classname' => 'core_user_external',
        'methodname' => 'agree_site_policy',
        'classpath' => 'user/externallib.php',
        'description' => 'Agree the site policy for the current user.',
        'type' => 'write',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_user_get_private_files_info' => array(
        'classname' => 'core_user_external',
        'methodname' => 'get_private_files_info',
        'classpath' => 'user/externallib.php',
        'description' => 'Returns general information about files in the user private files area.',
        'type' => 'read',
        'capabilities' => 'moodle/user:manageownfiles',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),

    // Competencies functions.
    'core_competency_create_competency_framework' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'create_competency_framework',
        'classpath'    => '',
        'description'  => 'Creates new competency frameworks.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_read_competency_framework' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'read_competency_framework',
        'classpath'    => '',
        'description'  => 'Load a summary of a competency framework.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_duplicate_competency_framework' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'duplicate_competency_framework',
        'classpath'    => '',
        'description'  => 'Duplicate a competency framework.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_delete_competency_framework' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'delete_competency_framework',
        'classpath'    => '',
        'description'  => 'Delete a competency framework.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_update_competency_framework' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'update_competency_framework',
        'classpath'    => '',
        'description'  => 'Update a competency framework.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_list_competency_frameworks' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_competency_frameworks',
        'classpath'    => '',
        'description'  => 'Load a list of a competency frameworks.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_count_competency_frameworks' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'count_competency_frameworks',
        'classpath'    => '',
        'description'  => 'Count a list of a competency frameworks.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_competency_framework_viewed' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'competency_framework_viewed',
        'classpath'    => '',
        'description'  => 'Log event competency framework viewed',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_create_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'create_competency',
        'classpath'    => '',
        'description'  => 'Creates new competencies.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_read_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'read_competency',
        'classpath'    => '',
        'description'  => 'Load a summary of a competency.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_competency_viewed' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'competency_viewed',
        'classpath'    => '',
        'description'  => 'Log event competency viewed',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_delete_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'delete_competency',
        'classpath'    => '',
        'description'  => 'Delete a competency.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_update_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'update_competency',
        'classpath'    => '',
        'description'  => 'Update a competency.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_list_competencies' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_competencies',
        'classpath'    => '',
        'description'  => 'Load a list of a competencies.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_list_competencies_in_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_competencies_in_template',
        'classpath'    => '',
        'description'  => 'Load a list of a competencies for a given template.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_count_competencies' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'count_competencies',
        'classpath'    => '',
        'description'  => 'Count a list of a competencies.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_count_competencies_in_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'count_competencies_in_template',
        'classpath'    => '',
        'description'  => 'Count a list of a competencies for a given template.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_search_competencies' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'search_competencies',
        'classpath'    => '',
        'description'  => 'Search a list of a competencies.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_set_parent_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'set_parent_competency',
        'classpath'    => '',
        'description'  => 'Set a new parent for a competency.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_move_up_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'move_up_competency',
        'classpath'    => '',
        'description'  => 'Re-order a competency.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_move_down_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'move_down_competency',
        'classpath'    => '',
        'description'  => 'Re-order a competency.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_list_course_competencies' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_course_competencies',
        'classpath'    => '',
        'description'  => 'List the competencies in a course',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:coursecompetencyview',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_count_competencies_in_course' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'count_competencies_in_course',
        'classpath'    => '',
        'description'  => 'List the competencies in a course',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:coursecompetencyview',
        'ajax'         => true,
    ),
    'core_competency_count_courses_using_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'count_courses_using_competency',
        'classpath'    => '',
        'description'  => 'List the courses using a competency',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:coursecompetencyview',
        'ajax'         => true,
    ),
    'core_competency_add_competency_to_course' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'add_competency_to_course',
        'classpath'    => '',
        'description'  => 'Add the competency to a course',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:coursecompetencymanage',
        'ajax'         => true,
    ),
    'core_competency_add_competency_to_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'add_competency_to_template',
        'classpath'    => '',
        'description'  => 'Add the competency to a template',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:templatemanage',
        'ajax'         => true,
    ),
    'core_competency_remove_competency_from_course' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'remove_competency_from_course',
        'classpath'    => '',
        'description'  => 'Remove a competency from a course',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:coursecompetencymanage',
        'ajax'         => true,
    ),
    'core_competency_set_course_competency_ruleoutcome' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'set_course_competency_ruleoutcome',
        'classpath'    => '',
        'description'  => 'Modify the ruleoutcome value for course competency',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:coursecompetencymanage',
        'ajax'         => true,
    ),
    'core_competency_remove_competency_from_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'remove_competency_from_template',
        'classpath'    => '',
        'description'  => 'Remove a competency from a template',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:templatemanage',
        'ajax'         => true,
    ),
    'core_competency_reorder_course_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'reorder_course_competency',
        'classpath'    => '',
        'description'  => 'Move a course competency to a new relative sort order.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:coursecompetencymanage',
        'ajax'         => true,
    ),
    'core_competency_reorder_template_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'reorder_template_competency',
        'classpath'    => '',
        'description'  => 'Move a template competency to a new relative sort order.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:templatemanage',
        'ajax'         => true,
    ),
    'core_competency_create_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'create_template',
        'classpath'    => '',
        'description'  => 'Creates new learning plan templates.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:templatemanage',
        'ajax'         => true,
    ),
    'core_competency_duplicate_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'duplicate_template',
        'classpath'    => '',
        'description'  => 'Duplicate learning plan template.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:templatemanage',
        'ajax'         => true,
    ),
    'core_competency_read_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'read_template',
        'classpath'    => '',
        'description'  => 'Load a summary of a learning plan template.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:templateview',
        'ajax'         => true,
    ),
    'core_competency_delete_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'delete_template',
        'classpath'    => '',
        'description'  => 'Delete a learning plan template.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:templatemanage',
        'ajax'         => true,
    ),
    'core_competency_update_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'update_template',
        'classpath'    => '',
        'description'  => 'Update a learning plan template.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:templatemanage',
        'ajax'         => true,
    ),
    'core_competency_list_templates' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_templates',
        'classpath'    => '',
        'description'  => 'Load a list of a learning plan templates.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:templateview',
        'ajax'         => true,
    ),
    'core_competency_list_templates_using_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_templates_using_competency',
        'classpath'    => '',
        'description'  => 'Load a list of a learning plan templates for a given competency.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:templateview',
        'ajax'         => true,
    ),
    'core_competency_count_templates' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'count_templates',
        'classpath'    => '',
        'description'  => 'Count a list of a learning plan templates.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:templateview',
        'ajax'         => true,
    ),
    'core_competency_count_templates_using_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'count_templates_using_competency',
        'classpath'    => '',
        'description'  => 'Count a list of a learning plan templates for a given competency.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:templateview',
        'ajax'         => true,
    ),
    'core_competency_create_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'create_plan',
        'classpath'    => '',
        'description'  => 'Creates a learning plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_update_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'update_plan',
        'classpath'    => '',
        'description'  => 'Updates a learning plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_complete_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'complete_plan',
        'classpath'    => '',
        'description'  => 'Complete learning plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_reopen_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'reopen_plan',
        'classpath'    => '',
        'description'  => 'Reopen learning plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_read_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'read_plan',
        'classpath'    => '',
        'description'  => 'Load a learning plan.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:planviewown',
        'ajax'         => true,
    ),
    'core_competency_delete_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'delete_plan',
        'classpath'    => '',
        'description'  => 'Delete a learning plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_list_user_plans' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_user_plans',
        'classpath'    => '',
        'description'  => 'List a user\'s learning plans.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:planviewown',
        'ajax'         => true,
    ),
    'core_competency_list_plan_competencies' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'list_plan_competencies',
        'classpath'    => '',
        'description'  => 'List the competencies in a plan',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:planviewown',
        'ajax'         => true,
    ),
    'core_competency_add_competency_to_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'add_competency_to_plan',
        'classpath'    => '',
        'description'  => 'Add the competency to a learning plan',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_remove_competency_from_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'remove_competency_from_plan',
        'classpath'    => '',
        'description'  => 'Remove the competency from a learning plan',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_reorder_plan_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'reorder_plan_competency',
        'classpath'    => '',
        'description'  => 'Move a plan competency to a new relative sort order.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_plan_request_review' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'plan_request_review',
        'classpath'    => '',
        'description'  => 'Request for a plan to be reviewed.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanagedraft',
        'ajax'         => true,
    ),
    'core_competency_plan_start_review' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'plan_start_review',
        'classpath'    => '',
        'description'  => 'Start the review of a plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_plan_stop_review' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'plan_stop_review',
        'classpath'    => '',
        'description'  => 'Stop the review of a plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_plan_cancel_review_request' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'plan_cancel_review_request',
        'classpath'    => '',
        'description'  => 'Cancel the review of a plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanagedraft',
        'ajax'         => true,
    ),
    'core_competency_approve_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'approve_plan',
        'classpath'    => '',
        'description'  => 'Approve a plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_unapprove_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'unapprove_plan',
        'classpath'    => '',
        'description'  => 'Unapprove a plan.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
     'core_competency_template_has_related_data' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'template_has_related_data',
        'classpath'    => '',
        'description'  => 'Check if a template has related data',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:templateview',
        'ajax'         => true,
    ),
    'core_competency_get_scale_values' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'get_scale_values',
        'classpath'    => '',
        'description'  => 'Fetch the values for a specific scale',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_add_related_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'add_related_competency',
        'classpath'    => '',
        'description'  => 'Adds a related competency',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_remove_related_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'remove_related_competency',
        'classpath'    => '',
        'description'  => 'Remove a related competency',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencymanage',
        'ajax'         => true,
    ),
    'core_competency_read_user_evidence' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'read_user_evidence',
        'classpath'    => '',
        'description'  => 'Read an evidence of prior learning.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:userevidenceview',
        'ajax'         => true,
    ),
    'core_competency_delete_user_evidence' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'delete_user_evidence',
        'classpath'    => '',
        'description'  => 'Delete an evidence of prior learning.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:userevidencemanageown',
        'ajax'         => true,
    ),
    'core_competency_create_user_evidence_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'create_user_evidence_competency',
        'classpath'    => '',
        'description'  => 'Create an evidence of prior learning relationship with a competency.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:userevidencemanageown, moodle/competency:competencyview',
        'ajax'         => true,
    ),
    'core_competency_delete_user_evidence_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'delete_user_evidence_competency',
        'classpath'    => '',
        'description'  => 'Delete an evidence of prior learning relationship with a competency.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:userevidencemanageown',
        'ajax'         => true,
    ),
    'core_competency_user_competency_cancel_review_request' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_cancel_review_request',
        'classpath'    => '',
        'description'  => 'Cancel a review request.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:userevidencemanageown',
        'ajax'         => true,
    ),
    'core_competency_user_competency_request_review' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_request_review',
        'classpath'    => '',
        'description'  => 'Request a review.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:userevidencemanageown',
        'ajax'         => true,
    ),
    'core_competency_user_competency_start_review' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_start_review',
        'classpath'    => '',
        'description'  => 'Start a review.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencygrade',
        'ajax'         => true,
    ),
    'core_competency_user_competency_stop_review' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_stop_review',
        'classpath'    => '',
        'description'  => 'Stop a review.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencygrade',
        'ajax'         => true,
    ),
    'core_competency_user_competency_viewed' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_viewed',
        'classpath'    => '',
        'description'  => 'Log the user competency viewed event.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:usercompetencyview',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_user_competency_viewed_in_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_viewed_in_plan',
        'classpath'    => '',
        'description'  => 'Log the user competency viewed in plan event.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:usercompetencyview',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_user_competency_viewed_in_course' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_viewed_in_course',
        'classpath'    => '',
        'description'  => 'Log the user competency viewed in course event',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:usercompetencyview',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_user_competency_plan_viewed' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'user_competency_plan_viewed',
        'classpath'    => '',
        'description'  => 'Log the user competency plan viewed event.',
        'type'         => 'read',
        'capabilities' => 'moodle/competency:usercompetencyview',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_grade_competency' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'grade_competency',
        'classpath'    => '',
        'description'  => 'Grade a competency.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencygrade',
        'ajax'         => true,
    ),
    'core_competency_grade_competency_in_plan' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'grade_competency_in_plan',
        'classpath'    => '',
        'description'  => 'Grade a competency from the user plan page.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencygrade',
        'ajax'         => true,
    ),
    'core_competency_grade_competency_in_course' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'grade_competency_in_course',
        'classpath'    => '',
        'description'  => 'Grade a competency from the course page.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:competencygrade',
        'ajax'         => true,
        'services'     => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
    'core_competency_unlink_plan_from_template' => array(
        'classname'    => 'core_competency\external',
        'methodname'   => 'unlink_plan_from_template',
        'classpath'    => '',
        'description'  => 'Unlink a plan form it template.',
        'type'         => 'write',
        'capabilities' => 'moodle/competency:planmanage',
        'ajax'         => true,
    ),
    'core_competency_template_viewed' => array(
        'classname'     => 'core_competency\external',
        'methodname'    => 'template_viewed',
        'classpath'     => '',
        'description'   => 'Log event template viewed',
        'type'          => 'read',
        'capabilities'  => 'moodle/competency:templateview',
        'ajax'          => true,
    ),
    'core_competency_request_review_of_user_evidence_linked_competencies' => array(
        'classname'     => 'core_competency\external',
        'methodname'    => 'request_review_of_user_evidence_linked_competencies',
        'classpath'     => '',
        'description'   => 'Send user evidence competencies in review',
        'type'          => 'write',
        'capabilities'  => 'moodle/competency:userevidencemanageown',
        'ajax'          => true,
    ),
    'core_competency_update_course_competency_settings' => array(
        'classname'     => 'core_competency\external',
        'methodname'    => 'update_course_competency_settings',
        'classpath'     => '',
        'description'   => 'Update the course competency settings',
        'type'          => 'write',
        'capabilities'  => 'moodle/competency:coursecompetencyconfigure',
        'ajax'          => true,
    ),
    'core_competency_delete_evidence' => array(
        'classname'     => 'core_competency\external',
        'methodname'    => 'delete_evidence',
        'classpath'     => '',
        'description'   => 'Delete an evidence',
        'type'          => 'write',
        'capabilities'  => 'moodle/competency:evidencedelete',
        'ajax'          => true,
        'services'      => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),

    'core_webservice_get_site_info' => array(
        'classname' => 'core_webservice_external',
        'methodname' => 'get_site_info',
        'classpath' => 'webservice/externallib.php',
        'description' => 'Return some site info / user info / list web service functions',
        'type' => 'read',
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),

    // Blocks functions.
    'core_block_get_course_blocks' => array(
        'classname'     => 'core_block_external',
        'methodname'    => 'get_course_blocks',
        'description'   => 'Returns blocks information for a course.',
        'type'          => 'read',
        'capabilities'  => '',
        'services'      => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),

    'core_block_get_dashboard_blocks' => array(
        'classname'     => 'core_block_external',
        'methodname'    => 'get_dashboard_blocks',
        'description'   => 'Returns blocks information for the given user dashboard.',
        'type'          => 'read',
        'capabilities'  => '',
        'services'      => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),

    // Filters functions.
    'core_filters_get_available_in_context' => array(
        'classname'   => 'core_filters\external',
        'methodname'  => 'get_available_in_context',
        'description' => 'Returns the filters available in the given contexts.',
        'type'        => 'read',
        'services'    => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
    ),
);

$services = array(
   'Moodle mobile web service'  => array(
        'functions' => array(), // Unused as we add the service in each function definition, third party services would use this.
        'enabled' => 0,
        'restrictedusers' => 0,
        'shortname' => MOODLE_OFFICIAL_MOBILE_SERVICE,
        'downloadfiles' => 1,
        'uploadfiles' => 1
    ),
);
