Compare commits

..

2 Commits

Author SHA1 Message Date
f9772b1fb9
Fix check MOODLE_INTERNAL
Signed-off-by: Valentin Popov <info@valentineus.link>
2018-06-19 22:22:45 +04:00
3fa97bad31
Fix error install.xml
Signed-off-by: Valentin Popov <info@valentineus.link>
2018-06-19 19:49:00 +04:00
30 changed files with 345 additions and 1553 deletions

View File

@ -1,17 +0,0 @@
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

@ -1,25 +1,38 @@
language: php language: php
sudo: true
sudo: false addons:
firefox: "latest-esr"
postgresql: "9.6"
apt:
packages:
- "oracle-java8-installer"
- "oracle-java8-set-default"
os: "linux" cache:
directories:
- "$HOME/.composer/cache"
- "$HOME/.npm"
php: php:
- 5.6 - 7.0
- 7.1
- 7.2 - 7.2
env: env:
- DB=pgsql MOODLE_BRANCH=MOODLE_32_STABLE global:
- DB=pgsql MOODLE_BRANCH=MOODLE_33_STABLE - MOODLE_BRANCH=MOODLE_35_STABLE
- DB=pgsql MOODLE_BRANCH=MOODLE_34_STABLE matrix:
- DB=mysqli MOODLE_BRANCH=MOODLE_32_STABLE - DB=mysqli
- DB=mysqli MOODLE_BRANCH=MOODLE_33_STABLE - DB=pgsql
- DB=mysqli MOODLE_BRANCH=MOODLE_34_STABLE
before_install: before_install:
- phpenv config-rm xdebug.ini
- nvm install 8.9
- nvm use 8.9
- cd ../.. - cd ../..
- composer selfupdate - composer selfupdate
- composer create-project -n --no-dev moodlerooms/moodle-plugin-ci ci ^1 - composer create-project -n --no-dev --prefer-dist moodlerooms/moodle-plugin-ci ci ^2
- export PATH="$(cd ci/bin; pwd):$(cd ci/vendor/bin; pwd):$PATH" - export PATH="$(cd ci/bin; pwd):$(cd ci/vendor/bin; pwd):$PATH"
install: install:
@ -30,31 +43,34 @@ script:
- moodle-plugin-ci phpcpd - moodle-plugin-ci phpcpd
- moodle-plugin-ci phpmd - moodle-plugin-ci phpmd
- moodle-plugin-ci codechecker - moodle-plugin-ci codechecker
- moodle-plugin-ci csslint - moodle-plugin-ci validate
- moodle-plugin-ci shifter - moodle-plugin-ci savepoints
- moodle-plugin-ci jshint - moodle-plugin-ci mustache
- moodle-plugin-ci grunt
- moodle-plugin-ci phpunit - moodle-plugin-ci phpunit
- moodle-plugin-ci behat - moodle-plugin-ci behat
jobs: jobs:
include: include:
stage: deploy - stage: test old
env: DB=mysqli MOODLE_BRANCH=MOODLE_33_STABLE
php: 5.6
env: - stage: deploy
- DB=mysqli MOODLE_BRANCH=MOODLE_34_STABLE php: 7.2
php: 7.2 before_deploy:
- cd "$TRAVIS_REPO_SLUG"
- git stash --all
- /bin/sh build.sh
before_deploy: deploy:
- cd $TRAVIS_REPO_SLUG api_key: $GITHUB_PROJECT_TOKEN
- git stash --all email: "info@valentineus.link"
- /bin/sh build.sh file: "../build/*.zip"
file_glob: true
provider: releases
skip_cleanup: true
deploy: on:
provider: releases tags: true
skip_cleanup: true
file: "../local_webhooks.zip"
email: "info@valentineus.link"
api_key: $GITHUB_PROJECT_TOKEN
on:
tags: true

View File

