public function shareAction(array $params = [])
{
$postId = (int)($params['postId'] ?? 0);
$destCodesList = ($params['DEST_CODES'] ?? []);
$destData = ($params['DEST_DATA'] ?? []);
$invitedUserName = ($params['INVITED_USER_NAME'] ?? []);
$invitedUserLastName = ($params['INVITED_USER_LAST_NAME'] ?? []);
$invitedUserCrmEntity = ($params['INVITED_USER_CRM_ENTITY'] ?? []);
$invitedUserCreateCrmContact = ($params['INVITED_USER_CREATE_CRM_CONTACT'] ?? []);
$readOnly = (isset($params['readOnly']) && $params['readOnly'] === 'Y');
$pathToUser = ($params['pathToUser'] ?? '');
$pathToPost = ($params['pathToPost'] ?? '');
$currentUserId = $this->getCurrentUser()->getId();
$data = [
'ALLOW_EMAIL_INVITATION' => (
ModuleManager::isModuleInstalled('mail')
&& ModuleManager::isModuleInstalled('intranet')
&& (
!Loader::includeModule('bitrix24')
|| CBitrix24::isEmailConfirmed()
)
)
];
if ($postId <= 0)
{
$this->addError(new Error(Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_EMPTY'), 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_EMPTY'));
return null;
}
if (
!Loader::includeModule('blog')
|| !($postItem = BitrixBlogItemPost::getById($postId))
)
{
$this->addError(
new Error(
Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'),
'SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'
)
);
return null;
}
$currentUserPerm = Helper::getBlogPostPerm([
'USER_ID' => $currentUserId,
'POST_ID' => $postId,
]);
if ($currentUserPerm <= Permissions::DENY)
{
$this->addError(
new Error(
Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'),
'SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'
)
);
return null;
}
$postFields = $postItem->getFields();
if (
(int)$postFields['AUTHOR_ID'] !== $currentUserId
&& ComponentHelper::isCurrentUserExtranet()
)
{
$visibleUserIdList = CExtranet::getMyGroupsUsersSimple(SITE_ID);
if (!empty(array_diff([(int)$postFields['AUTHOR_ID']], $visibleUserIdList)))
{
$this->addError(
new Error(
Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'),
'SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'
)
);
return null;
}
}
$perms2update = [];
$sonetPermsListOld = CBlogPost::getSocNetPerms($postId);
foreach($sonetPermsListOld as $type => $val)
{
foreach($val as $id => $values)
{
if($type !== 'U')
{
$perms2update[] = $type . $id;
}
else
{
$perms2update[] = (
in_array('US' . $id, $values, true)
? 'UA'
: $type.$id
);
}
}
}
$newRightsList = [];
$sonetPermsListNew = [
'UA' => [],
'U' => [],
'UE' => [],
'SG' => [],
'DR' => []
];
if (!empty($destData))
{
try
{
$entitites = Json::decode($destData);
if (!empty($entitites))
{
$destCodesList = BitrixMainUIEntitySelectorConverter::convertToFinderCodes($entitites);
}
}
catch(ArgumentException $e)
{
}
}
foreach($destCodesList as $destCode)
{
if ($destCode === 'UA')
{
$sonetPermsListNew['UA'][] = 'UA';
}
elseif (preg_match('/^UE(.+)$/i', $destCode, $matches))
{
$sonetPermsListNew['UE'][] = $matches[1];
}
elseif (preg_match('/^U(d+)$/i', $destCode, $matches))
{
$sonetPermsListNew['U'][] = 'U'.$matches[1];
}
elseif (preg_match('/^SG(d+)$/i', $destCode, $matches))
{
$sonetPermsListNew['SG'][] = 'SG'.$matches[1];
}
elseif (preg_match('/^DR(d+)$/i', $destCode, $matches))
{
$sonetPermsListNew['DR'][] = 'DR'.$matches[1];
}
}
$HTTPPost = [
'SONET_PERMS' => $sonetPermsListNew,
'INVITED_USER_NAME' => $invitedUserName,
'INVITED_USER_LAST_NAME' => $invitedUserLastName,
'INVITED_USER_CRM_ENTITY' => $invitedUserCrmEntity,
'INVITED_USER_CREATE_CRM_CONTACT' => $invitedUserCreateCrmContact
];
ComponentHelper::processBlogPostNewMailUser($HTTPPost, $data);
$sonetPermsListNew = $HTTPPost['SONET_PERMS'];
$currentAdmin = CSocNetUser::isCurrentUserModuleAdmin();
$canPublish = true;
foreach($sonetPermsListNew as $type => $val)
{
foreach($val as $code)
{
if(in_array($type, [ 'U', 'SG', 'DR', 'CRMCONTACT' ]))
{
if (!in_array($code, $perms2update))
{
if ($type === 'SG')
{
$sonetGroupId = (int)str_replace('SG', '', $code);
$canPublish = (
$currentAdmin
|| CSocNetFeaturesPerms::canPerformOperation($currentUserId, SONET_ENTITY_GROUP, $sonetGroupId, 'blog', 'write_post')
|| CSocNetFeaturesPerms::canPerformOperation($currentUserId, SONET_ENTITY_GROUP, $sonetGroupId, 'blog', 'moderate_post')
|| CSocNetFeaturesPerms::canPerformOperation($currentUserId, SONET_ENTITY_GROUP, $sonetGroupId, 'blog', 'full_post')
);
if (!$canPublish)
{
break;
}
}
$perms2update[] = $code;
$newRightsList[] = $code;
}
}
elseif ($type === 'UA')
{
if (!in_array('UA', $perms2update, true))
{
$perms2update[] = 'UA';
$newRightsList[] = 'UA';
}
}
}
if (!$canPublish)
{
break;
}
}
if (
!empty($newRightsList)
&& $canPublish
)
{
ComponentHelper::processBlogPostShare(
[
'POST_ID' => $postId,
'BLOG_ID' => $postFields['BLOG_ID'],
'SITE_ID' => SITE_ID,
'SONET_RIGHTS' => $perms2update,
'NEW_RIGHTS' => $newRightsList,
'USER_ID' => $currentUserId
],
[
'MENTION' => 'N',
'LIVE' => 'Y',
'CAN_USER_COMMENT' => (!$readOnly ? 'Y' : 'N'),
'PATH_TO_USER' => $pathToUser,
'PATH_TO_POST' => $pathToPost,
]
);
}
elseif (!$canPublish)
{
$this->addError(new Error(Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_SHARE_PREMODERATION'), 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_SHARE_PREMODERATION'));
return null;
}
}