diff options
-rw-r--r-- | classes/local/record.php | 45 | ||||
-rw-r--r-- | externallib.php | 57 | ||||
-rw-r--r-- | tests/external_test.php | 36 |
3 files changed, 138 insertions, 0 deletions
diff --git a/classes/local/record.php b/classes/local/record.php index 29dadce..3e74571 100644 --- a/classes/local/record.php +++ b/classes/local/record.php @@ -20,6 +20,10 @@ defined('MOODLE_INTERNAL') || die(); use stdClass; use function defined; +use function is_array; +use function is_bool; +use function is_int; +use function is_string; /** * It's a class description record. @@ -77,4 +81,45 @@ final class record extends stdClass { * @var string */ public $token; + + /** + * Classes constructor. + * + * @param array|null $conditions + */ + public function __construct(array $conditions = null) { + if (isset($conditions['events']) && is_array($conditions['events'])) { + $this->events = []; + + foreach ($conditions['events'] as $event) { + if (is_string($event)) { + $this->events[] = $event; + } + } + } + + if (isset($conditions['header']) && is_string($conditions['header'])) { + $this->header = $conditions['header']; + } + + if (isset($conditions['id']) && is_int($conditions['id'])) { + $this->id = $conditions['id']; + } + + if (isset($conditions['name']) && is_string($conditions['name'])) { + $this->name = $conditions['name']; + } + + if (isset($conditions['point']) && is_string($conditions['point'])) { + $this->point = $conditions['point']; + } + + if (isset($conditions['status']) && is_bool($conditions['status'])) { + $this->status = $conditions['status']; + } + + if (isset($conditions['token']) && is_string($conditions['token'])) { + $this->token = $conditions['token']; + } + } }
\ No newline at end of file diff --git a/externallib.php b/externallib.php index 15ed0e2..baef051 100644 --- a/externallib.php +++ b/externallib.php @@ -32,6 +32,63 @@ use local_webhooks\local\record; */ final class local_webhooks_external extends external_api { /** + * Add a new service. + * + * @param array $conditions + * + * @return int + * + * @throws \coding_exception + * @throws \dml_exception + * @throws \invalid_parameter_exception + * @throws \restricted_context_exception + */ + public static function add_service(array $conditions): int { + $parameters = self::validate_parameters(self::add_service_parameters(), [ + 'events' => $conditions['events'], + 'header' => $conditions['header'], + 'name' => $conditions['name'], + 'point' => $conditions['point'], + 'status' => $conditions['status'], + 'token' => $conditions['token'], + ]); + + $context = context_system::instance(); + self::validate_context($context); + + $record = new record($parameters); + + return api::add_service($record); + } + + /** + * Returns description of the method parameters. + * + * @return \external_function_parameters + */ + public static function add_service_parameters(): external_function_parameters { + return new external_function_parameters([ + 'events' => new external_multiple_structure( + new external_value(PARAM_RAW, 'The event\'s name.'), 'The service\'s list events.' + ), + 'header' => new external_value(PARAM_RAW, 'The request\'s header or type'), + 'name' => new external_value(PARAM_RAW, 'The service\'s name.'), + 'point' => new external_value(PARAM_URL, 'The service\'s endpoint.'), + 'status' => new external_value(PARAM_BOOL, 'The service\'s status.'), + 'token' => new external_value(PARAM_RAW, 'The service\'s secret key.'), + ], ''); + } + + /** + * Returns description of the method result value. + * + * @return \external_value + */ + public static function add_service_returns(): external_value { + return new external_value(PARAM_INT, 'The service\'s ID.'); + } + + /** * Delete the existing service. * * @param int $serviceid diff --git a/tests/external_test.php b/tests/external_test.php index 517f370..c0e4cd7 100644 --- a/tests/external_test.php +++ b/tests/external_test.php @@ -65,6 +65,42 @@ final class local_webhooks_external_testcase extends externallib_advanced_testca } /** + * Testing external add service. + * + * @throws \ReflectionException + * @throws \coding_exception + * @throws \dml_exception + * @throws \invalid_parameter_exception + * @throws \invalid_response_exception + * @throws \restricted_context_exception + */ + public function test_adding() { + $this->resetAfterTest(); + self::setAdminUser(); + + $record = self::get_random_record(); + $return = local_webhooks_external::add_service((array) $record); + $return = external_api::clean_returnvalue(local_webhooks_external::add_service_returns(), $return); + + self::assertInternalType('integer', $return); + self::assertEquals(1, api::get_total_count()); + + $service = api::get_service($return); + self::assertEquals($record->header, $service->header); + self::assertEquals($record->name, $service->name); + self::assertEquals($record->point, $service->point); + self::assertEquals($record->status, $service->status); + self::assertEquals($record->token, $service->token); + self::assertEquals($return, $service->id); + + self::assertInternalType('array', $service->events); + self::assertCount(count($record->events), $service->events); + foreach ($service->events as $event) { + self::assertContains($event, $record->events); + } + } + + /** * Testing the external delete service. * * @throws \ReflectionException |