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;
}