• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/user_group.php
  • Класс: CAllSocNetUserToGroup
  • Вызов: CAllSocNetUserToGroup::SetOwner
static function SetOwner($userId, $groupId, $groupFields = []): bool
{
	global $DB, $APPLICATION, $USER;

	if (empty($groupFields))
	{
		$groupFields = CSocNetGroup::GetByID($groupId);
	}

	if (empty($groupFields))
	{
		return false;
	}

	$errorMessage = "";
	$DB->StartTransaction();

	// setting relations for the old owner
	$res = CSocNetUserToGroup::GetList(
		array(),
		array(
			"USER_ID" => $groupFields["OWNER_ID"],
			"GROUP_ID" => $groupId,
		),
		false,
		false,
		array('ID', 'USER_ID')
	);
	if ($existingRelationFields = $res->fetch())
	{
		$role = UserToGroupTable::ROLE_USER;

		$workgroup = WorkgroupTable::getByPrimary($groupId)->fetchObject();
		if (
			$workgroup
			&& $workgroup->getScrumMasterId() === (int)$existingRelationFields['USER_ID']
		)
		{
			$role = UserToGroupTable::ROLE_MODERATOR;
		}

		$relationFields = array(
			"ROLE" => $role,
			"=DATE_UPDATE" => CDatabase::CurrentTimeFunction(),
			"INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER,
			"INITIATED_BY_USER_ID" => $USER->GetID(),
		);

		if (!CSocNetUserToGroup::Update($existingRelationFields["ID"], $relationFields))
		{
			if ($e = $APPLICATION->GetException())
			{
				$errorMessage = $e->GetString();
			}
			if ($errorMessage === '')
			{
				$errorMessage = Loc::getMessage('SONET_UG_ERROR_CANNOT_UPDATE_CURRENT_OWNER');
			}

			$APPLICATION->ThrowException($errorMessage, "ERROR_UPDATE_USER2GROUP");
			$DB->Rollback();
			return false;
		}
	}

	CSocNetUserToGroup::__SpeedFileDelete($groupFields["OWNER_ID"]);

	// setting relations for the new owner
	$res = CSocNetUserToGroup::GetList(
		[],
		[
			'USER_ID' => $userId,
			'GROUP_ID' => $groupId,
		],
		false,
		false,
		[ 'ID', 'ROLE' ]
	);
	if ($existingRelationFields = $res->Fetch())
	{
		$relationFields = array(
			"ROLE" => UserToGroupTable::ROLE_OWNER,
			"=DATE_UPDATE" => CDatabase::CurrentTimeFunction(),
			"INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER,
			"INITIATED_BY_USER_ID" => $USER->GetID(),
			"AUTO_MEMBER" => "N"
		);

		if (!CSocNetUserToGroup::Update($existingRelationFields["ID"], $relationFields))
		{
			if ($e = $APPLICATION->GetException())
			{
				$errorMessage = $e->GetString();
			}
			if ($errorMessage === '')
			{
				$errorMessage = Loc::getMessage('SONET_UG_ERROR_CANNOT_UPDATE_NEW_OWNER_RELATION');
			}

			$APPLICATION->ThrowException($errorMessage, "ERROR_UPDATE_USER2GROUP");
			$DB->Rollback();
			return false;
		}

		if (!in_array($existingRelationFields["ID"], UserToGroupTable::getRolesMember(), true))
		{
			UserToGroup::addInfoToChat([
				'group_id' => $groupId,
				'user_id' => $userId,
				'action' => UserToGroup::CHAT_ACTION_IN,
				'role' => $relationFields['ROLE'],
			]);
		}

		if (Loader::includeModule('im'))
		{
			CIMNotify::deleteByTag('SOCNET|INVITE_GROUP|' . (int)$userId  . '|' . (int)$existingRelationFields['ID']);
		}
	}
	else
	{
		$relationFields = array(
			"USER_ID" => $userId,
			"GROUP_ID" => $groupId,
			"ROLE" => UserToGroupTable::ROLE_OWNER,
			"=DATE_CREATE" => CDatabase::CurrentTimeFunction(),
			"=DATE_UPDATE" => CDatabase::CurrentTimeFunction(),
			"INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER,
			"INITIATED_BY_USER_ID" => $USER->GetID(),
			"MESSAGE" => false,
		);

		if (!CSocNetUserToGroup::Add($relationFields))
		{
			if ($e = $APPLICATION->GetException())
			{
				$errorMessage = $e->GetString();
			}
			if ($errorMessage === '')
			{
				$errorMessage = Loc::getMessage('SONET_UG_ERROR_CANNOT_ADD_NEW_OWNER_RELATION');
			}

			$APPLICATION->ThrowException($errorMessage, "ERROR_ADD_USER2GROUP");
			$DB->Rollback();
			return false;
		}

		UserToGroup::addInfoToChat(array(
			'group_id' => $groupId,
			'user_id' => $userId,
			'action' => UserToGroup::CHAT_ACTION_IN,
			'role' => $relationFields['ROLE']
		));
	}

	$GROUP_ID = CSocNetGroup::Update($groupId, array("OWNER_ID" => $userId));
	if (!$GROUP_ID || $GROUP_ID <= 0)
	{
		if ($e = $APPLICATION->GetException())
		{
			$errorMessage = $e->GetString();
		}
		if ($errorMessage === '')
		{
			$errorMessage = Loc::getMessage('SONET_UG_ERROR_CANNOT_UPDATE_GROUP');
		}

		$APPLICATION->ThrowException($errorMessage, "ERROR_UPDATE_GROUP");
		$DB->Rollback();
		return false;
	}

	$bIMIncluded = false;
	$groupUrl = "";
	$groupSiteId = SITE_ID;

	if (Loader::includeModule('im'))
	{
		$bIMIncluded = true;
		$groupSiteId = CSocNetGroup::GetDefaultSiteId($groupId, $groupFields["SITE_ID"]);
		$workgroupsPage = COption::GetOptionString("socialnetwork", "workgroups_page", "/workgroups/", $groupSiteId);
		$groupUrlTemplate = Path::get('group_path_template', $groupSiteId);
		$groupUrlTemplate = "#GROUPS_PATH#".mb_substr($groupUrlTemplate, mb_strlen($workgroupsPage));
		$groupUrl = str_replace(array("#group_id#", "#GROUP_ID#"), $groupId, $groupUrlTemplate);
	}

	// send message to the old owner
	if ($bIMIncluded)
	{
		$arTmp = CSocNetLogTools::ProcessPath(
			array(
				"GROUP_URL" => $groupUrl
			),
			$groupFields["OWNER_ID"],
			$groupSiteId
		);
		$groupUrl = $arTmp["URLS"]["GROUP_URL"];
		$serverName = (
		mb_strpos($groupUrl, "http://") === 0
			|| mb_strpos($groupUrl, "https://") === 0
				? ""
				: $arTmp["SERVER_NAME"]
		);

		$messageFields = array(
			"TO_USER_ID" => $groupFields["OWNER_ID"],
			"FROM_USER_ID" => $USER->GetID(),
			"NOTIFY_TYPE" => IM_NOTIFY_FROM,
			"NOTIFY_MODULE" => "socialnetwork",
			"NOTIFY_EVENT" => "owner_group",
			"NOTIFY_TAG" => "SOCNET|OWNER_GROUP|".$groupId,
			"NOTIFY_MESSAGE" => str_replace(
				"#NAME#",
				"".$groupFields["NAME"]."",
				GetMessage("SONET_UG_OWNER2MEMBER_MESSAGE")
			),
			"NOTIFY_MESSAGE_OUT" => str_replace(
				"#NAME#",
				$groupFields["NAME"],
				GetMessage("SONET_UG_OWNER2MEMBER_MESSAGE")." (".$serverName.$groupUrl.")"
			)
		);

		CIMNotify::Add($messageFields);
	}

	// send message to the new owner
	if ($bIMIncluded)
	{
		$arTmp = CSocNetLogTools::ProcessPath(
			array(
				"GROUP_URL" => $groupUrl
			),
			$userId,
			$groupSiteId
		);
		$groupUrl = $arTmp["URLS"]["GROUP_URL"];

		if (
			mb_strpos($groupUrl, "http://") === 0
			|| mb_strpos($groupUrl, "https://") === 0
		)
		{
			$serverName = "";
		}
		else
		{
			$serverName = $arTmp["SERVER_NAME"];
		}

		$messageFields = array(
			"TO_USER_ID" => $userId,
			"FROM_USER_ID" => $USER->GetID(),
			"NOTIFY_TYPE" => IM_NOTIFY_FROM,
			"NOTIFY_MODULE" => "socialnetwork",
			"NOTIFY_EVENT" => "owner_group",
			"NOTIFY_TAG" => "SOCNET|OWNER_GROUP|".$groupId,
			"NOTIFY_MESSAGE" => str_replace(
				"#NAME#",
				"".$groupFields["NAME"]."",
				GetMessage("SONET_UG_MEMBER2OWNER_MESSAGE")
			),
			"NOTIFY_MESSAGE_OUT" => str_replace(
				"#NAME#",
				$groupFields["NAME"],
				GetMessage("SONET_UG_MEMBER2OWNER_MESSAGE")." (".$serverName.$groupUrl.")"
			)
		);

		CIMNotify::Add($messageFields);
	}

	$notificationParams = array(
		"TYPE" => "owner",
		"RELATION_ID" => $existingRelationFields["ID"] ?? null,
		"USER_ID" => $userId,
		"GROUP_ID" => $groupId,
		"GROUP_NAME" => htmlspecialcharsbx($groupFields["NAME"]),
		"EXCLUDE_USERS" => array($userId, $groupFields["OWNER_ID"], $USER->GetID())
	);
	CSocNetUserToGroup::NotifyImToModerators($notificationParams);

	CSocNetSubscription::Set($userId, "SG".$groupId, "Y");

	$DB->Commit();
	return true;
}