Compare commits

...

136 Commits

Author SHA1 Message Date
edb23d6aad
Added mirror 2024-05-29 20:08:39 +04:00
064e2fa422
Update README.md
Signed-off-by: Valentin Popov <valentin@popov.link>
2023-12-28 16:58:03 +04:00
9cf4fc575c
Correction of spaces 2018-02-25 01:32:29 +04:00
f3c2ebbe4d
Correcting a stupid mistake 2018-02-25 01:27:40 +04:00
8f25379f32
Change version 2018-02-25 01:21:50 +04:00
90897b0e7d
General refactoring of the web services code 2018-02-25 01:19:19 +04:00
685d9ee15e Change version 2018-02-22 12:58:37 +04:00
db500cddce Fix 'invalid OPTIONAL value specified' 2018-02-22 12:55:20 +04:00
85bcb64e37 Added general list functions 2018-02-22 12:44:50 +04:00
1736128dbf Adding the function of forming events 2018-02-22 12:37:59 +04:00
5cdd8de9e3 Small code refactoring 2018-02-20 15:40:50 +04:00
b6ddc8bd40 Some variables have been removed 2018-02-20 15:17:27 +04:00
f10786bfb0 Update function 'local_webhooks_create_record' 2018-02-20 14:38:36 +04:00
899b129d23 The extension is added to the event handler 2018-02-19 15:26:27 +04:00
dd19065313 The extension is added to external functions 2018-02-19 15:25:49 +04:00
3a2bddeea4 The search function is expanded 2018-02-19 15:24:34 +04:00
a41dbbb950 Transferring internal functions to the internal library 2018-02-19 13:44:11 +04:00
a68882140b An external service search function is declared 2018-02-19 13:38:27 +04:00
43f0bf98d2 Added external functions to find services 2018-02-19 13:37:27 +04:00
95c4cf061a Rename the function to reset the cache 2018-02-19 13:15:14 +04:00
a1099245b5 Cache description added 2018-02-19 13:06:06 +04:00
66b5928e6e Added clearing the cache when changing data 2018-02-19 12:36:09 +04:00
4f75d9c5c8 Event handler is rewritten to work with the cache 2018-02-18 22:05:58 +04:00
29bdbc7456 Added a service search function that contains the specified event 2018-02-18 21:37:43 +04:00
ebf76795da Change the location of the functions for working with the cache 2018-02-18 21:28:46 +04:00
53c49b69de Added functions for working with the cache 2018-02-18 20:01:55 +04:00
f392fd42d9 Update the PHP version for testing. 2018-02-18 18:05:33 +04:00
67f8d73a15 Update versions of Moodle for testing. 2018-02-18 18:02:23 +04:00
22b7569f71 Correct the check for 'sesskey'. 2018-02-18 17:58:59 +04:00
fa74622268 Links to the editor contain sesskey 2018-01-04 15:38:55 +04:00
9b7426fb20 Check the sesskey on the editor page 2018-01-04 15:35:27 +04:00
283c64f62e Check the sesskey on the recovery page 2018-01-04 15:34:51 +04:00
17ae01ab71 Change version 2017-12-29 14:29:39 +04:00
28e1169be8 Added correct update from old versions 2017-12-29 14:25:49 +04:00
2126708201 An additional column is added 2017-12-27 21:03:09 +04:00
0041667754 Refactoring the handler class 2017-12-27 20:45:31 +04:00
91bf79f030 Added function to send the request 2017-12-27 20:43:36 +04:00
7d1a0b9fec Updated the function to update the record 2017-12-27 20:30:27 +04:00
51007a0fb5 Register a new external function 2017-12-27 19:52:21 +04:00
2eaa622161 Added external function display a list of events 2017-12-27 19:51:34 +04:00
3d4b78bd8b Added the function of receiving all the events 2017-12-27 16:01:48 +04:00
41185c6db4 Reconstructed external restore function from the backup 2017-12-27 15:47:36 +04:00
7e1284bfe2 Edit the result of the function 2017-12-27 15:29:58 +04:00
785a541d1c Registration of external plug-in functions is added 2017-12-27 15:27:55 +04:00
6e3bf072af Added external plugin functions 2017-12-27 15:26:59 +04:00
2e57e732ba Fixed the text of the button 2017-12-22 18:58:27 +04:00
499f36d118 Integration of the event system into functions 2017-12-21 12:06:20 +04:00
49516bea82 Refactoring the system of events 2017-12-21 11:48:43 +04:00
a6c6081139 Edit translation 2017-12-21 11:36:42 +04:00
9560267833 Refactoring the editor code 2017-12-21 11:31:58 +04:00
2057a1efb6 The functional was updated to a new form 2017-12-21 11:14:40 +04:00
0cbf2bbb87 The data recovery form has been extended 2017-12-21 11:12:40 +04:00
3e054dd94e Updated package dependencies 2017-12-21 11:11:24 +04:00
54fb29c5ea Correction on the main page 2017-12-21 10:01:37 +04:00
78e9e435cc Refactoring function code plugins 2017-12-21 09:59:14 +04:00
97711bb186 Added function to change the status of the service 2017-12-19 14:50:30 +04:00
999ad9f472 Refactoring the main page 2017-12-19 14:39:40 +04:00
82c7463e4a A class was added to display the table 2017-12-19 14:15:07 +04:00
e0e9322644 Additions to the description file 2017-12-11 07:47:51 +04:00
7278ee951b Changes to the User's Guide 2017-12-11 07:43:17 +04:00
01e2ba9f2f User guide 2017-12-11 07:37:49 +04:00
99868c158a Screenshots for documentation 2017-12-11 07:37:09 +04:00
bdaf1d35b2 Change version 2017-11-26 11:20:22 +04:00
7cfdf29600 Local class for calling events 2017-11-26 11:15:50 +04:00
bec8dcdc08 Update event registration classes 2017-11-23 22:00:36 +04:00
2ae949bbc3 Adding a logging system 2017-11-23 21:55:40 +04:00
de3c3a6553 Correcting errors, adding a logging system 2017-11-23 21:54:50 +04:00
05512c5440 Repeated refactoring of the event handler 2017-11-23 19:29:36 +04:00
91754489b0 Renaming a file 2017-11-23 18:57:22 +04:00
f8b85a270c Refactoring the code of the event handler 2017-11-23 18:54:31 +04:00
4bf6f61131 External backup function 2017-11-23 18:44:30 +04:00
3da34ec7f1 Fix the link 2017-11-23 18:12:42 +04:00
4f342659d4 Updating external functions 2017-11-23 18:11:33 +04:00
0bc809ba07 Refactoring the backup recovery code 2017-11-23 18:09:56 +04:00
03d22ef096 Refactoring the code for creating forms 2017-11-23 17:58:29 +04:00
1c87dae035 Refactoring the service manager code 2017-11-23 17:56:59 +04:00
5639dc7b0f Refactoring the code of the service editor 2017-11-23 17:37:41 +04:00
1ad4527c1d External code of the library 2017-11-23 17:24:40 +04:00
57cac60ab3 Code refactoring 2017-11-22 13:59:02 +04:00
d4d105c018 Change version 2017-11-18 08:35:16 +04:00
3ea8f29329 Adding event calls 2017-11-18 08:34:23 +04:00
c1077bc9c1 Service deletion event 2017-11-18 08:33:04 +04:00
bc02d0dce2 Service update event 2017-11-18 08:32:03 +04:00
93d788f046 Service creation event 2017-11-18 08:30:38 +04:00
29c12fa971 Renaming an event 2017-11-18 08:29:21 +04:00
1e8cbe7f09 Recovery event 2017-11-18 08:26:49 +04:00
ad07800be9 Backup event 2017-11-18 08:25:05 +04:00
f28b408b1e Added hostname to the request 2017-11-18 07:34:38 +04:00
91fd140bd4 Change version 2017-11-18 06:40:10 +04:00
463aeaf043 Correcting the page template 2017-11-18 06:37:58 +04:00
97140dccf7 Aesthetics in the code 2017-11-18 06:31:25 +04:00
bf2cef3ea0 Recovery algorithm 2017-11-18 05:41:28 +04:00
7b56375c05 Form class loading a backup 2017-11-18 04:56:33 +04:00
b61e5a08be Generate another backup file 2017-11-17 20:14:01 +04:00
4a470056a7 Template of the restore settings page 2017-11-17 19:58:45 +04:00
688448b350 Added backup function 2017-11-17 18:24:59 +04:00
35358ea7cc Updating pages for a new section 2017-11-15 10:49:36 +04:00
97296b795a Updated the event handler 2017-11-15 10:46:09 +04:00
0fcec2738d Update the settings file 2017-11-15 10:43:51 +04:00
e1372c6d34 Change version 2017-10-29 12:57:39 +04:00
098514660f Edit translation 2017-10-29 12:56:45 +04:00
07970f36e3 Processor additional field 2017-10-29 11:32:50 +04:00
1e81988bf5 Change version 2017-10-29 11:26:26 +04:00
217c79d867 Additional field in the database 2017-10-29 11:25:23 +04:00
4c63223050 Adding an additional field 2017-10-29 11:24:15 +04:00
41a1acc36b Bug Fix 2017-10-27 12:59:21 +04:00
9e1c2cca4e Additional check of variables 2017-10-27 12:51:58 +04:00
74c106aa87 Change version 2017-10-27 12:45:25 +04:00
700833b532 Simplification of the class 2017-10-27 12:41:48 +04:00
31ecf15e95 Filtering for possible errors 2017-10-27 12:41:15 +04:00
8afc94b51c Renaming a variable 2017-10-27 12:28:20 +04:00
2885dddccc Edit translation 2017-10-27 12:25:07 +04:00
0e4b7bc4d9 Event registration is added 2017-10-27 12:22:55 +04:00
d6d13338e3 Grinding of the final class 2017-10-27 12:16:21 +04:00
43ee70c01e Deleting an additional table 2017-10-27 12:11:25 +04:00
6dfe28dab5 The described class for simple journaling 2017-10-27 12:10:16 +04:00
04e60b112b Additional table 2017-10-27 11:28:10 +04:00
9e4c2dcbae Rename a class 2017-10-27 10:57:40 +04:00
1160a52753 Rename the handler class 2017-10-27 08:51:27 +04:00
af6ac9fb22 A small correction of logic 2017-10-27 08:04:23 +04:00
e1734746c0 Change version 2017-10-26 18:57:01 +04:00
21ad3135c8 Bug fix 2017-10-26 18:28:34 +04:00
f87b2c82c9 Maximum minimization of internal transfer 2017-10-26 18:25:48 +04:00
c25f4bada6 Updating layers of external pages 2017-10-26 18:18:31 +04:00
4f34a6db0f Refactoring the class displaying the form of the editor 2017-10-26 17:41:16 +04:00
a7e41f77d2 Refactoring the code to work with events 2017-10-26 17:34:34 +04:00
6c4e47b395 Bug fix 2017-10-26 17:31:08 +04:00
3816d4128c Minor corrections 2017-10-26 17:30:02 +04:00
fdaa591882 Refactoring the editor code 2017-10-26 17:25:30 +04:00
6b5c96a383 Refactoring the configuration file code 2017-10-26 17:11:34 +04:00
8ed2352fbe Refactoring the service manager code 2017-10-26 17:09:15 +04:00
f613301f24 Correcting the error if there is no value 2017-10-26 16:33:40 +04:00
f51bb5714e Supplemented description 2017-10-26 11:35:49 +04:00
065426b026 Refactoring of data sending 2017-10-26 11:07:01 +04:00
3a24fc34ca Small improvements cURL 2017-10-26 10:38:35 +04:00
a95df3c6b1 Set page layout 2017-10-26 10:15:47 +04:00
32 changed files with 2305 additions and 389 deletions

