* */ /** * Объект маппера для работы с БД * * @package application.modules.stream * @since 1.0 */ class ModuleStream_MapperStream extends Mapper { /** * Добавление события в БД * * @param ModuleStream_EntityEvent $oObject * @return int|bool */ public function AddEvent($oObject) { $sql = "INSERT INTO ".Config::Get('db.table.stream_event')." SET ?a "; if ($iId=$this->oDb->query($sql,$oObject->_getData())) { return $iId; } return false; } /** * Получает событие по типу и его ID * * @param string $sEventType Тип * @param int $iTargetId ID владельца события * @param int|null $iUserId ID пользователя * @return ModuleStream_EntityEvent */ public function GetEventByTarget($sEventType, $iTargetId, $iUserId=null) { $sql = "SELECT * FROM ".Config::Get('db.table.stream_event')." WHERE target_id = ?d AND event_type = ? { AND user_id = ?d } "; if ($aRow=$this->oDb->selectRow($sql,$iTargetId,$sEventType,is_null($iUserId) ? DBSIMPLE_SKIP : $iUserId)) { return Engine::GetEntity('ModuleStream_EntityEvent',$aRow); } return null; } /** * Обновление события * * @param ModuleStream_EntityEvent $oObject Объект события * @return int */ public function UpdateEvent($oObject) { $sql = "UPDATE ".Config::Get('db.table.stream_event')." SET ?a WHERE id = ?d "; $res=$this->oDb->query($sql,$oObject->_getData(array('publish')),$oObject->getId()); return $this->IsSuccessful($res); } /** * Получение типов событий, на которые подписан пользователь * * @param int $iUserId ID пользователя * @return array */ public function getTypesList($iUserId) { $sql = 'SELECT event_type FROM ' . Config::Get('db.table.stream_user_type') . ' WHERE user_id = ?d'; $aRet = $this->oDb->selectCol($sql, $iUserId); return $aRet; } /** * Получение списка пользователей, на которых подписан пользователь * * @param int $iUserId ID пользователя * @return array */ public function getUserSubscribes($iUserId) { $sql = 'SELECT target_user_id FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE user_id = ?d'; return $this->oDb->selectCol($sql, $iUserId); } /** * Чтение событий * * @param array $aEventTypes Список типов событий * @param array|null $aUsersList Список пользователей, чьи события читать * @param int $iCount Количество * @param int $iFromId ID события с которого начинать выборку * @return array */ public function Read($aEventTypes, $aUsersList, $iCount, $iFromId) { $sql = 'SELECT * FROM ' . Config::Get('db.table.stream_event'). ' WHERE event_type IN (?a) { AND user_id IN (?a) } AND publish = 1 { AND id < ?d } ORDER BY id DESC { LIMIT 0,?d }'; $aReturn=array(); if ($aRows=$this->oDb->select($sql,$aEventTypes,(!is_null($aUsersList) and count($aUsersList)) ? $aUsersList : DBSIMPLE_SKIP,!is_null($iFromId) ? $iFromId : DBSIMPLE_SKIP,!is_null($iCount) ? $iCount : DBSIMPLE_SKIP)) { foreach ($aRows as $aRow) { $aReturn[]=Engine::GetEntity('Stream_Event',$aRow); } } return $aReturn; } /** * Количество событий для пользователя * * @param array $aEventTypes Список типов событий * @param array|null $aUserId ID пользователя * @return int */ public function GetCount($aEventTypes, $aUserId) { if (!is_null($aUserId) and !is_array($aUserId)) { $aUserId=array($aUserId); } $sql = 'SELECT count(*) as c FROM ' . Config::Get('db.table.stream_event'). ' WHERE event_type IN (?a) { AND user_id IN (?a) } AND publish = 1 '; if ($aRow=$this->oDb->selectRow($sql,$aEventTypes,(!is_null($aUserId) and count($aUserId)) ? $aUserId : DBSIMPLE_SKIP)) { return $aRow['c']; } return 0; } /** * Редактирование списка событий, на которые подписан юзер * * @param int $iUserId ID пользователя * @param string $sEventType Тип * @return bool */ public function switchUserEventType($iUserId, $sEventType) { $sql = 'SELECT * FROM ' . Config::Get('db.table.stream_user_type') . ' WHERE user_id = ?d AND event_type = ?'; if ($this->oDb->select($sql, $iUserId, $sEventType)) { $sql = 'DELETE FROM ' . Config::Get('db.table.stream_user_type') . ' WHERE user_id = ?d AND event_type = ?'; } else { $sql = 'INSERT INTO '. Config::Get('db.table.stream_user_type') . ' SET user_id = ?d , event_type = ?'; } $this->oDb->query($sql, $iUserId, $sEventType); } /** * Подписать пользователя * * @param int $iUserId ID пользователя * @param int $iTargetUserId ID пользователя на которого подписываем */ public function subscribeUser($iUserId, $iTargetUserId) { $sql = 'SELECT * FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE user_id = ?d AND target_user_id = ?d'; if (!$this->oDb->select($sql, $iUserId, $iTargetUserId)) { $sql = 'INSERT INTO ' . Config::Get('db.table.stream_subscribe') . ' SET user_id = ?d, target_user_id = ?d'; $this->oDb->query($sql, $iUserId, $iTargetUserId); } } /** * Отписать пользователя * * @param int $iUserId ID пользователя * @param int $iTargetUserId ID пользователя на которого подписываем */ public function unsubscribeUser($iUserId, $iTargetUserId) { $sql = 'DELETE FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE user_id = ?d AND target_user_id = ?d'; $this->oDb->query($sql, $iUserId, $iTargetUserId); } /** * Проверяет подписан ли пользователь на конкретного пользователя * * @param $iUserId ID пользователя * @param $iTargetUserId ID пользователя на которого подписан * @return bool */ public function IsSubscribe($iUserId,$iTargetUserId) { $sql = 'SELECT * FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE user_id = ?d AND target_user_id = ?d LIMIT 0,1'; if ($this->oDb->selectRow($sql, $iUserId, $iTargetUserId)) { return true; } return false; } }