diff --git a/admin/tool/dataprivacy/classes/external/get_access_information.php b/admin/tool/dataprivacy/classes/external/get_access_information.php new file mode 100644 index 00000000000..62de8711f45 --- /dev/null +++ b/admin/tool/dataprivacy/classes/external/get_access_information.php @@ -0,0 +1,85 @@ +<?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/>. + +namespace tool_dataprivacy\external; + +use core_external\external_api; +use core_external\external_function_parameters; +use core_external\external_single_structure; +use core_external\external_value; +use core_external\external_warnings; +use tool_dataprivacy\api; + +/** + * External function for retrieving access (permissions) information for the privacy API. + * + * @package tool_dataprivacy + * @copyright 2023 Juan Leyva <juan@moodle.com> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 4.4 + */ +class get_access_information extends external_api { + + /** + * Webservice parameters. + * + * @return external_function_parameters + */ + public static function execute_parameters(): external_function_parameters { + return new external_function_parameters([]); + } + + /** + * Main method of the external function. + * + * @return array current user permissions + */ + public static function execute(): array { + global $USER; + + $system = \context_system::instance(); + external_api::validate_context($system); + + return [ + 'cancontactdpo' => api::can_contact_dpo(), + 'canmanagedatarequests' => api::can_manage_data_requests($USER->id), + 'cancreatedatadownloadrequest' => api::can_create_data_download_request_for_self($USER->id), + 'cancreatedatadeletionrequest' => api::can_create_data_deletion_request_for_self($USER->id), + 'hasongoingdatadownloadrequest' => api::has_ongoing_request($USER->id, api::DATAREQUEST_TYPE_EXPORT), + 'hasongoingdatadeletionrequest' => api::has_ongoing_request($USER->id, api::DATAREQUEST_TYPE_DELETE), + 'warnings' => [], + ]; + } + + /** + * Webservice returns. + * + * @return external_single_structure + */ + public static function execute_returns(): external_single_structure { + return new external_single_structure( + [ + 'cancontactdpo' => new external_value(PARAM_BOOL, 'Can contact dpo.'), + 'canmanagedatarequests' => new external_value(PARAM_BOOL, 'Can manage data requests.'), + 'cancreatedatadownloadrequest' => new external_value(PARAM_BOOL, 'Can create data download request for self.'), + 'cancreatedatadeletionrequest' => new external_value(PARAM_BOOL, 'Can create data deletion request for self.'), + 'hasongoingdatadownloadrequest' => new external_value(PARAM_BOOL, 'Has ongoing data download request.'), + 'hasongoingdatadeletionrequest' => new external_value(PARAM_BOOL, 'Has ongoing data deletion request.'), + 'warnings' => new external_warnings(), + ] + ); + } +} diff --git a/admin/tool/dataprivacy/db/services.php b/admin/tool/dataprivacy/db/services.php index a8b42771735..8f3ac6517cd 100644 --- a/admin/tool/dataprivacy/db/services.php +++ b/admin/tool/dataprivacy/db/services.php @@ -243,4 +243,10 @@ $functions = [ 'ajax' => true, 'loginrequired' => true, ], + 'tool_dataprivacy_get_access_information' => [ + 'classname' => '\tool_dataprivacy\external\get_access_information', + 'description' => 'Retrieving privacy API access (permissions) information for the current user.', + 'type' => 'read', + 'services' => [MOODLE_OFFICIAL_MOBILE_SERVICE], + ], ]; diff --git a/admin/tool/dataprivacy/tests/external/external_test.php b/admin/tool/dataprivacy/tests/external/external_test.php index 7408592daf1..428da90bf8d 100644 --- a/admin/tool/dataprivacy/tests/external/external_test.php +++ b/admin/tool/dataprivacy/tests/external/external_test.php @@ -1113,4 +1113,31 @@ class external_test extends externallib_advanced_testcase { ] ], $results[$student1->id]); } + + /** + * Test for external::get_access_information(). + */ + public function test_get_access_information() { + $this->resetAfterTest(); + + $this->setAdminUser(); + $result = get_access_information::execute(); + $result = external_api::clean_returnvalue(get_access_information::execute_returns(), $result); + $this->assertFalse($result['cancontactdpo']); // Disabled by default. + + // Enable contact DPO. + set_config('contactdataprotectionofficer', 1, 'tool_dataprivacy'); + + $user = $this->getDataGenerator()->create_user(); + $this->setUser($user); + $result = get_access_information::execute(); + $result = external_api::clean_returnvalue(get_access_information::execute_returns(), $result); + + $this->assertTrue($result['cancontactdpo']); + $this->assertTrue($result['cancreatedatadownloadrequest']); + $this->assertTrue($result['cancreatedatadeletionrequest']); + $this->assertFalse($result['canmanagedatarequests']); + $this->assertFalse($result['hasongoingdatadownloadrequest']); + $this->assertFalse($result['hasongoingdatadeletionrequest']); + } }