Вход Регистрация
Файл: plugins/mailbox/bol/conversation_dao.php
Строк: 1273
<?php

class MAILBOX_BOL_ConversationDao extends PEEP_BaseDao
{
    const 
READ_NONE 0;
    const 
READ_INITIATOR 1;
    const 
READ_INTERLOCUTOR 2;
    const 
READ_ALL 3;

    const 
DELETED_NONE 0;
    const 
DELETED_INITIATOR 1;
    const 
DELETED_INTERLOCUTOR 2;
    const 
DELETED_ALL 3;

    const 
VIEW_NONE 0;
    const 
VIEW_INITIATOR 1;
    const 
VIEW_INTERLOCUTOR 2;
    const 
VIEW_ALL 3;

    const 
CACHE_LIFE_TIME 86400;

    const 
CACHE_TAG_USER_CONVERSATION_COUNT 'mailbox_conversation_count_user_id_';
    const 
CACHE_TAG_USER_NEW_CONVERSATION_COUNT 'mailbox_new_conversation_count_user_id_';

    const 
CHAT_CONVERSATION_SUBJECT 'mailbox_chat_conversation';
    const 
WINK_CONVERSATION_SUBJECT 'Wink';

    
/**
     * Class constructor
     *
     */
    
protected function __construct()
    {
        
parent::__construct();
    }
    
/**
     * Class instance
     *
     * @var MAILBOX_BOL_ConversationDao
     */
    
private static $classInstance;

    
/**
     * Returns class instance
     *
     * @return MAILBOX_BOL_ConversationDao
     */
    
public static function getInstance()
    {
        if ( 
self::$classInstance === null )
        {
            
self::$classInstance = new self();
        }

        return 
self::$classInstance;
    }

    
/**
     * @see MAILBOX_BOL_ConversationDao::getDtoClassName()
     *
     */
    
public function getDtoClassName()
    {
        return 
'MAILBOX_BOL_Conversation';
    }

    
/**
     * @see MAILBOX_BOL_ConversationDao::getTableName()
     *
     */
    
public function getTableName()
    {
        return 
PEEP_DB_PREFIX 'mailbox_conversation';
    }

    
/**
     * Returns conversations list by $userId
     *
     * @param int $userId
     * @param int $first
     * @param int $count
     * @return array
     */
    
public function getConversationListByUserId$userId$first$count )
    {
        
$sql " SELECT `conv`.* FROM `" $this->getTableName() . "` AS `conv`
            WHERE `conv`.`initiatorId` = :userId LIMIT :start, :count"
;

        return 
$this->dbo->queryForList($sql, array('userId' => $userId'start' => $first'count' => $count));
    }

    public function 
getAffectedRows()
    {
        return 
$this->dbo->getAffectedRows();
    }

    public function 
findConversationList$initiatorId$interlocutorId )
    {
        
$ex = new PEEP_Example();
        
$ex->andFieldEqual('initiatorId'$initiatorId);
        
$ex->andFieldEqual('interlocutorId'$interlocutorId);
        
$ex->setOrder('id');

        return 
$this->findListByExample($ex);
    }
    
/**
    *
    * @param array $userId
    * @return array
    */
    
public function getNewConversationListForConsoleNotificationMailer$userIdList )
    {
        if ( empty(
$userIdList) )
        {
            return array();
        }

        
$userList $this->dbo->mergeInClause($userIdList);

        
$sql " SELECT `mess`.`id` as messageId, `mess`.*, `conv`.* FROM `" $this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON (`last_m`.`conversationId` = `conv`.`id`)

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `last_m`.`initiatorMessageId` = `mess`.id AND ( `last_m`.`initiatorMessageId` > `last_m`.interlocutorMessageId )
                    OR `last_m`.`interlocutorMessageId` = `mess`.id AND ( `last_m`.`initiatorMessageId` < `last_m`.interlocutorMessageId ) )

                 WHERE  `conv`.`notificationSent` = 0 AND ( ( `conv`.`initiatorId` IN ( 
$userList ) AND `last_m`.`interlocutorMessageId` > 0 AND `conv`.`deleted` != " self::DELETED_INITIATOR " AND NOT `conv`.`read` & " . (self::READ_INITIATOR) . "  AND NOT `conv`.`viewed` &  " . (self::VIEW_INITIATOR) . " )
                         OR ( `conv`.`interlocutorId` IN ( 
$userList ) AND `conv`.`deleted` != " self::DELETED_INTERLOCUTOR "  AND  NOT `conv`.`read` & " . (self::READ_INTERLOCUTOR) . " AND NOT `conv`.`viewed` &  " . (self::VIEW_INTERLOCUTOR) . " ) ) 
        "
