use Bitrix\Socialnetwork\LogTable;
class CSocNetLogRights
{
public static function Add($LOG_ID, $GROUP_CODE, $bShare = false, $followSet = true)
{
global $DB, $CACHE_MANAGER;
static $logDataCache = array();
if (is_array($GROUP_CODE))
{
foreach($GROUP_CODE as $GROUP_CODE_TMP)
{
CSocNetLogRights::Add($LOG_ID, $GROUP_CODE_TMP, $bShare, $followSet);
}
return false;
}
else
{
$db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetLogRightsAdd");
while ($arEvent = $db_events->Fetch())
{
if (ExecuteModuleEventEx($arEvent, array($LOG_ID, $GROUP_CODE)) === false)
{
return false;
}
}
if (!isset($logDataCache[$LOG_ID]))
{
$res = LogTable::getList(array(
'filter' => array(
'ID' => $LOG_ID
),
'select' => array('LOG_UPDATE')
));
if ($logEntry = $res->fetch())
{
$logDataCache[$LOG_ID] = $logEntry;
}
}
$fields = array(
"LOG_ID" => $LOG_ID,
"GROUP_CODE" => $GROUP_CODE,
);
if (
!empty($logDataCache[$LOG_ID])
&& !empty($logDataCache[$LOG_ID]['LOG_UPDATE'])
&& ($logDataCache[$LOG_ID]['LOG_UPDATE'] instanceof \Bitrix\Main\Type\DateTime)
)
{
$fields['LOG_UPDATE'] = $logDataCache[$LOG_ID]['LOG_UPDATE']->toString();
}
$NEW_RIGHT_ID = $DB->add(
"b_sonet_log_right",
$fields,
array(),
"",
true // ignore errors
);
if ($NEW_RIGHT_ID)
{
if (preg_match('/^U(\d+)$/', $GROUP_CODE, $matches))
{
if($followSet)
{
\Bitrix\Socialnetwork\ComponentHelper::userLogSubscribe(array(
'logId' => $LOG_ID,
'userId' => $matches[1],
'typeList' => array(
'FOLLOW',
),
'followDate' => 'CURRENT'
));
}
}
elseif (
$bShare
&& preg_match('/^SG(\d+)$/', $GROUP_CODE, $matches)
)
{
// get all members who unfollow and set'em unfollow from the date
$arUserIDToCheck = array();
$rsGroupMembers = CSocNetUserToGroup::GetList(
array(),
array(
"GROUP_ID" => $matches[1],
"USER_ACTIVE" => "Y",
"<=ROLE" => SONET_ROLES_USER
),
false,
false,
array("USER_ID")
);
while ($arGroupMembers = $rsGroupMembers->Fetch())
{
$arUserIDToCheck[] = $arGroupMembers["USER_ID"];
}
if (!empty($arUserIDToCheck))
{
$arUserIDFollowDefault = array(
"Y" => array(),
"N" => array()
);
$arUserIDAlreadySaved = array();
$default_follow_type = COption::GetOptionString("socialnetwork", "follow_default_type", "Y");
$rsFollow = CSocNetLogFollow::GetList(
array(
"USER_ID" => $arUserIDToCheck,
"CODE" => "**"
),
array("USER_ID", "TYPE")
);
while($arFollow = $rsFollow->Fetch())
{
$arUserIDFollowDefault[$arFollow["TYPE"]][] = $arFollow["USER_ID"];
}
$rsFollow = CSocNetLogFollow::GetList(
array(
"USER_ID" => $arUserIDToCheck,
"CODE" => "L".$LOG_ID
),
array("USER_ID")
);
while($arFollow = $rsFollow->Fetch())
{
$arUserIDAlreadySaved[] = $arFollow["USER_ID"];
}
foreach($arUserIDToCheck as $iUserID)
{
// for them who not followed by default and not already saved follow/unfollow for the log entry
if (
!in_array($iUserID, $arUserIDAlreadySaved)
&& (
(
$default_follow_type == "N"
&& !in_array($iUserID, $arUserIDFollowDefault["Y"])
)
|| (
$default_follow_type == "Y"
&& in_array($iUserID, $arUserIDFollowDefault["N"])
)
)
)
{
CSocNetLogFollow::Add(
$iUserID,
"L".$LOG_ID,
"N",
ConvertTimeStamp(time() + CTimeZone::GetOffset(), "FULL", SITE_ID)
);
}
}
}
}
}
if(defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->ClearByTag("SONET_LOG_".intval($LOG_ID));
}
if (\Bitrix\Main\Loader::includeModule('landing'))
{
\Bitrix\Socialnetwork\Integration\Landing\Livefeed::onSocNetLogRightsAddHandler($GROUP_CODE);
}
return $NEW_RIGHT_ID;
}
}
function Update($RIGHT_ID, $GROUP_CODE)
{
global $DB;
$RIGHT_ID = intval($RIGHT_ID);
if (is_array($GROUP_CODE))
{
foreach($GROUP_CODE as $GROUP_CODE_TMP)
{
CSocNetLogRights::Update($RIGHT_ID, $GROUP_CODE_TMP);
}
return false;
}
else
{
$db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetLogRightsUpdate");
while ($arEvent = $db_events->Fetch())
{
if (ExecuteModuleEventEx($arEvent, array($RIGHT_ID, &$GROUP_CODE)) === false)
{
return false;
}
}
$strUpdate = $DB->PrepareUpdate("b_sonet_log_right", array(
"GROUP_CODE" => $GROUP_CODE
));
$DB->Query("UPDATE b_sonet_log_right SET ".$strUpdate." WHERE ID = ".$RIGHT_ID);
return $RIGHT_ID;
}
}
function Delete($RIGHT_ID)
{
global $DB;
$RIGHT_ID = intval($RIGHT_ID);
$DB->Query("DELETE FROM b_sonet_log_right WHERE ID = ".$RIGHT_ID);
}
public static function DeleteByLogID($LOG_ID)
{
global $DB;
$LOG_ID = intval($LOG_ID);
$DB->Query("DELETE FROM b_sonet_log_right WHERE LOG_ID = ".$LOG_ID);
$db_events = GetModuleEvents("socialnetwork", "OnSocNetLogRightsDelete");
while ($arEvent = $db_events->Fetch())
{
ExecuteModuleEventEx($arEvent, array($LOG_ID));
}
}
public static function GetList($aSort=array(), $aFilter=array())
{
global $DB;
$arFilter = array();
foreach($aFilter as $key=>$val)
{
$val = $DB->ForSql($val);
if($val == '')
{
continue;
}
switch(mb_strtoupper($key))
{
case "ID":
$arFilter[] = "R.ID=".intval($val);
break;
case "LOG_ID":
$arFilter[] = "R.LOG_ID=".intval($val);
break;
case "GROUP_CODE":
$arFilter[] = "R.GROUP_CODE='".$val."'";
break;
}
}
$arOrder = array();
foreach($aSort as $key=>$val)
{
$ord = (mb_strtoupper($val) <> "ASC"?"DESC":"ASC");
switch(mb_strtoupper($key))
{
case "ID":
$arOrder[] = "R.ID ".$ord;
break;
case "LOG_ID":
$arOrder[] = "R.LOG_ID ".$ord;
break;
case "GROUP_CODE":
$arOrder[] = "R.GROUP_CODE ".$ord;
break;
}
}
$sOrder = (count($arOrder) > 0 ? "\n ORDER BY ".implode(", ",$arOrder) : "");
if(count($arFilter) == 0)
$sFilter = "";
else
$sFilter = "\nWHERE ".implode("\nAND ", $arFilter);
$strSql = "
SELECT
R.ID
,R.LOG_ID
,R.GROUP_CODE
FROM
b_sonet_log_right R
".$sFilter.$sOrder;
return $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
}
public static function SetForSonet($logID, $entity_type, $entity_id, $feature, $operation, $bNew = false)
{
$bFlag = true;
if (!$bNew)
{
$rsRights = CSocNetLogRights::GetList(array(), array("LOG_ID" => $logID));
if ($arRights = $rsRights->Fetch())
{
$bFlag = false;
}
}
if ($bFlag)
{
$bExtranet = false;
$perm = CSocNetFeaturesPerms::GetOperationPerm($entity_type, $entity_id, $feature, $operation);
if ($perm)
{
$extranet_site_id = false;
if (CModule::IncludeModule("extranet") && $extranet_site_id = CExtranet::GetExtranetSiteID())
{
$arLogSites = array();
$rsLogSite = CSocNetLog::GetSite($logID);
while($arLogSite = $rsLogSite->Fetch())
{
$arLogSites[] = $arLogSite["LID"];
}
if (in_array($extranet_site_id, $arLogSites))
{
$bExtranet = true;
}
}
if ($bExtranet && $extranet_site_id)
{
if ($entity_type == SONET_ENTITY_GROUP && $perm == SONET_ROLES_OWNER)
CSocNetLogRights::Add($logID, array("SA", "S".SONET_ENTITY_GROUP.$entity_id, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_OWNER));
elseif ($entity_type == SONET_ENTITY_GROUP && $perm == SONET_ROLES_MODERATOR)
CSocNetLogRights::Add($logID, array("SA", "S".SONET_ENTITY_GROUP.$entity_id, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_OWNER, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_MODERATOR));
elseif ($entity_type == SONET_ENTITY_GROUP && in_array($perm, array(SONET_ROLES_USER, SONET_ROLES_AUTHORIZED, SONET_ROLES_ALL)))
CSocNetLogRights::Add($logID, array("SA", "S".SONET_ENTITY_GROUP.$entity_id, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_OWNER, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_MODERATOR, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_USER));
elseif ($entity_type == SONET_ENTITY_USER && $perm == SONET_RELATIONS_TYPE_NONE)
CSocNetLogRights::Add($logID, array("SA", "U".$entity_id));
elseif ($entity_type == SONET_ENTITY_USER && in_array($perm, array(SONET_RELATIONS_TYPE_FRIENDS, SONET_RELATIONS_TYPE_FRIENDS2, SONET_RELATIONS_TYPE_AUTHORIZED, SONET_RELATIONS_TYPE_ALL)))
{
$arCode = array("SA");
$arLog = CSocNetLog::GetByID($logID);
if ($arLog)
{
$dbUsersInGroup = CSocNetUserToGroup::GetList(
array(),
array(
"USER_ID" => $arLog["USER_ID"],
"<=ROLE" => SONET_ROLES_USER,
"GROUP_SITE_ID" => $extranet_site_id,
"GROUP_ACTIVE" => "Y"
),
false,
false,
array("ID", "GROUP_ID")
);
while ($arUsersInGroup = $dbUsersInGroup->Fetch())
{
if (!in_array("S".SONET_ENTITY_GROUP.$arUsersInGroup["GROUP_ID"]."_".SONET_ROLES_USER, $arCode))
{
$arCode = array_merge(
$arCode,
array(
"S".SONET_ENTITY_GROUP.$arUsersInGroup["GROUP_ID"]."_".SONET_ROLES_OWNER,
"S".SONET_ENTITY_GROUP.$arUsersInGroup["GROUP_ID"]."_".SONET_ROLES_MODERATOR,
"S".SONET_ENTITY_GROUP.$arUsersInGroup["GROUP_ID"]."_".SONET_ROLES_USER
)
);
}
}
CSocNetLogRights::Add($logID, $arCode);
}
}
}
else
{
if ($entity_type == SONET_ENTITY_GROUP && $perm == SONET_ROLES_OWNER)
CSocNetLogRights::Add($logID, array("SA", "S".SONET_ENTITY_GROUP.$entity_id, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_OWNER));
elseif ($entity_type == SONET_ENTITY_GROUP && $perm == SONET_ROLES_MODERATOR)
CSocNetLogRights::Add($logID, array("SA", "S".SONET_ENTITY_GROUP.$entity_id, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_OWNER, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_MODERATOR));
elseif ($entity_type == SONET_ENTITY_GROUP && $perm == SONET_ROLES_USER)
CSocNetLogRights::Add($logID, array("SA", "S".SONET_ENTITY_GROUP.$entity_id, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_OWNER, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_MODERATOR, "S".SONET_ENTITY_GROUP.$entity_id."_".SONET_ROLES_USER));
elseif ($entity_type == SONET_ENTITY_USER && in_array($perm, array(SONET_RELATIONS_TYPE_FRIENDS, SONET_RELATIONS_TYPE_FRIENDS2)))
{
$arCodes = array("SA", "U".$entity_id, "S".$entity_type.$entity_id."_".SONET_RELATIONS_TYPE_FRIENDS);
CSocNetLogRights::Add($logID, $arCodes);
}
elseif ($entity_type == SONET_ENTITY_USER && $perm == SONET_RELATIONS_TYPE_NONE)
CSocNetLogRights::Add($logID, array("SA", "U".$entity_id));
elseif ($entity_type == SONET_ENTITY_GROUP && $perm == SONET_ROLES_AUTHORIZED)
CSocNetLogRights::Add($logID, array("SA", "S".$entity_type.$entity_id, "S".$entity_type.$entity_id."_".SONET_ROLES_USER, "AU"));
elseif ($entity_type == SONET_ENTITY_USER && $perm == SONET_RELATIONS_TYPE_AUTHORIZED)
CSocNetLogRights::Add($logID, array("SA", "AU"));
elseif ($entity_type == SONET_ENTITY_GROUP && $perm == SONET_ROLES_ALL)
CSocNetLogRights::Add($logID, array("SA", "S".$entity_type.$entity_id, "S".$entity_type.$entity_id."_".SONET_ROLES_USER, "G2"));
elseif ($entity_type == SONET_ENTITY_USER && $perm == SONET_RELATIONS_TYPE_ALL)
CSocNetLogRights::Add($logID, array("SA", "G2"));
}
}
}
}
public static function CheckForUser($logID, $userID)
{
global $DB;
$userID = intval($userID);
$strSql = "SELECT SLR.ID FROM b_sonet_log_right SLR
WHERE
SLR.LOG_ID = ".intval($logID)."
AND
SLR.GROUP_CODE IN ('G2'".($userID > 0 ? ", 'AU'" : "").")
";
$result = $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
if ($ar = $result->fetch())
{
return true;
}
if ($userID > 0)
{
$strSql = "SELECT SLR.ID FROM b_sonet_log_right SLR
INNER JOIN b_user_access UA ON UA.ACCESS_CODE = SLR.GROUP_CODE
WHERE
SLR.LOG_ID = ".intval($logID)."
AND UA.USER_ID = ".$userID."
";
$result = $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
if ($ar = $result->fetch())
{
return true;
}
}
return false;
}
public static function CheckForUserAll($logID)
{
global $DB;
$strSql = "SELECT SLR.ID FROM b_sonet_log_right SLR
WHERE
SLR.LOG_ID = ".intval($logID)."
AND (
(SLR.GROUP_CODE = 'AU')
OR (SLR.GROUP_CODE = 'G2')
)";
$result = $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
if($ar = $result->Fetch())
{
return true;
}
return false;
}
public static function CheckForUserOnly($logID, $userID)
{
global $DB;
if (
intval($logID) <= 0
|| intval($userID) <= 0
)
return false;
$strSql = "SELECT SLR.ID FROM b_sonet_log_right SLR
INNER JOIN b_user_access UA ON 0=1 OR (UA.ACCESS_CODE = SLR.GROUP_CODE AND UA.USER_ID = ".intval($userID).")
WHERE SLR.LOG_ID = ".intval($logID);
$result = $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
if($ar = $result->Fetch())
{
return true;
}
return false;
}
}
?>