aboutsummaryrefslogtreecommitdiff
path: root/classes/task/notify.php
blob: bd11f2495c23850e7e95525dcf4d5963380bcb40 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

namespace local_webhooks\task;

defined('MOODLE_INTERNAL') || die();

global $CFG;

require_once($CFG->dirroot . '/local/webhooks/classes/local/api.php');

use core\task\adhoc_task;
use curl;
use local_webhooks\local\api;
use local_webhooks\local\record;
use function defined;
use function is_object;
use function is_string;

/**
 * Class for processing events.
 *
 * @package local_webhooks\task
 */
final class notify extends adhoc_task {
    /**
     * Debug information.
     *
     * @var array
     */
    public $debug;

    /**
     * Process an event.
     *
     * @throws \dml_exception
     */
    public function execute() {
        $event = $this->get_custom_data();

        if (!is_object($event) || !isset($event->eventname) || !is_string($event->eventname)) {
            return;
        }

        foreach (api::get_services_by_event($event->eventname) as $service) {
            if (!is_object($service)) {
                continue;
            }

            if (!$service->status) {
                continue;
            }

            $this->post($service, array_merge((array) $event, [
                'token' => $service->token,
            ]));
        }
    }

    /**
     * Send a request for the service.
     *
     * @param \local_webhooks\local\record $service
     * @param array                        $data
     */
    public function post(record $service, array $data) {
        $curl = new curl();
        $curl->setHeader(['Content-Type: ' . $service->header]);
        $curl->post($service->point, json_encode($data));

        if (defined('PHPUNIT_TEST') && PHPUNIT_TEST) {
            $this->debug = array_merge($this->debug ?? [], [
                compact('data', 'service'),
            ]);
        }
    }
}