;

        
$conversationList $this->dbo->queryForList($sql);
        
$resultList = array();

        foreach ( 
$conversationList as $conversation )
        {
            
$userId $conversation['recipientId'];

            if (
$conversation['wasAuthorized'] == 0)
            {
                
$actionName 'read_message';
                if (
$conversation['subject'] == 'mailbox_chat_conversation')
                {
                    
$actionName 'read_chat_message';
                }

                if (!
PEEP::getAuthorization()->isUserAuthorized($userId'mailbox'$actionName))
                {
                    
$status BOL_AuthorizationService::getInstance()->getActionStatus('mailbox'$actionName);
                    
$conversation['text'] = $status['msg'];
                }
            }
            else
            {
                if (
$conversation['isSystem'] == 1)
                {
                    
$eventParams json_decode($conversation['text'], true);
                    
$eventParams['params']['messageId'] = $conversation['messageId'];
                    
$eventParams['params']['getPreview'] = true;

                    
$event = new PEEP_Event($eventParams['entityType'].'.'.$eventParams['eventName'], $eventParams['params']);
                    
PEEP::getEventManager()->trigger($event);

                    
$data $event->getData();

                    if (!empty(
$data))
                    {
                        
$conversation['text'] = $data;
                    }
                    else
                    {
                        
$conversation['text'] = PEEP::getLanguage()->text('mailbox''can_not_display_entitytype_message', array('entityType'=>$eventParams['entityType']));
                    }
                }
            }

            
$resultList[$userId][] = $conversation;
        }

        return 
$resultList;
    }

    public function 
getMailsConversationIdList($userId$first$count)
    {
        
$sql " SELECT `conv`.`id`, MAX(mess.timeStamp) as `messageTimestamp`  FROM `" $this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON ( `last_m`.`conversationId` = `conv`.`id` )

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `conv`.`id` = `mess`.conversationId )

                 WHERE `conv`.`subject` <> '"
.self::CHAT_CONVERSATION_SUBJECT."' AND ( ( `conv`.`initiatorId` = :user AND `conv`.`deleted` != " self::DELETED_INITIATOR " AND ( `mess`.`id` = `last_m`.`initiatorMessageId` OR `mess`.`id` = `last_m`.`interlocutorMessageId`) )
                         OR ( `conv`.`interlocutorId` = :user AND `conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " AND ( `mess`.`id` = `last_m`.`initiatorMessageId` OR `mess`.`id` = `last_m`.`interlocutorMessageId`) ) )

                 GROUP BY `conv`.`id`

                 ORDER BY `messageTimestamp` DESC

                 LIMIT :first, :count "
;

        return 
$this->dbo->queryForList($sql, array('user' => $userId'first' => $first'count' => $count));
    }

    public function 
getChatsConversationIdList($userId$first$count)
    {
        
$sql " SELECT `conv`.`id`, MAX(mess.timeStamp) as `messageTimestamp`  FROM `" $this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON ( `last_m`.`conversationId` = `conv`.`id` )

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `conv`.`id` = `mess`.conversationId )

                 WHERE `conv`.`subject` = '"
