PageRenderTime 35ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/socialnetwork/lib/item/usertogroup.php

https://gitlab.com/alexprowars/bitrix
PHP | 758 lines | 662 code | 90 blank | 6 comment | 103 complexity | a71dfb9b133540721bbe6ea7ca31ce2a MD5 | raw file
  1. <?php
  2. /**
  3. * Bitrix Framework
  4. * @package bitrix
  5. * @subpackage socialnetwork
  6. * @copyright 2001-2012 Bitrix
  7. */
  8. namespace Bitrix\Socialnetwork\Item;
  9. use Bitrix\Main\Application;
  10. use Bitrix\Main\Config\Option;
  11. use Bitrix\Main\Loader;
  12. use Bitrix\Main\Localization\Loc;
  13. use Bitrix\Main\ModuleManager;
  14. use Bitrix\Socialnetwork\WorkgroupTable;
  15. use Bitrix\Socialnetwork\UserToGroupTable;
  16. use Bitrix\Socialnetwork\Integration;
  17. Loc::loadMessages(__FILE__);
  18. class UserToGroup
  19. {
  20. public const CHAT_ACTION_IN = 'in';
  21. public const CHAT_ACTION_OUT = 'out';
  22. public static function addRelationAutoMembership($params): void
  23. {
  24. global $USER;
  25. if (!empty($params['CURRENT_USER_ID']))
  26. {
  27. $currentUserId = (int)$params['CURRENT_USER_ID'];
  28. }
  29. elseif (is_object($USER))
  30. {
  31. $currentUserId = $USER->getId();
  32. }
  33. if ($currentUserId <= 0)
  34. {
  35. return;
  36. }
  37. static $helper = false;
  38. $userId = (int)($params['USER_ID'] ?? 0);
  39. $groupId = (int)($params['GROUP_ID'] ?? 0);
  40. $value = (isset($params['VALUE']) && in_array($params['VALUE'], WorkgroupTable::getAutoMembershipValuesAll(), true) ? $params['VALUE'] : 'Y');
  41. $notyfy = (isset($params['NOTIFY']) && $params['NOTIFY'] === "N" ? $params['NOTIFY'] : 'Y');
  42. if (
  43. $userId <= 0
  44. || $groupId <= 0
  45. )
  46. {
  47. return;
  48. }
  49. if (!$helper)
  50. {
  51. $connection = Application::getConnection();
  52. $helper = $connection->getSqlHelper();
  53. }
  54. $addFields = [
  55. 'AUTO_MEMBER' => $value,
  56. 'USER_ID' => $userId,
  57. 'GROUP_ID' => $groupId,
  58. 'ROLE' => (
  59. isset($params['ROLE'])
  60. && in_array($params['ROLE'], UserToGroupTable::getRolesAll(), true)
  61. ? $params['ROLE']
  62. : UserToGroupTable::ROLE_USER
  63. ),
  64. 'INITIATED_BY_TYPE' => UserToGroupTable::INITIATED_BY_GROUP,
  65. 'INITIATED_BY_USER_ID' => $currentUserId,
  66. '=DATE_CREATE' => $helper->getCurrentDateTimeFunction(),
  67. '=DATE_UPDATE' => $helper->getCurrentDateTimeFunction(),
  68. ];
  69. $relationId = \CSocNetUserToGroup::add($addFields);
  70. if (
  71. !$notyfy
  72. || $relationId <= 0
  73. || $value !== 'Y'
  74. )
  75. {
  76. return;
  77. }
  78. self::notifyAutoMembership([
  79. 'GROUP_ID' => $groupId,
  80. 'USER_ID' => $userId,
  81. 'RELATION_ID' => $relationId,
  82. ]);
  83. self::addInfoToChat([
  84. 'group_id' => $groupId,
  85. 'user_id' => $userId,
  86. 'action' => self::CHAT_ACTION_IN,
  87. 'role' => $addFields['ROLE'],
  88. ]);
  89. }
  90. public static function changeRelationAutoMembership($params): void
  91. {
  92. static $helper = false;
  93. $relationId = (int)($params['RELATION_ID'] ?? 0);
  94. $userId = (int)($params['USER_ID'] ?? 0);
  95. $groupId = (int)($params['GROUP_ID'] ?? 0);
  96. $value = (
  97. isset($params['VALUE'])
  98. && in_array($params['VALUE'], WorkgroupTable::getAutoMembershipValuesAll(), true)
  99. ? $params['VALUE']
  100. : 'Y'
  101. );
  102. $notyfy = (isset($params['NOTIFY']) && $params['NOTIFY'] === 'N' ? $params['NOTIFY'] : 'Y');
  103. if ($relationId <= 0)
  104. {
  105. return;
  106. }
  107. if (!$helper)
  108. {
  109. $connection = Application::getConnection();
  110. $helper = $connection->getSqlHelper();
  111. }
  112. $updateFields = [
  113. 'AUTO_MEMBER' => $value,
  114. '=DATE_UPDATE' => $helper->getCurrentDateTimeFunction(),
  115. ];
  116. if (
  117. isset($params['ROLE'])
  118. && in_array($params['ROLE'], UserToGroupTable::getRolesAll(), true)
  119. )
  120. {
  121. $updateFields['ROLE'] = $params['ROLE'];
  122. }
  123. \CSocNetUserToGroup::update($relationId, $updateFields);
  124. if (
  125. !$notyfy
  126. || $userId <= 0
  127. || $groupId <= 0
  128. || $value !== 'Y'
  129. )
  130. {
  131. return;
  132. }
  133. self::notifyAutoMembership([
  134. 'GROUP_ID' => $groupId,
  135. 'USER_ID' => $userId,
  136. 'RELATION_ID' => $relationId,
  137. ]);
  138. self::addInfoToChat([
  139. 'group_id' => $groupId,
  140. 'user_id' => $userId,
  141. 'action' => self::CHAT_ACTION_IN,
  142. 'role' => ($params['ROLE'] ?? false),
  143. ]);
  144. }
  145. private static function notifyAutoMembership($params): void
  146. {
  147. $userId = (int)($params['USER_ID'] ?? 0);
  148. $groupId = (int)($params['GROUP_ID'] ?? 0);
  149. $relationId = (int)($params['RELATION_ID'] ?? 0);
  150. if (
  151. $userId <= 0
  152. || $groupId <= 0
  153. || $relationId <= 0
  154. || !Loader::includeModule('im')
  155. )
  156. {
  157. return;
  158. }
  159. $groupItem = Workgroup::getById($groupId);
  160. $groupFields = $groupItem->getFields();
  161. $groupUrlData = $groupItem->getGroupUrlData([
  162. 'USER_ID' => $userId,
  163. ]);
  164. $messageFields = [
  165. "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM,
  166. "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
  167. "FROM_USER_ID" => $groupFields["OWNER_ID"],
  168. "TO_USER_ID" => $userId,
  169. "NOTIFY_MODULE" => "socialnetwork",
  170. "NOTIFY_EVENT" => "invite_group",
  171. "NOTIFY_TAG" => "SOCNET|INVITE_GROUP|" . $userId . '|' . $relationId,
  172. "NOTIFY_MESSAGE" => Loc::getMessage(($groupItem->isProject() ? "SOCIALNETWORK_ITEM_USERTOGROUP_AUTO_MEMBER_ADD_IM_PROJECT" : "SOCIALNETWORK_ITEM_USERTOGROUP_AUTO_MEMBER_ADD_IM"), [
  173. "#GROUP_NAME#" => "<a href=\"".$groupUrlData['DOMAIN'] . $groupUrlData['URL'] . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsEx($groupFields["NAME"]) . '</a>',
  174. ]
  175. ),
  176. "NOTIFY_MESSAGE_OUT" => Loc::getMessage("SOCIALNETWORK_ITEM_USERTOGROUP_AUTO_MEMBER_ADD_IM", [
  177. "#GROUP_NAME#" => htmlspecialcharsEx($groupFields["NAME"]),
  178. ]
  179. ) . ' (' . $groupUrlData['SERVER_NAME'] . $groupUrlData['URL'] . ')'
  180. ];
  181. \CIMNotify::deleteBySubTag('SOCNET|REQUEST_GROUP|' . $userId . '|' . $groupId . '|' . $relationId);
  182. \CIMNotify::add($messageFields);
  183. }
  184. public static function onAfterUserAdd(&$fields): void
  185. {
  186. if (
  187. $fields['ID'] <= 0
  188. || (
  189. isset($fields['ACTIVE'])
  190. && $fields['ACTIVE'] !== 'Y'
  191. )
  192. || !self::checkUF()
  193. )
  194. {
  195. return;
  196. }
  197. $deparmentIdList = [];
  198. if (
  199. isset($fields['UF_DEPARTMENT'])
  200. && is_array($fields['UF_DEPARTMENT'])
  201. && (int)$fields['UF_DEPARTMENT'][0] > 0
  202. )
  203. {
  204. $deparmentIdList = $fields['UF_DEPARTMENT'];
  205. }
  206. if (Loader::includeModule('intranet'))
  207. {
  208. $deparmentIdList = array_merge($deparmentIdList, \CIntranetUtils::getSubordinateDepartments($fields['ID'], false));
  209. }
  210. $deparmentIdList = array_unique($deparmentIdList);
  211. if (
  212. empty($deparmentIdList)
  213. || !ModuleManager::isModuleInstalled('intranet')
  214. || !Loader::includeModule('iblock')
  215. )
  216. {
  217. return;
  218. }
  219. $groupList = self::getConnectedGroups($deparmentIdList);
  220. if (empty($groupList))
  221. {
  222. return;
  223. }
  224. foreach($groupList as $groupId)
  225. {
  226. self::addRelationAutoMembership([
  227. 'USER_ID' => $fields['ID'],
  228. 'GROUP_ID' => $groupId,
  229. 'NOTIFY' => 'N',
  230. ]);
  231. }
  232. }
  233. public static function onAfterUserUpdate(&$userFields): void
  234. {
  235. if (!self::checkUF())
  236. {
  237. return;
  238. }
  239. if (
  240. (int)$userFields['ID'] <= 0
  241. || !isset($userFields['UF_DEPARTMENT'])
  242. || !ModuleManager::isModuleInstalled('intranet')
  243. || !Loader::includeModule('iblock')
  244. )
  245. {
  246. return;
  247. }
  248. $oldGroupList = [];
  249. $oldGroupAutoList = [];
  250. $newGroupList = [];
  251. $res = UserToGroupTable::getList([
  252. 'filter' => [
  253. 'USER_ID' => (int)$userFields['ID']
  254. ],
  255. 'select' => [ 'GROUP_ID', 'AUTO_MEMBER' ]
  256. ]);
  257. while($relation = $res->fetch())
  258. {
  259. $oldGroupList[] = $relation['GROUP_ID'];
  260. if ($relation['AUTO_MEMBER'] === 'Y')
  261. {
  262. $oldGroupAutoList[] = $relation['GROUP_ID'];
  263. }
  264. }
  265. $oldGroupList = array_unique($oldGroupList);
  266. $oldGroupAutoList = array_unique($oldGroupAutoList);
  267. if (
  268. !empty($userFields['UF_DEPARTMENT'])
  269. && is_array($userFields['UF_DEPARTMENT'])
  270. )
  271. {
  272. $userFields['UF_DEPARTMENT'] = array_values($userFields['UF_DEPARTMENT']);
  273. }
  274. $departmentList = (
  275. !is_array($userFields['UF_DEPARTMENT'])
  276. || empty($userFields['UF_DEPARTMENT'])
  277. || (int)$userFields['UF_DEPARTMENT'][0] <= 0
  278. ? []
  279. : $userFields['UF_DEPARTMENT']
  280. );
  281. if (Loader::includeModule('intranet'))
  282. {
  283. $departmentList = array_merge($departmentList, \CIntranetUtils::getSubordinateDepartments($userFields['ID'], false));
  284. }
  285. $departmentList = array_unique($departmentList);
  286. if (!empty($departmentList))
  287. {
  288. $newGroupList = self::getConnectedGroups($departmentList);
  289. }
  290. $groupListPlus = array_diff($newGroupList, $oldGroupList);
  291. $groupListMinus = array_diff($oldGroupAutoList, $newGroupList);
  292. $groupListMinus = array_diff($groupListMinus, $groupListPlus);
  293. if (!empty($groupListMinus))
  294. {
  295. $res = UserToGroupTable::getList([
  296. 'filter' => [
  297. '=USER_ID' => (int)$userFields['ID'],
  298. '@GROUP_ID' => $groupListMinus,
  299. '@ROLE' => [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER ],
  300. 'AUTO_MEMBER' => 'Y'
  301. ],
  302. 'select' => [ 'ID' ],
  303. ]);
  304. while($relation = $res->fetch())
  305. {
  306. \CSocNetUserToGroup::delete($relation['ID']);
  307. }
  308. }
  309. $changeList = $addList = $noChangeList = [];
  310. if (!empty($groupListPlus))
  311. {
  312. $res = UserToGroupTable::getList([
  313. 'filter' => [
  314. '=USER_ID' => (int)$userFields["ID"],
  315. '@GROUP_ID' => $groupListPlus,
  316. '@ROLE' => [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER ],
  317. ],
  318. 'select' => [ 'ID', 'GROUP_ID', 'AUTO_MEMBER' ],
  319. ]);
  320. while ($relation = $res->fetch())
  321. {
  322. if (
  323. $relation['AUTO_MEMBER'] === 'Y'
  324. || $relation['ROLE'] === UserToGroupTable::ROLE_OWNER
  325. )
  326. {
  327. $noChangeList[] = $relation['GROUP_ID'];
  328. }
  329. else // UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER, AUTO_MEMBER = 'N'
  330. {
  331. $noChangeList[] = $relation['GROUP_ID'];
  332. self::changeRelationAutoMembership([
  333. 'RELATION_ID' => (int)$relation['ID'],
  334. 'USER_ID' => (int)$userFields["ID"],
  335. 'GROUP_ID' => (int)$relation['GROUP_ID'],
  336. 'ROLE' => $relation['ROLE'],
  337. 'VALUE' => 'Y',
  338. 'NOTIFY' => 'N',
  339. ]);
  340. }
  341. }
  342. $groupListPlus = array_diff($groupListPlus, $noChangeList);
  343. }
  344. if (!empty($groupListPlus))
  345. {
  346. $res = UserToGroupTable::getList([
  347. 'filter' => [
  348. '=USER_ID' => (int)$userFields['ID'],
  349. '@GROUP_ID' => $groupListPlus,
  350. '@ROLE' => [ UserToGroupTable::ROLE_REQUEST, UserToGroupTable::ROLE_BAN ],
  351. 'AUTO_MEMBER' => 'N',
  352. ],
  353. 'select' => [ 'ID', 'USER_ID', 'GROUP_ID' ],
  354. ]);
  355. while ($relation = $res->fetch())
  356. {
  357. $changeList[] = (int)$relation['GROUP_ID'];
  358. self::changeRelationAutoMembership([
  359. 'RELATION_ID' => (int)$relation['ID'],
  360. 'USER_ID' => (int)$relation['USER_ID'],
  361. 'GROUP_ID' => (int)$relation['GROUP_ID'],
  362. 'ROLE' => UserToGroupTable::ROLE_USER,
  363. 'VALUE' => 'Y',
  364. ]);
  365. }
  366. $addList = array_diff($groupListPlus, $changeList);
  367. }
  368. foreach ($addList as $addGroupId)
  369. {
  370. self::addRelationAutoMembership([
  371. 'USER_ID' => (int)$userFields['ID'],
  372. 'GROUP_ID' => $addGroupId,
  373. 'ROLE' => UserToGroupTable::ROLE_USER,
  374. 'VALUE' => 'Y',
  375. ]);
  376. }
  377. }
  378. public static function getConnectedGroups($departmentList): array
  379. {
  380. static $structureIBlockId = false;
  381. static $departmentChainCache = [];
  382. $result = [];
  383. if ($structureIBlockId === false)
  384. {
  385. $structureIBlockId = (int)Option::get('intranet', 'iblock_structure', 0);
  386. }
  387. if ((int)$structureIBlockId <= 0)
  388. {
  389. return $result;
  390. }
  391. $userDepartmentList = [];
  392. foreach($departmentList as $departmentId)
  393. {
  394. $departmentChain = [];
  395. if (isset($departmentChainCache[$departmentId]))
  396. {
  397. $departmentChain = $departmentChainCache[$departmentId];
  398. }
  399. else
  400. {
  401. $res = \CIBlockSection::getNavChain($structureIBlockId, $departmentId, [ 'ID' ]);
  402. while ($section = $res->fetch())
  403. {
  404. if ((int)$section['ID'] > 0)
  405. {
  406. $departmentChain[] = (int)$section['ID'];
  407. }
  408. }
  409. $departmentChainCache[$departmentId] = $departmentChain;
  410. }
  411. $userDepartmentList = array_merge($userDepartmentList, $departmentChain);
  412. }
  413. $userDepartmentList = array_unique($userDepartmentList);
  414. if (!empty($userDepartmentList))
  415. {
  416. $res = WorkgroupTable::getList([
  417. 'filter' => [
  418. '@UF_SG_DEPT' => $userDepartmentList,
  419. ],
  420. 'select' => [ 'ID' ],
  421. ]);
  422. while ($group = $res->fetch())
  423. {
  424. if ((int)$group['ID'] > 0)
  425. {
  426. $result[] = (int)$group['ID'];
  427. }
  428. }
  429. }
  430. return array_unique($result);
  431. }
  432. private static function checkUF(): bool
  433. {
  434. $res = \CUserTypeEntity::getList([], [
  435. 'ENTITY_ID' => 'SONET_GROUP',
  436. 'FIELD_NAME' => 'UF_SG_DEPT'
  437. ]);
  438. return ($res && ($res->fetch()));
  439. }
  440. public static function addInfoToChat($params = [])
  441. {
  442. if (
  443. !is_array($params)
  444. || !isset($params['group_id'], $params['user_id'], $params['action'])
  445. || (int)$params['group_id'] <= 0
  446. || (int)$params['user_id'] <= 0
  447. || !Integration\Im\Chat\Workgroup::getUseChat()
  448. || !Loader::includeModule('im')
  449. || !in_array($params['action'], self::getChatActionList(), true)
  450. )
  451. {
  452. return false;
  453. }
  454. $groupId = (int)$params['group_id'];
  455. $userId = (int)$params['user_id'];
  456. $role = ($params['role'] ?? false);
  457. $sendMessage = (
  458. !isset($params['sendMessage'])
  459. || $params['sendMessage']
  460. );
  461. $chatData = Integration\Im\Chat\Workgroup::getChatData([
  462. 'group_id' => $groupId,
  463. 'skipAvailabilityCheck' => true,
  464. ]);
  465. if (
  466. empty($chatData)
  467. || empty($chatData[$groupId])
  468. || (int)$chatData[$groupId] <= 0
  469. )
  470. {
  471. return false;
  472. }
  473. $res = \CUser::getById($userId);
  474. $user = $res->fetch();
  475. if (
  476. empty($user)
  477. || (
  478. isset($user['ACTIVE'])
  479. && $user['ACTIVE'] === 'N'
  480. )
  481. )
  482. {
  483. return false;
  484. }
  485. $groupItem = Workgroup::getById($groupId);
  486. $projectSuffix = ($groupItem->isProject() ? '_PROJECT' : '');
  487. $userName = \CUser::formatName(\CSite::getNameFormat(), $user, true, false);
  488. switch($user['PERSONAL_GENDER'])
  489. {
  490. case "M":
  491. $genderSuffix = '_M';
  492. break;
  493. case "F":
  494. $genderSuffix = '_F';
  495. break;
  496. default:
  497. $genderSuffix = '';
  498. }
  499. $chatId = $chatData[$groupId];
  500. $chat = new \CIMChat(0);
  501. switch ($params['action'])
  502. {
  503. case self::CHAT_ACTION_IN:
  504. if ($chat->addUser($chatId, $userId, false, true, true))
  505. {
  506. if ($role === UserToGroupTable::ROLE_USER)
  507. {
  508. \Bitrix\Im\Chat::mute($chatId, true, $userId);
  509. }
  510. $chatMessage = str_replace('#USER_NAME#', $userName, Loc::getMessage('SOCIALNETWORK_ITEM_USERTOGROUP_CHAT_USER_ADD' . $projectSuffix . $genderSuffix));
  511. }
  512. else
  513. {
  514. $sendMessage = false;
  515. }
  516. break;
  517. case self::CHAT_ACTION_OUT:
  518. if ($chat->deleteUser($chatId, $userId, false, true))
  519. {
  520. $chatMessage = str_replace('#USER_NAME#', $userName, Loc::getMessage('SOCIALNETWORK_ITEM_USERTOGROUP_CHAT_USER_DELETE' . $projectSuffix . $genderSuffix));
  521. }
  522. else
  523. {
  524. $sendMessage = false;
  525. }
  526. break;
  527. default:
  528. $chatMessage = '';
  529. $sendMessage = false;
  530. }
  531. if ($sendMessage)
  532. {
  533. $chatMessageFields = [
  534. "MESSAGE" => $chatMessage,
  535. "SYSTEM" => "Y",
  536. "INCREMENT_COUNTER" => "N",
  537. "PUSH" => "N"
  538. ];
  539. $availableChatData = Integration\Im\Chat\Workgroup::getChatData([
  540. 'group_id' => $groupId,
  541. ]);
  542. if (
  543. !empty($availableChatData)
  544. && !empty($availableChatData[$groupId])
  545. && (int)$availableChatData[$groupId] > 0
  546. )
  547. {
  548. return \CIMChat::addMessage(array_merge(
  549. $chatMessageFields, [
  550. 'TO_CHAT_ID' => $chatId,
  551. ]
  552. ));
  553. }
  554. }
  555. else
  556. {
  557. return true;
  558. }
  559. return false;
  560. }
  561. private static function getChatActionList(): array
  562. {
  563. return [ self::CHAT_ACTION_IN, self::CHAT_ACTION_OUT ];
  564. }
  565. public static function addModerators($params = []): bool
  566. {
  567. global $USER;
  568. $result = false;
  569. if (
  570. !is_array($params)
  571. || !isset($params['group_id'], $params['user_id'])
  572. || (int)$params['group_id'] <= 0
  573. || empty($params['user_id'])
  574. )
  575. {
  576. return $result;
  577. }
  578. $groupId = (int)$params['group_id'];
  579. $userIdList = (
  580. is_array($params['user_id'])
  581. ? $params['user_id']
  582. : [ $params['user_id'] ]
  583. );
  584. $currentUserId = (
  585. isset($params['current_user_id'])
  586. && (int)$params['current_user_id'] > 0
  587. ? (int)$params['current_user_id']
  588. : (
  589. is_object($USER)
  590. && $USER->isAuthorized()
  591. ? $USER->getId()
  592. : false
  593. )
  594. );
  595. if (!$currentUserId)
  596. {
  597. return $result;
  598. }
  599. $ownerRelationIdList = [];
  600. $memberRelationIdList = [];
  601. $otherRelationIdList = [];
  602. $resRelation = UserToGroupTable::getList([
  603. 'filter' => [
  604. 'GROUP_ID' => $groupId,
  605. '@USER_ID' => $userIdList
  606. ],
  607. 'select' => [ 'ID', 'USER_ID', 'ROLE' ],
  608. ]);
  609. while ($relation = $resRelation->fetch())
  610. {
  611. if ($relation['ROLE'] === UserToGroupTable::ROLE_USER)
  612. {
  613. $memberRelationIdList[$relation['USER_ID']] = $relation['ID'];
  614. }
  615. elseif ($relation['ROLE'] === UserToGroupTable::ROLE_OWNER)
  616. {
  617. $ownerRelationIdList[$relation['USER_ID']] = $relation['ID'];
  618. }
  619. else // ban, request
  620. {
  621. $otherRelationIdList[$relation['USER_ID']] = $relation['ID'];
  622. }
  623. }
  624. if (!empty($memberRelationIdList))
  625. {
  626. \CSocNetUserToGroup::transferMember2Moderator($currentUserId, $groupId, $memberRelationIdList);
  627. }
  628. foreach ($userIdList as $userId)
  629. {
  630. if (
  631. !array_key_exists($userId, $memberRelationIdList)
  632. && !array_key_exists($userId, $ownerRelationIdList)
  633. )
  634. {
  635. if (array_key_exists($userId, $otherRelationIdList))
  636. {
  637. $relationId = \CSocNetUserToGroup::update($otherRelationIdList[$userId], [
  638. 'ROLE' => UserToGroupTable::ROLE_MODERATOR,
  639. '=DATE_UPDATE' => \CDatabase::CurrentTimeFunction(),
  640. ]);
  641. }
  642. else
  643. {
  644. $relationId = \CSocNetUserToGroup::add([
  645. 'USER_ID' => $userId,
  646. 'GROUP_ID' => $groupId,
  647. 'ROLE' => UserToGroupTable::ROLE_MODERATOR,
  648. '=DATE_CREATE' => \CDatabase::CurrentTimeFunction(),
  649. '=DATE_UPDATE' => \CDatabase::CurrentTimeFunction(),
  650. 'MESSAGE' => '',
  651. 'INITIATED_BY_TYPE' => UserToGroupTable::INITIATED_BY_GROUP,
  652. 'INITIATED_BY_USER_ID' => $currentUserId,
  653. 'SEND_MAIL' => 'N',
  654. ]);
  655. }
  656. if ($relationId)
  657. {
  658. \CSocNetUserToGroup::notifyModeratorAdded([
  659. 'userId' => $currentUserId,
  660. 'groupId' => $groupId,
  661. 'relationId' => $relationId
  662. ]);
  663. }
  664. }
  665. }
  666. return true;
  667. }
  668. }