/modules/socialnetwork/classes/general/rest.php
PHP | 2049 lines | 1945 code | 103 blank | 1 comment | 82 complexity | b478c74250c9968639214edf7adc969f MD5 | raw file
- <?php
- use Bitrix\Disk\File;
- use Bitrix\Intranet\Integration\Templates\Bitrix24\ThemePicker;
- use Bitrix\Main\Text\Emoji;
- use Bitrix\Socialnetwork\ComponentHelper;
- use Bitrix\Main\Config\Option;
- use Bitrix\Main\Loader;
- use Bitrix\Rest\RestException;
- use Bitrix\Main\ModuleManager;
- use Bitrix\Socialnetwork\Helper\Workgroup;
- use Bitrix\Socialnetwork\Item\Helper;
- use Bitrix\Socialnetwork\UserToGroupTable;
- if (!Loader::includeModule('rest'))
- {
- return;
- }
- class CSocNetLogRestService extends IRestService
- {
- public const PERM_DENY = 'D';
- public const PERM_READ = 'R';
- public const PERM_WRITE = 'W';
- private static $arAllowedOperations = array('', '!', '<', '<=', '>', '>=', '><', '!><', '?', '=', '!=', '%', '!%', '');
- public static function OnRestServiceBuildDescription(): array
- {
- return array(
- "log" => array(
- "log.blogpost.get" => array("CSocNetLogRestService", "getBlogPost"),
- 'log.blogpost.user.get' => array('callback' => array(__CLASS__, 'getUserBlogPost'), 'options' => array('private' => true)),
- "log.blogpost.add" => array("CSocNetLogRestService", "addBlogPost"),
- "log.blogpost.update" => array("CSocNetLogRestService", "updateBlogPost"),
- "log.blogpost.share" => array("CSocNetLogRestService", "shareBlogPost"),
- "log.blogpost.delete" => array("CSocNetLogRestService", "deleteBlogPost"),
- "log.blogpost.getusers.important" => array("CSocNetLogRestService", "getBlogPostUsersImprtnt"),
- "log.blogcomment.add" => array("CSocNetLogRestService", "addBlogComment"),
- 'log.blogcomment.user.get' => array('callback' => array(__CLASS__, 'getUserBlogComment'), 'options' => array('private' => true)),
- "log.blogcomment.delete" => array("CSocNetLogRestService", "deleteBlogComment"),
- 'log.comment.user.get' => array('callback' => array(__CLASS__, 'getUserLogComment'), 'options' => array('private' => true)),
- "log.comment.delete" => array("CSocNetLogRestService", "deleteLogComment"),
- CRestUtil::EVENTS => array(
- 'onLivefeedPostAdd' => self::createEventInfo('socialnetwork', 'OnAfterSocNetLogAdd', array(CSocNetLogBlogPostRestProxy::class, 'processEvent')),
- 'onLivefeedPostUpdate' => self::createEventInfo('socialnetwork', 'OnAfterSocNetLogUpdate', array(CSocNetLogBlogPostRestProxy::class, 'processEvent')),
- 'onLivefeedPostDelete' => self::createEventInfo('socialnetwork', 'OnSocNetLogDelete', array(CSocNetLogBlogPostRestProxy::class, 'processEvent')),
- ),
- ),
- "sonet_group" => array(
- "sonet_group.get" => array("CSocNetLogRestService", "getGroup"),
- "sonet_group.create" => array("CSocNetLogRestService", "createGroup"),
- "sonet_group.update" => array("CSocNetLogRestService", "updateGroup"),
- "sonet_group.delete" => array("CSocNetLogRestService", "deleteGroup"),
- "sonet_group.setowner" => array("CSocNetLogRestService", "setGroupOwner"),
- "sonet_group.user.get" => array("CSocNetLogRestService", "getGroupUsers"),
- "sonet_group.user.invite" => array("CSocNetLogRestService", "inviteGroupUsers"),
- "sonet_group.user.request" => array("CSocNetLogRestService", "requestGroupUser"),
- "sonet_group.user.add" => array("CSocNetLogRestService", "addGroupUsers"),
- "sonet_group.user.update" => array("CSocNetLogRestService", "updateGroupUsers"),
- "sonet_group.user.delete" => array("CSocNetLogRestService", "deleteGroupUsers"),
- "sonet_group.user.groups" => array("CSocNetLogRestService", "getUserGroups"),
- "sonet_group.feature.access" => array("CSocNetLogRestService", "getGroupFeatureAccess"),
- "sonet_group_subject.get" => array("CSocNetLogRestService", "getGroupSubject"),
- "sonet_group_subject.add" => array("CSocNetLogRestService", "addGroupSubject"),
- "sonet_group_subject.update" => array("CSocNetLogRestService", "updateGroupSubject"),
- "sonet_group_subject.delete" => array("CSocNetLogRestService", "deleteGroupSubject"),
- CRestUtil::EVENTS => array(
- 'onSonetGroupAdd' => self::createEventInfo('socialnetwork', 'OnSocNetGroupAdd', array(CSocNetGroupRestProxy::class, 'processEvent')),
- 'onSonetGroupUpdate' => self::createEventInfo('socialnetwork', 'OnSocNetGroupUpdate', array(CSocNetGroupRestProxy::class, 'processEvent')),
- 'onSonetGroupDelete' => self::createEventInfo('socialnetwork', 'OnSocNetGroupDelete', array(CSocNetGroupRestProxy::class, 'processEvent')),
- 'onSonetGroupSubjectAdd' => self::createEventInfo('socialnetwork', 'OnSocNetGroupSubjectAdd', array(CSocNetGroupSubjectRestProxy::class, 'processEvent')),
- 'onSonetGroupSubjectUpdate' => self::createEventInfo('socialnetwork', 'OnSocNetGroupSubjectUpdate', array(CSocNetGroupSubjectRestProxy::class, 'processEvent')),
- 'onSonetGroupSubjectDelete' => self::createEventInfo('socialnetwork', 'OnSocNetGroupSubjectDelete', array(CSocNetGroupSubjectRestProxy::class, 'processEvent'))
- ),
- CRestUtil::PLACEMENTS => array(
- 'SONET_GROUP_DETAIL_TAB' => array()
- ),
- )
- );
- }
- public static function createEventInfo($moduleName, $eventName, array $callback): array
- {
- return array($moduleName, $eventName, $callback, array('category' => \Bitrix\Rest\Sqs::CATEGORY_DEFAULT));
- }
- private static function getBlogPostEventId(): array
- {
- static $blogPostEventIdList = null;
- if ($blogPostEventIdList === null)
- {
- $blogPostLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\BlogPost;
- $blogPostEventIdList = $blogPostLivefeedProvider->getEventId();
- }
- $arEventId = $blogPostEventIdList;
- $arEventIdFullset = array();
- foreach ($arEventId as $eventId)
- {
- $arEventIdFullset = array_merge($arEventIdFullset, CSocNetLogTools::FindFullSetByEventID($eventId));
- }
- return array_unique($arEventIdFullset);
- }
- private static function getBlogCommentEventId(): ?array
- {
- static $blogCommentEventIdList = null;
- if ($blogCommentEventIdList === null)
- {
- $blogCommentLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\BlogComment;
- $blogCommentEventIdList = $blogCommentLivefeedProvider->getEventId();
- }
- return $blogCommentEventIdList;
- }
- private static function getLogCommentEventId(): ?array
- {
- static $logCommentEventIdList = null;
- if ($logCommentEventIdList === null)
- {
- $logCommentLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\LogComment;
- $logCommentEventIdList = $logCommentLivefeedProvider->getEventId();
- }
- return $logCommentEventIdList;
- }
- public static function getBlogPost($fields, $n, $server): array
- {
- global $USER_FIELD_MANAGER;
- $result = array();
- if (!CModule::IncludeModule("blog"))
- {
- return $result;
- }
- $tzOffset = CTimeZone::getOffset();
- $arOrder = [ 'LOG_UPDATE' => 'DESC' ];
- $res = CUser::getById(self::getCurrentUserId());
- if ($userFields = $res->Fetch())
- {
- $currentUserIntranet = (
- !empty($userFields["UF_DEPARTMENT"])
- && is_array($userFields["UF_DEPARTMENT"])
- && (int)$userFields["UF_DEPARTMENT"][0] > 0
- );
- $extranetSiteId = self::getExtranetSiteId();
- if (
- empty($extranetSiteId)
- || $currentUserIntranet
- )
- {
- $userSiteFields = CSocNetLogComponent::getSiteByDepartmentId($userFields["UF_DEPARTMENT"]);
- if (!empty($userSiteFields))
- {
- $siteId = $userSiteFields['LID'];
- }
- }
- elseif (
- !empty($extranetSiteId)
- && !$currentUserIntranet
- )
- {
- $siteId = $extranetSiteId;
- }
- else
- {
- $siteId = CSite::getDefSite();
- }
- }
- $filter = [
- "EVENT_ID" => self::getBlogPostEventId(),
- "SITE_ID" => [ $siteId, false ],
- "<=LOG_DATE" => "NOW"
- ];
- if (
- isset($fields['POST_ID'])
- && (int)$fields['POST_ID'] > 0
- )
- {
- $filter['SOURCE_ID'] = $fields['POST_ID'];
- }
- elseif (
- isset($fields['LOG_RIGHTS'])
- && is_array($fields['LOG_RIGHTS'])
- )
- {
- $filter["LOG_RIGHTS"] = $fields['LOG_RIGHTS'];
- }
- $arListParams = array(
- "CHECK_RIGHTS" => "Y",
- "USE_FOLLOW" => "N",
- "USE_SUBSCRIBE" => "N"
- );
- $dbLog = CSocNetLog::GetList(
- $arOrder,
- $filter,
- false,
- self::getNavData($n),
- array("ID", "SOURCE_ID"),
- $arListParams
- );
- $arPostId = $arPostIdToGet = array();
- while ($arLog = $dbLog->Fetch())
- {
- $arPostId[] = $arLog["SOURCE_ID"];
- }
- $cacheTtl = 2592000;
- foreach ($arPostId as $key => $postId)
- {
- $cacheId = 'blog_post_socnet_rest_'.$postId.'_ru'.($tzOffset <> 0 ? '_'.$tzOffset : '');
- $cacheDir = ComponentHelper::getBlogPostCacheDir(array(
- 'TYPE' => 'post',
- 'POST_ID' => $postId
- ));
- $obCache = new CPHPCache;
- if ($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
- {
- $result[$key] = $obCache->GetVars();
- }
- else
- {
- $arPostIdToGet[$key] = $postId;
- }
- $obCache->EndDataCache();
- }
- if (!empty($arPostIdToGet))
- {
- foreach ($arPostIdToGet as $key => $postId)
- {
- $cacheId = 'blog_post_socnet_rest_'.$postId.'_ru'.($tzOffset <> 0 ? '_'.$tzOffset : '');
- $cacheDir = ComponentHelper::getBlogPostCacheDir(array(
- 'TYPE' => 'post_general',
- 'POST_ID' => $postId
- ));
- $obCache = new CPHPCache;
- $obCache->InitCache($cacheTtl, $cacheId, $cacheDir);
- $obCache->StartDataCache();
- $dbPost = CBlogPost::GetList(
- array(),
- array("ID" => $postId),
- false,
- false,
- array(
- "ID",
- "BLOG_ID",
- "PUBLISH_STATUS",
- "TITLE",
- "AUTHOR_ID",
- "ENABLE_COMMENTS",
- "NUM_COMMENTS",
- "CODE",
- "MICRO",
- "DETAIL_TEXT",
- "DATE_PUBLISH",
- "CATEGORY_ID",
- "HAS_SOCNET_ALL",
- "HAS_TAGS",
- "HAS_IMAGES",
- "HAS_PROPS",
- "HAS_COMMENT_IMAGES"
- )
- );
- if ($arPost = $dbPost->Fetch())
- {
- if (!empty($arPost['DETAIL_TEXT']))
- {
- $arPost['DETAIL_TEXT'] = Emoji::decode($arPost['DETAIL_TEXT']);
- }
- if ($arPost["PUBLISH_STATUS"] !== BLOG_PUBLISH_STATUS_PUBLISH)
- {
- unset($arPost);
- }
- else
- {
- if (!empty($arPost['DATE_PUBLISH']))
- {
- $arPost['DATE_PUBLISH'] = CRestUtil::convertDateTime($arPost['DATE_PUBLISH']);
- }
- if ($arPost["HAS_PROPS"] !== 'N')
- {
- $arPostFields = $USER_FIELD_MANAGER->GetUserFields("BLOG_POST", $arPost["ID"], LANGUAGE_ID);
- $arPost = array_merge($arPost, $arPostFields);
- }
- if (
- !empty($arPost['UF_BLOG_POST_FILE'])
- && !empty($arPost['UF_BLOG_POST_FILE']['VALUE'])
- )
- {
- $arPost['FILES'] = $arPost['UF_BLOG_POST_FILE']['VALUE'];
- }
- $result[$key] = $arPost;
- }
- }
- $obCache->EndDataCache($arPost);
- }
- }
- ksort($result);
- return self::setNavData($result, $dbLog);
- }
- public static function getUserBlogPost($arParams, $offset, CRestServer $server): array
- {
- $arParams = array_change_key_case($arParams, CASE_UPPER);
- $result = Array(
- 'POSTS' => array(),
- 'FILES' => array(),
- );
- if (!Loader::includeModule("blog"))
- {
- return $result;
- }
- $userId = (int)(
- isset($arParams["USER_ID"])
- && (int)$arParams["USER_ID"] > 0
- && self::isAdmin()
- ? $arParams["USER_ID"]
- : self::getCurrentUserId()
- );
- $otherUserMode = ($userId !== self::getCurrentUserId());
- if ($userId <= 0)
- {
- throw new Bitrix\Rest\RestException("User ID can't be empty", "ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
- }
- if (isset($arParams['FIRST_ID']))
- {
- $options['FIRST_ID'] = (int)$arParams['FIRST_ID'];
- }
- else
- {
- $options['LAST_ID'] = isset($arParams['LAST_ID']) && (int)$arParams['LAST_ID'] > 0 ? (int)$arParams['LAST_ID'] : 0;
- }
- $options['LIMIT'] = isset($arParams['LIMIT'])? ((int)$arParams['LIMIT'] > 1000 ? 1000 : (int)$arParams['LIMIT']) : 100;
- $filter = [
- '=USER_ID' => $userId,
- '@EVENT_ID' => self::getBlogPostEventId()
- ];
- if (isset($options['FIRST_ID']))
- {
- $order = [];
- if ((int)$options['FIRST_ID'] > 0)
- {
- $filter['>ID'] = $options['FIRST_ID'];
- }
- }
- else
- {
- $order = [ 'ID' => 'DESC' ];
- if (isset($options['LAST_ID']) && (int)$options['LAST_ID'] > 0)
- {
- $filter['<ID'] = (int)$options['LAST_ID'];
- }
- }
- $logIdList = array();
- $res = Bitrix\Socialnetwork\LogTable::getList(array(
- 'filter' => $filter,
- 'select' => array(
- 'ID', 'SOURCE_ID'
- ),
- 'order' => $order,
- 'limit' => $options['LIMIT']
- ));
- $postIdList = array();
- while ($logFields = $res->fetch())
- {
- if ((int)$logFields['SOURCE_ID'] > 0)
- {
- $postIdList[] = $logFields['SOURCE_ID'];
- $logIdList[$logFields['SOURCE_ID']] = $logFields['ID'];
- }
- }
- $postIdList = array_unique($postIdList);
- if (empty($postIdList))
- {
- return $result;
- }
- $res = Bitrix\Blog\PostTable::getList([
- 'filter' => [
- '@ID' => $postIdList,
- ],
- 'select' => [
- 'ID', 'DATE_CREATE', 'TITLE', 'DETAIL_TEXT', 'UF_BLOG_POST_FILE'
- ],
- 'order' => [ 'ID' => 'DESC' ],
- ]);
- $attachedIdList = [];
- $postAttachedList = [];
- while ($postFields = $res->fetch())
- {
- $result['POSTS'][$postFields['ID']] = [
- 'ID' => (int)$logIdList[$postFields['ID']],
- 'POST_ID' => (int)$postFields['ID'],
- 'DATE_CREATE' => $postFields['DATE_CREATE'],
- 'TITLE' => ($otherUserMode ? '' : (string)$postFields['TITLE']),
- 'TEXT' => ($otherUserMode ? '' : (string)$postFields['DETAIL_TEXT']),
- 'ATTACH' => [],
- ];
- if (!empty($postFields['UF_BLOG_POST_FILE']))
- {
- if (is_array($postFields['UF_BLOG_POST_FILE']))
- {
- $attached = $postFields['UF_BLOG_POST_FILE'];
- }
- elseif ((int)$postFields['UF_BLOG_POST_FILE'] > 0)
- {
- $attached = array((int)$postFields['UF_BLOG_POST_FILE']);
- }
- else
- {
- $attached = array();
- }
- if (!empty($attached))
- {
- $attachedIdList = array_merge($attachedIdList, $attached);
- }
- $postAttachedList[$postFields['ID']] = $attached;
- }
- }
- $attachedObjectList = [];
- if (
- !empty($attachedIdList)
- && Loader::includeModule('disk')
- )
- {
- $res = Bitrix\Disk\AttachedObject::getList([
- 'filter' => [
- '@ID' => array_unique($attachedIdList)
- ],
- 'select' => [ 'ID', 'OBJECT_ID' ],
- ]);
- while ($attachedObjectFields = $res->fetch())
- {
- $diskObjectId = $attachedObjectFields['OBJECT_ID'];
- if ($fileData = self::getFileData($diskObjectId))
- {
- $attachedObjectList[$attachedObjectFields['ID']] = $diskObjectId;
- $result['FILES'][$diskObjectId] = $fileData;
- }
- }
- }
- foreach ($result['POSTS'] as $key => $value)
- {
- if ($value['DATE_CREATE'] instanceof \Bitrix\Main\Type\DateTime)
- {
- $result['POSTS'][$key]['DATE_CREATE'] = date('c', $value['DATE_CREATE']->getTimestamp());
- }
- if (!empty($postAttachedList[$key]))
- {
- foreach ($postAttachedList[$key] as $attachedId)
- {
- if (!empty($attachedObjectList[$attachedId]))
- {
- $result['POSTS'][$key]['ATTACH'][] = $attachedObjectList[$attachedId];
- }
- }
- }
- $result['POSTS'][$key] = array_change_key_case($result['POSTS'][$key], CASE_LOWER);
- }
- $result['POSTS'] = array_values($result['POSTS']);
- $result['FILES'] = self::convertFileData($result['FILES']);
- return $result;
- }
- public static function addBlogPost($arFields)
- {
- global $APPLICATION;
- try
- {
- $postId = Helper::addBlogPost($arFields, \Bitrix\Main\Engine\Controller::SCOPE_REST);
- if ($postId <= 0)
- {
- $e = $APPLICATION->getException();
- throw new Exception($e ? $e->getString() : 'Cannot add blog post');
- }
- }
- catch (Exception $e)
- {
- throw new Exception($e->getMessage(), $e->getCode());
- }
- return $postId;
- }
- public static function updateBlogPost($arFields)
- {
- global $APPLICATION;
- try
- {
- $postId = Helper::updateBlogPost($arFields, \Bitrix\Main\Engine\Controller::SCOPE_REST);
- if ($postId <= 0)
- {
- $e = $APPLICATION->getException();
- throw new Exception($e ? $e->getString() : 'Cannot update blog post');
- }
- }
- catch (Exception $e)
- {
- throw new Exception($e->getMessage(), $e->getCode());
- }
- return $postId;
- }
- public static function deleteBlogPost($arFields): bool
- {
- try
- {
- $result = Helper::deleteBlogPost([
- 'POST_ID' => (int)$arFields['POST_ID'],
- ]);
- }
- catch (Exception $e)
- {
- throw new Exception($e->getMessage(), $e->getCode());
- }
- return $result;
- }
- public static function shareBlogPost($fields): bool
- {
- $postId = (int)$fields['POST_ID'];
- if ($postId <= 0)
- {
- throw new Exception('Wrong post ID');
- }
- if (!Loader::includeModule('blog'))
- {
- throw new Exception('Blog module not installed');
- }
- $siteId = (
- is_set($fields, "SITE_ID")
- && !empty($fields["SITE_ID"])
- ? $fields["SITE_ID"]
- : SITE_ID
- );
- $blogId = false;
- if (
- !is_set($fields, "BLOG_ID")
- || (int)$fields["BLOG_ID"] <= 0
- )
- {
- $res = \Bitrix\Blog\PostTable::getList(array(
- 'filter' => array(
- '=ID' => $postId
- ),
- 'select' => array('BLOG_ID')
- ));
- if (
- ($postFields = $res->fetch())
- && !empty($postFields['BLOG_ID'])
- )
- {
- $blogId = (int)$postFields['BLOG_ID'];
- }
- }
- else
- {
- $blogId = (int)$fields["BLOG_ID"];
- }
- $blogPostPermsNewList = $fields['DEST'];
- if (!is_array($blogPostPermsNewList))
- {
- $blogPostPermsNewList = array($blogPostPermsNewList);
- }
- foreach ($blogPostPermsNewList as $key => $code)
- {
- if (
- $code !== 'UA'
- && !preg_match('/^SG(\d+)$/', $code, $matches)
- && !preg_match('/^U(\d+)$/', $code, $matches)
- && !preg_match('/^UE(.+)$/', $code, $matches)
- && !preg_match('/^DR(\d+)$/', $code, $matches)
- )
- {
- unset($blogPostPermsNewList[$key]);
- }
- }
- if (empty($blogPostPermsNewList))
- {
- throw new Exception('Wrong destinations');
- }
- $currentUserId = (
- isset($fields["USER_ID"])
- && (int)$fields["USER_ID"] > 0
- && self::isAdmin()
- ? $fields["USER_ID"]
- : self::getCurrentUserId()
- );
- $currentUserPerm = self::getBlogPostPerm(array(
- 'USER_ID' => $currentUserId,
- 'POST_ID' => $postId
- ));
- if ($currentUserPerm <= \Bitrix\Blog\Item\Permissions::READ)
- {
- throw new Exception('No read perms');
- }
- $resultFields = array(
- 'ERROR_MESSAGE' => false,
- 'PUBLISH_STATUS' => BLOG_PUBLISH_STATUS_PUBLISH
- );
- if (ModuleManager::isModuleInstalled('mail')
- && ModuleManager::isModuleInstalled('intranet')
- && (
- !Loader::includeModule('bitrix24')
- || CBitrix24::isEmailConfirmed()
- )
- )
- {
- $destinationList = $blogPostPermsNewList;
- ComponentHelper::processBlogPostNewMailUserDestinations($destinationList);
- $blogPostPermsNewList = array_unique($destinationList);
- }
- $permsNew = ComponentHelper::checkBlogPostDestinationList(array(
- 'DEST' => $blogPostPermsNewList,
- 'SITE_ID' => $siteId,
- 'AUTHOR_ID' => $currentUserId,
- ), $resultFields);
- if ($resultFields['ERROR_MESSAGE'])
- {
- throw new Exception($resultFields['ERROR_MESSAGE']);
- }
- elseif ($resultFields['PUBLISH_STATUS'] !== BLOG_PUBLISH_STATUS_PUBLISH)
- {
- throw new Exception('No permissions to share by this user (ID =' . $currentUserId . ')');
- }
- $permsFull = array();
- $blogPostPermsOldList = CBlogPost::getSocNetPerms($postId);
- foreach ($blogPostPermsOldList as $type => $val)
- {
- foreach ($val as $id => $values)
- {
- if ($type !== 'U')
- {
- $permsFull[] = $type.$id;
- }
- else
- {
- $permsFull[] = (
- in_array('US' . $id, $values, true)
- ? 'UA'
- : $type . $id
- );
- }
- }
- }
- foreach ($permsNew as $key => $code)
- {
- if (!in_array($code, $permsFull))
- {
- $permsFull[] = $code;
- }
- else
- {
- unset($permsNew[$key]);
- }
- }
- if (!empty($permsNew))
- {
- ComponentHelper::processBlogPostShare(
- array(
- "POST_ID" => $postId,
- "BLOG_ID" => $blogId,
- "SITE_ID" => $siteId,
- "SONET_RIGHTS" => $permsFull,
- "NEW_RIGHTS" => $permsNew,
- "USER_ID" => $currentUserId
- ),
- array(
- 'PATH_TO_POST' => \Bitrix\Socialnetwork\Helper\Path::get('userblogpost_page', $siteId)
- )
- );
- }
- return true;
- }
- public static function getBlogPostUsersImprtnt($fields): array
- {
- global $CACHE_MANAGER;
- if (!is_array($fields))
- {
- throw new Exception('Incorrect input data');
- }
- $arParams["postId"] = (int)$fields['POST_ID'];
- if ($arParams['postId'] <= 0)
- {
- throw new Exception('Wrong post ID');
- }
- $arParams["nTopCount"] = 500;
- $arParams["paramName"] = 'BLOG_POST_IMPRTNT';
- $arParams["paramValue"] = 'Y';
- $result = array();
- $cache = new CPHPCache();
- $cache_id = "blog_post_param_".serialize(array(
- $arParams["postId"],
- $arParams["nTopCount"],
- $arParams["paramName"],
- $arParams["paramValue"]
- ));
- $cache_path = $CACHE_MANAGER->GetCompCachePath(CComponentEngine::MakeComponentPath("socialnetwork.blog.blog"))."/".$arParams["postId"];
- $cache_time = (defined("BX_COMP_MANAGED_CACHE") ? 3600*24*365 : 600);
- if ($cache->InitCache($cache_time, $cache_id, $cache_path))
- {
- $result = $cache->GetVars();
- }
- else
- {
- $cache->StartDataCache($cache_time, $cache_id, $cache_path);
- if (CModule::IncludeModule("blog"))
- {
- if (defined("BX_COMP_MANAGED_CACHE"))
- {
- $CACHE_MANAGER->StartTagCache($cache_path);
- $CACHE_MANAGER->RegisterTag($arParams["paramName"].$arParams["postId"]);
- }
- if ($arBlogPost = CBlogPost::GetByID($arParams["postId"]))
- {
- $postPerms = CBlogPost::GetSocNetPostPerms($arParams["postId"], true, self::getCurrentUserId(), $arBlogPost["AUTHOR_ID"]);
- if ($postPerms >= BLOG_PERMS_READ)
- {
- $res = CBlogUserOptions::GetList(
- [],
- [
- 'POST_ID' => $arParams["postId"],
- 'NAME' => $arParams["paramName"],
- 'VALUE' => $arParams["paramValue"],
- 'USER_ACTIVE' => 'Y',
- ],
- [
- "nTopCount" => $arParams["nTopCount"],
- 'SELECT' => [ 'USER_ID' ],
- ]
- );
- if ($res)
- {
- while ($userOptionFields = $res->fetch())
- {
- $result[] = $userOptionFields['USER_ID'];
- }
- }
- }
- }
- if (defined("BX_COMP_MANAGED_CACHE"))
- {
- $CACHE_MANAGER->EndTagCache();
- }
- $cache->EndDataCache($result);
- }
- }
- return $result;
- }
- public static function getUserBlogComment($arParams, $offset, CRestServer $server): array
- {
- $arParams = array_change_key_case($arParams, CASE_UPPER);
- $result = Array(
- 'COMMENTS' => array(),
- 'FILES' => array(),
- );
- if (!Loader::includeModule("blog"))
- {
- return $result;
- }
- $userId = (int)(
- isset($arParams["USER_ID"])
- && (int)$arParams['USER_ID'] > 0
- && self::isAdmin()
- ? $arParams["USER_ID"]
- : self::getCurrentUserId()
- );
- $otherUserMode = ($userId !== self::getCurrentUserId());
- if ($userId <= 0)
- {
- throw new Bitrix\Rest\RestException("User ID can't be empty", "ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
- }
- if (isset($arParams['FIRST_ID']))
- {
- $options['FIRST_ID'] = (int)$arParams['FIRST_ID'];
- }
- else
- {
- $options['LAST_ID'] = (
- isset($arParams['LAST_ID']) && (int)$arParams['LAST_ID'] > 0
- ? (int)$arParams['LAST_ID']
- : 0
- );
- }
- $options['LIMIT'] = (
- isset($arParams['LIMIT'])
- ? (
- (int)$arParams['LIMIT'] > 1000
- ? 1000
- : (int)$arParams['LIMIT'])
- : 100
- );
- $filter = [
- '=USER_ID' => $userId,
- '@EVENT_ID' => self::getBlogCommentEventId(),
- ];
- if (isset($options['FIRST_ID']))
- {
- $order = array();
- if ((int)$options['FIRST_ID'] > 0)
- {
- $filter['>ID'] = $options['FIRST_ID'];
- }
- }
- else
- {
- $order = Array('ID' => 'DESC');
- if (isset($options['LAST_ID']) && (int)$options['LAST_ID'] > 0)
- {
- $filter['<ID'] = (int)$options['LAST_ID'];
- }
- }
- $logCommentIdList = array();
- $res = Bitrix\Socialnetwork\LogCommentTable::getList(array(
- 'filter' => $filter,
- 'select' => array(
- 'ID', 'SOURCE_ID'
- ),
- 'order' => $order,
- 'limit' => $options['LIMIT']
- ));
- $commentIdList = [];
- while ($logCommentFields = $res->fetch())
- {
- if ((int)$logCommentFields['SOURCE_ID'] > 0)
- {
- $commentIdList[] = $logCommentFields['SOURCE_ID'];
- $logCommentIdList[$logCommentFields['SOURCE_ID']] = $logCommentFields['ID'];
- }
- }
- $commentIdList = array_unique($commentIdList);
- if (empty($commentIdList))
- {
- return $result;
- }
- $res = Bitrix\Blog\CommentTable::getList(array(
- 'filter' => array(
- '@ID' => $commentIdList
- ),
- 'select' => array(
- 'ID', 'AUTHOR_ID', 'POST_ID', 'DATE_CREATE', 'POST_TEXT', 'SHARE_DEST', 'UF_BLOG_COMMENT_FILE'
- ),
- 'order' => array('ID' => 'DESC')
- ));
- $attachedIdList = array();
- $commentAttachedList = array();
- $loadedSocialnetwork = Loader::includeModule('socialnetwork');
- while ($commentFields = $res->fetch())
- {
- $result['COMMENTS'][$commentFields['ID']] = array(
- 'ID' => (int)$logCommentIdList[$commentFields['ID']],
- 'COMMENT_ID' => (int)$commentFields['ID'],
- 'POST_ID' => (int)$commentFields['POST_ID'],
- 'DATE' => $commentFields['DATE_CREATE'],
- 'TEXT' => ($otherUserMode ? '' : (string)$commentFields['POST_TEXT']),
- 'ATTACH' => array()
- );
- if (
- $loadedSocialnetwork
- && ($commentAuxProvider = \Bitrix\Socialnetwork\CommentAux\Base::findProvider(
- $commentFields,
- array(
- "mobile" => false,
- "bPublicPage" => true,
- "cache" => true
- )
- )
- ))
- {
- $result['COMMENTS'][$commentFields['ID']]['TEXT'] = $commentAuxProvider->getText();
- }
- if (!empty($commentFields['UF_BLOG_COMMENT_FILE']))
- {
- if (is_array($commentFields['UF_BLOG_COMMENT_FILE']))
- {
- $attached = $commentFields['UF_BLOG_COMMENT_FILE'];
- }
- elseif ((int)$commentFields['UF_BLOG_COMMENT_FILE'] > 0)
- {
- $attached = [ (int)$commentFields['UF_BLOG_COMMENT_FILE'] ];
- }
- else
- {
- $attached = [];
- }
- if (!empty($attached))
- {
- $attachedIdList = array_merge($attachedIdList, $attached);
- }
- $commentAttachedList[$commentFields['ID']] = $attached;
- }
- }
- $attachedObjectList = array();
- if (
- !empty($attachedIdList)
- && Loader::includeModule('disk')
- )
- {
- $res = Bitrix\Disk\AttachedObject::getList(array(
- 'filter' => array(
- '@ID' => array_unique($attachedIdList)
- ),
- 'select' => array('ID', 'OBJECT_ID')
- ));
- while ($attachedObjectFields = $res->fetch())
- {
- $diskObjectId = $attachedObjectFields['OBJECT_ID'];
- if ($fileData = self::getFileData($diskObjectId))
- {
- $attachedObjectList[$attachedObjectFields['ID']] = $diskObjectId;
- $result['FILES'][$diskObjectId] = $fileData;
- }
- }
- }
- foreach ($result['COMMENTS'] as $key => $value)
- {
- if ($value['DATE'] instanceof \Bitrix\Main\Type\DateTime)
- {
- $result['COMMENTS'][$key]['DATE'] = date('c', $value['DATE']->getTimestamp());
- }
- if (!empty($commentAttachedList[$key]))
- {
- foreach ($commentAttachedList[$key] as $attachedId)
- {
- if (!empty($attachedObjectList[$attachedId]))
- {
- $result['COMMENTS'][$key]['ATTACH'][] = $attachedObjectList[$attachedId];
- }
- }
- }
- $result['COMMENTS'][$key] = array_change_key_case($result['COMMENTS'][$key], CASE_LOWER);
- }
- $result['COMMENTS'] = array_values($result['COMMENTS']);
- $result['FILES'] = self::convertFileData($result['FILES']);
- return $result;
- }
- public static function addBlogComment($fields): int
- {
- $authorId = (int)(
- isset($fields["USER_ID"])
- && (int)$fields["USER_ID"] > 0
- && self::isAdmin()
- ? $fields["USER_ID"]
- : self::getCurrentUserId()
- );
- if (!Loader::includeModule('blog'))
- {
- throw new Exception('No blog module installed');
- }
- $postId = (int)$fields['POST_ID'];
- if ($postId <= 0)
- {
- throw new Exception('No post found');
- }
- $res = CBlogPost::getList(
- array(),
- array(
- "ID" => $postId
- ),
- false,
- false,
- array("ID", "BLOG_ID", "AUTHOR_ID", "BLOG_OWNER_ID", "TITLE")
- );
- $post = $res->fetch();
- if (!$post)
- {
- throw new Exception('No post found');
- }
- $blog = CBlog::getById($post["BLOG_ID"]);
- if (!$blog)
- {
- throw new Exception('No blog found');
- }
- if (
- empty($fields["FILES"])
- && !\Bitrix\Blog\Item\Comment::checkDuplicate(array(
- 'MESSAGE' => $fields["TEXT"],
- 'BLOG_ID' => $post['BLOG_ID'],
- 'POST_ID' => $post['ID'],
- 'AUTHOR_ID' => $authorId,
- ))
- )
- {
- throw new Exception('Duplicate comment');
- }
- $userIP = CBlogUser::getUserIP();
- $commentFields = array(
- "POST_ID" => $post['ID'],
- "BLOG_ID" => $post['BLOG_ID'],
- "TITLE" => '',
- "POST_TEXT" => $fields["TEXT"],
- "DATE_CREATE" => convertTimeStamp(time() + CTimeZone::getOffset(), "FULL"),
- "AUTHOR_IP" => $userIP[0],
- "AUTHOR_IP1" => $userIP[1],
- "URL" => $blog["URL"],
- "PARENT_ID" => false,
- "SEARCH_GROUP_ID" => $blog['GROUP_ID'],
- "AUTHOR_ID" => $authorId
- );
- $perm = \Bitrix\Blog\Item\Permissions::DENY;
- if ((int)$post['AUTHOR_ID'] === $authorId)
- {
- $perm = \Bitrix\Blog\Item\Permissions::FULL;
- }
- else
- {
- $postPerm = CBlogPost::getSocNetPostPerms($post["ID"]);
- if ($postPerm > \Bitrix\Blog\Item\Permissions::DENY)
- {
- $perm = CBlogComment::getSocNetUserPerms($post["ID"], $post["AUTHOR_ID"]);
- }
- }
- if ($perm === \Bitrix\Blog\Item\Permissions::DENY)
- {
- throw new Exception('No permissions');
- }
- if ($perm === \Bitrix\Blog\Item\Permissions::PREMODERATE)
- {
- $commentFields["PUBLISH_STATUS"] = BLOG_PUBLISH_STATUS_READY;
- }
- $result = CBlogComment::add($commentFields);
- if (!$result)
- {
- throw new Exception('Blog comment hasn\'t been added');
- }
- if (
- isset($fields["FILES"])
- && Option::get('disk', 'successfully_converted', false)
- && Loader::includeModule('disk')
- && ($storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($authorId))
- && ($folder = $storage->getFolderForUploadedFiles())
- )
- {
- // upload to storage
- $filesList = array();
- foreach ($fields["FILES"] as $tmp)
- {
- $fileFields = CRestUtil::saveFile($tmp);
- if (is_array($fileFields))
- {
- $file = $folder->uploadFile(
- $fileFields, // file array
- array(
- 'NAME' => $fileFields["name"],
- 'CREATED_BY' => $authorId
- ),
- array(),
- true
- );
- if ($file)
- {
- $filesList[] = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX.$file->getId();
- }
- }
- }
- if (!empty($filesList)) // update post
- {
- CBlogComment::update(
- $result,
- array(
- "HAS_PROPS" => "Y",
- "UF_BLOG_COMMENT_FILE" => $filesList
- )
- );
- }
- }
- \Bitrix\Blog\Item\Comment::actionsAfter(array(
- 'MESSAGE' => $commentFields["POST_TEXT"],
- 'BLOG_ID' => $post["BLOG_ID"],
- 'BLOG_OWNER_ID' => $post["BLOG_OWNER_ID"],
- 'POST_ID' => $post["ID"],
- 'POST_TITLE' => $post["TITLE"],
- 'POST_AUTHOR_ID' => $post["AUTHOR_ID"],
- 'COMMENT_ID' => $result,
- 'AUTHOR_ID' => $authorId,
- ));
- return $result;
- }
- public static function deleteBlogComment($fields): bool
- {
- $commentId = (int)$fields['COMMENT_ID'];
- if ($commentId <= 0)
- {
- throw new Exception('Wrong comment ID');
- }
- if (!Loader::includeModule('blog'))
- {
- throw new Exception('Blog module not installed');
- }
- $currentUserId = (
- isset($fields["USER_ID"])
- && (int)$fields["USER_ID"] > 0
- && self::isAdmin()
- ? $fields["USER_ID"]
- : self::getCurrentUserId()
- );
- $currentUserPerm = self::getBlogCommentPerm(array(
- 'USER_ID' => $currentUserId,
- 'COMMENT_ID' => $commentId
- ));
- if ($currentUserPerm < \Bitrix\Blog\Item\Permissions::FULL)
- {
- throw new Exception('No delete perms');
- }
- $commentFields = \Bitrix\Blog\Item\Comment::getById($commentId)->getFields();
- if (empty($commentId))
- {
- throw new Exception('No comment found');
- }
- if ($result = CBlogComment::Delete($commentId))
- {
- BXClearCache(true, ComponentHelper::getBlogPostCacheDir(array(
- 'TYPE' => 'post_comments',
- 'POST_ID' => $commentFields["POST_ID"]
- )));
- CBlogComment::DeleteLog($commentId);
- }
- return (bool)$result;
- }
- public static function getUserLogComment($arParams, $offset, CRestServer $server): array
- {
- $arParams = array_change_key_case($arParams, CASE_UPPER);
- $result = [
- 'COMMENTS' => [],
- 'FILES' => [],
- ];
- $userId = (int)(
- isset($arParams["USER_ID"])
- && (int)$arParams["USER_ID"] > 0
- && self::isAdmin()
- ? $arParams["USER_ID"]
- : self::getCurrentUserId()
- );
- $otherUserMode = ($userId !== self::getCurrentUserId());
- if ($userId <= 0)
- {
- throw new Bitrix\Rest\RestException("User ID can't be empty", "ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
- }
- if (isset($arParams['FIRST_ID']))
- {
- $options['FIRST_ID'] = (int)$arParams['FIRST_ID'];
- }
- else
- {
- $options['LAST_ID'] = (
- isset($arParams['LAST_ID'])
- && (int)$arParams['LAST_ID'] > 0
- ? (int)$arParams['LAST_ID']
- : 0
- );
- }
- $options['LIMIT'] = (
- isset($arParams['LIMIT'])
- ? (
- (int)$arParams['LIMIT'] > 1000
- ? 1000
- : (int)$arParams['LIMIT'])
- : 100
- );
- $filter = array(
- '=USER_ID' => $userId,
- '@EVENT_ID' => self::getLogCommentEventId()
- );
- if (isset($options['FIRST_ID']))
- {
- $order = array();
- if ((int)$options['FIRST_ID'] > 0)
- {
- $filter['>ID'] = $options['FIRST_ID'];
- }
- }
- else
- {
- $order = [ 'ID' => 'DESC' ];
- if (isset($options['LAST_ID']) && (int)$options['LAST_ID'] > 0)
- {
- $filter['<ID'] = (int)$options['LAST_ID'];
- }
- }
- $res = Bitrix\Socialnetwork\LogCommentTable::getList(array(
- 'filter' => $filter,
- 'select' => array(
- 'ID', 'LOG_ID', 'LOG_DATE', 'MESSAGE', 'UF_SONET_COM_DOC'
- ),
- 'order' => $order,
- 'limit' => $options['LIMIT']
- ));
- $attachedIdList = array();
- while ($commentFields = $res->fetch())
- {
- $result['COMMENTS'][$commentFields['ID']] = array(
- 'ID' => (int)$commentFields['ID'],
- 'COMMENT_ID' => (int)$commentFields['ID'],
- 'LOG_ID' => (int)$commentFields['LOG_ID'],
- 'DATE' => $commentFields['LOG_DATE'],
- 'TEXT' => ($otherUserMode ? '' : (string)$commentFields['MESSAGE']),
- 'ATTACH' => array()
- );
- if (!empty($commentFields['UF_SONET_COM_DOC']))
- {
- if (is_array($commentFields['UF_SONET_COM_DOC']))
- {
- $attached = $commentFields['UF_SONET_COM_DOC'];
- }
- elseif ((int)$commentFields['UF_SONET_COM_DOC'] > 0)
- {
- $attached = array((int)$commentFields['UF_SONET_COM_DOC']);
- }
- else
- {
- $attached = array();
- }
- if (!empty($attached))
- {
- $attachedIdList = array_merge($attachedIdList, $attached);
- }
- $commentAttachedList[$commentFields['ID']] = $attached;
- }
- }
- $attachedObjectList = array();
- if (
- !empty($attachedIdList)
- && Loader::includeModule('disk')
- )
- {
- $res = Bitrix\Disk\AttachedObject::getList(array(
- 'filter' => array(
- '@ID' => array_unique($attachedIdList)
- ),
- 'select' => array('ID', 'OBJECT_ID')
- ));
- while ($attachedObjectFields = $res->fetch())
- {
- $diskObjectId = $attachedObjectFields['OBJECT_ID'];
- if ($fileData = self::getFileData($diskObjectId))
- {
- $attachedObjectList[$attachedObjectFields['ID']] = $diskObjectId;
- $result['FILES'][$diskObjectId] = $fileData;
- }
- }
- }
- foreach ($result['COMMENTS'] as $key => $value)
- {
- if ($value['DATE'] instanceof \Bitrix\Main\Type\DateTime)
- {
- $result['COMMENTS'][$key]['DATE'] = date('c', $value['DATE']->getTimestamp());
- }
- if (!empty($commentAttachedList[$key]))
- {
- foreach ($commentAttachedList[$key] as $attachedId)
- {
- if (!empty($attachedObjectList[$attachedId]))
- {
- $result['COMMENTS'][$key]['ATTACH'][] = $attachedObjectList[$attachedId];
- }
- }
- }
- $result['COMMENTS'][$key] = array_change_key_case($result['COMMENTS'][$key], CASE_LOWER);
- }
- $result['COMMENTS'] = array_values($result['COMMENTS']);
- $result['FILES'] = self::convertFileData($result['FILES']);
- return $result;
- }
- public static function deleteLogComment($arFields): bool
- {
- $commentId = (int)$arFields['COMMENT_ID'];
- if ($commentId <= 0)
- {
- throw new Exception('Wrong comment ID');
- }
- $currentUserId = (
- isset($arFields["USER_ID"])
- && (int)$arFields["USER_ID"] > 0
- && self::isAdmin()
- ? $arFields["USER_ID"]
- : self::getCurrentUserId()
- );
- $commentFields = \Bitrix\Socialnetwork\Item\LogComment::getById($commentId)->getFields();
- if (empty($commentFields))
- {
- throw new Exception('No comment found');
- }
- $currentUserPerm = self::getLogCommentPerm(array(
- 'USER_ID' => $currentUserId,
- 'COMMENT_ID' => $commentId
- ));
- if ($currentUserPerm < self::PERM_WRITE)
- {
- throw new Exception('No write perms');
- }
- $result = CSocNetLogComments::Delete($commentId);
- return (bool)$result;
- }
- private static function getBlogPostPerm($fields)
- {
- return Helper::getBlogPostPerm($fields);
- }
- private static function getBlogCommentPerm($fields)
- {
- if (!Loader::includeModule('blog'))
- {
- throw new Exception('Blog module not installed');
- }
- $result = Bitrix\Blog\Item\Permissions::DENY;
- $commentId = $fields['COMMENT_ID'];
- $currentUserId = (int)(
- isset($fields["USER_ID"])
- && (int)$fields['USER_ID'] > 0
- && self::isAdmin()
- ? $fields["USER_ID"]
- : self::getCurrentUserId()
- );
- $arComment = self::getBlogCommentFields($commentId);
- if (empty($arComment))
- {
- return $result;
- }
- if ((int)$arComment["AUTHOR_ID"] === $currentUserId)
- {
- $result = Bitrix\Blog\Item\Permissions::FULL;
- }
- elseif (CSocNetUser::isUserModuleAdmin($currentUserId, SITE_ID))
- {
- $result = Bitrix\Blog\Item\Permissions::FULL;
- }
- elseif ($arComment['PUBLISH_STATUS'] === BLOG_PUBLISH_STATUS_PUBLISH)
- {
- $postItem = \Bitrix\Blog\Item\Post::getById($arComment['POST_ID']);
- $permsResult = $postItem->getSonetPerms(array(
- "CHECK_FULL_PERMS" => true
- ));
- $result = $permsResult['PERM'];
- if (
- $result <= \Bitrix\Blog\Item\Permissions::READ
- && $permsResult['READ_BY_OSG']
- )
- {
- $result = Bitrix\Blog\Item\Permissions::READ;
- }
- elseif ($result > \Bitrix\Blog\Item\Permissions::READ)
- {
- $result = \Bitrix\Blog\Item\Permissions::READ;
- }
- }
- return $result;
- }
- private static function getLogCommentPerm($arFields): string
- {
- $result = self::PERM_DENY;
- $commentId = $arFields['COMMENT_ID'];
- $currentUserId = (int)(
- isset($arFields["USER_ID"])
- && (int)$arFields["USER_ID"] > 0
- && self::isAdmin()
- ? $arFields["USER_ID"]
- : self::getCurrentUserId()
- );
- if (
- CSocNetUser::isUserModuleAdmin($currentUserId, SITE_ID)
- || (
- ($arComment = self::getLogCommentFields($commentId))
- && (int)$arComment['USER_ID'] === $currentUserId
- )
- )
- {
- $result = self::PERM_WRITE;
- }
- return $result;
- }
- private static function getBlogCommentFields($commentId): array
- {
- $result = array();
- if ($commentItem = \Bitrix\Blog\Item\Comment::getById($commentId))
- {
- $result = $commentItem->getFields();
- }
- return $result;
- }
- private static function getLogCommentFields($commentId): array
- {
- $result = array();
- if ($commentItem = \Bitrix\Socialnetwork\Item\LogComment::getById($commentId))
- {
- $result = $commentItem->getFields();
- }
- return $result;
- }
- private static function getFileData($diskObjectId)
- {
- $result = false;
- $diskObjectId = (int)$diskObjectId;
- if ($diskObjectId <= 0)
- {
- return $result;
- }
- if ($fileModel = \Bitrix\Disk\File::getById($diskObjectId))
- {
- /** @var \Bitrix\Disk\File $fileModel */
- $contentType = 'file';
- $imageParams = false;
- if (\Bitrix\Disk\TypeFile::isImage($fileModel->getName()))
- {
- $contentType = 'image';
- $params = $fileModel->getFile();
- $imageParams = Array(
- 'width' => (int)$params['WIDTH'],
- 'height' => (int)$params['HEIGHT'],
- );
- }
- else if (\Bitrix\Disk\TypeFile::isVideo($fileModel->getName()))
- {
- $contentType = 'video';
- $params = $fileModel->getView()->getPreviewData();
- $imageParams = Array(
- 'width' => (int)$params['WIDTH'],
- 'height' => (int)$params['HEIGHT'],
- );
- }
- $isImage = \Bitrix\Disk\TypeFile::isImage($fileModel);
- $urlManager = \Bitrix\Disk\Driver::getInstance()->getUrlManager();
- $result = array(
- 'id' => (int)$fileModel->getId(),
- 'date' => $fileModel->getCreateTime(),
- 'type' => $contentType,
- 'name' => $fileModel->getName(),
- 'size' => (int)$fileModel->getSize(),
- 'image' => $imageParams,
- 'authorId' => (int)$fileModel->getCreatedBy(),
- 'authorName' => CUser::FormatName(CSite::getNameFormat(false), $fileModel->getCreateUser(), true, true),
- 'urlPreview' => (
- $fileModel->getPreviewId()
- ? $urlManager->getUrlForShowPreview($fileModel, [ 'width' => 640, 'height' => 640])
- : (
- $isImage
- ? $urlManager->getUrlForShowFile($fileModel, [ 'width' => 640, 'height' => 640])
- : null
- )
- ),
- 'urlShow' => ($isImage ? $urlManager->getUrlForShowFile($fileModel) : $urlManager->getUrlForDownloadFile($fileModel)),
- 'urlDownload' => $urlManager->getUrlForDownloadFile($fileModel)
- );
- }
- return $result;
- }
- private static function convertFileData($fileData): array
- {
- if (!is_array($fileData))
- {
- return array();
- }
- foreach ($fileData as $key => $value)
- {
- if ($value['date'] instanceof \Bitrix\Main\Type\DateTime)
- {
- $fileData[$key]['date'] = date('c', $value['date']->getTimestamp());
- }
- foreach (['urlPreview', 'urlShow', 'urlDownload'] as $field)
- {
- $url = $fileData[$key][$field];
- if (is_string($url) && $url && mb_strpos($url, 'http') !== 0)
- {
- $fileData[$key][$field] = self::getPublicDomain().$url;
- }
- }
- }
- return $fileData;
- }
- private static function getPublicDomain(): ?string
- {
- static $result = null;
- if ($result === null)
- {
- $result = (\Bitrix\Main\Context::getCurrent()->getRequest()->isHttps() ? "https" : "http")."://".((defined("SITE_SERVER_NAME") && SITE_SERVER_NAME <> '') ? SITE_SERVER_NAME : Option::get("main", "server_name", $_SERVER['SERVER_NAME']));
- }
- return $result;
- }
- public static function createGroup($fields)
- {
- if (!is_array($fields))
- {
- throw new Exception('Incorrect input data');
- }
- foreach ($fields as $key => $value)
- {
- if (in_array(mb_substr($key, 0, 1), [ '~', '=' ]))
- {
- unset($fields[$key]);
- }
- }
- if (isset($fields['IMAGE_FILE_ID']) && Loader::includeModule('disk'))
- {
- if (
- (($imageFileId = (int)$fields['IMAGE_FILE_ID']) > 0)
- && ($file = File::loadById($imageFileId))
- && $file->canRead($file->getStorage()->getSecurityContext(self::getCurrentUserId()))
- )
- {
- $image = \CFile::MakeFileArray($file->getFileId());
- $image['del'] = 'N';
- \CFile::ResizeImage($image, ['width' => 300, 'height' => 300]);
- $fields['IMAGE_ID'] = $image;
- unset($fields['IMAGE']);
- }
- else
- {
- unset($fields['IMAGE_FILE_ID']);
- }
- }
- if (isset($fields['IMAGE']))
- {
- $fields['IMAGE_ID'] = CRestUtil::saveFile($fields['IMAGE']);
- if (!$fields['IMAGE_ID'])
- {
- unset($fields['IMAGE_ID']);
- }
- unset($fields['IMAGE']);
- }
- if (
- !is_set($fields, "SITE_ID")
- || (string)$fields["SITE_ID"] === ''
- )
- {
- $fields["SITE_ID"] = array(SITE_ID);
- }
- if (
- !is_set($fields, "SUBJECT_ID")
- || (int)$fields["SUBJECT_ID"] <= 0
- )
- {
- $rsSubject = CSocNetGroupSubject::GetList(
- array("SORT" => "ASC"),
- array("SITE_ID" => $fields["SITE_ID"]),
- false,
- false,
- array("ID")
- );
- if ($arSubject = $rsSubject->Fetch())
- {
- $fields["SUBJECT_ID"] = $arSubject["ID"];
- }
- }
- $initiatePerms = [
- UserToGroupTable::ROLE_OWNER,
- UserToGroupTable::ROLE_MODERATOR,
- UserToGroupTable::ROLE_USER,
- ];
- if (
- !isset($fields['INITIATE_PERMS'])
- || !in_array($fields['INITIATE_PERMS'], $initiatePerms, true)
- )
- {
- $isExtranetInstalled = (
- ModuleManager::isModuleInstalled('intranet')
- && ModuleManager::isModuleInstalled('extranet')
- && !empty(Option::get('extranet', 'extranet_site'))
- );
- $isExtranet = (
- $isExtranetInstalled
- && Loader::includeModule('extranet')
- && \CExtranet::IsExtranetSite()
- );
- $fields['INITIATE_PERMS'] = ($isExtranet ? UserToGroupTable::ROLE_MODERATOR : UserToGroupTable::ROLE_USER);
- }
- if (!empty($fields['PROJECT_DATE_START']))
- {
- $fields['PROJECT_DATE_START'] = CRestUtil::unConvertDate($fields['PROJECT_DATE_START']);
- }
- if (!empty($fields['PROJECT_DATE_FINISH']))
- {
- $fields['PROJECT_DATE_FINISH'] = CRestUtil::unConvertDate($fields['PROJECT_DATE_FINISH']);
- }
- $ownerId = (
- !empty($fields['OWNER_ID'])
- && (int)$fields['OWNER_ID'] > 0
- && self::isCurrentUserAdmin()
- ? (int)$fields['OWNER_ID']
- : self::getCurrentUserId()
- );
- Workgroup::mutateScrumFormFields($fields);
- $groupId = CSocNetGroup::createGroup($ownerId, $fields, false);
- if ($groupId <= 0)
- {
- throw new Exception('Cannot create group');
- }
- else
- {
- CSocNetFeatures::SetFeature(
- SONET_ENTITY_GROUP,
- $groupId,
- 'files',
- true
- );
- if (
- isset($fields['GROUP_THEME_ID'])
- && Loader::includeModule('intranet')
- )
- {
- $siteTemplateId = 'bitrix24';
- if ($themePicker = new ThemePicker($siteTemplateId, SITE_ID, self::getCurrentUserId(), ThemePicker::ENTITY_TYPE_SONET_GROUP, $groupId))
- {
- if (empty($fields['GROUP_THEME_ID']))
- {
- $themesList = $themePicker->getPatternThemes();
- $themePickerData = $themesList[array_rand($themesList)];
- $fields['GROUP_THEME_ID'] = $themePickerData['id'];
- }
- try
- {
- $themePicker->setCurrentThemeId($fields['GROUP_THEME_ID']);
- unset($themePicker);
- }
- catch (\Bitrix\Main\ArgumentException $exception)
- {
- }
- }
- }
- }
- return $groupId;
- }
- public static function updateGroup($arFields)
- {
- foreach ($arFields as $key => $value)
- {
- if (in_array(mb_substr($key, 0, 1), [ '~', '=' ]))
- {
- unset($arFields[$key]);
- }
- }
- if (isset($arFields['IMAGE_FILE_ID']) && Loader::includeModule('disk'))
- {
- $imageFileId = (int)$arFields['IMAGE_FILE_ID'];
- if ($imageFileId === 0)
- {
- $arFields['IMAGE_ID'] = ['del' => 'Y'];
- unset($arFields['IMAGE']);
- }
- else if (
- $imageFileId > 0
- && ($file = File::loadById($imageFileId))
- && $file->canRead($file->getStorage()->getSecurityContext(self::getCurrentUserId()))
- )
- {
- $image = \CFile::MakeFileArray($file->getFileId());
- $image['del'] = 'N';
- \CFile::ResizeImage($image, ['width' => 300, 'height' => 300]);
- $arFields['IMAGE_ID'] = $image;
- unset($arFields['IMAGE']);
- }
- else
- {
- unset($arFields['IMAGE_FILE_ID']);
- }
- }
- if (isset($arFields['IMAGE']))
- {
- $arFields['IMAGE_ID'] = CRestUtil::saveFile($arFields['IMAGE']);
- if (!$arFields['IMAGE_ID'])
- {
- $arFields['IMAGE_ID'] = array('del' => 'Y');
- }
- unset($arFields['IMAGE']);
- }
- if (!empty($arFields['PROJECT_DATE_START']))
- {
- $arFields['PROJECT_DATE_START'] = CRestUtil::unConvertDate($arFields['PROJECT_DATE_START']);
- }
- if (!empty($arFields['PROJECT_DATE_FINISH']))
- {
- $arFields['PROJECT_DATE_FINISH'] = CRestUtil::unConvertDate($arFields['PROJECT_DATE_FINISH']);
- }
- $groupID = $arFields['GROUP_ID'];
- unset($arFields['GROUP_ID']);
- if ((int)$groupID <= 0)
- {
- throw new Exception('Wrong group ID');
- }
- if (!Workgroup::canUpdate([
- 'groupId' => $groupID,
- ]))
- {
- throw new Exception('User has no permissions to update group');
- }
- $res = CSocNetGroup::Update($groupID, $arFields, false);
- if ((int)$res <= 0)
- {
- throw new Exception('Cannot update group');
- }
- return $res;
- }
- public static function deleteGroup($arFields): bool
- {
- $groupId = (int)$arFields['GROUP_ID'];
- if ($groupId <= 0)
- {
- throw new Exception('Wrong group ID');
- }
- $filter = [
- 'ID' => $groupId,
- ];
- if (!self::isCurrentUserAdmin())
- {
- $filter['CHECK_PERMISSIONS'] = self::getCurrentUserId();
- }
- $res = CSocNetGroup::GetList([], $filter);
- $groupFiels = $res->Fetch();
- if (is_array($groupFiels))
- {
- if (
- (int)$groupFiels["OWNER_ID"] === self::getCurrentUserId()
- || self::isCurrentUserAdmin()
- )
- {
- if (!CSocNetGroup::Delete($groupFiels["ID"]))
- {
- throw new Exception('Cannot delete group');
- }
- }
- else
- {
- throw new Exception('User has no permissions to delete group');
- }
- }
- else
- {
- throw new Exception('Socialnetwork group not found');
- }
- return true;
- }
- public static function setGroupOwner($arFields): bool
- {
- try
- {
- return Workgroup::setOwner([
- 'groupId' => $arFields['GROUP_ID'],
- 'userId' => $arFields['USER_ID'],
- ]);
- }
- catch(Exception $e)
- {
- throw new Exception($e->getMessage(), $e->getCode());
- }
- }
- public static function getGroup($arFields, $n, $server)
- {
- $arOrder = $arFields['ORDER'];
- if (!is_array($arOrder))
- {
- $arOrder = array("ID" => "DESC");
- }
- if (
- $arFields['IS_ADMIN'] === 'Y'
- && !self::isCurrentUserAdmin()
- )
- {
- unset($arFields['IS_ADMIN']);
- }
- $filter = self::checkGroupFilter($arFields['FILTER']);
- if (
- isset($arFields['GROUP_ID'])
- && (int)$arFields['GROUP_ID'] > 0
- )
- {
- $filter['ID'] = $arFields['GROUP_ID'];
- }
- if ($arFields['IS_ADMIN'] !== 'Y')
- {
- $filter['CHECK_PERMISSIONS'] = self::getCurrentUserId();
- }
- $extranetSiteId = self::getExtranetSiteId();
- if (
- $extranetSiteId
- && $arFields['IS_ADMIN'] !== 'Y'
- && self::getCurrentUserType() === 'extranet'
- )
- {
- $filter['SITE_ID'] = $extranetSiteId;
- }
- $result = [];
- $res = CSocNetGroup::GetList($arOrder, $filter, false, self::getNavData($n));
- while ($groupFields = $res->Fetch())
- {
- if (!empty($groupFields['NAME']))
- {
- $groupFields['NAME'] = Emoji::decode($groupFields['NAME']);
- }
- if (!empty($groupFields['DESCRIPTION']))
- {
- $groupFields['DESCRIPTION'] = Emoji::decode($groupFields['DESCRIPTION']);
- }
- $groupFields['DATE_CREATE'] = CRestUtil::ConvertDateTime($groupFields['DATE_CREATE']);
- $groupFields['DATE_UPDATE'] = CRestUtil::ConvertDateTime($groupFields['DATE_UPDATE']);
- $groupFields['DATE_ACTIVITY'] = CRestUtil::ConvertDate