17
.github/workflows/main.yml vendored Normal file
View File

@ -0,0 +1,17 @@
name: Workflow
on: [push]
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: yesolutions/mirror-action@master
with:
REMOTE: 'https://git.popov.link/moodle/local_webhooks.git'
GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}

View File

@ -6,25 +6,15 @@ os: "linux"
php:
- 5.6
- 7.1
- 7.2
env:
- DB=pgsql MOODLE_BRANCH=MOODLE_26_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_27_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_28_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_29_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_30_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_31_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_32_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_33_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_26_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_27_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_28_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_29_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_30_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_31_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_34_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_32_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_33_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_34_STABLE
before_install:
- cd ../..
@ -51,9 +41,9 @@ jobs:
stage: deploy
env:
- DB=mysqli MOODLE_BRANCH=MOODLE_33_STABLE
- DB=mysqli MOODLE_BRANCH=MOODLE_34_STABLE
php: 7.1
php: 7.2
before_deploy:
- cd $TRAVIS_REPO_SLUG

View File

@ -1,35 +1,27 @@
# Moodle WebHook's
[![GitHub Release](https://img.shields.io/github/release/valentineus/moodle-webhooks.svg)](https://github.com/valentineus/moodle-webhooks/releases)
[![Build Status](https://travis-ci.org/valentineus/moodle-webhooks.svg?branch=master)](https://travis-ci.org/valentineus/moodle-webhooks)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/376ab669f2d3436884015554f686a915)](https://www.codacy.com/app/valentineus/moodle-webhooks)
[![Gitter Badge](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/valentineus/auth-link)
Webhooks allow applications to subscribe to Moodle events.
Adding Webhooks to Moodle.
The Webhooks feature allows applications to receive real-time notification of changes to certain data.
**Attention!**:
This plugin is in active development.
Using Webhooks, your application will be able to receive notifications of changes to selected topics and their fields.
Because of this, you do not have to rely on continuous or even periodic requests to check for updates.
Notifications about Webhooks updates are sent as POST requests to the callback URL you specified.
Notifications can indicate the very fact of a field change or include a new value.
## Installation
Features:
Get the installation package in any of the available methods:
* Use any number of services for notification;
* Customizing each external service;
* Interception of all events in the Moodle system;
* Use a secret phrase to authenticate requests;
* [JSON](https://en.wikipedia.org/wiki/JSON) - Format of outgoing data;
* [GitHub Releases](https://github.com/valentineus/moodle-webhooks/releases).
* [Compilation from the source code](#build).
## Documentation
## Build
Self-assembly package is as follows:
* Clone the repository:
```bash
git clone https://github.com/valentineus/moodle-webhooks.git moodle-webhooks
```
* Run the build script:
```bash
cd ./moodle-webhooks
/bin/sh build.sh
```
* [Install the plugin](docs/getting-started.md#installation).
* [User guide](docs/getting-started.md#user-guide).
* [Request format](docs/getting-started.md#request-format).
## License
@ -37,4 +29,4 @@ cd ./moodle-webhooks
[GNU GPLv3](LICENSE.txt).
Copyright (c)
[Valentin Popov](mailto:info@valentineus.link).
[Valentin Popov](mailto:info@valentineus.link).

View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Registration of the system of events.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class backup_performed extends \core\event\base {
/**
* Init method.
*/
protected function init() {
$this->data["crud"] = "c";
$this->data["edulevel"] = self::LEVEL_OTHER;
$this->data["objecttable"] = "local_webhooks_service";
}
/**
* Return localised event name.
*/
public static function get_name() {
return new \lang_string("create", "moodle");
}
/**
* Returns description of what happened.
*/
public function get_description() {
return new \lang_string("backup", "moodle");
}
/**
* Get URL related to the action.
*/
public function get_url() {
return new \moodle_url("/local/webhooks/index.php");
}
}

View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Registration of the system of events.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class backup_restored extends \core\event\base {
/**
* Init method.
*/
protected function init() {
$this->data["crud"] = "u";
$this->data["edulevel"] = self::LEVEL_OTHER;
$this->data["objecttable"] = "local_webhooks_service";
}
/**
* Return localised event name.
*/
public static function get_name() {
return new \lang_string("update", "moodle");
}
/**
* Returns description of what happened.
*/
public function get_description() {
return new \lang_string("backupfinished", "moodle");
}
/**
* Get URL related to the action.
*/
public function get_url() {
return new \moodle_url("/local/webhooks/index.php");
}
}

View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Registration of the system of events.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class response_answer extends \core\event\base {
/**
* Init method.
*/
protected function init() {
$this->data["crud"] = "r";
$this->data["edulevel"] = self::LEVEL_OTHER;
$this->data["objecttable"] = "local_webhooks_service";
}
/**
* Return localised event name.
*/
public static function get_name() {
return new \lang_string("answer", "moodle");
}
/**
* Returns description of what happened.
*/
public function get_description() {
return $this->other["status"];
}
/**
* Get URL related to the action.
*/
public function get_url() {
return new \moodle_url("/local/webhooks/editservice.php", array("serviceid" => $this->objectid));
}
}

View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Registration of the system of events.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class service_added extends \core\event\base {
/**
* Init method.
*/
protected function init() {
$this->data["crud"] = "c";
$this->data["edulevel"] = self::LEVEL_OTHER;
$this->data["objecttable"] = "local_webhooks_service";
}
/**
* Return localised event name.
*/
public static function get_name() {
return new \lang_string("create", "moodle");
}
/**
* Returns description of what happened.
*/
public function get_description() {
return new \lang_string("eventwebserviceservicecreated", "webservice");
}
/**
* Get URL related to the action.
*/
public function get_url() {
return new \moodle_url("/local/webhooks/editservice.php", array("serviceid" => $this->objectid));
}
}

View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Registration of the system of events.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class service_deleted extends \core\event\base {
/**
* Init method.
*/
protected function init() {
$this->data["crud"] = "d";
$this->data["edulevel"] = self::LEVEL_OTHER;
$this->data["objecttable"] = "local_webhooks_service";
}
/**
* Return localised event name.
*/
public static function get_name() {
return new \lang_string("deleted", "moodle");
}
/**
* Returns description of what happened.
*/
public function get_description() {
return new \lang_string("eventwebserviceservicedeleted", "webservice");
}
/**
* Get URL related to the action.
*/
public function get_url() {
return new \moodle_url("/local/webhooks/index.php");
}
}

View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Registration of the system of events.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class service_deletedall extends \core\event\base {
/**
* Init method.
*/
protected function init() {
$this->data["crud"] = "d";
$this->data["edulevel"] = self::LEVEL_OTHER;
$this->data["objecttable"] = "local_webhooks_service";
}
/**
* Return localised event name.
*/
public static function get_name() {
return new \lang_string("deleted", "moodle");
}
/**
* Returns description of what happened.
*/
public function get_description() {
return new \lang_string("deletecompletely", "moodle");
}
/**
* Get URL related to the action.
*/
public function get_url() {
return new \moodle_url("/local/webhooks/index.php");
}
}

View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Registration of the system of events.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class service_updated extends \core\event\base {
/**
* Init method.
*/
protected function init() {
$this->data["crud"] = "u";
$this->data["edulevel"] = self::LEVEL_OTHER;
$this->data["objecttable"] = "local_webhooks_service";
}
/**
* Return localised event name.
*/
public static function get_name() {
return new \lang_string("update", "moodle");
}
/**
* Returns description of what happened.
*/
public function get_description() {
return new \lang_string("eventwebserviceserviceupdated", "webservice");
}
/**
* Get URL related to the action.
*/
public function get_url() {
return new \moodle_url("/local/webhooks/editservice.php", array("serviceid" => $this->objectid));
}
}

View File

@ -1,112 +0,0 @@
<?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/>.
/**
* The event handler.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks;
defined("MOODLE_INTERNAL") || die();
/**
* Defines how to work with events.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class events {
/**
* External handler.
*
* @param object $event
*/
public static function handler($event) {
$enable = get_config("local_webhooks", "enable");
if (boolval($enable)) {
$data = $event->get_data();
self::transmitter($data);
}
}
/**
* Transmitter, processing event and services.
*
* @param array $data
*/
private static function transmitter($data) {
global $DB;
$callbacks = $DB->get_recordset("local_webhooks_service");
if ($callbacks->valid()) {
foreach ($callbacks as $callback) {
self::handler_callback($data, $callback);
}
}
$callbacks->close();
}
/**
* Processes each callback.
*
* @param array $data
* @param object $callback
*/
private static function handler_callback($data, $callback) {
if ($callback->enable) {
if (!empty($callback->events)) {
$events = unserialize(gzuncompress(base64_decode($callback->events)));
}
if (boolval($events[$data["eventname"]])) {
/* Adding to the data token */
if (boolval($callback->token)) {
$data["token"] = $callback->token;
}
self::send($data, $callback);
}
}
}
/**
* Sending data to the node.
*
* @param array $data
* @param object $callback
*/
private static function send($data, $callback) {
$curl = new curl();
$package = self::packup($data);
$curl::request($callback, $package);
}
/**
* Packs the data for transmission.
*
* @param array $data
*/
private static function packup($data) {
return json_encode($data);
}
}

56
classes/handler.php Normal file
View File

@ -0,0 +1,56 @@
<?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/>.
/**
* The event handler.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks;
defined("MOODLE_INTERNAL") || die();
require_once(__DIR__ . "/../locallib.php");
require_once(__DIR__ . "/../lib.php");
/**
* Defines event handlers.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class handler {
/**
* External handler.
*
* @param object $event
*/
public static function events($event) {
$data = $event->get_data();
if (!is_array($recordlist = local_webhooks_cache_get($data["eventname"]))) {
$recordlist = local_webhooks_search_services_by_event($data["eventname"], true);
local_webhooks_cache_set($data["eventname"], $recordlist);
}
foreach ($recordlist as $record) {
local_webhooks_send_request($data, $record);
}
}
}

View File

@ -15,22 +15,18 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Defines the form of editing the service.
* Defines forms.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks;
defined("MOODLE_INTERNAL") || die();
require_once($CFG->libdir . "/formslib.php");
require_once(__DIR__ . "/../lib.php");
use report_eventlist_list_generator;
use lang_string;
use moodleform;
require_once($CFG->libdir . "/formslib.php");
/**
* Description editing form definition.
@ -46,72 +42,56 @@ class service_edit_form extends moodleform {
parent::__construct($baseurl);
}
/**
* Unpacks data for display.
*
* @param object $record
*/
public function set_data($record) {
$record->events = unserialize(gzuncompress(base64_decode($record->events)));
return parent::set_data($record);
}
/**
* Defines the standard structure of the form.
*/
protected function definition() {
$mform =& $this->_form;
$size = array("size" => 60);
/* Form heading */
$mform->addElement("header", "editserviceheader",
new lang_string("service", "webservice"));
$mform->addElement("header", "editserviceheader", new lang_string("service", "webservice"));
/* Name of the service */
$mform->addElement("text", "title",
new lang_string("name", "moodle"),
array("size" => 60));
$mform->setType("title", PARAM_NOTAGS);
$mform->addElement("text", "title", new lang_string("name", "moodle"), $size);
$mform->addRule("title", null, "required");
$mform->setType("title", PARAM_NOTAGS);
/* Callback address */
$mform->addElement("text", "url",
new lang_string("url", "moodle"),
array("size" => 60));
$mform->setType("url", PARAM_URL);
$mform->addElement("text", "url", new lang_string("url", "moodle"), $size);
$mform->addRule("url", null, "required");
$mform->setType("url", PARAM_URL);
/* Enabling the service */
$mform->addElement("advcheckbox", "enable",
new lang_string("enable", "moodle"));
$mform->addElement("advcheckbox", "enable", new lang_string("enable", "moodle"));
$mform->setType("enable", PARAM_BOOL);
$mform->setDefault("enable", 1);
$mform->setAdvanced("enable");
/* Token */
$mform->addElement("text", "token",
new lang_string("token", "webservice"),
array("size" => 60));
$mform->addElement("text", "token", new lang_string("token", "webservice"), $size);
$mform->setType("token", PARAM_NOTAGS);
/* Additional information */
$mform->addElement("text", "other", new lang_string("sourceext", "plugin"), $size);
$mform->setType("other", PARAM_NOTAGS);
$mform->setAdvanced("other");
/* Content type */
$mform->addElement("select", "type", "Content type",
array(
"json" => "application/json",
"x-www-form-urlencoded" => "application/x-www-form-urlencoded"));
$contenttype = array("json" => "application/json", "x-www-form-urlencoded" => "application/x-www-form-urlencoded");
$mform->addElement("select", "type", "Content type", $contenttype);
$mform->setAdvanced("type");
/* Form heading */
$mform->addElement("header", "editserviceheaderevent",
new lang_string("edulevel", "moodle"));
$mform->addElement("header", "editserviceheaderevent", new lang_string("edulevel", "moodle"));
/* List of events */
$eventlist = report_eventlist_list_generator::get_all_events_list(true);
$events = array();
$eventlist = local_webhooks_get_list_events();
$events = array();
/* Formation of the list of elements */
foreach ($eventlist as $event) {
$events[$event["component"]][] =&
$mform->createElement("checkbox", $event["eventname"], $event["eventname"]);
$events[$event["component"]][] =& $mform->createElement("checkbox", $event["eventname"], $event["eventname"]);
}
/* Displays groups of items */
@ -122,4 +102,41 @@ class service_edit_form extends moodleform {
/* Control Panel */
$this->add_action_buttons(true);
}
}
/**
* Description of the form of restoration.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class service_backup_form extends moodleform {
/**
* @param string $baseurl
*/
public function __construct($baseurl) {
parent::__construct($baseurl);
}
/**
* Defines the standard structure of the form.
*/
protected function definition() {
$mform =& $this->_form;
/* Form heading */
$mform->addElement("header", "editserviceheader", new lang_string("restore", "moodle"));
/* Flag for deleting existing data */
$mform->addElement("advcheckbox", "deleterecords", new lang_string("deleteall", "moodle"));
$mform->setType("deleterecords", PARAM_BOOL);
$mform->setDefault("deleterecords", 1);
/* Download the file */
$mform->addElement("filepicker", "backupfile", new lang_string("file", "moodle"));
$mform->addRule("backupfile", null, "required");
/* Control Panel */
$this->add_action_buttons(true, new lang_string("restore", "moodle"));
}
}

145
classes/webhooks_table.php Normal file
View File

@ -0,0 +1,145 @@
<?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/>.
/**
* Describes the plugin tables.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined("MOODLE_INTERNAL") || die();
require_once($CFG->libdir . "/tablelib.php");
/**
* Describes the main table of the plugin.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class local_webhooks_table extends table_sql {
/**
* Manager address.
*
* @var string $manager
*/
protected static $manager = "/local/webhooks/index.php";
/**
* Editor's address.
*
* @var string $editor
*/
protected static $editor = "/local/webhooks/editservice.php";
/**
* Constructor.
*
* @param string $uniqueid The unique identifier of the table.
*/
public function __construct($uniqueid) {
parent::__construct($uniqueid);
$this->define_table_columns();
$this->define_table_configs();
}
/**
* Defines the basic settings of the table.
*/
public function define_table_configs() {
$this->set_sql("*", "{local_webhooks_service}", "1");
$this->collapsible(false);
$this->is_downloadable(false);
$this->no_sorting("actions");
$this->pageable(true);
}
/**
* Defines the main columns and table headers.
*/
public function define_table_columns() {
$columns = array(
"title",
"url",
"events",
"actions"
);
$headers = array(
new lang_string("name", "moodle"),
new lang_string("url", "moodle"),
new lang_string("edulevel", "moodle"),
new lang_string("actions", "moodle")
);
$this->define_columns($columns);
$this->define_headers($headers);
}
/**
* Specifies the display of a column with actions.
*
* @param object $row Data from the database.
* @return string Displayed data.
*/
public function col_actions($row) {
global $OUTPUT;
$hideshowicon = "t/show";
$hideshowstring = new lang_string("enable", "moodle");
if (boolval($row->enable)) {
$hideshowicon = "t/hide";
$hideshowstring = new lang_string("disable", "moodle");
}
$hideshowlink = new moodle_url(self::$manager, array("hideshowid" => $row->id, "sesskey" => sesskey()));
$hideshowitem = $OUTPUT->action_icon($hideshowlink, new pix_icon($hideshowicon, $hideshowstring));
$editlink = new moodle_url(self::$editor, array("serviceid" => $row->id, "sesskey" => sesskey()));
$edititem = $OUTPUT->action_icon($editlink, new pix_icon("t/edit", new lang_string("edit", "moodle")));
$deletelink = new moodle_url(self::$manager, array("deleteid" => $row->id, "sesskey" => sesskey()));
$deleteitem = $OUTPUT->action_icon($deletelink, new pix_icon("t/delete", new lang_string("delete", "moodle")));
$html = $hideshowitem . $edititem . $deleteitem;
return $html;
}
/**
* Specifies the display of a column with events.
*
* @param object $row Data from the database.
* @return string Displayed data.
*/
public function col_events($row) {
$eventlist = local_webhooks_deserialization_data($row->events);
return count($eventlist);
}
/**
* Specifies the display of the column with the service name.
*
* @param object $row Data from the database.
* @return string Displayed data.
*/
public function col_title($row) {
$link = new moodle_url(self::$editor, array("serviceid" => $row->id, "sesskey" => sesskey()));
$html = html_writer::link($link, $row->title);
return $html;
}
}

View File

@ -15,12 +15,17 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Strings for component "local_webhooks", language "ru".
* Definition of the plug-in cache.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$string["managerservice"] = "Менеджер управления службами";
$string["pluginname"] = "WebHooks";
$definitions = array(
"webhooks_services" => array(
"mode" => cache_store::MODE_APPLICATION,
"requiredataguarantee" => true,
"staticacceleration" => true
)
);

View File

@ -26,10 +26,10 @@ defined("MOODLE_INTERNAL") || die();
$observers = array(
array(
"eventname" => "*",
"callback" => "\local_webhooks\\events::handler",
"callback" => "\local_webhooks\\handler::events",
"eventname" => "*",
"includefile" => null,
"priority" => 200,
"internal" => true
"internal" => true,
"priority" => 200
)
);

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="blocks/local_webhooks/db" VERSION="20171026" COMMENT="XMLDB file for Moodle" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd">
<XMLDB PATH="blocks/local_webhooks/db" VERSION="20171029" COMMENT="XMLDB file for Moodle" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd">
<TABLES>
<TABLE NAME="local_webhooks_service" COMMENT="A table for storing callback services.">
<FIELDS>
@ -9,11 +9,12 @@
<FIELD NAME="url" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" />
<FIELD NAME="type" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" />
<FIELD NAME="token" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" />
<FIELD NAME="events" TYPE="text" NOTNULL="true" SEQUENCE="false" />
<FIELD NAME="events" TYPE="text" NOTNULL="false" SEQUENCE="false" />
<FIELD NAME="other" TYPE="text" NOTNULL="false" SEQUENCE="false" />
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id" />
</KEYS>
</TABLE>
</TABLES>
</XMLDB>
</XMLDB>

115
db/services.php Normal file
View File

@ -0,0 +1,115 @@
<?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/>.
/**
* This file registers the plugin's external functions.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined("MOODLE_INTERNAL") || die();
$functions = array(
"local_webhooks_change_status" => array(
"classname" => "local_webhooks_external",
"methodname" => "change_status",
"classpath" => "local/webhooks/externallib.php",
"description" => "Change the status of the service.",
"type" => "write"
),
"local_webhooks_search_services_by_event" => array(
"classname" => "local_webhooks_external",
"methodname" => "search_services_by_event",
"classpath" => "local/webhooks/externallib.php",
"description" => "Search for services that contain the specified event.",
"type" => "read"
),
"local_webhooks_get_record" => array(
"classname" => "local_webhooks_external",
"methodname" => "get_record",
"classpath" => "local/webhooks/externallib.php",
"description" => "Get the record from the database.",
"type" => "read"
),
"local_webhooks_get_list_records" => array(
"classname" => "local_webhooks_external",
"methodname" => "get_list_records",
"classpath" => "local/webhooks/externallib.php",
"description" => "Get all records from the database.",
"type" => "read"
),
"local_webhooks_get_list_events" => array(
"classname" => "local_webhooks_external",
"methodname" => "get_list_events",
"classpath" => "local/webhooks/externallib.php",
"description" => "Get a list of all system events.",
"type" => "read"
),
"local_webhooks_create_record" => array(
"classname" => "local_webhooks_external",
"methodname" => "create_record",
"classpath" => "local/webhooks/externallib.php",
"description" => "Create an entry in the database.",
"type" => "write"
),
"local_webhooks_update_record" => array(
"classname" => "local_webhooks_external",
"methodname" => "update_record",
"classpath" => "local/webhooks/externallib.php",
"description" => "Update the record in the database.",
"type" => "write"
),
"local_webhooks_delete_record" => array(
"classname" => "local_webhooks_external",
"methodname" => "delete_record",
"classpath" => "local/webhooks/externallib.php",
"description" => "Delete the record from the database.",
"type" => "write"
),
"local_webhooks_delete_all_records" => array(
"classname" => "local_webhooks_external",
"methodname" => "delete_all_records",
"classpath" => "local/webhooks/externallib.php",
"description" => "Delete all records from the database.",
"type" => "write"
),
"local_webhooks_create_backup" => array(
"classname" => "local_webhooks_external",
"methodname" => "create_backup",
"classpath" => "local/webhooks/externallib.php",
"description" => "Create a backup.",
"type" => "read"
),
"local_webhooks_restore_backup" => array(
"classname" => "local_webhooks_external",
"methodname" => "restore_backup",
"classpath" => "local/webhooks/externallib.php",
"description" => "Restore from a backup.",
"type" => "write"
)
);

View File

@ -15,37 +15,38 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Create a class for sending data.
* Keeps track of upgrades to the 'local_webhooks' plugin.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_webhooks;
defined("MOODLE_INTERNAL") || die();
class curl {
public function __construct() {
if (!function_exists("curl_init")) {
print_error("nocurl", "mnet");
require_once(__DIR__ . "/../lib.php");
/**
* Function to upgrade 'local_webhooks'.
*
* @param number $oldversion
* @return boolean
*/
function xmldb_local_webhooks_upgrade($oldversion) {
global $CFG, $DB;
/* Update from version 3.0.0 */
if ($oldversion < 2017112600) {
$rs = $DB->get_recordset("local_webhooks_service", null, "id", "*", 0, 0);
foreach ($rs as $record) {
if (!empty($record->events)) {
$record->events = unserialize(gzuncompress(base64_decode($record->events)));
local_webhooks_update_record($record);
}
}
$rs->close();
upgrade_plugin_savepoint(true, 2017112600, "local", "webhooks");
}
public static function request($callback, $data) {
$ch = curl_init($callback->url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array(
"Content-Type: application/" . $callback->type,
"Content-Length: " . strlen($data))
);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
return true;
}

111
docs/getting-started.md Normal file
View File

@ -0,0 +1,111 @@
# Getting Started
## Navigation
* [Installation](#installation)
* [Build](#build)
* [User guide](#user-guide)
* [Guide to the manager](#guide-to-the-manager)
* [Guide to the editor](#guide-to-the-editor)
* [Request format](#request-format)
## Installation
Get the installation package in any of the available methods:
* [GitHub Releases](https://github.com/valentineus/moodle-webhooks/releases).
* [Compilation from the source code](#build).
### Build
Self-assembly package is as follows:
* Clone the repository:
```bash
git clone https://github.com/valentineus/moodle-webhooks.git moodle-webhooks
```
* Run the build script:
```bash
cd ./moodle-webhooks
/bin/sh build.sh
```
## User guide
After you install the plug-in, the Service Manager appears on the `Server` tab in the administration panel.
To open the page, go:
`Site administration` ->
`Server` ->
`WebHooks`.
### Guide to the manager
The main window looks like this:
![Service Manager](screenshots/managerservice.jpg)
On the main page you can see the list of services and manage each service separately.
Column description
* "**Name**" shows the name of the service.
* "**URL**" indicates the address of the service to which notifications are received.
* "**Actions**" allows you to enable / disable the service, edit and delete.
Description of control buttons:
* "**Add service**" opens a page for creating a new service.
* "**Backup**" loads the backup file of the service list.
* "**Restore**" redirects the data recovery page from the backup.
### Guide to the editor
During the editing and creation of the service, this page opens:
![Service Editor](screenshots/editservice.jpg)
Description of fields:
* "**Name**" stores an arbitrary name for the service.
* "**URL**" stores the address of the service to which notifications will be sent as a POST request.
* "**Token**" allows you to specify an individual key that will allow an external service to identify requests.
* "**Advanced**" stores a large string passed to the service.
This can be useful for some services or users.
* "**Content Type**" allows you to configure the type of outbound requests if there are compatibility issues.
The "**All events**" list contains a list of all events registered in the system.
The selected events will notify the service.
## Request format
Events come in
[JSON](https://en.wikipedia.org/wiki/JSON)
format.
An example of an observed course event:
```JSON
{
"eventname": "\\core\\event\\course_viewed",
"component": "core",
"action": "viewed",
"target": "course",
"objecttable": null,
"objectid": null,
"crud": "r",
"edulevel": 2,
"contextid": 2,
"contextlevel": 50,
"contextinstanceid": "1",
"userid": "2",
"courseid": "1",
"relateduserid": null,
"anonymous": 0,
"other": null,
"timecreated": 1512961456,
"host": "localhost",
"token": "",
"extra": ""
}
```
[Detailed description of the fields](https://docs.moodle.org/dev/Event_2#Properties).

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

View File

@ -15,7 +15,7 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Service editor.
* Page for editing the service.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
@ -23,28 +23,25 @@
*/
require_once(__DIR__ . "/../../config.php");
require_once(__DIR__ . "/classes/forms.php");
require_once(__DIR__ . "/classes/service_form.php");
require_once(__DIR__ . "/lib.php");
$idservice = optional_param("idservice", 0, PARAM_INT);
require_once($CFG->libdir . "/adminlib.php");
require_login();
/* Optional parameters */
$serviceid = optional_param("serviceid", 0, PARAM_INT);
/* Link generation */
$urlparameters = array("idservice" => $idservice);
$managerservice = new moodle_url("/local/webhooks/managerservice.php", $urlparameters);
$baseurl = new moodle_url("/local/webhooks/editservice.php", $urlparameters);
$PAGE->set_url($baseurl, $urlparameters);
$urlparameters = array("serviceid" => $serviceid);
$baseurl = new moodle_url("/local/webhooks/editservice.php", $urlparameters);
$managerservice = new moodle_url("/local/webhooks/index.php");
/* Configure the context of the page */
admin_externalpage_setup("local_webhooks", "", null, $baseurl, array());
$context = context_system::instance();
$PAGE->set_context($context);
/* Preparing a template for data */
$titlepage = new lang_string("externalservice", "webservice");
$servicerecord = new stdClass;
/* Create an editing form */
$mform = new \local_webhooks\service_edit_form($PAGE->url);
$mform = new service_edit_form($PAGE->url);
/* Cancel processing */
if ($mform->is_cancelled()) {
@ -52,41 +49,33 @@ if ($mform->is_cancelled()) {
}
/* Getting the data */
if ($idediting = boolval($idservice)) {
$servicerecord = $DB->get_record("local_webhooks_service", array("id" => $idservice), "*", MUST_EXIST);
$servicerecord = new stdClass();
if ($editing = boolval($serviceid)) {
$servicerecord = local_webhooks_get_record($serviceid);
$mform->set_data($servicerecord);
}
/* Processing of received data */
if ($data = $mform->get_data()) {
/* Packing of data */
if (!empty($data->events)) {
$data->events = base64_encode(gzcompress(serialize($data->events), 9));
}
if ($idediting) {
$data->id = $idservice;
$DB->update_record("local_webhooks_service", $data);
if (($data = $mform->get_data()) && confirm_sesskey()) {
if ($editing) {
$data->id = $serviceid;
local_webhooks_update_record($data);
} else {
$DB->insert_record("local_webhooks_service", $data);
local_webhooks_create_record($data);
}
redirect($managerservice);
redirect($managerservice, new lang_string("changessaved", "moodle"));
}
/* Page template */
$PAGE->set_pagelayout("admin");
/* The page title */
$titlepage = new lang_string("externalservice", "webservice");
$PAGE->navbar->add($titlepage);
$PAGE->set_heading($titlepage);
$PAGE->set_title($titlepage);
/* The page title */
$PAGE->navbar->add(new lang_string("localplugins", "moodle"));
$PAGE->navbar->add(new lang_string("pluginname", "local_webhooks"));
$PAGE->navbar->add(new lang_string("managerservice", "local_webhooks"), $managerservice);
$PAGE->navbar->add($titlepage);
echo $OUTPUT->header();
/* Displays the form */
$mform->display();
/* Footer */
echo $OUTPUT->footer();

643
externallib.php Normal file
View File

@ -0,0 +1,643 @@
<?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/>.
/**
* This file defines the plugin's external functions.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined("MOODLE_INTERNAL") || die();
require_once(__DIR__ . "/lib.php");
require_once($CFG->libdir . "/externallib.php");
/**
* External functions.
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class local_webhooks_external extends external_api {
/**
* Single template output parameters.
*
* @return external_description
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
private static function structure_record_parameters() {
return new external_single_structure(
array(
"id" => new external_value(PARAM_INT, "Service ID."),
"enable" => new external_value(PARAM_BOOL, "Enable or disable the service."),
"title" => new external_value(PARAM_TEXT, "Name of the service."),
"url" => new external_value(PARAM_URL, "Web address of the service."),
"type" => new external_value(PARAM_TEXT, "Used header type."),
"token" => new external_value(PARAM_RAW, "Authorization key.", VALUE_OPTIONAL),
"other" => new external_value(PARAM_RAW, "Additional field.", VALUE_OPTIONAL),
"events" => new external_multiple_structure(
new external_single_structure(
array(
"name" => new external_value(PARAM_TEXT, "The name of the event."),
"value" => new external_value(PARAM_BOOL, "Enabled or disabled handler.")
)
), "List of observed events.", VALUE_OPTIONAL
)
), "Information about the service."
);
}
/**
* Formation of the final list.
*
* @param array $listrecords
* @return array
*/
private static function formation_list($listrecords) {
$result = array();
foreach ($listrecords as $index => $record) {
$result[$index] = (array) $record;
$result[$index]["events"] = self::formation_events($record->events);
}
return $result;
}
/**
* Formation of the final list of events.
*
* @param array $listevents
* @return array
*/
private static function formation_events($listevents) {
$result = array();
foreach ($listevents as $key => $value) {
$result[] = array("name" => $key, "value" => $value);
}
return $result;
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function change_status_parameters() {
return new external_function_parameters(
array(
"serviceid" => new external_value(PARAM_INT, "Service ID.")
)
);
}
/**
* Change the status of the service.
*
* @param number $serviceid
* @return boolean
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function change_status($serviceid) {
$parameters = self::validate_parameters(self::change_status_parameters(), array("serviceid" => $serviceid));
$context = context_system::instance();
self::validate_context($context);
return local_webhooks_change_status($parameters["serviceid"]);
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function change_status_returns() {
return new external_value(PARAM_BOOL, "Result of execution.");
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function search_services_by_event_parameters() {
return new external_function_parameters(
array(
"eventname" => new external_value(PARAM_TEXT, "The name of the event."),
"active" => new external_value(PARAM_BOOL, "Filter show active or all services.")
)
);
}
/**
* Search for services that contain the specified event.
*
* @param string $eventname
* @param boolean $active
* @return array
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function search_services_by_event($eventname, $active) {
$parameters = self::validate_parameters(self::search_services_by_event_parameters(), array("eventname" => $eventname, "active" => $active));
$context = context_system::instance();
self::validate_context($context);
$result = array();
if ($listrecords = local_webhooks_search_services_by_event($parameters["eventname"], $parameters["active"])) {
$result = self::formation_list($listrecords);
}
return $result;
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function search_services_by_event_returns() {
return new external_multiple_structure(
self::structure_record_parameters(), "List of services."
);
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function get_record_parameters() {
return new external_function_parameters(
array(
"serviceid" => new external_value(PARAM_INT, "Service ID.")
)
);
}
/**
* Get the record from the database.
*
* @param number $serviceid
* @return array
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function get_record($serviceid) {
$parameters = self::validate_parameters(self::get_record_parameters(), array("serviceid" => $serviceid));
$context = context_system::instance();
self::validate_context($context);
$result = array();
if ($record = local_webhooks_get_record($parameters["serviceid"])) {
$result = (array) $record;
$result["events"] = self::formation_events($record->events);
}
return $result;
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function get_record_returns() {
return self::structure_record_parameters();
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function get_list_records_parameters() {
return new external_function_parameters(array());
}
/**
* Get all records from the database.
*
* @return array
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function get_list_records() {
$context = context_system::instance();
self::validate_context($context);
$result = array();
if ($listrecords = local_webhooks_get_list_records()) {
$result = self::formation_list($listrecords);
}
return $result;
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function get_list_records_returns() {
return new external_multiple_structure(
self::structure_record_parameters(), "List of services."
);
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function get_list_events_parameters() {
return new external_function_parameters(array());
}
/**
* Get a list of all system events.
*
* @return array
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function get_list_events() {
$context = context_system::instance();
self::validate_context($context);
$result = array();
if ($eventlist = local_webhooks_get_list_events()) {
foreach ($eventlist as $item) {
$result[] = $item["eventname"];
}
}
return $result;
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function get_list_events_returns() {
return new external_multiple_structure(
new external_value(PARAM_TEXT, "The name of the event.")
);
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function create_record_parameters() {
return new external_function_parameters(
array(
"service" => new external_single_structure(
array(
"enable" => new external_value(PARAM_BOOL, "Enable or disable the service.", VALUE_OPTIONAL),
"title" => new external_value(PARAM_TEXT, "Name of the service."),
"url" => new external_value(PARAM_URL, "Web address of the service."),
"type" => new external_value(PARAM_TEXT, "Used header type.", VALUE_OPTIONAL),
"token" => new external_value(PARAM_RAW, "Authorization key.", VALUE_OPTIONAL),
"other" => new external_value(PARAM_RAW, "Additional field.", VALUE_OPTIONAL),
"events" => new external_multiple_structure(
new external_single_structure(
array(
"name" => new external_value(PARAM_TEXT, "The name of the event."),
"value" => new external_value(PARAM_BOOL, "Enabled or disabled handler.")
)
), "List of observed events.", VALUE_OPTIONAL
)
), "Information about the service."
)
)
);
}
/**
* Create an entry in the database.
*
* @param array $service
* @return boolean
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function create_record($service) {
$parameters = self::validate_parameters(self::create_record_parameters(), array("service" => $service));
$context = context_system::instance();
self::validate_context($context);
$record = new stdClass();
$record->other = $parameters["service"]["other"];
$record->title = $parameters["service"]["title"];
$record->token = $parameters["service"]["token"];
$record->url = $parameters["service"]["url"];
$record->events = array();
$record->enable = !empty($parameters["service"]["enable"]) ? $parameters["service"]["enable"] : false;
$record->type = !empty($parameters["service"]["type"]) ? $parameters["service"]["type"] : "json";
foreach ($parameters["service"]["events"] as $value) {
$record->events[$value["name"]] = $value["value"];
}
return local_webhooks_create_record($record);
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function create_record_returns() {
return new external_value(PARAM_BOOL, "Result of execution.");
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function update_record_parameters() {
return new external_function_parameters(
array(
"service" => new external_single_structure(
array(
"id" => new external_value(PARAM_INT, "Service ID."),
"enable" => new external_value(PARAM_BOOL, "Enable or disable the service.", VALUE_OPTIONAL),
"title" => new external_value(PARAM_TEXT, "Name of the service.", VALUE_OPTIONAL),
"url" => new external_value(PARAM_URL, "Web address of the service.", VALUE_OPTIONAL),
"type" => new external_value(PARAM_TEXT, "Used header type.", VALUE_OPTIONAL),
"token" => new external_value(PARAM_RAW, "Authorization key.", VALUE_OPTIONAL),
"other" => new external_value(PARAM_RAW, "Additional field.", VALUE_OPTIONAL),
"events" => new external_multiple_structure(
new external_single_structure(
array(
"name" => new external_value(PARAM_TEXT, "The name of the event."),
"value" => new external_value(PARAM_BOOL, "Enabled or disabled handler.")
)
), "List of observed events.", VALUE_OPTIONAL
)
), "Information about the service."
)
)
);
}
/**
* Update the record in the database.
*
* @param array $service
* @return boolean
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function update_record($service) {
$parameters = self::validate_parameters(self::update_record_parameters(), array("service" => $service));
$context = context_system::instance();
self::validate_context($context);
$result = false;
if ($record = local_webhooks_get_record($parameters["service"]["id"])) {
$record->enable = !empty($parameters["service"]["enable"]) ? $parameters["service"]["enable"] : $record->enable;
$record->other = !empty($parameters["service"]["other"]) ? $parameters["service"]["other"] : $record->other;
$record->title = !empty($parameters["service"]["title"]) ? $parameters["service"]["title"] : $record->title;
$record->token = !empty($parameters["service"]["token"]) ? $parameters["service"]["token"] : $record->token;
$record->type = !empty($parameters["service"]["type"]) ? $parameters["service"]["type"] : $record->type;
$record->url = !empty($parameters["service"]["url"]) ? $parameters["service"]["url"] : $record->url;
if (!empty($parameters["service"]["events"])) {
$record->events = array();
foreach ($parameters["service"]["events"] as $value) {
$record->events[$value["name"]] = $value["value"];
}
}
$result = local_webhooks_update_record($record);
}
return $result;
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function update_record_returns() {
return new external_value(PARAM_BOOL, "Result of execution.");
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function delete_record_parameters() {
return new external_function_parameters(
array(
"serviceid" => new external_value(PARAM_INT, "Service ID.")
)
);
}
/**
* Delete the record from the database.
*
* @param number $serviceid
* @return boolean
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function delete_record($serviceid) {
$parameters = self::validate_parameters(self::delete_record_parameters(), array("serviceid" => $serviceid));
$context = context_system::instance();
self::validate_context($context);
return local_webhooks_delete_record($parameters["serviceid"]);
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function delete_record_returns() {
return new external_value(PARAM_BOOL, "Result of execution.");
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function delete_all_records_parameters() {
return new external_function_parameters(array());
}
/**
* Delete all records from the database.
*
* @return boolean
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function delete_all_records() {
$context = context_system::instance();
self::validate_context($context);
return local_webhooks_delete_all_records();
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function delete_all_records_returns() {
return new external_value(PARAM_BOOL, "Result of execution.");
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function create_backup_parameters() {
return new external_function_parameters(array());
}
/**
* Create a backup.
*
* @return string
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function create_backup() {
$context = context_system::instance();
self::validate_context($context);
return local_webhooks_create_backup();
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function create_backup_returns() {
return new external_value(PARAM_RAW, "Backup copy.");
}
/**
* Returns description of method parameters.
*
* @return external_function_parameters
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function restore_backup_parameters() {
return new external_function_parameters(
array(
"options" => new external_single_structure(
array(
"backup" => new external_value(PARAM_RAW, "Backup copy."),
"deleterecords" => new external_value(PARAM_BOOL, "Delete or leave all records.", VALUE_OPTIONAL)
)
)
)
);
}
/**
* Restore from a backup.
*
* @param array $options
* @since Moodle 2.9 Options available
* @since Moodle 2.2
*/
public static function restore_backup($options) {
$parameters = self::validate_parameters(self::restore_backup_parameters(), array("options" => $options));
$context = context_system::instance();
self::validate_context($context);
$deleterecords = !empty($parameters["options"]["deleterecords"]) ? $parameters["options"]["deleterecords"] : false;
local_webhooks_restore_backup($parameters["options"]["backup"], $deleterecords);
}
/**
* Returns description of method result value.
*
* @return external_description
* @since Moodle 2.2
*/
public static function restore_backup_returns() {
return null;
}
}

100
index.php Normal file
View File

@ -0,0 +1,100 @@
<?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/>.
/**
* Service Management Manager.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . "/../../config.php");
require_once(__DIR__ . "/classes/webhooks_table.php");
require_once(__DIR__ . "/lib.php");
require_once($CFG->libdir . "/adminlib.php");
/* Optional parameters */
$backupservices = optional_param("getbackup", 0, PARAM_BOOL);
$deleteall = optional_param("deleteall", 0, PARAM_INT);
$deleteid = optional_param("deleteid", 0, PARAM_INT);
$hideshowid = optional_param("hideshowid", 0, PARAM_INT);
/* Link generation */
$editservice = "/local/webhooks/editservice.php";
$managerservice = "/local/webhooks/index.php";
$restorebackup = "/local/webhooks/restorebackup.php";
$baseurl = new moodle_url($managerservice);
/* Configure the context of the page */
admin_externalpage_setup("local_webhooks", "", null, $baseurl, array());
$context = context_system::instance();
/* Delete the service */
if (!empty($deleteid) && confirm_sesskey()) {
local_webhooks_delete_record($deleteid);
redirect($PAGE->url, new lang_string("deleted", "moodle"));
}
/* Switching the status of the service */
if (!empty($hideshowid) && confirm_sesskey()) {
local_webhooks_change_status($hideshowid);
redirect($PAGE->url, new lang_string("changessaved", "moodle"));
}
/* Deletes all data */
if (boolval($deleteall) && confirm_sesskey()) {
local_webhooks_delete_all_records();
redirect($PAGE->url, new lang_string("deleted", "moodle"));
}
/* Upload settings as a file */
if (boolval($backupservices)) {
$filecontent = local_webhooks_create_backup();
$filename = "webhooks_" . date("U") . ".backup";
send_file($filecontent, $filename, 0, 0, true, true);
}
/* The page title */
$titlepage = new lang_string("pluginname", "local_webhooks");
$PAGE->set_heading($titlepage);
$PAGE->set_title($titlepage);
echo $OUTPUT->header();
/* Adds the add button */
$addserviceurl = new moodle_url($editservice, array("sesskey" => sesskey()));
echo $OUTPUT->single_button($addserviceurl, new lang_string("add", "moodle"));
/* Adds a delete button */
$deleteallurl = new moodle_url($managerservice, array("deleteall" => true, "sesskey" => sesskey()));
echo $OUTPUT->single_button($deleteallurl, new lang_string("deleteall", "moodle"), "get");
/* Adds a backup button */
$backupurl = new moodle_url($managerservice, array("getbackup" => true));
echo $OUTPUT->single_button($backupurl, new lang_string("backup", "moodle"), "get");
/* Adds a restore button */
$restorebackupurl = new moodle_url($restorebackup);
echo $OUTPUT->single_button($restorebackupurl, new lang_string("restore", "moodle"));
/* Displays the table */
$table = new local_webhooks_table("local-webhooks-table");
$table->define_baseurl($baseurl);
$table->out(25, true);
/* Footer */
echo $OUTPUT->footer();

View File

@ -22,5 +22,4 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$string["managerservice"] = "Service management manager";
$string["pluginname"] = "WebHooks";

268
lib.php Normal file
View File

@ -0,0 +1,268 @@
<?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/>.
/**
* This file contains the functions used by the plugin.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined("MOODLE_INTERNAL") || die();
require_once(__DIR__ . "/locallib.php");
/**
* Change the status of the service.
*
* @param number $serviceid
* @return boolean
*/
function local_webhooks_change_status($serviceid) {
global $DB;
$result = false;
if ($record = local_webhooks_get_record($serviceid)) {
$record->enable = !boolval($record->enable);
$result = local_webhooks_update_record($record);
}
return $result;
}
/**
* Search for services that contain the specified event.
*
* @param string $eventname
* @param boolean $active
* @return array
*/
function local_webhooks_search_services_by_event($eventname, $active = false) {
$recordlist = local_webhooks_get_list_records();
$active = boolval($active);
$result = array();
foreach ($recordlist as $record) {
if (!empty($record->events[$eventname])) {
if ($active && boolval($record->enable)) {
$result[] = $record;
}
if (!$active) {
$result[] = $record;
}
}
}
return $result;
}
/**
* Get the record from the database.
*
* @param number $serviceid
* @return object
*/
function local_webhooks_get_record($serviceid) {
global $DB;
$servicerecord = $DB->get_record("local_webhooks_service", array("id" => $serviceid), "*", MUST_EXIST);
if (!empty($servicerecord->events)) {
$servicerecord->events = local_webhooks_deserialization_data($servicerecord->events);
}
return $servicerecord;
}
/**
* Get all records from the database.
*
* @param number $limitfrom
* @param number $limitnum
* @return array
*/
function local_webhooks_get_list_records($limitfrom = 0, $limitnum = 0) {
global $DB;
$listrecords = $DB->get_records("local_webhooks_service", null, "id", "*", $limitfrom, $limitnum);
foreach ($listrecords as $servicerecord) {
if (!empty($servicerecord->events)) {
$servicerecord->events = local_webhooks_deserialization_data($servicerecord->events);
}
}
return $listrecords;
}
/**
* Get a list of all system events.
*
* @return array
*/
function local_webhooks_get_list_events() {
return report_eventlist_list_generator::get_all_events_list(true);
}
/**
* Create an entry in the database.
*
* @param object $record
* @return boolean
*/
function local_webhooks_create_record($record) {
global $DB;
if (!empty($record->events)) {
$record->events = local_webhooks_serialization_data($record->events);
}
$result = $DB->insert_record("local_webhooks_service", $record, true, false);
/* Clear the plugin cache */
local_webhooks_cache_reset();
/* Event notification */
local_webhooks_events::service_added($result);
return boolval($result);
}
/**
* Update the record in the database.
*
* @param object $data
* @return boolean
*/
function local_webhooks_update_record($record) {
global $DB;
if (empty($record->id)) {
print_error("missingparam", "error", null, "id");
}
$record->events = !empty($record->events) ? local_webhooks_serialization_data($record->events) : null;
$result = $DB->update_record("local_webhooks_service", $record, false);
/* Clear the plugin cache */
local_webhooks_cache_reset();
/* Event notification */
local_webhooks_events::service_updated($record->id);
return boolval($result);
}
/**
* Delete the record from the database.
*
* @param number $serviceid
* @return boolean
*/
function local_webhooks_delete_record($serviceid) {
global $DB;
$result = $DB->delete_records("local_webhooks_service", array("id" => $serviceid));
/* Clear the plugin cache */
local_webhooks_cache_reset();
/* Event notification */
local_webhooks_events::service_deleted($serviceid);
return boolval($result);
}
/**
* Delete all records from the database.
*
* @return boolean
*/
function local_webhooks_delete_all_records() {
global $DB;
$result = $DB->delete_records("local_webhooks_service", null);
/* Clear the plugin cache */
local_webhooks_cache_reset();
/* Event notification */
local_webhooks_events::service_deletedall();
return boolval($result);
}
/**
* Create a backup.
*
* @return string
*/
function local_webhooks_create_backup() {
$listrecords = local_webhooks_get_list_records();
$result = local_webhooks_serialization_data($listrecords);
/* Event notification */
local_webhooks_events::backup_performed();
return $result;
}
/**
* Restore from a backup.
*
* @param string $data
*/
function local_webhooks_restore_backup($data, $deleterecords = false) {
$listrecords = local_webhooks_deserialization_data($data);
if (boolval($deleterecords)) {
local_webhooks_delete_all_records();
}
foreach ($listrecords as $servicerecord) {
local_webhooks_create_record($servicerecord);
}
/* Event notification */
local_webhooks_events::backup_restored();
}
/**
* Send the event remotely to the service.
*
* @param array $event
* @param object $callback
* @return array
*/
function local_webhooks_send_request($event, $callback) {
global $CFG;
$event["host"] = parse_url($CFG->wwwroot)["host"];
$event["token"] = $callback->token;
$event["extra"] = $callback->other;
$curl = new curl();
$curl->setHeader(array("Content-Type: application/" . $callback->type));
$curl->post($callback->url, json_encode($event));
$response = $curl->getResponse();
/* Event notification */
local_webhooks_events::response_answer($callback->id, $response);
return $response;
}

175
locallib.php Normal file
View File

@ -0,0 +1,175 @@
<?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/>.
/**
* Classes of modules.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined("MOODLE_INTERNAL") || die();
/**
* Get data from the cache by key.
*
* @param string $eventname
* @return array
*/
function local_webhooks_cache_get($eventname) {
$cache = cache::make("local_webhooks", "webhooks_services");
return $cache->get($eventname);
}
/**
* Update the data in the cache by key.
*
* @param string $eventname
* @param array $recordlist
* @return boolean
*/
function local_webhooks_cache_set($eventname, $recordlist = array()) {
$cache = cache::make("local_webhooks", "webhooks_services");
return $cache->set($eventname, $recordlist);
}
/**
* Delete the data in the cache by key.
*
* @param string $eventname
* @return boolean
*/
function local_webhooks_cache_delete($eventname) {
$cache = cache::make("local_webhooks", "webhooks_services");
return $cache->delete($eventname);
}
/**
* Clear the cache of the plugin.
*
* @return boolean
*/
function local_webhooks_cache_reset() {
$cache = cache::make("local_webhooks", "webhooks_services");
return $cache->purge();
}
/**
* Data serialization.
*
* @param array|object $data
* @return string
*/
function local_webhooks_serialization_data($data) {
return serialize($data);
}
/**
* Data deserialization.
*
* @param string $data
* @return array|object
*/
function local_webhooks_deserialization_data($data) {
return unserialize($data);
}
/**
* Description of functions of the call of events
*
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class local_webhooks_events {
/**
* Call the event when creating a backup.
*/
public static function backup_performed() {
$context = context_system::instance();
$event = local_webhooks\event\backup_performed::create(array("context" => $context, "objectid" => 0));
$event->trigger();
}
/**
* Call the event when restoring from a backup.
*/
public static function backup_restored() {
$context = context_system::instance();
$event = local_webhooks\event\backup_restored::create(array("context" => $context, "objectid" => 0));
$event->trigger();
}
/**
* Call event when the response is received from the service
*
* @param number $objectid Service ID
* @param array $response Server response
*/
public static function response_answer($objectid = 0, $response = array()) {
$context = context_system::instance();
$status = "Error sending request";
if (!empty($response["HTTP/1.1"])) {
$status = $response["HTTP/1.1"];
}
$event = local_webhooks\event\response_answer::create(array("context" => $context, "objectid" => $objectid, "other" => array("status" => $status)));
$event->trigger();
}
/**
* Call the event when the service is added.
*
* @param number $objectid Service ID
*/
public static function service_added($objectid = 0) {
$context = context_system::instance();
$event = local_webhooks\event\service_added::create(array("context" => $context, "objectid" => $objectid));
$event->trigger();
}
/**
* Call the event when the service is deleted.
*
* @param number $objectid Service ID
*/
public static function service_deleted($objectid = 0) {
$context = context_system::instance();
$event = local_webhooks\event\service_deleted::create(array("context" => $context, "objectid" => $objectid));
$event->trigger();
}
/**
* Call the event when all services are deleted.
*/
public static function service_deletedall() {
$context = context_system::instance();
$event = local_webhooks\event\service_deletedall::create(array("context" => $context, "objectid" => 0));
$event->trigger();
}
/**
* Call event when the service is updated.
*
* @param number $objectid Service ID
*/
public static function service_updated($objectid = 0) {
$context = context_system::instance();
$event = local_webhooks\event\service_updated::create(array("context" => $context, "objectid" => $objectid));
$event->trigger();
}
}

View File

@ -1,105 +0,0 @@
<?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/>.
/**
* Service Management Manager.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . "/../../config.php");
require_once($CFG->libdir . "/tablelib.php");
$deleteservice = optional_param("deleteservice", 0, PARAM_INT);
require_login();
/* Link generation */
$managerservice = "/local/webhooks/managerservice.php";
$editservice = "/local/webhooks/editservice.php";
$baseurl = new moodle_url($managerservice);
$PAGE->set_url($baseurl);
/* Configure the context of the page */
$context = context_system::instance();
$PAGE->set_context($context);
/* Delete the service */
if ($deleteservice && confirm_sesskey()) {
$DB->delete_records("local_webhooks_service", array("id" => $deleteservice));
redirect($PAGE->url, new lang_string("deleted", "moodle"));
}
/* Retrieving a list of services */
$select = null;
$callbacks = $DB->get_records_select("local_webhooks_service", $select, null, $DB->sql_order_by_text("id"));
/* Page template */
$titlepage = new lang_string("managerservice", "local_webhooks");
$PAGE->set_pagelayout("standard");
$PAGE->set_title($titlepage);
$PAGE->set_heading($titlepage);
/* The page title */
$PAGE->navbar->add(new lang_string("localplugins", "moodle"));
$PAGE->navbar->add(new lang_string("pluginname", "local_webhooks"));
$PAGE->navbar->add($titlepage, $baseurl);
echo $OUTPUT->header();
/* Table declaration */
$table = new flexible_table("callbacks-table");
/* Customize the table */
$table->define_columns(array("title", "url", "actions"));
$table->define_headers(array(
new lang_string("name", "moodle"),
new lang_string("url", "moodle"),
new lang_string("actions", "moodle")));
$table->define_baseurl($baseurl);
$table->setup();
foreach ($callbacks as $callback) {
/* Filling of information columns */
$titlecallback = html_writer::div($callback->title, "title");
$urlcallback = html_writer::div($callback->url, "url");
/* Link for editing */
$editlink = new moodle_url($editservice,
array("idservice" => $callback->id));
$edititem = $OUTPUT->action_icon($editlink,
new pix_icon("t/edit", get_string("edit")));
/* Link to remove */
$deletelink = new moodle_url($managerservice,
array("deleteservice" => $callback->id, "sesskey" => sesskey()));
$deleteitem = $OUTPUT->action_icon($deletelink,
new pix_icon("t/delete", get_string("delete")));
/* Adding data to the table */
$table->add_data(array($titlecallback, $urlcallback, $edititem . $deleteitem));
}
/* Display the table */
$table->print_html();
/* Add service button */
$addurl = new moodle_url("/local/webhooks/editservice.php");
echo $OUTPUT->single_button($addurl,
new lang_string("addaservice", "webservice"), "get");
echo $OUTPUT->footer();

65
restorebackup.php Normal file
View File

@ -0,0 +1,65 @@
<?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/>.
/**
* Restore the settings page.
*
* @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . "/../../config.php");
require_once(__DIR__ . "/classes/service_form.php");
require_once(__DIR__ . "/lib.php");
require_once($CFG->libdir . "/adminlib.php");
/* Link generation */
$baseurl = new moodle_url("/local/webhooks/restorebackup.php");
$managerservice = new moodle_url("/local/webhooks/index.php");
/* Configure the context of the page */
admin_externalpage_setup("local_webhooks", "", null, $baseurl, array());
$context = context_system::instance();
/* Create an editing form */
$mform = new service_backup_form($PAGE->url);
/* Cancel processing */
if ($mform->is_cancelled()) {
redirect($managerservice);
}
/* Processing the received file */
if (($data = $mform->get_data()) && confirm_sesskey()) {
$content = $mform->get_file_content("backupfile");
local_webhooks_restore_backup($content, $data->deleterecords);
redirect($managerservice, new lang_string("restorefinished", "moodle"));
}
/* The page title */
$titlepage = new lang_string("backup", "moodle");
$PAGE->navbar->add($titlepage);
$PAGE->set_heading($titlepage);
$PAGE->set_title($titlepage);
echo $OUTPUT->header();
/* Displays the form */
$mform->display();
/* Footer */
echo $OUTPUT->footer();

View File

@ -24,22 +24,9 @@
defined("MOODLE_INTERNAL") || die();
$settings = null;
if ($hassiteconfig) {
$settings = new admin_settingpage("local_webhooks",
new lang_string("pluginname", "local_webhooks"));
$ADMIN->add("localplugins", $settings);
$settings->add(new admin_setting_configcheckbox(
"local_webhooks/enable",
new lang_string("enable", "moodle"),
new lang_string("enablews", "webservice"),
false));
/* Link to the service manager */
$linktext = new lang_string("managerservice", "local_webhooks");
$linkurl = new moodle_url("/local/webhooks/managerservice.php");
$settings->add(new admin_setting_heading("local_webhooks_managerservice", null,
html_writer::link($linkurl, $linktext)));
$ADMIN->add("server", new admin_externalpage("local_webhooks",
new lang_string("pluginname", "local_webhooks"),
new moodle_url("/local/webhooks/index.php")
));
}

View File

@ -23,8 +23,10 @@
*/
defined("MOODLE_INTERNAL") || die();
$plugin->release = "0.4.0 (Build: 2017102620)";
$plugin->version = 2017102620;
$plugin->requires = 2016112900;
$plugin->component = "local_webhooks";
$plugin->maturity = MATURITY_BETA;
$plugin->release = "4.0.0-rc.2 (Build: 2018022500)";
$plugin->version = 2018022500;
$plugin->requires = 2016112900;
$plugin->component = "local_webhooks";
$plugin->maturity = MATURITY_RC;
$plugin->dependencies = array("report_eventlist" => 2016120500);