4use Bitrix\Intranet\Integration\Templates\Bitrix24\ThemePicker;
22if (!Loader::includeModule(
'rest'))
33 private static $arAllowedOperations =
array(
'',
'!',
'<',
'<=',
'>',
'>=',
'><',
'!><',
'?',
'=',
'!=',
'%',
'!%',
'');
39 "log.blogpost.get" =>
array(
"CSocNetLogRestService",
"getBlogPost"),
40 'log.blogpost.user.get' =>
array(
'callback' =>
array(__CLASS__,
'getUserBlogPost'),
'options' =>
array(
'private' =>
true)),
41 "log.blogpost.add" =>
array(
"CSocNetLogRestService",
"addBlogPost"),
42 "log.blogpost.update" =>
array(
"CSocNetLogRestService",
"updateBlogPost"),
43 "log.blogpost.share" =>
array(
"CSocNetLogRestService",
"shareBlogPost"),
44 "log.blogpost.delete" =>
array(
"CSocNetLogRestService",
"deleteBlogPost"),
45 "log.blogpost.getusers.important" =>
array(
"CSocNetLogRestService",
"getBlogPostUsersImprtnt"),
46 "log.blogcomment.add" =>
array(
"CSocNetLogRestService",
"addBlogComment"),
47 'log.blogcomment.user.get' =>
array(
'callback' =>
array(__CLASS__,
'getUserBlogComment'),
'options' =>
array(
'private' =>
true)),
48 "log.blogcomment.delete" =>
array(
"CSocNetLogRestService",
"deleteBlogComment"),
49 'log.comment.user.get' =>
array(
'callback' =>
array(__CLASS__,
'getUserLogComment'),
'options' =>
array(
'private' =>
true)),
50 "log.comment.delete" =>
array(
"CSocNetLogRestService",
"deleteLogComment"),
51 CRestUtil::EVENTS =>
array(
52 'onLivefeedPostAdd' => self::createEventInfo(
'socialnetwork',
'OnAfterSocNetLogAdd',
array(CSocNetLogBlogPostRestProxy::class,
'processEvent')),
53 'onLivefeedPostUpdate' => self::createEventInfo(
'socialnetwork',
'OnAfterSocNetLogUpdate',
array(CSocNetLogBlogPostRestProxy::class,
'processEvent')),
54 'onLivefeedPostDelete' => self::createEventInfo(
'socialnetwork',
'OnSocNetLogDelete',
array(CSocNetLogBlogPostRestProxy::class,
'processEvent')),
57 "sonet_group" =>
array(
58 "sonet_group.get" =>
array(
"CSocNetLogRestService",
"getGroup"),
59 "sonet_group.create" =>
array(
"CSocNetLogRestService",
"createGroup"),
60 "sonet_group.update" =>
array(
"CSocNetLogRestService",
"updateGroup"),
61 "sonet_group.delete" =>
array(
"CSocNetLogRestService",
"deleteGroup"),
62 "sonet_group.setowner" =>
array(
"CSocNetLogRestService",
"setGroupOwner"),
63 "sonet_group.user.get" =>
array(
"CSocNetLogRestService",
"getGroupUsers"),
64 "sonet_group.user.invite" =>
array(
"CSocNetLogRestService",
"inviteGroupUsers"),
65 "sonet_group.user.request" =>
array(
"CSocNetLogRestService",
"requestGroupUser"),
66 "sonet_group.user.add" =>
array(
"CSocNetLogRestService",
"addGroupUsers"),
67 "sonet_group.user.update" =>
array(
"CSocNetLogRestService",
"updateGroupUsers"),
68 "sonet_group.user.delete" =>
array(
"CSocNetLogRestService",
"deleteGroupUsers"),
69 "sonet_group.user.groups" =>
array(
"CSocNetLogRestService",
"getUserGroups"),
70 "sonet_group.feature.access" =>
array(
"CSocNetLogRestService",
"getGroupFeatureAccess"),
71 "sonet_group_subject.get" =>
array(
"CSocNetLogRestService",
"getGroupSubject"),
72 "sonet_group_subject.add" =>
array(
"CSocNetLogRestService",
"addGroupSubject"),
73 "sonet_group_subject.update" =>
array(
"CSocNetLogRestService",
"updateGroupSubject"),
74 "sonet_group_subject.delete" =>
array(
"CSocNetLogRestService",
"deleteGroupSubject"),
75 CRestUtil::EVENTS =>
array(
76 'onSonetGroupAdd' => self::createEventInfo(
'socialnetwork',
'OnSocNetGroupAdd',
array(CSocNetGroupRestProxy::class,
'processEvent')),
77 'onSonetGroupUpdate' => self::createEventInfo(
'socialnetwork',
'OnSocNetGroupUpdate',
array(CSocNetGroupRestProxy::class,
'processEvent')),
78 'onSonetGroupDelete' => self::createEventInfo(
'socialnetwork',
'OnSocNetGroupDelete',
array(CSocNetGroupRestProxy::class,
'processEvent')),
79 'onSonetGroupSubjectAdd' => self::createEventInfo(
'socialnetwork',
'OnSocNetGroupSubjectAdd',
array(CSocNetGroupSubjectRestProxy::class,
'processEvent')),
80 'onSonetGroupSubjectUpdate' => self::createEventInfo(
'socialnetwork',
'OnSocNetGroupSubjectUpdate',
array(CSocNetGroupSubjectRestProxy::class,
'processEvent')),
81 'onSonetGroupSubjectDelete' => self::createEventInfo(
'socialnetwork',
'OnSocNetGroupSubjectDelete',
array(CSocNetGroupSubjectRestProxy::class,
'processEvent'))
83 CRestUtil::PLACEMENTS =>
array(
84 'SONET_GROUP_DETAIL_TAB' =>
array()
92 return array($moduleName, $eventName, $callback,
array(
'category' => \
Bitrix\
Rest\Sqs::CATEGORY_DEFAULT));
95 private static function getBlogPostEventId():
array
97 static $blogPostEventIdList =
null;
98 if ($blogPostEventIdList ===
null)
100 $blogPostLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\BlogPost;
101 $blogPostEventIdList = $blogPostLivefeedProvider->getEventId();
104 $arEventId = $blogPostEventIdList;
105 $arEventIdFullset =
array();
106 foreach ($arEventId as $eventId)
111 return array_unique($arEventIdFullset);
114 private static function getBlogCommentEventId(): ?
array
116 static $blogCommentEventIdList =
null;
117 if ($blogCommentEventIdList ===
null)
119 $blogCommentLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\BlogComment;
120 $blogCommentEventIdList = $blogCommentLivefeedProvider->getEventId();
123 return $blogCommentEventIdList;
126 private static function getLogCommentEventId(): ?
array
128 static $logCommentEventIdList =
null;
129 if ($logCommentEventIdList ===
null)
131 $logCommentLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\LogComment;
132 $logCommentEventIdList = $logCommentLivefeedProvider->getEventId();
135 return $logCommentEventIdList;
143 if (!CModule::IncludeModule(
"blog"))
148 $tzOffset = CTimeZone::getOffset();
149 $arOrder = [
'LOG_UPDATE' =>
'DESC' ];
151 $res = CUser::getById(self::getCurrentUserId());
152 if ($userFields =
$res->Fetch())
154 $currentUserIntranet = (
155 !empty($userFields[
"UF_DEPARTMENT"])
156 && is_array($userFields[
"UF_DEPARTMENT"])
157 && (int)$userFields[
"UF_DEPARTMENT"][0] > 0
163 empty($extranetSiteId)
164 || $currentUserIntranet
167 $userSiteFields = CSocNetLogComponent::getSiteByDepartmentId($userFields[
"UF_DEPARTMENT"]);
168 if (!empty($userSiteFields))
170 $siteId = $userSiteFields[
'LID'];
174 !empty($extranetSiteId)
175 && !$currentUserIntranet
187 "EVENT_ID" => self::getBlogPostEventId(),
189 "<=LOG_DATE" =>
"NOW"
201 && is_array(
$fields[
'LOG_RIGHTS'])
207 $arListParams =
array(
208 "CHECK_RIGHTS" =>
"Y",
210 "USE_SUBSCRIBE" =>
"N"
217 self::getNavData(
$n),
218 array(
"ID",
"SOURCE_ID"),
222 $arPostId = $arPostIdToGet =
array();
224 while ($arLog =
$dbLog->Fetch())
226 $arPostId[] = $arLog[
"SOURCE_ID"];
231 foreach ($arPostId as
$key => $postId)
233 $cacheId =
'blog_post_socnet_rest_'.$postId.
'_ru'.($tzOffset <> 0 ?
'_'.$tzOffset :
'');
239 if ($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
245 $arPostIdToGet[
$key] = $postId;
250 if (!empty($arPostIdToGet))
252 foreach ($arPostIdToGet as
$key => $postId)
254 $cacheId =
'blog_post_socnet_rest_'.$postId.
'_ru'.($tzOffset <> 0 ?
'_'.$tzOffset :
'');
256 'TYPE' =>
'post_general',
260 $obCache->
InitCache($cacheTtl, $cacheId, $cacheDir);
262 $obCache->StartDataCache();
266 array(
"ID" => $postId),
290 if ($arPost = $dbPost->Fetch())
292 if (!empty($arPost[
'DETAIL_TEXT']))
294 $arPost[
'DETAIL_TEXT'] =
Emoji::decode($arPost[
'DETAIL_TEXT']);
303 if (!empty($arPost[
'DATE_PUBLISH']))
305 $arPost[
'DATE_PUBLISH'] = CRestUtil::convertDateTime($arPost[
'DATE_PUBLISH']);
308 if ($arPost[
"HAS_PROPS"] !==
'N')
310 $arPostFields =
$USER_FIELD_MANAGER->GetUserFields(
"BLOG_POST", $arPost[
"ID"], LANGUAGE_ID);
311 $arPost = array_merge($arPost, $arPostFields);
315 !empty($arPost[
'UF_BLOG_POST_FILE'])
316 && !empty($arPost[
'UF_BLOG_POST_FILE'][
'VALUE'])
319 $arPost[
'FILES'] = $arPost[
'UF_BLOG_POST_FILE'][
'VALUE'];
326 $obCache->EndDataCache($arPost);
354 : self::getCurrentUserId()
357 $otherUserMode = (
$userId !== self::getCurrentUserId());
361 throw new RestException(
"User ID can't be empty",
"ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
377 '@EVENT_ID' => self::getBlogPostEventId()
391 $order = [
'ID' =>
'DESC' ];
399 $logIdList =
array();
410 $postIdList =
array();
411 while ($logFields =
$res->fetch())
413 if ((
int)$logFields[
'SOURCE_ID'] > 0)
415 $postIdList[] = $logFields[
'SOURCE_ID'];
416 $logIdList[$logFields[
'SOURCE_ID']] = $logFields[
'ID'];
420 $postIdList = array_unique($postIdList);
421 if (empty($postIdList))
426 $res = Bitrix\Blog\PostTable::getList([
428 '@ID' => $postIdList,
431 'ID',
'DATE_CREATE',
'TITLE',
'DETAIL_TEXT',
'UF_BLOG_POST_FILE'
433 'order' => [
'ID' =>
'DESC' ],
436 $attachedIdList = [];
437 $postAttachedList = [];
439 while ($postFields =
$res->fetch())
441 $result[
'POSTS'][$postFields[
'ID']] = [
442 'ID' => (int)$logIdList[$postFields[
'ID']],
443 'POST_ID' => (
int)$postFields[
'ID'],
444 'DATE_CREATE' => $postFields[
'DATE_CREATE'],
445 'TITLE' => ($otherUserMode ?
'' : (string)$postFields[
'TITLE']),
446 'TEXT' => ($otherUserMode ?
'' : (
string)$postFields[
'DETAIL_TEXT']),
449 if (!empty($postFields[
'UF_BLOG_POST_FILE']))
451 if (is_array($postFields[
'UF_BLOG_POST_FILE']))
453 $attached = $postFields[
'UF_BLOG_POST_FILE'];
455 elseif ((
int)$postFields[
'UF_BLOG_POST_FILE'] > 0)
457 $attached =
array((
int)$postFields[
'UF_BLOG_POST_FILE']);
464 if (!empty($attached))
466 $attachedIdList = array_merge($attachedIdList, $attached);
469 $postAttachedList[$postFields[
'ID']] = $attached;
473 $attachedObjectList = [];
476 !empty($attachedIdList)
480 $res = Bitrix\Disk\AttachedObject::getList([
482 '@ID' => array_unique($attachedIdList)
484 'select' => [
'ID',
'OBJECT_ID' ],
486 while ($attachedObjectFields =
$res->fetch())
488 $diskObjectId = $attachedObjectFields[
'OBJECT_ID'];
490 if ($fileData = self::getFileData($diskObjectId))
492 $attachedObjectList[$attachedObjectFields[
'ID']] = $diskObjectId;
493 $result[
'FILES'][$diskObjectId] = $fileData;
502 $result[
'POSTS'][
$key][
'DATE_CREATE'] = date(
'c', $value[
'DATE_CREATE']->getTimestamp());
505 if (!empty($postAttachedList[
$key]))
507 foreach ($postAttachedList[
$key] as $attachedId)
509 if (!empty($attachedObjectList[$attachedId]))
511 $result[
'POSTS'][
$key][
'ATTACH'][] = $attachedObjectList[$attachedId];
535 throw new RestException($e ? $e->getString() :
'Cannot add blog post');
556 throw new RestException($e ? $e->getString() :
'Cannot update blog post');
571 $result = Helper::deleteBlogPost([
572 'POST_ID' => (
int) (
$arFields[
'POST_ID'] ??
null),
585 $postId = (int)
$fields[
'POST_ID'];
608 || (
int)
$fields[
"BLOG_ID"] <= 0
611 $res = \Bitrix\Blog\PostTable::getList(
array(
615 'select' =>
array(
'BLOG_ID')
618 ($postFields =
$res->fetch())
619 && !empty($postFields[
'BLOG_ID'])
622 $blogId = (int)$postFields[
'BLOG_ID'];
627 $blogId = (int)
$fields[
"BLOG_ID"];
630 $blogPostPermsNewList =
$fields[
'DEST'];
632 if (!is_array($blogPostPermsNewList))
634 $blogPostPermsNewList =
array($blogPostPermsNewList);
637 foreach ($blogPostPermsNewList as
$key =>
$code)
647 unset($blogPostPermsNewList[
$key]);
651 if (empty($blogPostPermsNewList))
661 : self::getCurrentUserId()
664 $currentUserPerm = self::getBlogPostPerm(
array(
665 'USER_ID' => $currentUserId,
674 $resultFields =
array(
675 'ERROR_MESSAGE' =>
false,
683 || CBitrix24::isEmailConfirmed()
687 $destinationList = $blogPostPermsNewList;
689 $blogPostPermsNewList = array_unique($destinationList);
693 'DEST' => $blogPostPermsNewList,
695 'AUTHOR_ID' => $currentUserId,
698 if ($resultFields[
'ERROR_MESSAGE'])
705 throw new RestException(
'No permissions to share by this user (ID =' . $currentUserId .
')');
708 $permsFull =
array();
711 foreach ($blogPostPermsOldList as
$type =>
$val)
713 foreach (
$val as $id => $values)
717 $permsFull[] =
$type.$id;
722 in_array(
'US' . $id, $values,
true)
732 if (!in_array(
$code, $permsFull))
734 $permsFull[] =
$code;
738 unset($permsNew[
$key]);
742 if (!empty($permsNew))
746 "POST_ID" => $postId,
747 "BLOG_ID" => $blogId,
749 "SONET_RIGHTS" => $permsFull,
750 "NEW_RIGHTS" => $permsNew,
751 "USER_ID" => $currentUserId
779 $arParams[
"paramName"] =
'BLOG_POST_IMPRTNT';
785 $cache_id =
"blog_post_param_".serialize(
array(
791 $cache_path =
$CACHE_MANAGER->GetCompCachePath(CComponentEngine::MakeComponentPath(
"socialnetwork.blog.blog")).
"/".
$arParams[
"postId"];
792 $cache_time = (defined(
"BX_COMP_MANAGED_CACHE") ? 3600*24*365 : 600);
794 if ($cache->InitCache($cache_time, $cache_id, $cache_path))
800 $cache->StartDataCache($cache_time, $cache_id, $cache_path);
802 if (CModule::IncludeModule(
"blog"))
804 if (defined(
"BX_COMP_MANAGED_CACHE"))
821 'USER_ACTIVE' =>
'Y',
825 'SELECT' => [
'USER_ID' ],
830 while ($userOptionFields =
$res->fetch())
832 $result[] = $userOptionFields[
'USER_ID'];
838 if (defined(
"BX_COMP_MANAGED_CACHE"))
855 'COMMENTS' =>
array(),
869 : self::getCurrentUserId()
872 $otherUserMode = (
$userId !== self::getCurrentUserId());
876 throw new RestException(
"User ID can't be empty",
"ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
903 '@EVENT_ID' => self::getBlogCommentEventId(),
917 $order = Array(
'ID' =>
'DESC');
925 $logCommentIdList =
array();
937 while ($logCommentFields =
$res->fetch())
939 if ((
int)$logCommentFields[
'SOURCE_ID'] > 0)
941 $commentIdList[] = $logCommentFields[
'SOURCE_ID'];
942 $logCommentIdList[$logCommentFields[
'SOURCE_ID']] = $logCommentFields[
'ID'];
946 $commentIdList = array_unique($commentIdList);
947 if (empty($commentIdList))
952 $res = Bitrix\Blog\CommentTable::getList(
array(
954 '@ID' => $commentIdList
957 'ID',
'AUTHOR_ID',
'POST_ID',
'DATE_CREATE',
'POST_TEXT',
'SHARE_DEST',
'UF_BLOG_COMMENT_FILE'
959 'order' =>
array(
'ID' =>
'DESC')
962 $attachedIdList =
array();
963 $commentAttachedList =
array();
967 while ($commentFields =
$res->fetch())
970 'ID' => (
int)$logCommentIdList[$commentFields[
'ID']],
971 'COMMENT_ID' => (
int)$commentFields[
'ID'],
972 'POST_ID' => (
int)$commentFields[
'POST_ID'],
973 'DATE' => $commentFields[
'DATE_CREATE'],
974 'TEXT' => ($otherUserMode ?
'' : (
string)$commentFields[
'POST_TEXT']),
984 "bPublicPage" =>
true,
990 $result[
'COMMENTS'][$commentFields[
'ID']][
'TEXT'] = $commentAuxProvider->getText();
993 if (!empty($commentFields[
'UF_BLOG_COMMENT_FILE']))
995 if (is_array($commentFields[
'UF_BLOG_COMMENT_FILE']))
997 $attached = $commentFields[
'UF_BLOG_COMMENT_FILE'];
999 elseif ((
int)$commentFields[
'UF_BLOG_COMMENT_FILE'] > 0)
1001 $attached = [ (int)$commentFields[
'UF_BLOG_COMMENT_FILE'] ];
1008 if (!empty($attached))
1010 $attachedIdList = array_merge($attachedIdList, $attached);
1013 $commentAttachedList[$commentFields[
'ID']] = $attached;
1017 $attachedObjectList =
array();
1020 !empty($attachedIdList)
1024 $res = Bitrix\Disk\AttachedObject::getList(
array(
1026 '@ID' => array_unique($attachedIdList)
1028 'select' =>
array(
'ID',
'OBJECT_ID')
1030 while ($attachedObjectFields =
$res->fetch())
1032 $diskObjectId = $attachedObjectFields[
'OBJECT_ID'];
1033 if ($fileData = self::getFileData($diskObjectId))
1035 $attachedObjectList[$attachedObjectFields[
'ID']] = $diskObjectId;
1036 $result[
'FILES'][$diskObjectId] = $fileData;
1045 $result[
'COMMENTS'][
$key][
'DATE'] = date(
'c', $value[
'DATE']->getTimestamp());
1048 if (!empty($commentAttachedList[
$key]))
1050 foreach ($commentAttachedList[
$key] as $attachedId)
1052 if (!empty($attachedObjectList[$attachedId]))
1054 $result[
'COMMENTS'][
$key][
'ATTACH'][] = $attachedObjectList[$attachedId];
1072 && (
int)
$fields[
"USER_ID"] > 0
1075 : self::getCurrentUserId()
1083 $postId = (int) (
$fields[
'POST_ID'] ??
null);
1089 $res = CBlogPost::getList(
1096 array(
"ID",
"BLOG_ID",
"AUTHOR_ID",
"BLOG_OWNER_ID",
"TITLE")
1105 $blog = CBlog::getById(
$post[
"BLOG_ID"]);
1114 'MESSAGE' =>
$fields[
"TEXT"] ??
null,
1115 'BLOG_ID' =>
$post[
'BLOG_ID'],
1116 'POST_ID' =>
$post[
'ID'],
1117 'AUTHOR_ID' => $authorId,
1124 $userIP = CBlogUser::getUserIP();
1126 $commentFields =
array(
1127 "POST_ID" =>
$post[
'ID'],
1128 "BLOG_ID" =>
$post[
'BLOG_ID'],
1130 "POST_TEXT" =>
$fields[
"TEXT"],
1131 "DATE_CREATE" => convertTimeStamp(time() + CTimeZone::getOffset(),
"FULL"),
1132 "AUTHOR_IP" => $userIP[0],
1133 "AUTHOR_IP1" => $userIP[1],
1134 "URL" => $blog[
"URL"],
1135 "PARENT_ID" =>
false,
1136 "SEARCH_GROUP_ID" => $blog[
'GROUP_ID'],
1137 "AUTHOR_ID" => $authorId
1141 if ((
int)
$post[
'AUTHOR_ID'] === $authorId)
1147 $postPerm = CBlogPost::getSocNetPostPerms(
$post[
"ID"]);
1150 $perm = CBlogComment::getSocNetUserPerms(
$post[
"ID"],
$post[
"AUTHOR_ID"]);
1164 $result = CBlogComment::add($commentFields);
1172 && Option::get(
'disk',
'successfully_converted',
false)
1175 && ($folder =
$storage->getFolderForUploadedFiles())
1179 $filesList =
array();
1183 $fileFields = CRestUtil::saveFile(
$tmp);
1185 if (is_array($fileFields))
1187 $file = $folder->uploadFile(
1190 'NAME' => $fileFields[
"name"],
1191 'CREATED_BY' => $authorId
1199 $filesList[] = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX.$file->getId();
1204 if (!empty($filesList))
1206 CBlogComment::update(
1210 "UF_BLOG_COMMENT_FILE" => $filesList
1217 'MESSAGE' => $commentFields[
"POST_TEXT"],
1218 'BLOG_ID' =>
$post[
"BLOG_ID"],
1219 'BLOG_OWNER_ID' =>
$post[
"BLOG_OWNER_ID"],
1220 'POST_ID' =>
$post[
"ID"],
1221 'POST_TITLE' =>
$post[
"TITLE"],
1222 'POST_AUTHOR_ID' =>
$post[
"AUTHOR_ID"],
1224 'AUTHOR_ID' => $authorId,
1232 $commentId = (int) (
$fields[
'COMMENT_ID'] ??
null);
1234 if ($commentId <= 0)
1246 && (int)
$fields[
"USER_ID"] > 0
1249 : self::getCurrentUserId()
1252 $currentUserPerm = self::getBlogCommentPerm(
array(
1253 'USER_ID' => $currentUserId,
1254 'COMMENT_ID' => $commentId
1263 if (empty($commentId))
1271 'TYPE' =>
'post_comments',
1272 'POST_ID' => $commentFields[
"POST_ID"]
1294 : self::getCurrentUserId()
1297 $otherUserMode = (
$userId !== self::getCurrentUserId());
1301 throw new RestException(
"User ID can't be empty",
"ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
1329 '@EVENT_ID' => self::getLogCommentEventId()
1343 $order = [
'ID' =>
'DESC' ];
1354 'ID',
'LOG_ID',
'LOG_DATE',
'MESSAGE',
'UF_SONET_COM_DOC'
1360 $attachedIdList =
array();
1362 while ($commentFields =
$res->fetch())
1365 'ID' => (
int)$commentFields[
'ID'],
1366 'COMMENT_ID' => (
int)$commentFields[
'ID'],
1367 'LOG_ID' => (
int)$commentFields[
'LOG_ID'],
1368 'DATE' => $commentFields[
'LOG_DATE'],
1369 'TEXT' => ($otherUserMode ?
'' : (
string)$commentFields[
'MESSAGE']),
1373 if (!empty($commentFields[
'UF_SONET_COM_DOC']))
1375 if (is_array($commentFields[
'UF_SONET_COM_DOC']))
1377 $attached = $commentFields[
'UF_SONET_COM_DOC'];
1379 elseif ((
int)$commentFields[
'UF_SONET_COM_DOC'] > 0)
1381 $attached =
array((
int)$commentFields[
'UF_SONET_COM_DOC']);
1385 $attached =
array();
1388 if (!empty($attached))
1390 $attachedIdList = array_merge($attachedIdList, $attached);
1393 $commentAttachedList[$commentFields[
'ID']] = $attached;
1397 $attachedObjectList =
array();
1400 !empty($attachedIdList)
1404 $res = Bitrix\Disk\AttachedObject::getList(
array(
1406 '@ID' => array_unique($attachedIdList)
1408 'select' =>
array(
'ID',
'OBJECT_ID')
1410 while ($attachedObjectFields =
$res->fetch())
1412 $diskObjectId = $attachedObjectFields[
'OBJECT_ID'];
1414 if ($fileData = self::getFileData($diskObjectId))
1416 $attachedObjectList[$attachedObjectFields[
'ID']] = $diskObjectId;
1417 $result[
'FILES'][$diskObjectId] = $fileData;
1426 $result[
'COMMENTS'][
$key][
'DATE'] = date(
'c', $value[
'DATE']->getTimestamp());
1429 if (!empty($commentAttachedList[
$key]))
1431 foreach ($commentAttachedList[
$key] as $attachedId)
1433 if (!empty($attachedObjectList[$attachedId]))
1435 $result[
'COMMENTS'][
$key][
'ATTACH'][] = $attachedObjectList[$attachedId];
1451 $commentId = (int)
$arFields[
'COMMENT_ID'];
1453 if ($commentId <= 0)
1463 : self::getCurrentUserId()
1467 if (empty($commentFields))
1472 $currentUserPerm = self::getLogCommentPerm(
array(
1473 'USER_ID' => $currentUserId,
1474 'COMMENT_ID' => $commentId
1477 if ($currentUserPerm < self::PERM_WRITE)
1487 private static function getBlogPostPerm(
$fields)
1489 return Helper::getBlogPostPerm(
$fields);
1492 private static function getBlogCommentPerm(
$fields)
1494 if (!Loader::includeModule(
'blog'))
1496 throw new RestException(
'Blog module not installed');
1501 $commentId =
$fields[
'COMMENT_ID'];
1503 $currentUserId = (int)(
1505 && (
int)
$fields[
'USER_ID'] > 0
1508 : self::getCurrentUserId()
1511 $arComment = self::getBlogCommentFields($commentId);
1512 if (empty($arComment))
1517 if ((
int)$arComment[
"AUTHOR_ID"] === $currentUserId)
1521 elseif (CSocNetUser::isUserModuleAdmin($currentUserId,
SITE_ID))
1527 $postItem = \Bitrix\Blog\Item\Post::getById($arComment[
'POST_ID']);
1528 $permsResult = $postItem->getSonetPerms(
array(
1529 "CHECK_FULL_PERMS" =>
true
1531 $result = $permsResult[
'PERM'];
1533 $result <= \Bitrix\Blog\Item\Permissions::READ
1534 && $permsResult[
'READ_BY_OSG']
1548 private static function getLogCommentPerm(
$arFields): string
1554 $currentUserId = (int)(
1559 : self::getCurrentUserId()
1563 CSocNetUser::isUserModuleAdmin($currentUserId,
SITE_ID)
1565 ($arComment = self::getLogCommentFields($commentId))
1566 && (
int)$arComment[
'USER_ID'] === $currentUserId
1576 private static function getBlogCommentFields($commentId):
array
1579 if ($commentItem = \Bitrix\Blog\Item\Comment::getById($commentId))
1581 $result = $commentItem->getFields();
1586 private static function getLogCommentFields($commentId):
array
1591 $result = $commentItem->getFields();
1596 private static function getFileData($diskObjectId)
1600 $diskObjectId = (int)$diskObjectId;
1601 if ($diskObjectId <= 0)
1606 if ($fileModel = \Bitrix\Disk\File::getById($diskObjectId))
1610 $imageParams =
false;
1611 if (\Bitrix\Disk\TypeFile::isImage($fileModel))
1614 $params = $fileModel->getFile();
1615 $imageParams = Array(
1616 'width' => (
int)
$params[
'WIDTH'],
1617 'height' => (
int)
$params[
'HEIGHT'],
1620 else if (\Bitrix\Disk\TypeFile::isVideo($fileModel->getName()))
1623 $params = $fileModel->getView()->getPreviewData();
1624 $imageParams = Array(
1625 'width' => (
int)
$params[
'WIDTH'],
1626 'height' => (
int)
$params[
'HEIGHT'],
1630 $isImage = \Bitrix\Disk\TypeFile::isImage($fileModel);
1631 $urlManager = \Bitrix\Disk\Driver::getInstance()->getUrlManager();
1634 'id' => (
int)$fileModel->getId(),
1635 'date' => $fileModel->getCreateTime(),
1637 'name' => $fileModel->getName(),
1638 'size' => (
int)$fileModel->getSize(),
1639 'image' => $imageParams,
1640 'authorId' => (
int)$fileModel->getCreatedBy(),
1641 'authorName' => CUser::FormatName(CSite::getNameFormat(
false), $fileModel->getCreateUser(),
true,
true),
1643 $fileModel->getPreviewId()
1644 ? $urlManager->getUrlForShowPreview($fileModel, [
'width' => 640,
'height' => 640])
1647 ? $urlManager->getUrlForShowFile($fileModel, [
'width' => 640,
'height' => 640])
1651 'urlShow' => ($isImage ? $urlManager->getUrlForShowFile($fileModel) : $urlManager->getUrlForDownloadFile($fileModel)),
1652 'urlDownload' => $urlManager->getUrlForDownloadFile($fileModel)
1659 private static function convertFileData($fileData):
array
1661 if (!is_array($fileData))
1666 foreach ($fileData as
$key => $value)
1668 if ($value[
'date'] instanceof \Bitrix\Main\Type\DateTime)
1673 foreach ([
'urlPreview',
'urlShow',
'urlDownload'] as $field)
1676 if (is_string(
$url) &&
$url && mb_strpos(
$url,
'http') !== 0)
1678 $fileData[
$key][$field] = self::getPublicDomain().$url;
1686 private static function getPublicDomain(): ?string
1691 $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']));
1706 if (in_array(mb_substr(
$key, 0, 1), [
'~',
'=' ]))
1715 (($imageFileId = (
int)
$fields[
'IMAGE_FILE_ID']) > 0)
1716 && ($file = File::loadById($imageFileId))
1717 && $file->canRead($file->getStorage()->getSecurityContext(self::getCurrentUserId()))
1720 $image = \CFile::MakeFileArray($file->getFileId());
1721 $image[
'del'] =
'N';
1722 \CFile::ResizeImage($image, [
'width' => 300,
'height' => 300]);
1729 unset(
$fields[
'IMAGE_FILE_ID']);
1743 $validateExtranetField =
static fn (
$siteId) =>
1744 Option::get(
'socialnetwork',
'enable_extranet_for_groups', 0)
1747 && !CExtranet::IsExtranetSite(
$siteId)
1751 if (!isset(
$fields[
'SITE_ID']))
1758 $filteredSiteIds = array_filter($siteIds, $validateExtranetField);
1760 if (empty($filteredSiteIds))
1766 $fields[
'SITE_ID'] = $filteredSiteIds;
1770 $siteIdForCheck =
$fields[
'SITE_ID'][0];
1774 && !CExtranet::isIntranetUser()
1778 $fields[
'SITE_ID'][] = $siteIdForCheck;
1784 'siteId' => $siteIdForCheck,
1785 'checkAdminSession' =>
false,
1788 throw new RestException(
'You have no permissions to create a group');
1793 || (
int)
$fields[
"SUBJECT_ID"] <= 0
1796 $rsSubject = CSocNetGroupSubject::GetList(
1797 array(
"SORT" =>
"ASC"),
1803 if ($arSubject = $rsSubject->Fetch())
1805 $fields[
"SUBJECT_ID"] = $arSubject[
"ID"];
1815 !isset(
$fields[
'INITIATE_PERMS'])
1816 || !in_array(
$fields[
'INITIATE_PERMS'], $initiatePerms,
true)
1819 $isExtranetInstalled = (
1822 && !empty(Option::get(
'extranet',
'extranet_site'))
1825 $isExtranetInstalled
1827 && \CExtranet::IsExtranetSite()
1833 if (!empty(
$fields[
'PROJECT_DATE_START']))
1835 $fields[
'PROJECT_DATE_START'] = CRestUtil::unConvertDate(
$fields[
'PROJECT_DATE_START']);
1837 if (!empty(
$fields[
'PROJECT_DATE_FINISH']))
1839 $fields[
'PROJECT_DATE_FINISH'] = CRestUtil::unConvertDate(
$fields[
'PROJECT_DATE_FINISH']);
1844 && (int)
$fields[
'OWNER_ID'] > 0
1845 && self::isCurrentUserAdmin()
1847 : self::getCurrentUserId()
1850 Workgroup::mutateScrumFormFields(
$fields);
1852 $groupId = CSocNetGroup::createGroup($ownerId,
$fields,
false);
1859 CSocNetFeatures::SetFeature(
1867 isset(
$fields[
'GROUP_THEME_ID'])
1871 $siteTemplateId =
'bitrix24';
1873 if ($themePicker =
new ThemePicker($siteTemplateId,
SITE_ID, self::getCurrentUserId(), ThemePicker::ENTITY_TYPE_SONET_GROUP, $groupId))
1875 if (empty(
$fields[
'GROUP_THEME_ID']))
1877 $themesList = $themePicker->getPatternThemes();
1878 $themePickerData = $themesList[array_rand($themesList)];
1879 $fields[
'GROUP_THEME_ID'] = $themePickerData[
'id'];
1884 $themePicker->setCurrentThemeId(
$fields[
'GROUP_THEME_ID']);
1885 unset($themePicker);
1901 if (in_array(mb_substr(
$key, 0, 1), [
'~',
'=' ]))
1909 $imageFileId = (int)
$arFields[
'IMAGE_FILE_ID'];
1911 if ($imageFileId === 0)
1918 && ($file = File::loadById($imageFileId))
1919 && $file->canRead($file->getStorage()->getSecurityContext(self::getCurrentUserId()))
1922 $image = \CFile::MakeFileArray($file->getFileId());
1923 $image[
'del'] =
'N';
1924 \CFile::ResizeImage($image, [
'width' => 300,
'height' => 300]);
1945 if (!empty(
$arFields[
'PROJECT_DATE_START']))
1947 $arFields[
'PROJECT_DATE_START'] = CRestUtil::unConvertDate(
$arFields[
'PROJECT_DATE_START']);
1949 if (!empty(
$arFields[
'PROJECT_DATE_FINISH']))
1951 $arFields[
'PROJECT_DATE_FINISH'] = CRestUtil::unConvertDate(
$arFields[
'PROJECT_DATE_FINISH']);
1954 $groupID =
$arFields[
'GROUP_ID'] ??
null;
1957 if ((
int)$groupID <= 0)
1962 $isModifySiteIdsNeeded =
1964 && !Option::get(
'socialnetwork',
'enable_extranet_for_groups', 0)
1967 if ($isModifySiteIdsNeeded)
1969 $arFields[
'SITE_ID'] = self::getModifiedGroupSiteIdsForDisabledExtranet(
1976 'groupId' => $groupID,
1977 'checkAdminSession' =>
false,
1980 throw new RestException(
'User has no permissions to update group');
1983 $groupFields = \Bitrix\Socialnetwork\WorkgroupTable::getList([
1990 'filter' => [
'ID' => $groupID],
1999 $newOwnerId = (int)(
$arFields[
'OWNER_ID'] ?? 0);
2000 if ($newOwnerId && $newOwnerId !== (
int)$groupFields[
'OWNER_ID'])
2002 CSocNetUserToGroup::setOwner($newOwnerId, $groupID, $groupFields);
2008 private static function getModifiedGroupSiteIdsForDisabledExtranet(
int $groupId,
array $siteIds):
array
2010 if (!Loader::includeModule(
'extranet'))
2015 $leaveGroupTypeExtranet = CExtranet::IsExtranetSocNetGroup($groupId);
2017 $extranetSiteId = CExtranet::GetExtranetSiteID();
2019 $addSiteIdIfMissing =
static function (
array &$siteIds, mixed
$siteId) {
2020 if (!in_array(
$siteId, $siteIds,
true))
2026 $removeSiteIdIfExists =
static function (
array &$siteIds, mixed
$siteId) {
2031 unset($siteIds[
$key]);
2035 $addSiteIdIfMissing(
2037 $leaveGroupTypeExtranet ? $extranetSiteId :
SITE_ID
2039 $removeSiteIdIfExists(
2041 $leaveGroupTypeExtranet ?
SITE_ID : $extranetSiteId
2049 $groupId = (int) (
$arFields[
'GROUP_ID'] ??
null);
2060 if (!self::isCurrentUserAdmin())
2062 $filter[
'CHECK_PERMISSIONS'] = self::getCurrentUserId();
2066 $groupFields =
$res->Fetch();
2067 if (!is_array($groupFields))
2073 (
int)$groupFields[
"OWNER_ID"] !== self::getCurrentUserId()
2074 && !self::isCurrentUserAdmin()
2077 throw new RestException(
'User has no permissions to delete group');
2080 if (!CSocNetGroup::Delete($groupFields[
"ID"]))
2092 return Workgroup::setOwner([
2093 'groupId' =>
$arFields[
'GROUP_ID'] ??
null,
2094 'userId' =>
$arFields[
'USER_ID'] ??
null,
2106 if (!is_array($arOrder))
2108 $arOrder =
array(
"ID" =>
"DESC");
2113 && !self::isCurrentUserAdmin()
2129 if ((
$arFields[
'IS_ADMIN'] ??
null) !==
'Y')
2131 $filter[
'CHECK_PERMISSIONS'] = self::getCurrentUserId();
2138 && (
$arFields[
'IS_ADMIN'] ??
null) !==
'Y'
2139 && self::getCurrentUserType() ===
'extranet'
2142 $filter[
'SITE_ID'] = $extranetSiteId;
2146 $res = CSocNetGroup::GetList($arOrder,
$filter,
false, self::getNavData(
$n));
2147 while ($groupFields =
$res->Fetch())
2149 if (!empty($groupFields[
'NAME']))
2153 if (!empty($groupFields[
'DESCRIPTION']))
2155 $groupFields[
'DESCRIPTION'] =
Emoji::decode($groupFields[
'DESCRIPTION']);
2158 $groupFields[
'DATE_CREATE'] = CRestUtil::ConvertDateTime($groupFields[
'DATE_CREATE']);
2159 $groupFields[
'DATE_UPDATE'] = CRestUtil::ConvertDateTime($groupFields[
'DATE_UPDATE']);
2160 $groupFields[
'DATE_ACTIVITY'] = CRestUtil::ConvertDateTime($groupFields[
'DATE_ACTIVITY']);
2162 if ($groupFields[
'IMAGE_ID'] > 0)
2164 $groupFields[
'IMAGE'] = self::getFile($groupFields[
'IMAGE_ID']);
2167 if ($extranetSiteId)
2169 $groupFields[
"IS_EXTRANET"] =
"N";
2170 $rsGroupSite = CSocNetGroup::GetSite($groupFields[
"ID"]);
2171 while ($arGroupSite = $rsGroupSite->Fetch())
2173 if ($arGroupSite[
"LID"] === $extranetSiteId)
2175 $groupFields[
"IS_EXTRANET"] =
"Y";
2181 unset($groupFields[
'INITIATE_PERMS'], $groupFields[
'SPAM_PERMS'], $groupFields[
'IMAGE_ID']);
2191 $GROUP_ID = (int) (
$arFields[
'ID'] ??
null);
2202 if (!self::isCurrentUserAdmin())
2204 $filter[
'CHECK_PERMISSIONS'] = self::getCurrentUserId();
2206 if (self::getCurrentUserType() ===
'extranet')
2213 $groupFields =
$res->fetch();
2214 if (!is_array($groupFields))
2219 $res = CSocNetUserToGroup::getList(
2222 'GROUP_ID' => $groupFields[
'ID'],
2224 '=USER_ACTIVE' =>
'Y'
2228 [
'USER_ID',
'ROLE' ]
2232 while ($relationFields =
$res->fetch())
2242 $groupID =
$arFields[
'GROUP_ID'] ??
null;
2243 $arUserID =
$arFields[
'USER_ID'] ??
null;
2246 if ((
int)$groupID <= 0)
2252 (!is_array($arUserID) && (
int)$arUserID <= 0)
2253 || (is_array($arUserID) &&
count($arUserID) <= 0)
2259 if (!is_array($arUserID))
2261 $arUserID =
array($arUserID);
2264 $arSuccessID =
array();
2268 "CHECK_PERMISSIONS" => self::getCurrentUserId(),
2270 $arGroup =
$dbRes->Fetch();
2271 if (!is_array($arGroup))
2276 foreach ($arUserID as $user_id)
2278 $isCurrentUserTmp = (self::getCurrentUserId() === (int)$user_id);
2280 $user2groupRelation = CSocNetUserToGroup::GetUserRole($user_id, $arGroup[
"ID"]);
2283 !$isCurrentUserTmp && $canInviteGroup && !$user2groupRelation
2284 && CSocNetUserToGroup::SendRequestToJoinGroup(self::getCurrentUserId(), $user_id, $arGroup[
"ID"],
$message,
true)
2287 $arSuccessID[] = $user_id;
2291 return $arSuccessID;
2296 $groupID =
$arFields[
'GROUP_ID'] ??
null;
2299 if ((
int)$groupID <= 0)
2306 'CHECK_PERMISSIONS' => self::getCurrentUserId(),
2308 if (self::getCurrentUserType() ===
'extranet')
2313 $arGroup =
$dbRes->Fetch();
2314 if (is_array($arGroup))
2316 $url = (CMain::IsHTTPS() ?
"https://" :
"http://").
$_SERVER[
"HTTP_HOST"].CComponentEngine::MakePathFromTemplate(
"/workgroups/group/#group_id#/requests/",
array(
"group_id" => $arGroup[
"ID"]));
2318 if (!CSocNetUserToGroup::SendRequestToBeMember(self::getCurrentUserId(), $arGroup[
"ID"],
$message,
$url,
false))
2331 $groupId =
$arFields[
'GROUP_ID'] ??
null;
2332 $userIdList =
$arFields[
'USER_ID'] ??
null;
2334 if ((
int)$groupId <= 0)
2339 if (!self::isCurrentUserAdmin())
2345 (!is_array($userIdList) && (
int)$userIdList <= 0)
2346 || (is_array($userIdList) &&
count($userIdList) <= 0)
2352 if (!is_array($userIdList))
2354 $userIdList = [ $userIdList ];
2360 $groupFields =
$res->fetch();
2361 if (!is_array($groupFields))
2373 $res = \Bitrix\Intranet\UserTable::getList([
2375 '@ID' => $userIdList
2377 'select' => [
'ID',
'USER_TYPE' ]
2380 while ($userFields =
$res->fetch())
2382 if (!in_array($userFields[
'USER_TYPE'], [
'employee',
'extranet' ]))
2386 $userIdList[] = $userFields[
'ID'];
2389 $userFields[
'USER_TYPE'] ===
'extranet'
2393 $groupSiteList = [];
2394 $resSite = \Bitrix\Socialnetwork\WorkgroupSiteTable::getList([
2396 '=GROUP_ID' => $groupId
2398 'select' => [
'SITE_ID' ]
2400 while ($groupSite = $resSite->fetch())
2402 $groupSiteList[] = $groupSite[
'SITE_ID'];
2404 if (!in_array($extranetSiteId, $groupSiteList,
true))
2406 $groupSiteList[] = $extranetSiteId;
2407 CSocNetGroup::update($groupId, [
2408 'SITE_ID' => $groupSiteList
2415 $successUserId = [];
2417 foreach ($userIdList as
$userId)
2419 $user2groupRelation = CSocNetUserToGroup::getUserRole(
$userId, $groupId);
2420 if ($user2groupRelation)
2425 if (CSocNetUserToGroup::add([
2427 "GROUP_ID" => $groupId,
2429 "=DATE_CREATE" => CDatabase::currentTimeFunction(),
2430 "=DATE_UPDATE" => CDatabase::currentTimeFunction(),
2433 "INITIATED_BY_USER_ID" => $groupFields[
'OWNER_ID']
2439 'group_id' => $groupId,
2447 return $successUserId;
2452 $groupId =
$arFields[
'GROUP_ID'] ??
null;
2453 $userIdList =
$arFields[
'USER_ID'] ??
null;
2456 if ((
int)$groupId <= 0)
2461 if (!self::isCurrentUserAdmin())
2463 throw new RestException(
'No permissions to update users role');
2472 (!is_array($userIdList) && (
int)$userIdList <= 0)
2473 || (is_array($userIdList) &&
count($userIdList) <= 0)
2479 if (!is_array($userIdList))
2481 $userIdList = [ $userIdList ];
2487 $groupFields =
$res->fetch();
2488 if (!is_array($groupFields))
2493 $successUserId = [];
2495 $resRelation = UserToGroupTable::getList(
array(
2497 'GROUP_ID' => $groupId,
2498 '@USER_ID' => $userIdList
2500 'select' =>
array(
'ID',
'USER_ID',
'ROLE')
2502 while ($relation = $resRelation->fetch())
2505 $relation[
'ROLE'] === $role
2512 if (CSocNetUserToGroup::update($relation[
'ID'], [
2514 "=DATE_UPDATE" => CDatabase::currentTimeFunction(),
2517 $successUserId[] = $relation[
'USER_ID'];
2521 return $successUserId;
2526 $groupId =
$arFields[
'GROUP_ID'] ??
null;
2527 $userIdList =
$arFields[
'USER_ID'] ??
null;
2529 if ((
int)$groupId <= 0)
2534 if (!self::isCurrentUserAdmin())
2536 throw new RestException(
'No permissions to update users role');
2540 (!is_array($userIdList) && (
int)$userIdList <= 0)
2541 || (is_array($userIdList) &&
count($userIdList) <= 0)
2547 if (!is_array($userIdList))
2549 $userIdList = [ $userIdList ];
2552 $res = CSocNetGroup::getList(
2559 [
'SCRUM_MASTER_ID' ]
2561 $groupFields =
$res->fetch();
2562 if (!is_array($groupFields))
2567 $successUserId = [];
2569 $resRelation = UserToGroupTable::getList(
array(
2571 'GROUP_ID' => $groupId,
2572 '@USER_ID' => $userIdList
2574 'select' =>
array(
'ID',
'USER_ID',
'ROLE')
2576 while ($relation = $resRelation->fetch())
2583 if ((
int)$groupFields[
'SCRUM_MASTER_ID'] === (
int)$relation[
'USER_ID'])
2588 if (CSocNetUserToGroup::delete($relation[
'ID']))
2590 $successUserId[] = $relation[
'USER_ID'];
2594 return $successUserId;
2599 $res = CSocNetUserToGroup::getList(
2602 'USER_ID' => self::getCurrentUserId(),
2607 [
'GROUP_ID',
'GROUP_NAME',
'ROLE',
'GROUP_IMAGE_ID' ]
2612 while ($groupFields =
$res->fetch())
2614 if (!empty($groupFields[
'GROUP_NAME']))
2616 $groupFields[
'GROUP_NAME'] =
Emoji::decode($groupFields[
'GROUP_NAME']);
2619 $groupFields[
'GROUP_IMAGE'] =
'';
2622 if ($groupFields[
'GROUP_IMAGE_ID'] > 0)
2624 $files[] = (int)$groupFields[
'GROUP_IMAGE_ID'];
2630 && ($extranetSiteId = self::getExtranetSiteId())
2633 $extranetWorkgroupIdList = [];
2634 $workgroupIdList = array_map(
static function($item) {
return $item[
'GROUP_ID']; },
$result);
2635 $res = \Bitrix\Socialnetwork\WorkgroupSiteTable::getList([
2637 'GROUP_ID' => $workgroupIdList,
2638 'SITE_ID' => $extranetSiteId
2640 'select' => [
'GROUP_ID' ]
2642 while ($workgroupSiteFields =
$res->fetch())
2644 $extranetWorkgroupIdList[] = (int)$workgroupSiteFields[
'GROUP_ID'];
2647 if (!empty($extranetWorkgroupIdList))
2651 if (in_array((
int)$groupFields[
'GROUP_ID'], $extranetWorkgroupIdList,
true))
2668 if ($groupFields[
'GROUP_IMAGE_ID'] > 0)
2682 $groupID = (int) (
$arFields[
"GROUP_ID"] ??
null);
2683 $feature = trim((
string) (
$arFields[
"FEATURE"] ??
''));
2684 $operation = trim((
string) (
$arFields[
"OPERATION"] ??
''));
2710 return CSocNetFeaturesPerms::CurrentUserCanPerformOperation(
SONET_ENTITY_GROUP, $groupID, $feature, $operation);
2713 private static function checkGroupFilter(
$arFilter)
2728 if (!in_array($operation, self::$arAllowedOperations,
true))
2737 case 'DATE_ACTIVITY':
2742 if ($extranetSiteId = self::getExtranetSiteId())
2746 $arFilter[
'=SITE_ID'] = $extranetSiteId;
2750 $arFilter[
'!=SITE_ID'] = $extranetSiteId;
2755 case 'CHECK_PERMISSIONS':
2769 private static function getFile($fileId)
2772 if (is_array($arFile))
2774 return $arFile[
'SRC'];
2780 private static function isAdmin(): bool
2786 Loader::includeModule(
'bitrix24')
2787 && CBitrix24::isPortalAdmin(self::getCurrentUserId())
2795 if (!is_array($arOrder))
2797 $arOrder =
array(
"SORT" =>
"ASC");
2805 : CSite::getDefSite()
2817 $subjectIdList = [];
2820 $resSubject = CSocNetGroupSubject::getList(
2824 self::getNavData(
$n),
2827 while ($subjectFields = $resSubject->fetch())
2829 $subjectIdList[] = $subjectFields[
'ID'];
2830 $result[$subjectFields[
'ID']] = $subjectFields;
2833 if (!empty($subjectIdList))
2835 $res = \Bitrix\Socialnetwork\WorkgroupSubjectSiteTable::getList([
2837 '@SUBJECT_ID' => $subjectIdList
2839 'select' => [
'SUBJECT_ID',
'SITE_ID']
2842 while ($subjectSiteFields =
$res->Fetch())
2845 isset(
$result[$subjectSiteFields[
'SUBJECT_ID']])
2846 && is_array(
$result[$subjectSiteFields[
'SUBJECT_ID']])
2849 if (!isset(
$result[$subjectSiteFields[
'SUBJECT_ID']][
'SITE_ID']))
2851 $result[$subjectSiteFields[
'SUBJECT_ID']][
'SITE_ID'] = [];
2853 $result[$subjectSiteFields[
'SUBJECT_ID']][
'SITE_ID'][] = $subjectSiteFields[
'SITE_ID'];
2867 if (in_array(mb_substr(
$key, 0, 1), [
'~',
'=' ]))
2873 $subjectId =
$fields[
'SUBJECT_ID'] ??
null;
2876 if ((
int)$subjectId <= 0)
2887 if (!($arGroupSubject =
$dbRes->fetch()))
2889 throw new RestException(
'Socialnetwork group subject not found');
2892 if (!self::isCurrentUserAdmin())
2894 throw new RestException(
'User has no permissions to update group subject');
2897 $res = CSocNetGroupSubject::update($arGroupSubject[
"ID"],
$fields);
2908 $subjectId =
$arFields[
'SUBJECT_ID'] ??
null;
2910 if ((
int)$subjectId <= 0)
2920 $arGroupSubject =
$dbRes->fetch();
2921 if (!is_array($arGroupSubject))
2923 throw new RestException(
'Socialnetwork group subject not found');
2926 $resSites = CSocNetGroupSubject::getSite($arGroupSubject[
'ID']);
2927 while ($siteFields = $resSites->fetch())
2929 $count = CSocNetGroupSubject::getList(
2932 'SITE_ID' => $siteFields[
'LID']
2938 throw new RestException(
'Cannot delete the sole group subject for site ('.$siteFields[
'LID'].
')');
2942 if (!self::isCurrentUserAdmin())
2944 throw new RestException(
'User has no permissions to delete group subject');
2947 if (!CSocNetGroupSubject::delete($arGroupSubject[
"ID"]))
2957 if (!self::isCurrentUserAdmin())
2959 throw new RestException(
'User has no permissions to add group subject');
2964 if (in_array(mb_substr(
$key, 0, 1), [
'~',
'=' ]))
2970 if (empty(
$fields[
'SITE_ID']))
2972 $fields[
'SITE_ID'] = [ CSite::getDefSite() ];
2979 throw new RestException(
'Socialnetwork group subject hasn\'t been added');
2987 private static function getCurrentUserId(): int
2991 return (
int)
$USER->getId();
2994 private static function isCurrentUserAdmin(): bool
2997 if ($value ===
null)
2999 $value = CSocNetUser::isCurrentUserModuleAdmin(
SITE_ID,
false);
3014 $res = \Bitrix\Intranet\UserTable::getList([
3016 '=ID' => self::getCurrentUserId(),
3018 'select' => [
'USER_TYPE' ],
3020 if ($userFields =
$res->fetch()
3023 $result = $userFields[
'USER_TYPE'];
3046 static $processedIdList =
array();
3053 $eventName = $arHandler[
'EVENT_NAME'];
3055 $appKey = $arHandler[
'APP_ID'].$arHandler[
'APPLICATION_TOKEN'];
3056 if (!isset($processedIdList[$appKey]))
3058 $processedIdList[$appKey] =
array();
3061 switch(mb_strtolower($eventName))
3063 case 'onlivefeedpostadd':
3064 case 'onlivefeedpostupdate':
3065 case 'onlivefeedpostdelete':
3069 if (mb_strtolower($eventName) ===
'onlivefeedpostadd')
3072 $id = (int)(
$fields[
'ID'] ?? 0);
3074 elseif (in_array(mb_strtolower($eventName),
array(
'onlivefeedpostupdate',
'onlivefeedpostdelete')))
3082 throw new RestException(
'Could not find livefeed entity ID in fields of event "' . $eventName .
'"');
3086 mb_strtolower($eventName) ===
'onlivefeedpostupdate'
3087 && in_array($id, $processedIdList[$appKey],
true)
3090 throw new RestException(
'ID ' . $id .
'has already been processed');
3093 if (in_array(mb_strtolower($eventName),
array(
'onlivefeedpostadd',
'onlivefeedpostupdate')))
3095 $processedIdList[$appKey][] = $id;
3100 && mb_strtolower($eventName) ===
'onlivefeedpostupdate'
3107 'select' =>
array(
'EVENT_ID',
'SOURCE_ID')
3110 if ($logFields =
$res->fetch())
3112 $sourceId = (int)($logFields[
'SOURCE_ID'] ?? 0);
3113 $logEventId = $logFields[
'EVENT_ID'] ??
false;
3118 $sourceId = isset(
$fields[
'SOURCE_ID']) ? (int)
$fields[
'SOURCE_ID'] : 0;
3119 $logEventId =
$fields[
'EVENT_ID'] ??
false;
3126 throw new RestException(
'Could not find livefeed source ID in fields of event "' . $eventName .
'"');
3129 return array(
'FIELDS' =>
array(
'POST_ID' => $sourceId));
3132 throw new RestException(
'The event "' . $logEventId .
'" is not processed by the log.blogpost REST events');
3143 static $processedIdList =
array();
3145 $eventName = $arHandler[
'EVENT_NAME'];
3147 $appKey = $arHandler[
'APP_ID'].$arHandler[
'APPLICATION_TOKEN'];
3148 if (!isset($processedIdList[$appKey]))
3150 $processedIdList[$appKey] =
array();
3153 switch (mb_strtolower($eventName))
3155 case 'onsonetgroupadd':
3156 case 'onsonetgroupupdate':
3157 case 'onsonetgroupdelete':
3163 throw new RestException(
'Could not find sonet group ID in fields of event "' . $eventName .
'"');
3167 mb_strtolower($eventName) ===
'onsonetgroupupdate'
3168 && in_array($id, $processedIdList[$appKey],
true)
3171 throw new RestException(
'ID ' . $id .
' has already been processed');
3174 if (in_array(mb_strtolower($eventName),
array(
'onsonetgroupadd',
'onsonetgroupupdate')))
3176 $processedIdList[$appKey][] = $id;
3179 return array(
'FIELDS' =>
array(
'ID' => $id));
3190 static $processedIdList =
array();
3192 $eventName = $arHandler[
'EVENT_NAME'];
3194 $appKey = $arHandler[
'APP_ID'].$arHandler[
'APPLICATION_TOKEN'];
3195 if (!isset($processedIdList[$appKey]))
3197 $processedIdList[$appKey] =
array();
3200 switch(mb_strtolower($eventName))
3202 case 'onsonetgroupsubjectadd':
3203 case 'onsonetgroupsubjectupdate':
3204 case 'onsonetgroupsubjectdelete':
3210 throw new RestException(
'Could not find sonet group subject ID in fields of event "' . $eventName .
'"');
3214 mb_strtolower($eventName) ===
'onsonetgroupsubjectupdate'
3215 && in_array($id, $processedIdList[$appKey],
true)
3218 throw new RestException(
'ID '. $id .
'has already been processed');
3221 if (in_array(mb_strtolower($eventName),
array(
'onsonetgroupsubjectadd',
'onsonetgroupsubjectupdate')))
3223 $processedIdList[$appKey][] = $id;
3226 return array(
'FIELDS' =>
array(
'ID' => $id));
const BLOG_PUBLISH_STATUS_READY
const BLOG_PUBLISH_STATUS_PUBLISH
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static includeModule($moduleName)
static isModuleInstalled($moduleName)
static getList(array $parameters=array())
static getBlogPostCacheDir($params=array())
static checkBlogPostDestinationList($params, &$resultFields)
static processBlogPostShare($fields, $params)
static processBlogPostNewMailUserDestinations(&$destinationList)
static get(string $key='', $siteId=SITE_ID)
static canUpdate(array $params=[])
static addInfoToChat($params=[])
static getSocNetPerms($ID, $useCache=true)
static GetSocNetPostPerms( $postId=0, $bNeedFull=false, $userId=false, $postAuthor=0)
static CanPerformOperation($fromUserID, $toUserID, $operation, $bCurrentUserIsAdmin=false)
static GetList( $arOrder=["ID"=> "DESC"], $arFilter=[], $arGroupBy=false, $arNavStartParams=false, $arSelectFields=[])
static GetList($arOrder=array("ID"=> "ASC"), $arFilter=array(), $arAddParams=array())
static GetFileArray($fileId, $uploadDir=false)
InitCache($TTL, $uniq_str, $initdir=false, $basedir="cache")
EndDataCache($vars=false)
static unConvertDateTime($iso8601, $enableOffset=false)
static processEvent(array $arParams, array $arHandler)
static processEvent(array $arParams, array $arHandler)
static processEvent(array $arParams, array $arHandler)
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
static getGroupSubject($arFields, $n, $server)
static setGroupOwner($arFields)
static getUserGroups($arFields, $n, $server)
static updateGroup($arFields)
static getGroupUsers($arFields, $n, $server)
static getCurrentUserType()
static getGroupFeatureAccess($arFields)
static deleteGroupSubject($arFields)
static updateGroupUsers($arFields)
static shareBlogPost($fields)
static getBlogPost($fields, $n, $server)
static deleteBlogComment($fields)
static getExtranetSiteId()
static createGroup($fields)
static deleteGroupUsers($arFields)
static getGroup($arFields, $n, $server)
static OnRestServiceBuildDescription()
static addGroupSubject($fields)
static getUserBlogComment($arParams, $offset, CRestServer $server)
static updateBlogPost($arFields)
static addBlogPost($arFields)
static addGroupUsers($arFields)
static deleteBlogPost($arFields)
static requestGroupUser($arFields)
static updateGroupSubject($fields)
static deleteLogComment($arFields)
static getUserLogComment($arParams, $offset, CRestServer $server)
static createEventInfo($moduleName, $eventName, array $callback)
static inviteGroupUsers($arFields)
static addBlogComment($fields)
static getBlogPostUsersImprtnt($fields)
static deleteGroup($arFields)
static getUserBlogPost($arParams, $offset, CRestServer $server)
static setNavData($result, $dbRes)
if(!is_array($prop["VALUES"])) $tmp
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
global $USER_FIELD_MANAGER
$_SERVER["DOCUMENT_ROOT"]
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
BXClearCache($full=false, $initdir='')
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
if(empty($decryptedData)) $storage
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
if( $_SERVER $arSocNetFeaturesSettings['REQUEST_METHOD']=="GET" &&($RestoreDefaults ?? null)<> '' && $SONET_RIGHT=="W" &&check_bitrix_sessid())
if(CModule::IncludeModule("forum")) if(CModule::IncludeModule("blog")) $dbLog