Listener::fireCallback()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 6
cts 6
cp 1
rs 10
c 0
b 0
f 0
cc 3
nc 4
nop 4
crap 3
1
<?php
2
3
namespace AmoCRM\Webhooks;
4
5
use AmoCRM\Exception;
6
7
/**
8
 * Class Listener
9
 *
10
 * Назначения и вызов callback при уведомлениях.
11
 *
12
 * Webhooks – это уведомление сторонних приложений посредством отправки уведомлений о событиях,
13
 * произошедших в amoCRM. Вы можете настроить HTTP адреса ваших приложений и связанные с ними
14
 * рабочие правила в настройках своего аккаунта, в разделе «API».
15
 *
16
 * @package AmoCRM\Webhooks
17
 * @author dotzero <[email protected]>
18
 * @link http://www.dotzero.ru/
19
 * @link https://github.com/dotzero/amocrm-php
20
 *
21
 * For the full copyright and license information, please view the LICENSE
22
 * file that was distributed with this source code.
23
 */
24
class Listener
25
{
26
    /**
27
     * @var array Список callback функций
28
     */
29
    private $hooks = [];
30
31
    /**
32
     * @var array Список всех доступных событий
33
     */
34
    public $events_list = [
35
        'add_lead', // Добавить сделку
36
        'add_contact', // Добавить контакт
37
        'add_company', // Добавить компанию
38
        'add_customer', // Добавить покупателя
39
        'add_task', // Добавить покупателя
40
        'update_lead', // Изменить сделку
41
        'update_contact', // Изменить контакт
42
        'update_company', // Изменить компанию
43
        'update_customer', // Изменить покупателя
44
        'update_task', // Изменить покупателя
45
        'delete_lead', // Удалить сделку
46
        'delete_contact', // Удалить контакт
47
        'delete_company', // Удалить компанию
48
        'delete_customer', // Удалить покупателя
49
        'delete_task', // Удалить задачу
50
        'status_lead', // Смена статуса сделки
51
        'responsible_lead', // Смена отв-го сделки
52
        'restore_contact', // Восстановить контакт
53
        'restore_company', // Восстановить компанию
54
        'restore_lead', // Восстановить сделку
55
        'note_lead', // Примечание в сделке
56
        'note_contact', // Примечание в контакте
57
        'note_company', // Примечание в компании
58
        'note_customer', // Примечание в покупателе
59
    ];
60
61
    /**
62
     * Добавление события на уведомление в список событий
63
     *
64
     * @param string|array $events Код события или массив событий
65
     * @param callback|callable $callback Callback-функция
66
     * @return $this
67
     * @throws Exception
68
     */
69 13
    public function on($events, $callback)
70
    {
71 13
        if (!is_array($events)) {
72 13
            $events = [$events];
73 13
        }
74
75 13
        if (!is_callable($callback, true)) {
76
            throw new Exception('Callback must be callable');
77
        }
78
79 13
        foreach ($events as $event) {
80 13
            if (!in_array($event, $this->events_list)) {
81
                throw new Exception('Invalid event name');
82
            }
83
84 13
            if (!isset($this->hooks[$event])) {
85 13
                $this->hooks[$event] = [];
86 13
            }
87
88 13
            $this->hooks[$event][] = $callback;
89 13
        }
90
91 13
        return $this;
92
    }
93
94
    /**
95
     * Вызов обработчика уведомлений
96
     *
97
     * @return bool
98
     */
99 13
    public function listen()
100
    {
101 13
        if (!isset($_POST['account']['subdomain']) || empty($this->hooks)) {
102
            return false;
103
        }
104
105 13
        $post = $_POST;
106 13
        $domain = $post['account']['subdomain'];
107 13
        unset($post['account']);
108
109 13
        foreach ($post as $entityName => $entityData) {
110 13
            foreach ($entityData as $actionName => $actionData) {
111 13
                foreach ($actionData as $data) {
112 13
                    $type = $entityName;
113
                    switch ($entityName) {
114 13
                        case 'contacts':
115 8
                            $type = $data['type'];
116 8
                            break;
117 5
                        case 'leads':
118 5
                            $type = 'lead';
119 5
                            break;
120
                    }
121
122 13
                    $callback = $actionName . '_' . $type;
123 13
                    $id = isset($data['id']) ? $data['id'] : null;
124
125 13
                    $this->fireCallback($callback, $domain, $id, $data);
126 13
                }
127 13
            }
128 13
        }
129
130 13
        return true;
131
    }
132
133
    /**
134
     * Очистка списка событий
135
     *
136
     * @return $this
137
     */
138 13
    public function clean()
139
    {
140 13
        $this->hooks = [];
141
142 13
        return $this;
143
    }
144
145
    /**
146
     * Вызов Callback-функции на уведомление
147
     *
148
     * @param string $name Код события
149
     * @param string $domain Поддомен amoCRM
150
     * @param int $id Id объекта связанного с уведомлением
151
     * @param array $data Поля возвращаемые уведомлением
152
     */
153 13
    private function fireCallback($name, $domain, $id, $data)
154
    {
155 13
        $callbacks = isset($this->hooks[$name]) ? $this->hooks[$name] : [];
156
157 13
        foreach ($callbacks AS $callback) {
158 13
            call_user_func($callback, $domain, $id, $data);
159 13
        }
160 13
    }
161
}
162