@ -1,5 +1,8 @@
# Moodle WebHook's # Moodle WebHook's
[![GitHub Release](https://img.shields.io/github/release/valentineus/moodle-webhooks.svg)](https://github.com/valentineus/moodle-webhooks/releases) [![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/moodle-webhooks)
Adding Webhooks to Moodle. Adding Webhooks to Moodle.
The Webhooks feature allows applications to receive real-time notification of changes to certain data. The Webhooks feature allows applications to receive real-time notification of changes to certain data.
@ -17,11 +20,27 @@ Features:
* Use a secret phrase to authenticate requests; * Use a secret phrase to authenticate requests;
* [JSON](https://en.wikipedia.org/wiki/JSON) - Format of outgoing data; * [JSON](https://en.wikipedia.org/wiki/JSON) - Format of outgoing data;
## Documentation ## Installation
* [Install the plugin](docs/getting-started.md#installation). Get the installation package in any of the available methods:
* [User guide](docs/getting-started.md#user-guide).
* [Request format](docs/getting-started.md#request-format). * [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
```
## License ## License

View File

@ -1,21 +1,32 @@
#!/bin/sh #!/bin/sh
# Author: Valentin Popov # Author: Valentin Popov
# Email: info@valentineus.link # Email: info@valentineus.link
# Date: 2017-10-19 # Date: 2018-06-19
# Usage: /bin/sh build.sh # Usage: /bin/sh ./build.sh
# Description: Build the final package for installation in Moodle. # Description: Build the final package for installation in Moodle.
# Updating the Environment # Updating the Environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
export PATH="$PATH:/usr/local/scripts" export PATH="$PATH:/usr/local/scripts"
# Build the package # Current project
cd .. PROJECT="local_webhooks"
mv "./moodle-webhooks" "./local_webhooks"
zip -9 -r "local_webhooks.zip" "local_webhooks" \ # Defining directories
-x "local_webhooks/.git*" \ DIRECTORY="$(pwd)"
-x "local_webhooks/.travis.yml" \ NAMEDIR="$(basename $DIRECTORY)"
-x "local_webhooks/build.sh" TMPDIR="$(mktemp --directory)"
# Creating a Temporary Directory
cp --recursive --verbose "../$NAMEDIR" "$TMPDIR/$PROJECT"
mkdir --parents --verbose "$DIRECTORY/build"
cd "$TMPDIR"
# Creating an archive
zip -9 -r "$DIRECTORY/build/$PROJECT.zip" "$PROJECT" \
-x "$PROJECT/.git*" \
-x "$PROJECT/.travis.yml" \
-x "$PROJECT/build*"
# End of work # End of work
exit 0 exit 0

View File

@ -24,7 +24,7 @@
namespace local_webhooks\event; namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
/** /**
* Defines how to work with events. * Defines how to work with events.

View File

@ -24,7 +24,7 @@
namespace local_webhooks\event; namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
/** /**
* Defines how to work with events. * Defines how to work with events.

View File

@ -24,7 +24,7 @@
namespace local_webhooks\event; namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
/** /**
* Defines how to work with events. * Defines how to work with events.

View File

@ -24,7 +24,7 @@
namespace local_webhooks\event; namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
/** /**
* Defines how to work with events. * Defines how to work with events.

View File

@ -24,7 +24,7 @@
namespace local_webhooks\event; namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
/** /**
* Defines how to work with events. * Defines how to work with events.

View File

@ -1,65 +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/>.
/**
* 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

@ -24,7 +24,7 @@
namespace local_webhooks\event; namespace local_webhooks\event;
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
/** /**
* Defines how to work with events. * Defines how to work with events.

View File

@ -24,13 +24,15 @@
namespace local_webhooks; namespace local_webhooks;
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . "/../locallib.php");
require_once(__DIR__ . "/../lib.php"); require_once(__DIR__ . "/../lib.php");
require_once(__DIR__ . "/../locallib.php");
require_once($CFG->libdir . "/filelib.php");
/** /**
* Defines event handlers. * Defines how to work with events.
* *
* @copyright 2017 "Valentin Popov" <info@valentineus.link> * @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@ -44,13 +46,48 @@ class handler {
public static function events($event) { public static function events($event) {
$data = $event->get_data(); $data = $event->get_data();
if (!is_array($recordlist = local_webhooks_cache_get($data["eventname"]))) { if ($callbacks = local_webhooks_get_list_records()) {
$recordlist = local_webhooks_search_services_by_event($data["eventname"], true); foreach ($callbacks as $callback) {
local_webhooks_cache_set($data["eventname"], $recordlist); self::handler_callback($data, $callback);
} }
foreach ($recordlist as $record) {
local_webhooks_send_request($data, $record);
} }
} }
/**
* Processes each callback.
*
* @param array $data
* @param object $callback
*/
private static function handler_callback($data, $callback) {
global $CFG;
if (boolval($callback->enable)) {
if (!empty($callback->events[$data["eventname"]])) {
$urlparse = parse_url($CFG->wwwroot);
$data["host"] = $urlparse['host'];
$data["token"] = $callback->token;
$data["extra"] = $callback->other;
self::send($data, $callback);
}
}
}
/**
* Sending data to the node.
*
* @param array $data
* @param object $callback
*/
private static function send($data, $callback) {
$curl = new \curl();
$curl->setHeader(array("Content-Type: application/" . $callback->type));
$curl->post($callback->url, json_encode($data));
$response = $curl->getResponse();
\local_webhooks_events::response_answer($callback->id, $response);
return $response;
}
} }

View File

@ -22,9 +22,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/ */
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . "/../lib.php");
require_once($CFG->libdir . "/formslib.php"); require_once($CFG->libdir . "/formslib.php");
@ -86,7 +84,7 @@ class service_edit_form extends moodleform {
$mform->addElement("header", "editserviceheaderevent", new lang_string("edulevel", "moodle")); $mform->addElement("header", "editserviceheaderevent", new lang_string("edulevel", "moodle"));
/* List of events */ /* List of events */
$eventlist = local_webhooks_get_list_events(); $eventlist = report_eventlist_list_generator::get_all_events_list(true);
$events = array(); $events = array();
/* Formation of the list of elements */ /* Formation of the list of elements */
@ -127,11 +125,6 @@ class service_backup_form extends moodleform {
/* Form heading */ /* Form heading */
$mform->addElement("header", "editserviceheader", new lang_string("restore", "moodle")); $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 */ /* Download the file */
$mform->addElement("filepicker", "backupfile", new lang_string("file", "moodle")); $mform->addElement("filepicker", "backupfile", new lang_string("file", "moodle"));
$mform->addRule("backupfile", null, "required"); $mform->addRule("backupfile", null, "required");

View File

@ -1,145 +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/>.
/**
* 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

@ -1,31 +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/>.
/**
* 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
*/
$definitions = array(
"webhooks_services" => array(
"mode" => cache_store::MODE_APPLICATION,
"requiredataguarantee" => true,
"staticacceleration" => true
)
);

View File

@ -22,7 +22,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/ */
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
$observers = array( $observers = array(
array( array(

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<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"> <XMLDB PATH="local/webhooks/db" VERSION="2018061900" COMMENT="XMLDB file for Moodle" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd">
<TABLES> <TABLES>
<TABLE NAME="local_webhooks_service" COMMENT="A table for storing callback services."> <TABLE NAME="local_webhooks_service" COMMENT="A table for storing callback services.">
<FIELDS> <FIELDS>

View File

@ -1,115 +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/>.
/**
* 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

@ -1,52 +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/>.
/**
* 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
*/
defined("MOODLE_INTERNAL") || die();
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");
}
return true;
}

View File

@ -1,111 +0,0 @@
# 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.

Before

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

View File

@ -56,15 +56,15 @@ if ($editing = boolval($serviceid)) {
} }
/* Processing of received data */ /* Processing of received data */
if (($data = $mform->get_data()) && confirm_sesskey()) { if ($data = $mform->get_data()) {
if ($editing) { if ($editing) {
$data->id = $serviceid; $data->id = $serviceid;
local_webhooks_update_record($data); local_webhooks_update_record($data, false);
redirect($managerservice, new lang_string("eventwebserviceserviceupdated", "webservice"));
} else { } else {
local_webhooks_create_record($data); local_webhooks_update_record($data, true);
redirect($managerservice, new lang_string("eventwebserviceservicecreated", "webservice"));
} }
redirect($managerservice, new lang_string("changessaved", "moodle"));
} }
/* The page title */ /* The page title */
@ -77,5 +77,4 @@ echo $OUTPUT->header();
/* Displays the form */ /* Displays the form */
$mform->display(); $mform->display();
/* Footer */
echo $OUTPUT->footer(); echo $OUTPUT->footer();

View File

@ -1,643 +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/>.
/**
* 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;
}
}

View File

@ -23,14 +23,13 @@
*/ */
require_once(__DIR__ . "/../../config.php"); require_once(__DIR__ . "/../../config.php");
require_once(__DIR__ . "/classes/webhooks_table.php");
require_once(__DIR__ . "/lib.php"); require_once(__DIR__ . "/lib.php");
require_once($CFG->libdir . "/adminlib.php"); require_once($CFG->libdir . "/adminlib.php");
require_once($CFG->libdir . "/tablelib.php");
/* Optional parameters */ /* Optional parameters */
$backupservices = optional_param("getbackup", 0, PARAM_BOOL); $backupservices = optional_param("getbackup", 0, PARAM_BOOL);
$deleteall = optional_param("deleteall", 0, PARAM_INT);
$deleteid = optional_param("deleteid", 0, PARAM_INT); $deleteid = optional_param("deleteid", 0, PARAM_INT);
$hideshowid = optional_param("hideshowid", 0, PARAM_INT); $hideshowid = optional_param("hideshowid", 0, PARAM_INT);
@ -45,22 +44,13 @@ admin_externalpage_setup("local_webhooks", "", null, $baseurl, array());
$context = context_system::instance(); $context = context_system::instance();
/* Delete the service */ /* Delete the service */
if (!empty($deleteid) && confirm_sesskey()) { if (boolval($deleteid)) {
local_webhooks_delete_record($deleteid); local_webhooks_remove_record($deleteid);
redirect($PAGE->url, new lang_string("deleted", "moodle")); redirect($PAGE->url, new lang_string("eventwebserviceservicedeleted", "webservice"));
} }
/* Switching the status of the service */ /* Retrieving a list of services */
if (!empty($hideshowid) && confirm_sesskey()) { $callbacks = local_webhooks_get_list_records();
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 */ /* Upload settings as a file */
if (boolval($backupservices)) { if (boolval($backupservices)) {
@ -69,32 +59,74 @@ if (boolval($backupservices)) {
send_file($filecontent, $filename, 0, 0, true, true); send_file($filecontent, $filename, 0, 0, true, true);
} }
/* Switching the status of the service */
if (boolval($hideshowid)) {
$callback = $callbacks[$hideshowid];
if (!empty($callback)) {
$callback->enable = !boolval($callback->enable);
local_webhooks_update_record($callback, false);
redirect($PAGE->url, new lang_string("eventwebserviceserviceupdated", "webservice"));
}
}
/* The page title */ /* The page title */
$titlepage = new lang_string("pluginname", "local_webhooks"); $titlepage = new lang_string("pluginname", "local_webhooks");
$PAGE->set_heading($titlepage); $PAGE->set_heading($titlepage);
$PAGE->set_title($titlepage); $PAGE->set_title($titlepage);
echo $OUTPUT->header(); echo $OUTPUT->header();
/* Adds the add button */ /* Table declaration */
$addserviceurl = new moodle_url($editservice, array("sesskey" => sesskey())); $table = new flexible_table("webhooks-service-table");
echo $OUTPUT->single_button($addserviceurl, new lang_string("add", "moodle"));
/* Adds a delete button */ /* Customize the table */
$deleteallurl = new moodle_url($managerservice, array("deleteall" => true, "sesskey" => sesskey())); $table->define_columns(array("title", "url", "actions"));
echo $OUTPUT->single_button($deleteallurl, new lang_string("deleteall", "moodle"), "get"); $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();
/* Adds a backup button */ foreach ($callbacks as $callback) {
/* Filling of information columns */
$titlecallback = html_writer::div($callback->title, "title");
$urlcallback = html_writer::div($callback->url, "url");
/* Defining service status */
$hideshowicon = "t/show";
$hideshowstring = new lang_string("enable", "moodle");
if (boolval($callback->enable)) {
$hideshowicon = "t/hide";
$hideshowstring = new lang_string("disable", "moodle");
}
/* Link to enable / disable the service */
$hideshowlink = new moodle_url($managerservice, array("hideshowid" => $callback->id));
$hideshowitem = $OUTPUT->action_icon($hideshowlink, new pix_icon($hideshowicon, $hideshowstring));
/* Link for editing */
$editlink = new moodle_url($editservice, array("serviceid" => $callback->id));
$edititem = $OUTPUT->action_icon($editlink, new pix_icon("t/edit", new lang_string("edit", "moodle")));
/* Link to remove */
$deletelink = new moodle_url($managerservice, array("deleteid" => $callback->id));
$deleteitem = $OUTPUT->action_icon($deletelink, new pix_icon("t/delete", new lang_string("delete", "moodle")));
/* Adding data to the table */
$table->add_data(array($titlecallback, $urlcallback, $hideshowitem . $edititem . $deleteitem));
}
/* Display the table */
$table->print_html();
/* Add service button */
$addserviceurl = new moodle_url($editservice);
echo $OUTPUT->single_button($addserviceurl, new lang_string("addaservice", "webservice"), "get");
/* Button to get a backup */
$backupurl = new moodle_url($managerservice, array("getbackup" => true)); $backupurl = new moodle_url($managerservice, array("getbackup" => true));
echo $OUTPUT->single_button($backupurl, new lang_string("backup", "moodle"), "get"); echo $OUTPUT->single_button($backupurl, new lang_string("backup", "moodle"), "get");
/* Adds a restore button */ /* Button for restoring settings */
$restorebackupurl = new moodle_url($restorebackup); $restorebackupurl = new moodle_url($restorebackup);
echo $OUTPUT->single_button($restorebackupurl, new lang_string("restore", "moodle")); echo $OUTPUT->single_button($restorebackupurl, new lang_string("restore", "moodle"), "get");
/* Displays the table */
$table = new local_webhooks_table("local-webhooks-table");
$table->define_baseurl($baseurl);
$table->out(25, true);
/* Footer */
echo $OUTPUT->footer(); echo $OUTPUT->footer();

249
lib.php
View File

@ -15,82 +15,19 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/** /**
* This file contains the functions used by the plugin. * Library code used by the service control interfaces.
* *
* @package local_webhooks * @package local_webhooks
* @copyright 2017 "Valentin Popov" <info@valentineus.link> * @copyright 2017 "Valentin Popov" <info@valentineus.link>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/ */
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . "/locallib.php"); require_once(__DIR__ . "/locallib.php");
/** /**
* Change the status of the service. * Getting a list of all services.
*
* @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 $limitfrom
* @param number $limitnum * @param number $limitnum
@ -99,170 +36,130 @@ function local_webhooks_get_record($serviceid) {
function local_webhooks_get_list_records($limitfrom = 0, $limitnum = 0) { function local_webhooks_get_list_records($limitfrom = 0, $limitnum = 0) {
global $DB; global $DB;
$listrecords = $DB->get_records("local_webhooks_service", null, "id", "*", $limitfrom, $limitnum); $listservices = $DB->get_records("local_webhooks_service", null, "id", "*", $limitfrom, $limitnum);
foreach ($listrecords as $servicerecord) { foreach ($listservices as $servicerecord) {
if (!empty($servicerecord->events)) { if (!empty($servicerecord->events)) {
$servicerecord->events = local_webhooks_deserialization_data($servicerecord->events); $servicerecord->events = local_webhooks_unarchive_data($servicerecord->events);
} }
} }
return $listrecords; return $listservices;
} }
/** /**
* Get a list of all system events. * Getting information about the service.
* *
* @return array * @param number $serviceid
* @return object
*/ */
function local_webhooks_get_list_events() { function local_webhooks_get_record($serviceid = 0) {
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; global $DB;
if (!empty($record->events)) { $servicerecord = $DB->get_record("local_webhooks_service", array("id" => $serviceid), "*", MUST_EXIST);
$record->events = local_webhooks_serialization_data($record->events);
if (!empty($servicerecord->events)) {
$servicerecord->events = local_webhooks_unarchive_data($servicerecord->events);
} }
$result = $DB->insert_record("local_webhooks_service", $record, true, false); return $servicerecord;
}
/* Clear the plugin cache */ /**
local_webhooks_cache_reset(); * Clear the database table.
*/
function local_webhooks_remove_list_records() {
global $DB;
/* Event notification */ $DB->delete_records("local_webhooks_service", null);
local_webhooks_events::service_added($result); }
return boolval($result); /**
* Delete the record.
*
* @param number $serviceid
*/
function local_webhooks_remove_record($serviceid = 0) {
global $DB;
$DB->delete_records("local_webhooks_service", array("id" => $serviceid));
local_webhooks_events::service_deleted($serviceid);
} }
/** /**
* Update the record in the database. * Update the record in the database.
* *
* @param object $data * @param object $data
* @param boolean $insert
* @return boolean * @return boolean
*/ */
function local_webhooks_update_record($record) { function local_webhooks_update_record($data, $insert = true) {
global $DB; global $DB;
if (empty($record->id)) { if (empty($data->events)) {
print_error("missingparam", "error", null, "id"); $data->events = array();
} }
$record->events = !empty($record->events) ? local_webhooks_serialization_data($record->events) : null; $data->events = local_webhooks_archiving_data($data->events);
$result = $DB->update_record("local_webhooks_service", $record, false);
/* Clear the plugin cache */ if (boolval($insert)) {
local_webhooks_cache_reset(); $result = $DB->insert_record("local_webhooks_service", $data, true, false);
local_webhooks_events::service_added($result);
/* Event notification */ } else {
local_webhooks_events::service_updated($record->id); $result = $DB->update_record("local_webhooks_service", $data, false);
local_webhooks_events::service_updated($data->id);
}
return boolval($result); return boolval($result);
} }
/** /**
* Delete the record from the database. * Make a backup copy of all the services.
*
* @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 * @return string
*/ */
function local_webhooks_create_backup() { function local_webhooks_create_backup() {
$listrecords = local_webhooks_get_list_records(); $listservices = local_webhooks_get_list_records();
$result = local_webhooks_serialization_data($listrecords); $listservices = local_webhooks_archiving_data($listservices);
/* Event notification */
local_webhooks_events::backup_performed(); local_webhooks_events::backup_performed();
return $listservices;
return $result;
} }
/** /**
* Restore from a backup. * Restore the data from the backup.
* *
* @param string $data * @param string $data
*/ */
function local_webhooks_restore_backup($data, $deleterecords = false) { function local_webhooks_restore_backup($listservices = "") {
$listrecords = local_webhooks_deserialization_data($data); $listservices = local_webhooks_unarchive_data($listservices);
if (boolval($deleterecords)) { local_webhooks_remove_list_records();
local_webhooks_delete_all_records();
foreach ($listservices as $servicerecord) {
local_webhooks_update_record($servicerecord, true);
} }
foreach ($listrecords as $servicerecord) {
local_webhooks_create_record($servicerecord);
}
/* Event notification */
local_webhooks_events::backup_restored(); local_webhooks_events::backup_restored();
} }
/** /**
* Send the event remotely to the service. * Compress an array into a string.
* *
* @param array $event * @param array $data
* @param object $callback * @return string
*/
function local_webhooks_archiving_data($data = array()) {
$result = base64_encode(gzcompress(serialize($data), 3));
return $result;
}
/**
* Gets an array from a compressed string.
*
* @param string $data
* @return array * @return array
*/ */
function local_webhooks_send_request($event, $callback) { function local_webhooks_unarchive_data($data = "") {
global $CFG; $result = unserialize(gzuncompress(base64_decode($data)));
return $result;
$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;
} }

View File

@ -22,71 +22,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/ */
defined("MOODLE_INTERNAL") || die(); 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 * Description of functions of the call of events
@ -100,7 +36,14 @@ class local_webhooks_events {
*/ */
public static function backup_performed() { public static function backup_performed() {
$context = context_system::instance(); $context = context_system::instance();
$event = local_webhooks\event\backup_performed::create(array("context" => $context, "objectid" => 0));
$event = local_webhooks\event\backup_performed::create(
array(
"context" => $context,
"objectid" => 0
)
);
$event->trigger(); $event->trigger();
} }
@ -109,7 +52,14 @@ class local_webhooks_events {
*/ */
public static function backup_restored() { public static function backup_restored() {
$context = context_system::instance(); $context = context_system::instance();
$event = local_webhooks\event\backup_restored::create(array("context" => $context, "objectid" => 0));
$event = local_webhooks\event\backup_restored::create(
array(
"context" => $context,
"objectid" => 0
)
);
$event->trigger(); $event->trigger();
} }
@ -121,13 +71,20 @@ class local_webhooks_events {
*/ */
public static function response_answer($objectid = 0, $response = array()) { public static function response_answer($objectid = 0, $response = array()) {
$context = context_system::instance(); $context = context_system::instance();
$status = "Error sending request";
$status = "Error sending request";
if (!empty($response["HTTP/1.1"])) { if (!empty($response["HTTP/1.1"])) {
$status = $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 = local_webhooks\event\response_answer::create(
array(
"context" => $context,
"objectid" => $objectid,
"other" => array("status" => $status)
)
);
$event->trigger(); $event->trigger();
} }
@ -138,7 +95,14 @@ class local_webhooks_events {
*/ */
public static function service_added($objectid = 0) { public static function service_added($objectid = 0) {
$context = context_system::instance(); $context = context_system::instance();
$event = local_webhooks\event\service_added::create(array("context" => $context, "objectid" => $objectid));
$event = local_webhooks\event\service_added::create(
array(
"context" => $context,
"objectid" => $objectid
)
);
$event->trigger(); $event->trigger();
} }
@ -149,16 +113,14 @@ class local_webhooks_events {
*/ */
public static function service_deleted($objectid = 0) { public static function service_deleted($objectid = 0) {
$context = context_system::instance(); $context = context_system::instance();
$event = local_webhooks\event\service_deleted::create(array("context" => $context, "objectid" => $objectid));
$event->trigger();
}
/** $event = local_webhooks\event\service_deleted::create(
* Call the event when all services are deleted. array(
*/ "context" => $context,
public static function service_deletedall() { "objectid" => $objectid
$context = context_system::instance(); )
$event = local_webhooks\event\service_deletedall::create(array("context" => $context, "objectid" => 0)); );
$event->trigger(); $event->trigger();
} }
@ -169,7 +131,14 @@ class local_webhooks_events {
*/ */
public static function service_updated($objectid = 0) { public static function service_updated($objectid = 0) {
$context = context_system::instance(); $context = context_system::instance();
$event = local_webhooks\event\service_updated::create(array("context" => $context, "objectid" => $objectid));
$event = local_webhooks\event\service_updated::create(
array(
"context" => $context,
"objectid" => $objectid
)
);
$event->trigger(); $event->trigger();
} }
} }

View File

@ -45,9 +45,9 @@ if ($mform->is_cancelled()) {
} }
/* Processing the received file */ /* Processing the received file */
if (($data = $mform->get_data()) && confirm_sesskey()) { if ($data = $mform->get_data()) {
$content = $mform->get_file_content("backupfile"); $content = $mform->get_file_content("backupfile");
local_webhooks_restore_backup($content, $data->deleterecords); local_webhooks_restore_backup($content);
redirect($managerservice, new lang_string("restorefinished", "moodle")); redirect($managerservice, new lang_string("restorefinished", "moodle"));
} }
@ -61,5 +61,4 @@ echo $OUTPUT->header();
/* Displays the form */ /* Displays the form */
$mform->display(); $mform->display();
/* Footer */
echo $OUTPUT->footer(); echo $OUTPUT->footer();

View File

@ -22,7 +22,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/ */
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
if ($hassiteconfig) { if ($hassiteconfig) {
$ADMIN->add("server", new admin_externalpage("local_webhooks", $ADMIN->add("server", new admin_externalpage("local_webhooks",

View File

@ -22,11 +22,10 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/ */
defined("MOODLE_INTERNAL") || die(); defined('MOODLE_INTERNAL') || die();
$plugin->release = "4.0.0-rc.2 (Build: 2018022500)"; $plugin->release = "3.0.1 (Build: 2018061900)";
$plugin->version = 2018022500; $plugin->version = 2018061900;
$plugin->requires = 2016112900; $plugin->requires = 2016112900;
$plugin->component = "local_webhooks"; $plugin->component = "local_webhooks";
$plugin->maturity = MATURITY_RC; $plugin->maturity = MATURITY_STABLE;
$plugin->dependencies = array("report_eventlist" => 2016120500);