• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/internals/eventservice/event/workgroupevent.php
  • Класс: BitrixSocialnetworkInternalsEventServiceEventWorkgroupEvent
  • Вызов: WorkgroupEvent::process
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);
	}
}