/modules/socialservices/lib/contact.php
PHP | 679 lines | 530 code | 69 blank | 80 comment | 55 complexity | 1a0b66aedcad8fc5f675cfdefc906174 MD5 | raw file
- <?php
- namespace Bitrix\Socialservices;
- use Bitrix\Main;
- use Bitrix\Main\Config\Option;
- use Bitrix\Main\Localization\Loc;
- use Bitrix\Main\Entity;
- use Bitrix\Main\Type\DateTime;
- Loc::loadMessages(__FILE__);
- /**
- * Class ContactTable
- *
- * Fields:
- * <ul>
- * <li> ID int mandatory
- * <li> TIMESTAMP_X datetime optional default 'CURRENT_TIMESTAMP'
- * <li> USER_ID int mandatory
- * <li> CONTACT_USER_ID int optional
- * <li> CONTACT_XML_ID int optional
- * <li> CONTACT_NAME string(255) optional
- * <li> CONTACT_LAST_NAME string(255) optional
- * <li> CONTACT_PHOTO string(255) optional
- * <li> NOTIFY bool optional default 'N'
- * </ul>
- *
- * @package Bitrix\Socialservices
- *
- * DO NOT WRITE ANYTHING BELOW THIS
- *
- * <<< ORMENTITYANNOTATION
- * @method static EO_Contact_Query query()
- * @method static EO_Contact_Result getByPrimary($primary, array $parameters = array())
- * @method static EO_Contact_Result getById($id)
- * @method static EO_Contact_Result getList(array $parameters = array())
- * @method static EO_Contact_Entity getEntity()
- * @method static \Bitrix\Socialservices\EO_Contact createObject($setDefaultValues = true)
- * @method static \Bitrix\Socialservices\EO_Contact_Collection createCollection()
- * @method static \Bitrix\Socialservices\EO_Contact wakeUpObject($row)
- * @method static \Bitrix\Socialservices\EO_Contact_Collection wakeUpCollection($rows)
- */
- class ContactTable extends Main\Entity\DataManager
- {
- const NOTIFY = 'Y';
- const DONT_NOTIFY = 'N';
- const NOTIFY_CONTACT_COUNT = 3;
- const NOTIFY_POSSIBLE_COUNT = 3;
- const POSSIBLE_LAST_AUTHORIZE_LIMIT = '-1 weeks';
- const POSSIBLE_RESET_TIME = 2592000; // 86400 * 30
- const POSSIBLE_RESET_TIME_KEY = "_ts";
- protected static $notifyStack = array();
- /**
- * Returns DB table name for entity.
- *
- * @return string
- */
- public static function getTableName()
- {
- return 'b_socialservices_contact';
- }
- /**
- * Returns entity map definition.
- *
- * @return array
- */
- public static function getMap()
- {
- return array(
- 'ID' => array(
- 'data_type' => 'integer',
- 'primary' => true,
- 'autocomplete' => true,
- ),
- 'TIMESTAMP_X' => array(
- 'data_type' => 'datetime',
- ),
- 'USER_ID' => array(
- 'data_type' => 'integer',
- 'required' => true,
- ),
- 'CONTACT_USER_ID' => array(
- 'data_type' => 'integer',
- ),
- 'CONTACT_XML_ID' => array(
- 'data_type' => 'integer',
- ),
- 'CONTACT_NAME' => array(
- 'data_type' => 'string',
- ),
- 'CONTACT_LAST_NAME' => array(
- 'data_type' => 'string',
- ),
- 'CONTACT_PHOTO' => array(
- 'data_type' => 'string',
- ),
- 'LAST_AUTHORIZE' => array(
- 'data_type' => 'datetime',
- ),
- 'NOTIFY' => array(
- 'data_type' => 'boolean',
- 'values' => array(static::DONT_NOTIFY, static::NOTIFY),
- ),
- 'USER' => array(
- 'data_type' => 'Bitrix\Main\UserTable',
- 'reference' => array('=this.USER_ID' => 'ref.ID'),
- ),
- 'CONTACT_USER' => array(
- 'data_type' => 'Bitrix\Main\UserTable',
- 'reference' => array('=this.CONTACT_USER_ID' => 'ref.ID'),
- ),
- );
- }
- public static function onBeforeUpdate(Entity\Event $event)
- {
- $result = new Entity\EventResult();
- $data = $event->getParameter("fields");
- if(!isset($data['TIMESTAMP_X']))
- {
- $data['TIMESTAMP_X'] = new DateTime();
- $result->modifyFields($data);
- }
- }
- /**
- * @deprecated
- */
- public static function onUserLoginSocserv($params)
- {
- global $USER;
- if(
- $params['EXTERNAL_AUTH_ID'] === \CSocServBitrix24Net::ID
- && \Bitrix\Main\ModuleManager::isModuleInstalled('bitrix24')
- )
- {
- $notificationOptions = \CUserOptions::getOption("socialservices", "notifications", array());
- $lastDate = 0;
- if(isset($notificationOptions["CONTACTS_NOTIFY_DATE"]))
- {
- $lastDate = $notificationOptions["CONTACTS_NOTIFY_DATE"];
- }
- if($lastDate < time() - 86400)
- {
- static::notifyPossible($USER->getId());
- $notificationOptions["CONTACTS_NOTIFY_DATE"] = time();
- \CUserOptions::setOption("socialservices", "notifications", $notificationOptions);
- }
- }
- }
- public static function onNetworkBroadcast($data)
- {
- $contactsList = array();
- $possibleContactsList = array();
- if(isset($data["contact"]) && is_array($data["contact"]))
- {
- foreach($data["contact"] as $contact)
- {
- if(!isset($contactsList[$contact['CONTACT_OWNER']]))
- {
- $contactsList[$contact['CONTACT_OWNER']] = array();
- }
- $contactsList[$contact['CONTACT_OWNER']][] = $contact;
- }
- }
- if(isset($data["contact_possible"]) && is_array($data["contact_possible"]))
- {
- foreach($data["contact_possible"] as $contact)
- {
- if(!isset($possibleContactsList[$contact['CONTACT_OWNER']]))
- {
- $possibleContactsList[$contact['CONTACT_OWNER']] = array();
- }
- $possibleContactsList[$contact['CONTACT_OWNER']][] = $contact;
- }
- }
- $dbRes = UserTable::getList(array(
- 'filter' => array(
- '=EXTERNAL_AUTH_ID' => \CSocServBitrix24Net::ID,
- '=XML_ID' => array_unique(
- array_merge(
- array_keys($contactsList),
- array_keys($possibleContactsList)
- )
- ),
- ),
- 'select' => array('ID', 'USER_ID', 'XML_ID')
- ));
- while($owner = $dbRes->fetch())
- {
- if(
- count($contactsList) > 0
- && count($contactsList[$owner["XML_ID"]]) > 0
- )
- {
- static::processContacts($owner, $contactsList[$owner["XML_ID"]]);
- }
- if(
- count($possibleContactsList) > 0
- && count($possibleContactsList[$owner["XML_ID"]]) > 0
- )
- {
- static::processPossibleContacts($owner, $possibleContactsList[$owner["XML_ID"]]);
- }
- }
- }
- protected static function processContacts($owner, array $contactsList)
- {
- if(!Main\Loader::includeModule('rest'))
- {
- return;
- }
- $existedContacts = array();
- $dbRes = ContactTable::getList(array(
- 'filter' => array(
- '=USER_ID' => $owner["USER_ID"],
- ),
- 'select' => array('ID', 'CONTACT_XML_ID')
- ));
- while($existedContact = $dbRes->fetch())
- {
- $existedContacts[$existedContact['CONTACT_XML_ID']] = $existedContact['ID'];
- }
- foreach($contactsList as $contact)
- {
- $contactFields = array(
- "USER_ID" => $owner["USER_ID"],
- "CONTACT_XML_ID" => $contact["CONTACT_ID"],
- "CONTACT_NAME" => $contact["NAME"],
- "CONTACT_LAST_NAME" => $contact["LAST_NAME"],
- "CONTACT_PHOTO" => $contact["PHOTO"],
- "NOTIFY" => $contact["NOTIFY"],
- "LAST_AUTHORIZE" => DateTime::createFromUserTime(\CRestUtil::unConvertDateTime($contact['LAST_AUTHORIZE'])),
- );
- $contactId = false;
- if(isset($existedContacts[$contactFields["CONTACT_XML_ID"]]))
- {
- $contactId = $existedContacts[$contactFields["CONTACT_XML_ID"]];
- $result = static::update($contactId, $contactFields);
- if(!$result->isSuccess())
- {
- AddMessage2Log($result->getErrorMessages());
- }
- }
- else
- {
- $result = static::add($contactFields);
- if($result->isSuccess())
- {
- $contactId = $result->getId();
- }
- else
- {
- AddMessage2Log($result->getErrorMessages());
- }
- }
- if(
- $contactId > 0
- && isset($contact["profile"])
- && count($contact["profile"]) > 0
- )
- {
- if(isset($existedContacts[$contactFields["CONTACT_XML_ID"]]))
- {
- ContactConnectTable::deleteByContact($contactId);
- }
- foreach($contact["profile"] as $profile)
- {
- $connectFields = array(
- 'CONTACT_ID' => $contactId,
- 'CONTACT_PROFILE_ID' => $profile['PROFILE_ID'],
- 'CONTACT_PORTAL' => $profile['PORTAL'],
- 'CONNECT_TYPE' => $profile['TYPE'],
- 'LAST_AUTHORIZE' => DateTime::createFromUserTime(\CRestUtil::unConvertDateTime($profile['LAST_AUTHORIZE'])),
- );
- $r = ContactConnectTable::add($connectFields);
- if($r->isSuccess())
- {
- if(!isset($contactFields["CONNECT"]))
- {
- $contactFields["CONNECT"] = array($connectFields);
- }
- else
- {
- $contactFields["CONNECT"][] = $connectFields;
- }
- }
- }
- if(!isset($existedContacts[$contactFields["CONTACT_XML_ID"]]))
- {
- static::notifyJoin($contactId, $contactFields);
- }
- }
- }
- static::notifyJoinFinish($owner["USER_ID"]);
- }
- protected static function processPossibleContacts($owner, array $contactsList)
- {
- if(!Main\Loader::includeModule('rest'))
- {
- return;
- }
- $existedContacts = array();
- $dbRes = UserLinkTable::getList(array(
- 'filter' => array(
- '=SOCSERV_USER_ID' => $owner["ID"],
- '=SOCSERV_USER.EXTERNAL_AUTH_ID' => \CSocServBitrix24Net::ID,
- ),
- 'select' => array('ID', 'LINK_UID')
- ));
- while($existedContact = $dbRes->fetch())
- {
- $existedContacts[$existedContact['LINK_UID']] = $existedContact['ID'];
- }
- foreach($contactsList as $contact)
- {
- $contactFields = array(
- "USER_ID" => $owner["USER_ID"],
- "SOCSERV_USER_ID" => $owner["ID"],
- "LINK_UID" => $contact["CONTACT_ID"],
- "LINK_NAME" => $contact["NAME"],
- "LINK_LAST_NAME" => $contact["LAST_NAME"],
- "LINK_PICTURE" => $contact["PHOTO"],
- );
- $linkId = false;
- if(isset($existedContacts[$contactFields["LINK_UID"]]))
- {
- $linkId = $existedContacts[$contactFields["LINK_UID"]];
- UserLinkTable::update($linkId, $contactFields);
- }
- else
- {
- $result = UserLinkTable::add($contactFields);
- if($result->isSuccess())
- {
- $linkId = $result->getId();
- }
- }
- if(
- $linkId !== false
- && isset($contact["profile"])
- && count($contact["profile"]) > 0
- )
- {
- if(isset($existedContacts[$contactFields["LINK_UID"]]))
- {
- ContactConnectTable::deleteByLink($linkId);
- }
- foreach($contact["profile"] as $profile)
- {
- $result = ContactConnectTable::add(array(
- 'LINK_ID' => $linkId,
- 'CONTACT_PROFILE_ID' => $profile['PROFILE_ID'],
- 'CONTACT_PORTAL' => $profile['PORTAL'],
- 'CONNECT_TYPE' => $profile['TYPE'],
- 'LAST_AUTHORIZE' => DateTime::createFromUserTime(\CRestUtil::unConvertDateTime($profile['LAST_AUTHORIZE'])),
- ));
- }
- }
- }
- }
- public static function getConnectId($connect)
- {
- return $connect["CONNECT_TYPE"].$connect["CONTACT_PROFILE_ID"];
- }
- protected static function notifyJoin($contactId, array $contactInfo = null)
- {
- $network = new Network();
- if($network->isOptionEnabled() && Main\Loader::includeModule('im'))
- {
- if($contactInfo === null)
- {
- $dbRes = static::getByPrimary($contactId);
- $contactInfo = $dbRes->fetch();
- }
- if(!$contactInfo)
- {
- return false;
- }
- if(!isset($contactInfo["CONNECT"]))
- {
- $contactInfo["CONNECT"] = array();
- $dbRes = ContactConnectTable::getList(array(
- "order" => array("LAST_AUTHORIZE" => "ASC"),
- "filter" => array(
- "=CONTACT_ID" => $contactInfo["ID"],
- ),
- "limit" => 1,
- "select" => array(
- "CONTACT_PROFILE_ID", "CONNECT_TYPE"
- )
- ));
- while($connect = $dbRes->fetch())
- {
- $contactInfo["CONNECT"][] = $connect;
- }
- }
- if(count($contactInfo["CONNECT"]) > 0)
- {
- if(isset($contactInfo["CONTACT_PHOTO_RESIZED"]))
- {
- $contactInfo["CONTACT_PHOTO"] = $contactInfo["CONTACT_PHOTO_RESIZED"];
- }
- if($contactInfo["NOTIFY"] == ContactTable::NOTIFY)
- {
- $attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);
- $attachParams = array(
- "NAME" => \CUser::FormatName(\CSite::GetNameFormat(), array(
- "NAME" => $contactInfo["CONTACT_NAME"],
- "LAST_NAME" => $contactInfo["CONTACT_LAST_NAME"]
- ), false, false),
- );
- if($contactInfo["CONTACT_PHOTO"])
- {
- $attachParams["AVATAR"] = $contactInfo["CONTACT_PHOTO"];
- }
- $attachParams["NETWORK_ID"] = static::getConnectId($contactInfo["CONNECT"][0]);
- $attach->AddUser($attachParams);
- $messageFields = array(
- "TO_USER_ID" => $contactInfo["USER_ID"],
- "FROM_USER_ID" => 0,
- "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
- "NOTIFY_MODULE" => "socialservices",
- "NOTIFY_EVENT" => "contacts",
- "NOTIFY_MESSAGE" => Loc::getMessage("SS_JOIN_NOTIFY"),
- "NOTIFY_MESSAGE_OUT" => IM_MAIL_SKIP,
- "ATTACH" => array($attach),
- );
- return \CIMNotify::Add($messageFields);
- }
- else
- {
- static::$notifyStack[] = $contactInfo;
- }
- }
- }
- return false;
- }
- protected static function notifyJoinFinish($userId)
- {
- $network = new Network();
- if(
- $network->isOptionEnabled()
- && count(static::$notifyStack) > 0
- && Main\Loader::includeModule('im')
- )
- {
- $attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);
- $count = 0;
- foreach(static::$notifyStack as $contactInfo)
- {
- if(++$count > static::NOTIFY_CONTACT_COUNT)
- {
- $attach->AddHtml('<a href="'.str_replace("#USER_ID#", $userId, Option::get("intranet", "path_user", "/company/persona/user/#USER_ID#/")).'">'.Loc::getMessage("SS_JOIN_NOTIFY_MORE", array("#NUM#" => count(static::$notifyStack)-$count+1)).'</a>');
- break;
- }
- else
- {
- $attachParams = array(
- "NAME" => \CUser::FormatName(\CSite::GetNameFormat(), array(
- "NAME" => $contactInfo["CONTACT_NAME"],
- "LAST_NAME" => $contactInfo["CONTACT_LAST_NAME"]
- ), false, false),
- );
- if($contactInfo["CONTACT_PHOTO"])
- {
- $attachParams["AVATAR"] = $contactInfo["CONTACT_PHOTO"];
- }
- $attachParams["NETWORK_ID"] = static::getConnectId($contactInfo["CONNECT"][0]);
- $attach->AddUser($attachParams);
- }
- }
- $messageFields = array(
- "TO_USER_ID" => $userId,
- "FROM_USER_ID" => 0,
- "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
- "NOTIFY_MODULE" => "socialservices",
- "NOTIFY_EVENT" => "multiple_contacts",
- "NOTIFY_MESSAGE" => Loc::getMessage("SS_JOIN_NOTIFY_MULTIPLE"),
- "NOTIFY_MESSAGE_OUT" => IM_MAIL_SKIP,
- "ATTACH" => array($attach),
- );
- \CIMNotify::Add($messageFields);
- static::$notifyStack = array();
- }
- }
- /**
- * @deprecated
- */
- protected static function notifyPossible($userId)
- {
- $network = new Network();
- if($network->isOptionEnabled() && Main\Loader::includeModule('im'))
- {
- $ts = time();
- $alreadyShown = \CUserOptions::GetOption("socialservices", "possible_contacts", null, $userId);
- if(
- !is_array($alreadyShown)
- || $alreadyShown[static::POSSIBLE_RESET_TIME_KEY] < $ts - static::POSSIBLE_RESET_TIME
- )
- {
- $alreadyShown = array();
- }
- else
- {
- $ts = $alreadyShown[static::POSSIBLE_RESET_TIME_KEY];
- unset($alreadyShown[static::POSSIBLE_RESET_TIME_KEY]);
- }
- $dateLimit = new DateTime();
- $dateLimit->add(static::POSSIBLE_LAST_AUTHORIZE_LIMIT);
- $contactList = ContactConnectTable::getList(array(
- 'order' => array('LAST_AUTHORIZE' => 'DESC'),
- 'filter' => array(
- '!=LINK_ID' => '',
- '=CONNECT_TYPE' => ContactConnectTable::TYPE_PORTAL,
- '>=LAST_AUTHORIZE' => $dateLimit,
- '=LINK.USER_ID' => $userId,
- '!=LINK.ID' => $alreadyShown,
- ),
- 'count_total' => true,
- 'group' => array('LINK_ID'),
- 'limit' => static::NOTIFY_POSSIBLE_COUNT,
- 'select' => array(
- 'LINK_ID', 'LINK_NAME' => 'LINK.LINK_NAME', 'LINK_LAST_NAME' => 'LINK.LINK_LAST_NAME', 'LINK_PICTURE' => 'LINK.LINK_PICTURE',
- ),
- ));
- /*
- $contactList = UserLinkTable::getList(array(
- 'order' => array("RND" => "ASC"),
- 'filter' => array(
- '=USER_ID' => $userId,
- '!=ID' => $alreadyShown,
- ),
- 'limit' => static::NOTIFY_POSSIBLE_COUNT,
- 'count_total' => true,
- 'group' => array("CONNECT.CONTACT_ID"), // Mistake? CONNECT.LINK_ID should be here
- 'runtime' => array(
- new Entity\ExpressionField('RND', 'RAND()'),
- new Entity\ReferenceField(
- "CONNECT",
- ContactConnectTable::getEntity(),
- array(
- "=ref.LINK_ID" => "this.ID",
- "=ref.CONNECT_TYPE" => new Main\DB\SqlExpression(
- '?', ContactConnectTable::TYPE_PORTAL
- )
- ),
- array("join_type"=>"inner")
- ),
- )
- ));
- */
- $count = $contactList->getCount();
- if($count > 0)
- {
- $attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);
- while($contactInfo = $contactList->fetch())
- {
- $alreadyShown[] = $contactInfo["LINK_ID"];
- // get all link portals, authorized during last week
- $contactInfo["CONNECT"] = array();
- $dbRes = ContactConnectTable::getList(array(
- "order" => array("LAST_AUTHORIZE" => "DESC"),
- "filter" => array(
- "=LINK_ID" => $contactInfo["LINK_ID"],
- ">=LAST_AUTHORIZE" => $dateLimit,
- ),
- "limit" => 1,
- "select" => array(
- "CONTACT_PROFILE_ID", "CONNECT_TYPE"
- )
- ));
- while($connect = $dbRes->fetch())
- {
- $contactInfo["CONNECT"][] = $connect;
- }
- if(count($contactInfo["CONNECT"]) > 0)
- {
- $attachParams = array(
- "NAME" => \CUser::FormatName(\CSite::GetNameFormat(), array(
- "NAME" => $contactInfo["LINK_NAME"],
- "LAST_NAME" => $contactInfo["LINK_LAST_NAME"]
- ), false, false),
- );
- if($contactInfo["LINK_PICTURE"])
- {
- $attachParams["AVATAR"] = $contactInfo["LINK_PICTURE"];
- }
- $attachParams["NETWORK_ID"] = static::getConnectId($contactInfo["CONNECT"][0]);
- $attach->AddUser($attachParams);
- }
- }
- /*
- if($count > static::NOTIFY_POSSIBLE_COUNT)
- {
- $attach->AddHtml('<a href="'.str_replace("#USER_ID#", $userId, Option::get("intranet", "path_user", "/company/persona/user/#USER_ID#/")).'">'.Loc::getMessage("SS_JOIN_NOTIFY_MORE", array("#NUM#" => $count - static::NOTIFY_POSSIBLE_COUNT)).'</a>');
- }
- */
- $messageFields = array(
- "TO_USER_ID" => $userId,
- "FROM_USER_ID" => 0,
- "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
- "NOTIFY_MODULE" => "socialservices",
- "NOTIFY_EVENT" => "possible_contacts",
- "NOTIFY_MESSAGE" => Loc::getMessage("SS_JOIN_NOTIFY_POSSIBLE"),
- "NOTIFY_MESSAGE_OUT" => IM_MAIL_SKIP,
- "ATTACH" => $attach,
- );
- \CIMNotify::Add($messageFields);
- }
- $alreadyShown[static::POSSIBLE_RESET_TIME_KEY] = $ts;
- \CUserOptions::SetOption("socialservices", "possible_contacts", $alreadyShown, false, $userId);
- }
- }
- }