• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/controller/workgroup.php
  • Класс: BitrixSocialnetworkControllerWorkgroup
  • Вызов: Workgroup::changePinAction
public function changePinAction(
	array $groupIdList,
	string $action,
	string $componentName = '',
	string $signedParameters = ''
): ?bool
{
	if (!Loader::includeModule('socialnetwork'))
	{
		$this->addError(new Error('SONET_CONTROLLER_MODULE_NOT_INSTALLED', 'SONET_CONTROLLER_MODULE_NOT_INSTALLED'));
		return null;
	}

	$unsignedParameters = [];
	if (
		$componentName !== ''
		&& $signedParameters !== ''
	)
	{
		$unsignedParameters = BitrixMainComponentParameterSigner::unsignParameters($componentName, $signedParameters);
		if (!is_array($unsignedParameters))
		{
			$unsignedParameters = [];
		}
	}

	$mode = ($unsignedParameters['MODE'] ?? '');

	$currentUserId = $this->getCurrentUser()->getId();
	$counter = 0;

	foreach ($groupIdList as $groupId)
	{
		$groupId = (int)$groupId;

		if (
			$groupId <= 0
			|| !HelperWorkgroupAccess::canView([
				'groupId' => $groupId,
			])
		)
		{
			continue;
		}

		$counter++;

		$query = new Query(WorkgroupPinTable::getEntity());
		$query = $query
			->setSelect([
				'ID',
				'GROUP_ID',
				'USER_ID',
			])
			->where('GROUP_ID', $groupId)
			->where('USER_ID', $currentUserId);

		if ($mode === '')
		{
			$query = $query->where(Query::filter()
				->logic('or')
				->whereNull('CONTEXT')
				->where('CONTEXT', '')
			);
		}
		else
		{
			$query = $query->where('CONTEXT', $mode);
		}

		$pin = $query
			->setLimit(1)
			->exec()->fetchObject();

		$pinResult = false;
		if (
			$action === 'pin'
			&& !$pin
		)
		{
			try
			{
				WorkgroupPinTable::add([
					'GROUP_ID' => $groupId,
					'USER_ID' => $currentUserId,
					'CONTEXT' => $mode,
				]);
			}
			catch (Exception $e)
			{
				$this->addError(
					new Error(
						Loc::getMessage('SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'),
						'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'
					)
				);

				return null;
			}

			$pinResult = true;
		}
		elseif (
			$action === 'unpin'
			&& $pin
		)
		{
			$tableDeleteResult = WorkgroupPinTable::delete($pin->get('ID'));
			if (!$tableDeleteResult->isSuccess())
			{
				$this->addError(new Error(
					Loc::getMessage('SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'),
					'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'
				));
				return null;
			}

			$pinResult = true;
		}

		if ($pinResult === true)
		{
			PushService::addEvent(
				[ $currentUserId ],
				[
					'module_id' => 'socialnetwork',
					'command' => 'workgroup_pin_changed',
					'params' => [
						'GROUP_ID' => $groupId,
						'USER_ID' => $currentUserId,
						'ACTION' => $action,
					],
				]
			);
		}
	}

	if ($counter <= 0)
	{
		$this->addError(new Error(Loc::getMessage('SONET_CONTROLLER_WORKGROUP_EMPTY'), 'SONET_CONTROLLER_WORKGROUP_EMPTY'));
		return null;
	}

	return true;
}