• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/helper/workgroup.php
  • Класс: BitrixSocialnetworkHelperWorkgroup
  • Вызов: Workgroup::setModerators
static function setModerators(array $fields = []): bool
{
	$groupId = (int)($fields['groupId'] ?? 0);
	$userIds = array_map('intval', array_filter($fields['userIds'] ?? []));

	if ($groupId <= 0)
	{
		throw new ArgumentException(Loc::getMessage('SOCIALNETWORK_HELPER_WORKGROUP_ERROR_WRONG_GROUP_ID'));
	}

	$currentUserId = User::getCurrentUserId();
	$isCurrentUserModuleAdmin = static::isCurrentUserModuleAdmin();

	$groupPerms = static::getPermissions(['groupId' => $groupId]);
	if (!$groupPerms || (!$groupPerms['UserCanModifyGroup'] && !$isCurrentUserModuleAdmin))
	{
		throw new AccessDeniedException(Loc::getMessage('SOCIALNETWORK_HELPER_WORKGROUP_ERROR_OPERATION_NO_PERMS'));
	}

	$currentModeratorRelations = static::getCurrentModeratorRelations($groupId);
	$moderatorsToAdd = array_diff($userIds, array_keys($currentModeratorRelations));
	$moderatorsToRemove = array_diff_key($currentModeratorRelations, array_fill_keys($userIds, true));

	if (!empty($moderatorsToRemove))
	{
		CSocNetUserToGroup::TransferModerator2Member(
			$currentUserId,
			$groupId,
			$moderatorsToRemove
		);
	}

	if (!empty($moderatorsToAdd))
	{
		[$ownerRelations, $memberRelations, $otherRelations] = static::getUserRelations($groupId, $moderatorsToAdd);

		if (!empty($memberRelations))
		{
			CSocNetUserToGroup::transferMember2Moderator(
				$currentUserId,
				$groupId,
				$memberRelations
			);
		}

		$moderatorsToAdd = array_diff($moderatorsToAdd, array_keys($memberRelations), array_keys($ownerRelations));
		foreach ($moderatorsToAdd as $userId)
		{
			if (array_key_exists($userId, $otherRelations))
			{
				$relationId = static::transferToModerators($otherRelations[$userId]);
			}
			else
			{
				$relationId = static::addToModerators($userId, $groupId);
			}

			if ($relationId)
			{
				static::sendNotifications($userId, $groupId, $relationId);
			}
		}
	}

	return true;
}