.self::CHAT_CONVERSATION_SUBJECT."' AND (( `conv`.`initiatorId` = :user AND `conv`.`deleted` != " self::DELETED_INITIATOR "  )
                         OR ( `conv`.`interlocutorId` = :user AND `conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " ))

                 GROUP BY `conv`.`id`

                 ORDER BY `messageTimestamp` DESC

                 LIMIT :first, :count "
;

        return 
$this->dbo->queryForList($sql, array('user' => $userId'first' => $first'count' => $count));
    }

    public function 
getConversationItem$convId )
    {
        
$sql " SELECT `conv`.`id`, `conv`.`initiatorId`, `conv`.`interlocutorId`, `conv`.`subject`, `conv`.`read`, `conv`.`viewed`, `mess`.`id` as 'lastMessageId', `mess`.`text`, `mess`.`recipientRead`, `mess`.`timeStamp`, `mess`.`isSystem`, `mess`.`senderId` as `lastMessageSenderId`,  `mess`.`recipientId` as `lastMessageRecipientId`, `mess`.`wasAuthorized` as `lastMessageWasAuthorized`, `last_m`.`initiatorMessageId`, `last_m`.`interlocutorMessageId`  FROM `" $this->getTableName() . "` AS `conv`

                 LEFT JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON ( `last_m`.`conversationId` = `conv`.`id` )

                 LEFT JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `last_m`.`initiatorMessageId` = `mess`.id OR `last_m`.`interlocutorMessageId` = `mess`.id )

                 WHERE `conv`.`id` = :convId
                 ORDER BY `mess`.`timeStamp` DESC, `mess`.`id` DESC
                 LIMIT 1"
;

        return 
$this->dbo->queryForRow($sql, array('convId' => $convId));
    }

    public function 
findChatConversationIdWithUserById($userId$opponentId)
    {
        
$sql "SELECT `id` FROM `".$this->getTableName()."` WHERE `subject`=:subject AND ( `initiatorId`=:userId AND `interlocutorId`=:opponentId OR `initiatorId`=:opponentId AND `interlocutorId`=:userId )";

        return (int)
$this->dbo->queryForColumn($sql, array('subject'=>self::CHAT_CONVERSATION_SUBJECT'userId'=>$userId'opponentId'=>$opponentId));
    }

    public function 
findChatConversationIdWithUserByIdList($userId$userIdList)
    {
        
$userIdListString $this->dbo->mergeInClause($userIdList);

        
$sql "SELECT `id`, IF (`initiatorId` IN ( {$userIdListString} ), initiatorId, interlocutorId) AS opponentId FROM `".$this->getTableName()."` WHERE `subject`=:subject AND ( `initiatorId`=:userId AND `interlocutorId` IN ( {$userIdListString} ) OR `initiatorId` IN ( {$userIdListString} ) AND `interlocutorId`=:userId )";

        return 
$this->dbo->queryForList($sql, array('subject'=>self::CHAT_CONVERSATION_SUBJECT'userId'=>$userId));
    }

    public function 
findWinkConversationIdWithUserById($userId$opponentId)
    {
        
$sql "SELECT `id` FROM `".$this->getTableName()."` WHERE `subject`=:subject AND ( `initiatorId`=:userId AND `interlocutorId`=:opponentId OR `initiatorId`=:opponentId AND `interlocutorId`=:userId )";

        return (int)
$this->dbo->queryForColumn($sql, array('subject'=>self::WINK_CONVERSATION_SUBJECT'userId'=>$userId'opponentId'=>$opponentId));
    }

    public function 
findConversationListByUserId($userId$activeModes)
    {
        if (
in_array('chat'$activeModes) && in_array('mail'$activeModes))
        {
            
$condition "1 ";
        }
        else
        {
            
$condition "1 ";

            if (
in_array('chat'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` = '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }

            if (
in_array('mail'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` <> '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }
        }

        
$sql " SELECT `conv`.`id`, MAX(mess.timeStamp) as `messageTimestamp`  FROM `" $this->getTableName() . "` AS `conv`

                 LEFT JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON ( `last_m`.`conversationId` = `conv`.`id` )

                 LEFT JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `conv`.`id` = `mess`.conversationId )

                 WHERE 
{$condition} AND (( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " self::DELETED_INITIATOR " OR `mess`.`timeStamp`>`conv`.`initiatorDeletedTimestamp` )  )
                         OR ( `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " OR `mess`.`timeStamp`>`conv`.`interlocutorDeletedTimestamp` ) )) AND `last_m`.`id` IS NOT NULL

                 GROUP BY `conv`.`id`

                 ORDER BY `messageTimestamp` DESC"
;

        return 
$this->dbo->queryForColumnList($sql, array('user' => $userId));
    }

    public function 
findConversationItemListByUserId($userId$activeModes$from 0$count 50)
    {
        if (
in_array('chat'$activeModes) && in_array('mail'$activeModes))
        {
            
$condition "1 ";
        }
        else
        {
            
$condition "1 ";

            if (
in_array('chat'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` = '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }

            if (
in_array('mail'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` <> '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }
        }
//
//        $sql = " SELECT `conv`.`id`,
//                        `conv`.`initiatorId`,
//                        `conv`.`interlocutorId`,
//                        `conv`.`subject`,
//                        `conv`.`read`,
//                        `conv`.`viewed`,
//
//                        `last_m`.`initiatorMessageId`,
//                        `initiatorMessage`.`id` as initiatorLastMessageId,
//                        `initiatorMessage`.`text` as initiatorText,
//                        `initiatorMessage`.`recipientRead` as initiatorRecipientRead,
//                        `initiatorMessage`.`isSystem` as initiatorMessageIsSystem,
//                        `initiatorMessage`.`senderId` as `initiatorMessageSenderId`,
//                        `initiatorMessage`.`recipientId` as `initiatorMessageRecipientId`,
//                        `initiatorMessage`.`wasAuthorized` as `initiatorMessageWasAuthorized`,
//                        `initiatorMessage`.`timeStamp` as `initiatorMessageTimestamp`,
//
//                        `last_m`.`interlocutorMessageId`,
//                        `interlocutorMessage`.`id` as interlocutorLastMessageId,
//                        `interlocutorMessage`.`text` as interlocutorText,
//                        `interlocutorMessage`.`recipientRead` as interlocutorRecipientRead,
//                        `interlocutorMessage`.`isSystem` as interlocutorMessageIsSystem,
//                        `interlocutorMessage`.`senderId` as `interlocutorMessageSenderId`,
//                        `interlocutorMessage`.`recipientId` as `interlocutorMessageRecipientId`,
//                        `interlocutorMessage`.`wasAuthorized` as `interlocutorMessageWasAuthorized`,
//                        `interlocutorMessage`.`timeStamp` as `interlocutorMessageTimestamp`
//
//                 FROM `" . $this->getTableName() . "` AS `conv`
//
//                 LEFT JOIN `" . MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
//                     ON ( `last_m`.`conversationId` = `conv`.`id` )
//
//                 LEFT JOIN `" . MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `interlocutorMessage`
//                     ON ( `conv`.`id` = `interlocutorMessage`.conversationId AND `last_m`.`interlocutorMessageId` = `interlocutorMessage`.`id` )
//
//                 LEFT JOIN `" . MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `initiatorMessage`
//                     ON ( `conv`.`id` = `initiatorMessage`.conversationId AND `last_m`.`initiatorMessageId` = `initiatorMessage`.`id` )
//
//                 WHERE {$condition} AND (( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " . self::DELETED_INITIATOR . " OR `initiatorMessage`.`timeStamp`>`conv`.`initiatorDeletedTimestamp` )  )
//                         OR ( `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  . self::DELETED_INTERLOCUTOR .  " OR `interlocutorMessage`.`timeStamp`>`conv`.`interlocutorDeletedTimestamp` ) )) AND `last_m`.`id` IS NOT NULL
//
//                GROUP BY `conv`.`id`
//
//                ORDER BY GREATEST( COALESCE(`initiatorMessage`.`timeStamp`, 0), COALESCE(`interlocutorMessage`.`timeStamp`, 0) ) DESC
//
//                LIMIT :from, :count";

        
$sql " SELECT `conv`.`id`,
                        `conv`.`initiatorId`,
                        `conv`.`interlocutorId`,
                        `conv`.`subject`,
                        `conv`.`read`,
                        `conv`.`viewed`,

                        `initiatorMessage`.`id` as initiatorLastMessageId,
                        `initiatorMessage`.`text` as initiatorText,
                        `initiatorMessage`.`recipientRead` as initiatorRecipientRead,
                        `initiatorMessage`.`isSystem` as initiatorMessageIsSystem,
                        `initiatorMessage`.`senderId` as `initiatorMessageSenderId`,
                        `initiatorMessage`.`recipientId` as `initiatorMessageRecipientId`,
                        `initiatorMessage`.`wasAuthorized` as `initiatorMessageWasAuthorized`,
                        `initiatorMessage`.`timeStamp` as `initiatorMessageTimestamp`

                 FROM `" 
$this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `initiatorMessage`
                     ON ( `conv`.`lastMessageId` = `initiatorMessage`.`id` )

                 WHERE 
{$condition} AND (( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " self::DELETED_INITIATOR " OR `initiatorMessage`.`timeStamp`>`conv`.`initiatorDeletedTimestamp` )  )
                         OR ( `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " OR `initiatorMessage`.`timeStamp`>`conv`.`interlocutorDeletedTimestamp` ) ))

                GROUP BY `conv`.`id`

                ORDER BY `conv`.`lastMessageTimestamp` DESC

                LIMIT :from, :count"
;

        return 
$this->dbo->queryForList($sql, array('user' => $userId'from'=>$from'count'=>$count));
    }

    public function 
countConversationListByUserId($userId$activeModes)
    {
        if (
in_array('chat'$activeModes) && in_array('mail'$activeModes))
        {
            
$condition "1 ";
        }
        else
        {
            
$condition "1 ";

            if (
in_array('chat'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` = '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }

            if (
in_array('mail'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` <> '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }
        }

        
$sql "SELECT COUNT(*) FROM ( SELECT `conv`.`id` as `count` FROM `" $this->getTableName() . "` AS `conv`

                 LEFT JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON ( `last_m`.`conversationId` = `conv`.`id` )

                 LEFT JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `conv`.`id` = `mess`.conversationId )

                 WHERE 
{$condition} AND (( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " self::DELETED_INITIATOR " OR `mess`.`timeStamp`>`conv`.`initiatorDeletedTimestamp` )  )
                         OR ( `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " OR `mess`.`timeStamp`>`conv`.`interlocutorDeletedTimestamp` ) ))  AND `last_m`.`id` IS NOT NULL
                GROUP BY `conv`.`id`) AS `cnt`"
;

        return 
$this->dbo->queryForColumn($sql, array('user' => $userId));
    }

    public function 
getViewedConversationCountForConsole$userId$convList )
    {
        
$condition " 1 ";
        if ( !empty( 
$convList ) )
        {
            
$condition .= " AND `conv`.`id` IN ("$this->dbo->mergeInClause($convList) .") ";
        }

        
$sql " SELECT COUNT(`conv`.`id`) FROM `" $this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON `last_m`.`conversationId` = `conv`.`id`
                         AND ( ( `conv`.`initiatorId` = :user AND `last_m`.`interlocutorMessageId` > 0 AND `conv`.`deleted` != " 
self::DELETED_INITIATOR " AND NOT `conv`.`read` & " . (self::READ_INITIATOR) . " AND `conv`.`viewed` &  " . (self::VIEW_INITIATOR) . " )
                         OR ( `conv`.`interlocutorId` = :user AND `conv`.`deleted` != " 
self::DELETED_INTERLOCUTOR "  AND  NOT `conv`.`read` & " . (self::READ_INTERLOCUTOR) . " AND `conv`.`viewed` &  " . (self::VIEW_INTERLOCUTOR) . " ) )";

        return (int) 
$this->dbo->queryForColumn($sql, array('user' => $userId));
    }

    public function 
getNewConversationCountForConsole$userId$convList )
    {
        
$condition " 1 ";
        if ( !empty( 
$convList ) )
        {
            
$condition .= " AND `conv`.`id` IN ("$this->dbo->mergeInClause($convList) .") ";
        }

        
$sql " SELECT COUNT(`conv`.`id`) FROM `" $this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON `last_m`.`conversationId` = `conv`.`id`
                         AND ( ( `conv`.`initiatorId` = :user AND `last_m`.`interlocutorMessageId` > 0 AND `conv`.`deleted` != " 
self::DELETED_INITIATOR " AND NOT `conv`.`read` & " . (self::READ_INITIATOR) . "  AND NOT `conv`.`viewed` &  " . (self::VIEW_INITIATOR) . " )
                         OR ( `conv`.`interlocutorId` = :user AND `conv`.`deleted` != " 
self::DELETED_INTERLOCUTOR "  AND  NOT `conv`.`read` & " . (self::READ_INTERLOCUTOR) . " AND NOT `conv`.`viewed` &  " . (self::VIEW_INTERLOCUTOR) . " ) )
                         WHERE "
.$condition;

        return (int) 
$this->dbo->queryForColumn($sql, array('user' => $userId));
    }

    public function 
getConsoleConversationList$activeModes$userId$first$count$lastPingTime null$ignoreList = array() )
    {
        if (
in_array('chat'$activeModes) && in_array('mail'$activeModes))
        {
            
$condition "1 ";
        }
        else
        {
            
$condition "1 ";

            if (
in_array('chat'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` = '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }

            if (
in_array('mail'$activeModes))
            {
                
$condition .= "AND `conv`.`subject` <> '".MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT."' ";
            }
        }

        
$ignore "";

        if ( !empty( 
$ignoreList ) )
        {
            
$ignore " AND `conv`.id NOT IN ("$this->dbo->mergeInClause($ignoreList) .") ";
        }

        
$sql " SELECT `last_m`.*, `mess`.*, `conv`.* FROM `" $this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON ( `last_m`.`conversationId` = `conv`.`id` )

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `conv`.`id` = `mess`.conversationId )

                 WHERE 
{$condition} AND ( ( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " self::DELETED_INITIATOR " OR `conv`.`lastMessageTimestamp` > `conv`.`initiatorDeletedTimestamp`) AND `mess`.`id` = `last_m`.`interlocutorMessageId` )
                         OR ( `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " OR `conv`.`lastMessageTimestamp` > `conv`.`interlocutorDeletedTimestamp`) AND `mess`.`id` = `last_m`.`initiatorMessageId` ) ) $ignore

                 ORDER BY if( ((`conv`.`initiatorId` = :user AND `conv`.`viewed` &  " 
. (self::VIEW_INITIATOR) . ") OR (`conv`.`interlocutorId` = :user AND `conv`.`viewed` &  " . (self::VIEW_INTERLOCUTOR) . ")), 1, 0  ), `mess`.`timeStamp` DESC

                 LIMIT :first, :count "
;

        return 
$this->dbo->queryForList$sql, array('user' => $userId'first' => $first'count' => $count'lastPingTime' => isset($lastPingTime) ? $lastPingTime time() ) );
    }


    public function 
getMarkedUnreadConversationList$userId$ignoreList = array(), $activeModeList = array())
    {
        
$mailModeEnabled = (in_array('mail'$activeModeList)) ? true false;
        
$chatModeEnabled = (in_array('chat'$activeModeList)) ? true false;
        
$ignore "";

        if ( !empty( 
$ignoreList ) )
        {
            
$ignore " AND `conv`.id NOT IN ("$this->dbo->mergeInClause($ignoreList) .") ";
        }

        if ( !
$mailModeEnabled || !$chatModeEnabled )
        {
            if ( !
$chatModeEnabled 
            {
                
$ignore .= " AND `conv`.subject <> '" MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT "' ";
            }
            else 
            {
                
$ignore .= " AND `conv`.subject = '" MAILBOX_BOL_ConversationService::CHAT_CONVERSATION_SUBJECT "' ";
            }
        }

        
$ignore .= ' AND `conv`.`lastMessageId` != 0';
        
$sql " SELECT `conv`.`id` FROM `" $this->getTableName() . "` AS `conv`

                 WHERE (( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " 
self::DELETED_INITIATOR " OR `conv`.`lastMessageTimestamp` > `conv`.`initiatorDeletedTimestamp`) ) OR ( `conv`.`interlocutorId` = :user AND ( `conv`.`deleted` != "  self::DELETED_INTERLOCUTOR " OR `conv`.`lastMessageTimestamp` > `conv`.`interlocutorDeletedTimestamp`) ))
AND ( `conv`.`read` <> "
.self::READ_ALL."
AND (( `conv`.`initiatorId` = :user AND NOT `conv`.`read` & "
self::READ_INITIATOR .") OR ( `conv`.`interlocutorId` = :user AND NOT `conv`.`read` & "self::READ_INTERLOCUTOR ." ))
                         )
                         
$ignore
        "
;

        return 
$this->dbo->queryForColumnList$sql, array('user' => $userId) );
    }

    public function 
getInboxConversationList$userId$first$count )
    {
        
$sql " SELECT `conv`.*, `last_m`.*, `mess`.* FROM `" $this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
                     ON ( `last_m`.`conversationId` = `conv`.`id` )

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `mess`
                     ON ( `conv`.`id` = `mess`.conversationId )

                 WHERE ( `conv`.`initiatorId` = :user AND `conv`.`deleted` != " 
self::DELETED_INITIATOR " AND `mess`.`id` = `last_m`.`interlocutorMessageId` )
                         OR ( `conv`.`interlocutorId` = :user AND `conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " AND `mess`.`id` = `last_m`.`initiatorMessageId` )

                 ORDER BY `mess`.`timeStamp` DESC

                 LIMIT :first, :count "
;

        return 
$this->dbo->queryForList($sql, array('user' => $userId'first' => $first'count' => $count));
    }

    public function 
findConversationByKeyword$kw$limit null$from )
    {
        
$questionName PEEP::getConfig()->getValue('base''display_name_question');
        
$questionDataTable BOL_QuestionDataDao::getInstance()->getTableName();

        
$userId PEEP::getUser()->getId();

        
$limitStr $limit === null '' 'LIMIT 'intval($from) .', ' intval($limit);


        
//TODO get by username
        
if ($questionName == 'username')
        {
            
$join "INNER JOIN `".BOL_UserDao::getInstance()->getTableName()."` AS us ON ( `us`.`id` = IF (`conv`.`initiatorId`=:user, `conv`.`interlocutorId`, `conv`.`initiatorId`)   )";
            
$where " `us`.`username` LIKE :kw ";
        }
        else
        {
            
$join "INNER JOIN `".$questionDataTable."` AS qd ON ( `qd`.`userId` = IF (`conv`.`initiatorId`=:user, `conv`.`interlocutorId`, `conv`.`initiatorId`)  )";
            
$where " `qd`.`questionName`=:name AND `qd`.`textValue` LIKE :kw ";
        }

        
$query " SELECT `conv`.`id`,
                        `conv`.`initiatorId`,
                        `conv`.`interlocutorId`,
                        `conv`.`subject`,
                        `conv`.`read`,
                        `conv`.`viewed`,
                        `conv`.`lastMessageTimestamp`,

                        `message`.`id` as lastMessageId,
                        `message`.`text` as lastMessageText,
                        `message`.`recipientRead` as lastMessageRecipientRead,
                        `message`.`isSystem` as lastMessageIsSystem,
                        `message`.`senderId` as lastMessageSenderId,
                        `message`.`recipientId` as lastMessageRecipientId,
                        `message`.`wasAuthorized` as lastMessageWasAuthorized

                 FROM `" 
$this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `message`
                     ON ( `conv`.`lastMessageId` = `message`.`id` )

                 
{$join}

                 WHERE ( 
{$where} ) AND (( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " self::DELETED_INITIATOR " OR `message`.`timeStamp`>`conv`.`initiatorDeletedTimestamp` )  )
                         OR ( `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " OR `message`.`timeStamp`>`conv`.`interlocutorDeletedTimestamp` ) ))

                UNION

                SELECT `conv`.`id`,
                        `conv`.`initiatorId`,
                        `conv`.`interlocutorId`,
                        `conv`.`subject`,
                        `conv`.`read`,
                        `conv`.`viewed`,
                        `conv`.`lastMessageTimestamp`,

                        `message`.`id` as lastMessageId,
                        `message`.`text` as lastMessageText,
                        `message`.`recipientRead` as lastMessageRecipientRead,
                        `message`.`isSystem` as lastMessageIsSystem,
                        `message`.`senderId` as lastMessageSenderId,
                        `message`.`recipientId` as lastMessageRecipientId,
                        `message`.`wasAuthorized` as lastMessageWasAuthorized

                 FROM `" 
$this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `message`
                     ON ( `conv`.`lastMessageId` = `message`.`id` )

                 WHERE conv.subject LIKE :kw AND ( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " 
self::DELETED_INITIATOR " OR `message`.`timeStamp`>`conv`.`initiatorDeletedTimestamp` )  )


                UNION

                SELECT `conv`.`id`,
                        `conv`.`initiatorId`,
                        `conv`.`interlocutorId`,
                        `conv`.`subject`,
                        `conv`.`read`,
                        `conv`.`viewed`,
                        `conv`.`lastMessageTimestamp`,

                        `message`.`id` as lastMessageId,
                        `message`.`text` as lastMessageText,
                        `message`.`recipientRead` as lastMessageRecipientRead,
                        `message`.`isSystem` as lastMessageIsSystem,
                        `message`.`senderId` as lastMessageSenderId,
                        `message`.`recipientId` as lastMessageRecipientId,
                        `message`.`wasAuthorized` as lastMessageWasAuthorized

                 FROM `" 
$this->getTableName() . "` AS `conv`

                 INNER JOIN `" 
MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `message`
                     ON ( `conv`.`lastMessageId` = `message`.`id` )

                 WHERE conv.subject LIKE :kw AND (  `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  
self::DELETED_INTERLOCUTOR .  " OR `message`.`timeStamp`>`conv`.`interlocutorDeletedTimestamp` ))


                GROUP BY 1
                ORDER BY 7 DESC

                "
.$limitStr;
//print_r($query);
//        $query = " SELECT `conv`.`id`,
//                        `conv`.`initiatorId`,
//                        `conv`.`interlocutorId`,
//                        `conv`.`subject`,
//                        `conv`.`read`,
//                        `conv`.`viewed`,
//
//                        `last_m`.`initiatorMessageId`,
//                        `initiatorMessage`.`id` as initiatorLastMessageId,
//                        `initiatorMessage`.`text` as initiatorText,
//                        `initiatorMessage`.`recipientRead` as initiatorRecipientRead,
//                        `initiatorMessage`.`isSystem` as initiatorMessageIsSystem,
//                        `initiatorMessage`.`senderId` as `initiatorMessageSenderId`,
//                        `initiatorMessage`.`recipientId` as `initiatorMessageRecipientId`,
//                        `initiatorMessage`.`wasAuthorized` as `initiatorMessageWasAuthorized`,
//                        `initiatorMessage`.`timeStamp` as `initiatorMessageTimestamp`,
//
//                        `last_m`.`interlocutorMessageId`,
//                        `interlocutorMessage`.`id` as interlocutorLastMessageId,
//                        `interlocutorMessage`.`text` as interlocutorText,
//                        `interlocutorMessage`.`recipientRead` as interlocutorRecipientRead,
//                        `interlocutorMessage`.`isSystem` as interlocutorMessageIsSystem,
//                        `interlocutorMessage`.`senderId` as `interlocutorMessageSenderId`,
//                        `interlocutorMessage`.`recipientId` as `interlocutorMessageRecipientId`,
//                        `interlocutorMessage`.`wasAuthorized` as `interlocutorMessageWasAuthorized`,
//                        `interlocutorMessage`.`timeStamp` as `interlocutorMessageTimestamp`
//
//                 FROM `" . $this->getTableName() . "` AS `conv`
//
//                 INNER JOIN `" . MAILBOX_BOL_LastMessageDao::getInstance()->getTableName() . "` AS `last_m`
//                     ON ( `last_m`.`conversationId` = `conv`.`id` )
//
//                 LEFT JOIN `" . MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `interlocutorMessage`
//                     ON ( `conv`.`id` = `interlocutorMessage`.conversationId AND `last_m`.`interlocutorMessageId` = `interlocutorMessage`.`id` )
//
//                 LEFT JOIN `" . MAILBOX_BOL_MessageDao::getInstance()->getTableName() . "` AS `initiatorMessage`
//                     ON ( `conv`.`id` = `initiatorMessage`.conversationId AND `last_m`.`initiatorMessageId` = `initiatorMessage`.`id` )
//
//                 {$join}
//
//                 WHERE ( {$where} ) AND (( `conv`.`initiatorId` = :user AND (`conv`.`deleted` != " . self::DELETED_INITIATOR . " OR `initiatorMessage`.`timeStamp`>`conv`.`initiatorDeletedTimestamp` )  )
//                         OR ( `conv`.`interlocutorId` = :user AND (`conv`.`deleted` != "  . self::DELETED_INTERLOCUTOR .  " OR `interlocutorMessage`.`timeStamp`>`conv`.`interlocutorDeletedTimestamp` ) )) AND `last_m`.`id` IS NOT NULL
//
//                GROUP BY `conv`.`id`
//
//                ORDER BY GREATEST( COALESCE(`initiatorMessage`.`timeStamp`, 0), COALESCE(`interlocutorMessage`.`timeStamp`, 0) ) DESC
//
//                ".$limitStr;

        
$conversationItemList PEEP::getDbo()->queryForList($query, array(
            
'kw' => '%' $kw '%',
            
'user' => $userId,
            
'name' => $questionName
        
));

        foreach(
$conversationItemList as $i => $conversation)
        {
            
$conversationItemList[$i]['timeStamp'] = (int)$conversation['lastMessageTimestamp'];
            
$conversationItemList[$i]['lastMessageSenderId'] = $conversation['lastMessageSenderId'];
            
$conversationItemList[$i]['isSystem'] = $conversation['lastMessageIsSystem'];
            
$conversationItemList[$i]['text'] = $conversation['lastMessageText'];

            
$conversationItemList[$i]['lastMessageId'] = $conversation['lastMessageId'];
            
$conversationItemList[$i]['recipientRead'] = $conversation['lastMessageRecipientRead'];
            
$conversationItemList[$i]['lastMessageRecipientId'] = $conversation['lastMessageRecipientId'];
            
$conversationItemList[$i]['lastMessageWasAuthorized'] = $conversation['lastMessageWasAuthorized'];
        }

//        foreach($conversationItemList as $i => $conversation)
//        {
//            if ((int)$conversation['initiatorMessageTimestamp'] > (int)$conversation['interlocutorMessageTimestamp'])
//            {
//                $conversationItemList[$i]['timeStamp'] = (int)$conversation['initiatorMessageTimestamp'];
//                $conversationItemList[$i]['lastMessageSenderId'] = $conversation['initiatorMessageSenderId'];
//                $conversationItemList[$i]['isSystem'] = $conversation['initiatorMessageIsSystem'];
//                $conversationItemList[$i]['text'] = $conversation['initiatorText'];
//
//                $conversationItemList[$i]['lastMessageId'] = $conversation['initiatorLastMessageId'];
//                $conversationItemList[$i]['recipientRead'] = $conversation['initiatorRecipientRead'];
//                $conversationItemList[$i]['lastMessageRecipientId'] = $conversation['initiatorMessageRecipientId'];
//                $conversationItemList[$i]['lastMessageWasAuthorized'] = $conversation['initiatorMessageWasAuthorized'];
//            }
//            else
//            {
//                $conversationItemList[$i]['timeStamp'] = (int)$conversation['interlocutorMessageTimestamp'];
//                $conversationItemList[$i]['lastMessageSenderId'] = $conversation['interlocutorMessageSenderId'];
//                $conversationItemList[$i]['isSystem'] = $conversation['interlocutorMessageIsSystem'];
//                $conversationItemList[$i]['text'] = $conversation['interlocutorText'];
//
//                $conversationItemList[$i]['lastMessageId'] = $conversation['interlocutorLastMessageId'];
//                $conversationItemList[$i]['recipientRead'] = $conversation['interlocutorRecipientRead'];
//                $conversationItemList[$i]['lastMessageRecipientId'] = $conversation['interlocutorMessageRecipientId'];
//                $conversationItemList[$i]['lastMessageWasAuthorized'] = $conversation['interlocutorMessageWasAuthorized'];
//            }
//        }

        
return $conversationItemList;
    }


    
/**
     * @param $userId
     * @return MAILBOX_BOL_Conversation
     */
    
public function findUserLastConversation($userId)
    {
        
$example = new PEEP_Example();
        
$example->andFieldEqual('initiatorId'$userId);
        
$example->setOrder('createStamp DESC');
        
$example->setLimitClause(0,1);

        return 
$this->findObjectByExample($example);
    }
}
Онлайн: 1
Реклама