Completed
Push — master ( 43695e...e3b460 )
by dotzero
27:31
created

Webhooks   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 77
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 14
c 1
b 0
f 1
lcom 1
cbo 1
dl 0
loc 77
rs 10
ccs 34
cts 34
cp 1

3 Methods

Rating   Name   Duplication   Size   Complexity  
B on() 0 18 5
B listen() 0 21 6
A fireCallback() 0 8 3
1
<?php
2
3
namespace AmoCRM;
4
5
/**
6
 * Class Webhooks
7
 *
8
 * Класс для добавление и вызова WebHooks
9
 *
10
 * WebHooks – это уведомление сторонних приложений посредством отправки уведомлений о событиях,
11
 * произошедших в amoCRM. Вы можете настроить HTTP адреса ваших приложений и связанные с ними
12
 * рабочие правила в настройках своего аккаунта, в разделе «API».
13
 *
14
 * @package AmoCRM
15
 * @version 0.1.0
16
 * @author dotzero <[email protected]>
17
 * @link http://www.dotzero.ru/
18
 * @link https://github.com/dotzero/amocrm-php
19
 *
20
 * For the full copyright and license information, please view the LICENSE
21
 * file that was distributed with this source code.
22
 */
23
class Webhooks
24
{
25
    /**
26
     * @var array Список callback функций
27
     */
28
    private $hooks = [];
29
30
    /**
31
     * Добавление события на уведомление в список событий
32
     *
33
     * @param string $events Код события
34
     * @param callback $callback Callback-функция
35
     * @throws Exception
36
     */
37 4
    public function on($events, $callback)
38
    {
39 4
        if (!is_array($events)) {
40 4
            $events = [$events];
41 4
        }
42
43 4
        if (!is_callable($callback, true)) {
44 1
            throw new Exception('Callback must be callable');
45
        }
46
47 3
        foreach ($events as $event) {
48 3
            if (!isset($this->hooks[$event])) {
49 3
                $this->hooks[$event] = [];
50 3
            }
51
52 3
            $this->hooks[$event][] = $callback;
53 3
        }
54 3
    }
55
56
    /**
57
     * Вызов обработчика уведомлений
58
     *
59
     * @return bool
60
     */
61 2
    public function listen()
0 ignored issues
show
Coding Style introduced by
listen uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
62
    {
63 2
        if (!isset($_POST['account']['subdomain'])) {
64 1
            return false;
65
        }
66
67 2
        $post = $_POST;
68 2
        $domain = $post['account']['subdomain'];
69 2
        unset($post['account']);
70
71 2
        foreach ($post AS $entityName => $entityData) {
72 2
            foreach ($entityData AS $actionName => $actionData) {
73 2
                $data = $actionData[0];
74 2
                $callback = (isset($data['type']) && $data['type'] == 'company') ? 'companies' : $entityName;
75 2
                $callback .= '-' . $actionName;
76 2
                $this->fireCallback($callback, $domain, $data['id'], $data);
77 2
            }
78 2
        }
79
80 2
        return true;
81
    }
82
83
    /**
84
     * Вызов Callback-функции на уведомление
85
     *
86
     * @param string $name Код события
87
     * @param string $domain Поддомен amoCRM
88
     * @param int $id Id объекта связаного с уведомленим
89
     * @param array $data Поля возвращаемые уведомлением
90
     */
91 2
    private function fireCallback($name, $domain, $id, $data)
92
    {
93 2
        $callbacks = isset($this->hooks[$name]) ? $this->hooks[$name] : [];
94
95 2
        foreach ($callbacks AS $callback) {
96 2
            call_user_func($callback, $domain, $id, $data);
97 2
        }
98 2
    }
99
}
100