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

class NOTIFICATIONS_BOL_Service
{
    const 
SCHEDULE_IMMEDIATELY 'immediately';
    const 
SCHEDULE_AUTO 'auto';
    const 
SCHEDULE_NEVER 'never';

    private static 
$classInstance;

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

        return 
self::$classInstance;
    }

    
/**
     *
     * @var NOTIFICATIONS_BOL_RuleDao
     */
    
private $ruleDao;

    
/**
     *
     * @var NOTIFICATIONS_BOL_UnsubscribeDao
     */
    
private $unsubscribeDao;

    
/**
     *
     * @var NOTIFICATIONS_BOL_ScheduleDao
     */
    
private $scheduleDao;

    
/**
     *
     * @var NOTIFICATIONS_BOL_SendQueueDao
     */
    
private $sendQueueDao;

    
/**
     *
     * @var NOTIFICATIONS_BOL_NotificationDao
     */
    
private $notificationDao;

    private 
$defaultRuleList = array();

    public function 
__construct()
    {
        
$this->ruleDao NOTIFICATIONS_BOL_RuleDao::getInstance();
        
$this->unsubscribeDao NOTIFICATIONS_BOL_UnsubscribeDao::getInstance();
        
$this->notificationDao NOTIFICATIONS_BOL_NotificationDao::getInstance();
        
$this->scheduleDao NOTIFICATIONS_BOL_ScheduleDao::getInstance();
        
$this->sendQueueDao NOTIFICATIONS_BOL_SendQueueDao::getInstance();
    }

    public function 
collectActionList()
    {
        if ( empty(
$this->defaultRuleList) )
        {
            
$event = new BASE_CLASS_EventCollector('notifications.collect_actions');
            
PEEP::getEventManager()->trigger($event);

            
$eventData $event->getData();
            foreach ( 
$eventData as $item )
            {
                
$this->defaultRuleList[$item['action']] = $item;
            }
        }

        return 
$this->defaultRuleList;
    }

    public function 
findRuleList$userId$actions null )
    {
        
$out = array();
        
$list $this->ruleDao->findRuleList($userId$actions);
        foreach ( 
$list as $item )
        {
            
$out[$item->action] = $item;
        }

        return 
$out;
    }

    public function 
saveRuleNOTIFICATIONS_BOL_Rule $rule )
    {
        
$this->ruleDao->save($rule);
    }

    public function 
findUserIdByUnsubscribeCode$code )
    {
        
$dto $this->unsubscribeDao->findByCode($code);

        return  empty(
$dto) ? null $dto->userId;
    }

    private function 
getUnsubscribeCodeLifeTime()
    {
        return 
60 60 24 7;
    }

    public function 
deleteExpiredUnsubscribeCodeList()
    {
        
$time time() - $this->getUnsubscribeCodeLifeTime();
        
$this->unsubscribeDao->deleteExpired($time);
    }

    public function 
generateUnsubscribeCodeBOL_User $user )
    {
        
$code md5($user->email);
        
$dto = new NOTIFICATIONS_BOL_Unsubscribe();
        
$dto->userId $user->id;
        
$dto->code $code;
        
$dto->timeStamp time();

        
$this->unsubscribeDao->save($dto);

        return 
$code;
    }

    
    public function 
isNotificationPermited$userId$action )
    {
        
$defaultRules $this->collectActionList();
        
$rules $this->findRuleList($userId);
        
        if ( isset(
$rules[$action]) )
        {
            return (bool) 
$rules[$action]->checked;
        }
        
        return !empty(
$defaultRules[$action]['selected']);
    }
    
    public function 
sendPermittedNotifications$userId$notificationList )
    {
        
$defaultRules $this->collectActionList();
        
$rules $this->findRuleList($userId);

        
$listToSend = array();
        foreach ( 
$notificationList as $notification )
        {
            
$action $notification['action'];

            if ( isset(
$rules[$action]) )
            {
                if ( !
$rules[$action]->checked )
                {
                    continue;
                }
            }
            else
            {
                if ( empty(
$defaultRules[$action]['selected']) )
                {
                    continue;
                }
            }

            
$listToSend[] = $notification;
        }

        
$this->sendNotifications($userId$listToSendfalse);
    }

    public function 
sendNotifications$userId$notifications )
    {
        if ( empty(
$notifications) )
        {
            return;
        }

        
$cmp = new NOTIFICATIONS_CMP_Notification($userId);

        foreach ( 
$notifications as $item )
        {
            
$data $item['data'];
            
$params $item;
            
$onEvent = new PEEP_Event('notifications.on_item_send'$params$data);
            
PEEP::getEventManager()->trigger($onEvent);

            
$item['data'] = $onEvent->getData();

            
$cmp->addItem($item);
        }

        
$this->sendProcess($userId$cmp);
    }

    private function 
