public function process(): void
{
$this->collectNewData();
$events = (EventCollection::getInstance())->list();
$workgroupsPushList = [];
$workgroupEventsList = [
EventDictionary::EVENT_WORKGROUP_ADD,
EventDictionary::EVENT_WORKGROUP_BEFORE_UPDATE,
EventDictionary::EVENT_WORKGROUP_UPDATE,
EventDictionary::EVENT_WORKGROUP_DELETE,
EventDictionary::EVENT_WORKGROUP_USER_ADD,
EventDictionary::EVENT_WORKGROUP_USER_UPDATE,
EventDictionary::EVENT_WORKGROUP_USER_DELETE,
];
$addedEventTypes = [
EventDictionary::EVENT_WORKGROUP_ADD,
];
$changedEventTypes = [
EventDictionary::EVENT_WORKGROUP_BEFORE_UPDATE,
EventDictionary::EVENT_WORKGROUP_UPDATE,
];
$deletedEventTypes = [
EventDictionary::EVENT_WORKGROUP_DELETE,
];
$userChangedEventTypes = [
EventDictionary::EVENT_WORKGROUP_USER_ADD,
EventDictionary::EVENT_WORKGROUP_USER_UPDATE,
EventDictionary::EVENT_WORKGROUP_USER_DELETE,
];
$userAddedAndDeletedEventTypes = [
EventDictionary::EVENT_WORKGROUP_USER_ADD,
EventDictionary::EVENT_WORKGROUP_USER_DELETE,
];
$added = [];
$changed = [];
$deleted = [];
$userChanged = [];
foreach ($events as $event)
{
/* @var $event Event */
$eventType = $event->getType();
$groupId = $event->getGroupId();
if (!in_array($eventType, $workgroupEventsList, true))
{
continue;
}
if (in_array($eventType, $addedEventTypes, true))
{
$added[] = $groupId;
}
elseif (in_array($eventType, $changedEventTypes, true))
{
$changed[] = $groupId;
}
elseif (in_array($eventType, $deletedEventTypes, true))
{
$deleted[] = $groupId;
}
elseif (in_array($eventType, $userChangedEventTypes, true))
{
$userChanged[] = $groupId;
}
}
$added = array_diff($added, $deleted);
$changed = array_diff($changed, $added, $deleted);
$changed = $this->clearNotRealChanges($changed);
$userChanged = array_diff($userChanged, $added, $changed, $deleted);
$notVisibleGroupsUsers = $this->getNotVisibleGroupsUsers([
$added,
$changed,
$deleted,
$userChanged
]);
foreach ($events as $event)
{
/* @var $event WorkgroupEvent */
$eventType = $event->getType();
$groupId = $event->getGroupId();
if (
in_array($eventType, $userAddedAndDeletedEventTypes, true)
&& in_array($groupId, $userChanged, true)
)
{
(new WorkgroupSender())->sendForUserAddedAndRemoved($event, $notVisibleGroupsUsers);
unset($userChanged[$groupId]);
}
if (
(
in_array($eventType, $addedEventTypes, true)
&& !in_array($groupId, $added, true)
)
|| (
in_array($eventType, $changedEventTypes, true)
&& !in_array($groupId, $changed, true)
)
|| (
in_array($eventType, $userChangedEventTypes, true)
&& !in_array($groupId, $userChanged, true)
)
)
{
continue;
}
$workgroupsPushList[] = [
'EVENT' => $eventType,
'GROUP_ID' => $groupId,
];
}
if (!empty($workgroupsPushList))
{
(new WorkgroupSender())->send($workgroupsPushList, $notVisibleGroupsUsers);
}
}