• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/user_group.php
  • Класс: CAllSocNetUserToGroup
  • Вызов: CAllSocNetUserToGroup::InitUserPerms
static function InitUserPerms($userId, $groupFields, $isCurrentUserAdmin)
{
	global $arSocNetAllowedInitiatePerms;
	global $arSocNetAllowedSpamPerms;

	$arReturn = array();

	$userId = (int)$userId;
	$groupId = (int)$groupFields["ID"];
	$groupOwnerId = (int)$groupFields["OWNER_ID"];
	$groupInitiatePerms = Trim($groupFields["INITIATE_PERMS"]);
	$groupVisible = Trim($groupFields["VISIBLE"]);
	$groupOpened = Trim($groupFields["OPENED"]);
	$groupSpamPerms = Trim(($groupFields["SPAM_PERMS"] ?? ''));

	if ($groupId <= 0 || $groupOwnerId <= 0 || !in_array($groupInitiatePerms, $arSocNetAllowedInitiatePerms))
	{
		return false;
	}

	$arReturn["Operations"] = [];

	if (!in_array($groupSpamPerms, $arSocNetAllowedSpamPerms))
	{
		$groupSpamPerms = "K";
	}

	// UserRole - User role in group. False if user is not group member.
	// UserIsMember - True in user is group member.
	// UserIsAuto - True in user is group auto member.
	// UserIsOwner - True if user is group owner.
	// UserCanInitiate - True if user can invite friends to group.
	// UserCanViewGroup - True if user can view group.
	// UserCanAutoJoinGroup - True if user can join group automatically.
	// UserCanModifyGroup - True if user can modify group.
	// UserCanModerateGroup - True if user can moderate group.

	if ($userId <= 0)
	{
		$arReturn["UserRole"] = false;
		$arReturn["UserIsMember"] = false;
		$arReturn["UserIsAutoMember"] = false;
		$arReturn["UserIsOwner"] = false;
		$arReturn['UserIsScrumMaster'] = false;
		$arReturn["UserCanInitiate"] = false;
		$arReturn["UserCanProcessRequestsIn"] = false;
		$arReturn["UserCanViewGroup"] = ($groupVisible === "Y");
		$arReturn["UserCanAutoJoinGroup"] = false;
		$arReturn["UserCanModifyGroup"] = false;
		$arReturn["UserCanModerateGroup"] = false;
		$arReturn["UserCanSpamGroup"] = false;
		$arReturn["InitiatedByType"] = false;
		$arReturn["InitiatedByUserId"] = false;
		$arReturn["Operations"]["viewsystemevents"] = false;
	}
	else
	{
		if (!isset($groupFields['SCRUM']))
		{
			$group = Workgroup::getById($groupFields['ID']);
			$groupFields['SCRUM'] = ($group && $group->isScrumProject() ? 'Y' : 'N');
		}

		if (!isset($groupFields['SCRUM_MASTER_ID']))
		{
			$group = Workgroup::getById($groupFields['ID']);
			$groupFields['SCRUM_MASTER_ID'] = ($group ? $group->getScrumMaster() : 0);
		}

		$arUserRoleExtended = CSocNetUserToGroup::GetUserRole($userId, $groupId, true);
		$arReturn["UserRole"] = $arUserRoleExtended["ROLE"];

		$arReturn["UserIsMember"] = (
			$arReturn["UserRole"]
			&& in_array($arReturn["UserRole"], UserToGroupTable::getRolesMember(), true)
		);
		$arReturn["UserIsAutoMember"] = (
			$arReturn["UserIsMember"]
			&& $arUserRoleExtended["AUTO_MEMBER"] === "Y"
		);

		$arReturn["InitiatedByType"] = false;
		$arReturn["InitiatedByUserId"] = false;
		if ($arReturn["UserRole"] === UserToGroupTable::ROLE_REQUEST)
		{
			$dbRelation = CSocNetUserToGroup::GetList(
				[],
				[ 'USER_ID' => $userId, 'GROUP_ID' => $groupId ],
				false,
				false,
				[ 'INITIATED_BY_TYPE', 'INITIATED_BY_USER_ID' ]
			);
			if ($arRelation = $dbRelation->Fetch())
			{
				$arReturn["InitiatedByType"] = $arRelation["INITIATED_BY_TYPE"];
				$arReturn["InitiatedByUserId"] = (int)$arRelation['INITIATED_BY_USER_ID'];
			}
		}

		$arReturn["UserIsOwner"] = ($userId === $groupOwnerId);
		$arReturn['UserIsScrumMaster'] = (
			$groupFields['SCRUM'] === 'Y'
			&& (int)$groupFields['SCRUM_MASTER_ID'] === $userId
		);

		if ($isCurrentUserAdmin)
		{
			$arReturn["UserCanInitiate"] = true;
			$arReturn["UserCanProcessRequestsIn"] = true;
			$arReturn["UserCanViewGroup"] = true;
			$arReturn["UserCanAutoJoinGroup"] = true;
			$arReturn["UserCanModifyGroup"] = true;
			$arReturn["UserCanModerateGroup"] = true;
			$arReturn["UserCanSpamGroup"] = true;
			$arReturn["Operations"]["viewsystemevents"] = true;
		}
		elseif ($arReturn["UserIsMember"])
		{
			$arReturn["UserCanInitiate"] = (
				(
					$groupInitiatePerms === UserToGroupTable::ROLE_OWNER
					&& $arReturn['UserIsOwner']
				)
				|| (
					$groupInitiatePerms === UserToGroupTable::ROLE_MODERATOR
					&& in_array($arReturn['UserRole'], [
						UserToGroupTable::ROLE_OWNER,
						UserToGroupTable::ROLE_MODERATOR,
					], true)
				)
				|| ($groupInitiatePerms === UserToGroupTable::ROLE_USER)
			);
			$arReturn['UserCanProcessRequestsIn'] = (
				$arReturn['UserCanInitiate']
				&& in_array($arReturn['UserRole'], [
					UserToGroupTable::ROLE_OWNER,
					UserToGroupTable::ROLE_MODERATOR,
				], true)
			);
			$arReturn["UserCanViewGroup"] = true;
			$arReturn["UserCanAutoJoinGroup"] = false;
			$arReturn["UserCanModifyGroup"] = $arReturn["UserIsOwner"];
			if (
				!$arReturn['UserCanModifyGroup'] 
				&& $groupFields['SCRUM'] === 'Y'
			)
			{
				if (!isset($groupFields['SCRUM_MASTER_ID']))
				{
					$group = Workgroup::getById($groupFields['ID']);
					$groupFields['SCRUM_MASTER_ID'] = ($group ? $group->getScrumMaster() : 0);
				}

				$arReturn['UserCanModifyGroup'] = ((int)$groupFields['SCRUM_MASTER_ID'] === $userId);
			}
			$arReturn["UserCanModerateGroup"] = (in_array($arReturn['UserRole'], [
				UserToGroupTable::ROLE_OWNER,
				UserToGroupTable::ROLE_MODERATOR,
			], true));
			$arReturn['UserCanSpamGroup'] = (
				(
					$groupSpamPerms === UserToGroupTable::ROLE_OWNER
					&& $arReturn['UserIsOwner']
				)
				|| (
					$groupSpamPerms === UserToGroupTable::ROLE_MODERATOR
					&& in_array($arReturn["UserRole"], [
						UserToGroupTable::ROLE_OWNER,
						UserToGroupTable::ROLE_MODERATOR,
					], true)
				)
				|| $groupSpamPerms === UserToGroupTable::ROLE_USER
				|| $groupSpamPerms === SONET_ROLES_ALL
			);
			$arReturn["Operations"]["viewsystemevents"] = true;
		}
		else
		{
			$arReturn["UserCanInitiate"] = false;
			$arReturn["UserCanViewGroup"] = ($groupVisible === "Y");
			$arReturn["UserCanAutoJoinGroup"] = ($arReturn["UserCanViewGroup"] && ($groupOpened === "Y"));
			$arReturn["UserCanModifyGroup"] = false;
			$arReturn["UserCanModerateGroup"] = false;
			$arReturn["UserCanSpamGroup"] = ($groupSpamPerms === SONET_ROLES_ALL);
			$arReturn["Operations"]["viewsystemevents"] = false;
		}
	}

	if (Loader::includeModule('extranet') && CExtranet::IsExtranetSite())
	{
		$arReturn["UserCanSpamGroup"] = true;
	}

	if (!CBXFeatures::IsFeatureEnabled("WebMessenger"))
	{
		$arReturn["UserCanSpamGroup"] = false;
	}

	return $arReturn;
}