sendProcess$userIdNOTIFICATIONS_CMP_Notification $cmp )
    {
        
$userService BOL_UserService::getInstance();
        
$user $userService->findUserById($userId);

        if ( empty(
$user) )
        {
            return 
false;
        }

        
$email $user->email;
        
$unsubscribeCode $this->generateUnsubscribeCode($user);

        
$cmp->setUnsubscribeCode($unsubscribeCode);

        
$txt $cmp->getTxt();
        
$html $cmp->getHtml();

        
$subject $cmp->getSubject();

        try
        {
            
$mail PEEP::getMailer()->createMail()
                ->
addRecipientEmail($email)
                ->
setTextContent($txt)
                ->
setHtmlContent($html)
                ->
setSubject($subject);

            
PEEP::getMailer()->send($mail);
        }
        catch ( 
Exception $e )
        {
            
//Skip invalid notification
        
}
    }



    public function 
findNotificationList$userId$beforeStamp$ignoreIds$count )
    {
        return 
$this->notificationDao->findNotificationList($userId$beforeStamp$ignoreIds$count);
    }

    public function 
findNewNotificationList$userId$afterStamp )
    {
        return 
$this->notificationDao->findNewNotificationList($userId$afterStamp);
    }

    public function 
findNotificationListForSend$userIdList )
    {
        return 
$this->notificationDao->findNotificationListForSend($userIdList);
    }

    public function 
findNotificationCount$userId$viewed null$exclude null )
    {
        return 
$this->notificationDao->findNotificationCount($userId$viewed$exclude);
    }

    public function 
saveNotificationNOTIFICATIONS_BOL_Notification $notification )
    {
        
$this->notificationDao->saveNotification($notification);
    }

    
/**
     *
     * @param string $entityType
     * @param int $entityId
     * @param int $userId
     * @return NOTIFICATIONS_BOL_Notification
     */
    
public function findNotification$entityType$entityId$userId )
    {
        return 
$this->notificationDao->findNotification($entityType$entityId$userId);
    }

    public function 
markNotificationsViewedByIds$idList$viewed true )
    {
        
$this->notificationDao->markViewedByIds($idList$viewed);
    }

    public function 
markNotificationsViewedByUserId$userId$viewed true )
    {
        
$this->notificationDao->markViewedByUserId($userId$viewed);
    }

    public function 
markNotificationsSentByIds$idList$sent true )
    {
        
$this->notificationDao->markSentByIds($idList$sent);
    }

    public function 
deleteNotification$entityType$entityId$userId )
    {
        
$this->notificationDao->deleteNotification($entityType$entityId$userId);
    }

    public function 
deleteExpiredNotification()
    {
        
$this->notificationDao->deleteExpired();
    }

    public function 
deleteNotificationByEntity$entityType$entityId )
    {
        
$this->notificationDao->deleteNotificationByEntity($entityType$entityId);
    }

    public function 
deleteNotificationByPluginKey$pluginKey )
    {
        
$this->notificationDao->deleteNotificationByPluginKey($pluginKey);
    }

    public function 
setNotificationStatusByPluginKey$pluginKey$status )
    {
        
$this->notificationDao->setNotificationStatusByPluginKey($pluginKey$status);
    }

    public function 
getDefaultSchedule()
    {
        return 
self::SCHEDULE_AUTO;
    }

    public function 
getSchedule$userId )
    {
        
$entity $this->scheduleDao->findByUserId($userId);

        return 
$entity === null $this->getDefaultSchedule() : $entity->schedule;
    }

    public function 
setSchedule$userId$schedule )
    {
        
$entity $this->scheduleDao->findByUserId($userId);

        if ( 
$entity === null )
        {
            
$entity = new NOTIFICATIONS_BOL_Schedule();
            
$entity->userId $userId;
        }
        else if ( 
$entity->schedule == $schedule )
        {
            return 
false;
        }

        
$entity->schedule $schedule;

        
$this->scheduleDao->save($entity);

        return 
true;
    }

    public function 
fillSendQueue$period null )
    {
        
$this->sendQueueDao->fillData($period$this->getDefaultSchedule());
    }

    public function 
getSendQueueLength()
    {
        return 
$this->sendQueueDao->countAll();
    }

    public function 
findUserIdListForSend$count )
    {
        
$list $this->sendQueueDao->findList($count);

        if ( empty(
$list) )
        {
            return array();
        }

        
$userIds = array();
        
$ids = array();
        foreach ( 
$list as $item )
        {
            
$ids[] = $item->id;
            
$userIds[] = $item->userId;
        }

        
$this->sendQueueDao->deleteByIdList($ids);

        return 
$userIds;
    }
}
Онлайн: 0
Реклама