View file upload/src/addons/XenCentral/Feedback/Repository/Notification.php

File size: 12.89Kb
<?php
/**
 * @package XenCentral Feedback System
 * @author DNF Technology
 * @copyright Drnoyan & Nalyan LDA, Portugal, EU
 * @license http://dnf.technology/terms/
 * @link http://customers.dnf.technology
 * @version 2.0.0 Beta 10
 * @revision 12
 */

namespace XenCentral\Feedback\Repository;

use XF\Db\Exception;
use XF\Mvc\Entity\Finder;
use XF\Mvc\Entity\Repository;
use XenCentral\Feedback\PreferencesContainer;

class Notification
{
    use FeedbackAbstractRepository;


    public function notifyNewFeedback($feedbackId)
    {
        $feedback = $this->_getFeedbackModel()->getFeedbackById($feedbackId);

        $userPreferences = new \XenCentral\Feedback\PreferencesContainer(
            $this->_getPreferencesModel()->getUserNotificationPreferences($feedback['rateduser']['user_id']),
            $feedback
        );

        $adminPreferences = new \XenCentral\Feedback\PreferencesContainer(
            $this->_getPreferencesModel()->getAdminPreferences(),
            $feedback
        );
        $fromUserId = $feedback['rateruser']['user_id'];

        $toUserId = $feedback['rateduser']['user_id'];

        $fromUserName = $feedback['rateruser']['username'];

        $toUserName = $feedback['rateduser']['username'];

        if ($userPreferences->sendNotification()) {
            if ($feedback['has_reply'] == 0) {
                $this->_sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId, '_moderated');
            } else {
                $this->_sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId);
            }
        } else if ($feedback['has_reply'] == 0) {
            $this->_sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId, '_moderated');
        }

        if ($adminPreferences->sendAdminNotification()) {

            $admins=\XF::options()->xcfs_admin_username;
            foreach ($admins as $admin) {
                $admin = \XF::app()->em()->find('XF:User', [
                    'user_id' => $admin
                ]);
                if (isset($admin)) {
                    $this->_sendNewFeedbackAdminAlert($admin, $fromUserId, $fromUserName, $toUserName, $feedback);
                }
            }
        }

        if ($userPreferences->sendEmail()) {
            if ($userPreferences->getEmailNotificationType() == 0) {
                // send email
                $this->_sendSeparateNewFeedbackEmail($feedback);
            } else {
                $this->_queueNewFeedbackEmail($feedback);
            }
        }
        $admins=\XF::options()->xcfs_admin_username;
        foreach ($admins as $admin) {
            $toAdmin = \XF::app()->em()->find('XF:User', [
                'user_id' => $admin
            ]);

            if ($adminPreferences->sendAdminEmail()) {

                if ($adminPreferences->getEmailAdminNotificationType() == 0) {
                    // send email
                    $this->_sendSeparateNewFeedbackEmail($feedback, $toAdmin['user_id'], '_admin');
                } else {

                    $this->_queueNewFeedbackEmail($feedback, $toAdmin['user_id']);
                }

            }
        }

        if ($userPreferences->sendPm()) {
            if ($userPreferences->getPmNotificationType() == 0) {
                // send pm
                $this->_sendSeparateNewFeedbackPM($feedback);
            } else {
                $this->_queueNewFeedbackPM($feedback);
            }
        }

        if ($adminPreferences->sendAdminPm()) {
            $admins=\XF::options()->xcfs_admin_username;
            foreach ($admins as $admin) {
                $toAdmin = \XF::app()->em()->find('XF:User', [
                    'user_id' => $admin
                ]);

                if ($adminPreferences->getPmAdminNotificationType() == 0) {
                    $this->_sendSeparateNewFeedbackAdminPM($feedback, $toAdmin['user_id']);
                } else {
                    $this->_queueNewFeedbackPM($feedback, $toAdmin['user_id']);
                }
            }
        }

    }

    public function _sendSeparateNewFeedbackEmail($feedback, $toUserId = false, $postfix = '')
    {
        $feedbackUrl = \XF::app()->router('public')->buildLink('full:feedback/feedback/view', $feedback);

        if ($toUserId == false) {
            $user= \XF::app()->em()->find('XF:User', [
                'user_id' => $feedback['foruserid']
            ]);
        } else {
            $user= \XF::app()->em()->find('XF:User', [
                'user_id' => $toUserId
            ]);
        }

        $params = array(
            'user' => $user,
            'feedbackType' => \XF::phrase('xcfs_' . $feedback['feedback_string']),
            'boardTitle' => $boardTitle = \XF::options()->boardTitle,
            'feedback' => $feedback,
            'feedbackURL' => $feedbackUrl
        );
        \XF::app()->mailer()->newMail()
            ->setToUser($user)
            ->setTemplate('xcfs_new_feedback', $params)
            ->queue();

        return true;
    }

    public function _queueNewFeedbackEmail($feedback, $userId = false)
    {
        if (!$userId) {
            $userId = $feedback['rateduser']['user_id'];
        }

        $q = "
			INSERT INTO xf_xc_feedback_notification_queue (
				`forUserId`,
				`date`,
				`handler`, 
				`sent`,
				`extraData`)
			VALUES (
				" . $userId . ",
				" . \XF::$time . ",
				'XenCentral\\\\Feedback\\\\NotificationQueue\\\\Email',
				0,
				" . \XF::db()->quote(serialize($feedback)) . "
			)
		";

        \XF::db()->query($q);
    }

    public function _sendSeparateNewFeedbackPM($feedback, $toUserId = false, $postfix = '')
    {

            $userFrom = \XF::app()->em()->find('XF:User', [
                'user_id' => $feedback['fromuserid']
            ]);
            $userTo = \XF::app()->em()->find('XF:User', [
                'user_id' => $feedback['foruserid']
            ]);

        $creator = \XF::service('XF:Conversation\Creator', $userFrom);
        //$creator->setIsAutomated();
        $creator->setRecipientsTrusted($userTo);
        $creator->setContent($feedback['review'], $feedback['review']);
        if (!$creator->validate())
        {
            return;
        }
        $creator->save();

    }

    public function _sendSeparateNewFeedbackAdminPM($feedback, $toUserId = false, $postfix = '')
    {

            $user = \XF::app()->em()->find('XF:User', [
                'user_id' => $toUserId
            ]);
            $fromuser = \XF::app()->em()->find('XF:User', [
                'user_id' => $feedback['fromuserid']
            ]);
            $creator = \XF::service('XF:Conversation\Creator', $fromuser);
            //$creator->isAutomated();
            $creator->setRecipientsTrusted($user);
            $creator->setContent($feedback['review'], $feedback['review']);
            if (!$creator->validate())
            {
                return;
            }
            $creator->save();


    }

    public function _queueNewFeedbackPM($feedback, $userId = false)
    {
        if (!$userId) {
            $userId = $feedback['rateduser']['user_id'];
        }
        $q = "
			INSERT INTO xf_xc_feedback_notification_queue (
				`forUserId`,
				`date`,
				`handler`,
				`sent`,
				`extraData`)
			VALUES (
				" . $userId . ",
				" . \XF::$time . ",
				'XenCentral\\\\Feedback\\\\NotificationQueue\\\\PM',
				0,
				" . \XF::db()->quote(serialize($feedback)) . "
			)
		";

        \XF::db()->query($q);
    }

    public function _sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId, $postfix='')
    {
        $toUserId = \XF::app()->em()->find('XF:User', [
            'user_id' => $toUserId
        ]);

        $alertRepo = \XF::repository('XF:UserAlert');
        $alertRepo->alert(
            $toUserId,
            $fromUserId,
            $fromUserName,
            'feedback',
            $feedbackId,
            'feedback'.$postfix

        );
    }

    protected function _sendNewFeedbackAdminAlert($toUserId, $fromUserId, $fromUserName, $toUsername, $feedback)
    {

            $alertRepo = \XF::repository('XF:UserAlert');
            $alertRepo->alert(
                $toUserId,
                $fromUserId,
                $fromUserName,
                'feedback',
                $feedback['fb_id'],
                'feedback',
                array()

            );

    }

    public static function runQueue()
    {
        $self = new self();

        $orderedNotifications = array();

        $notifications = \XF::db()->fetchAll("
			SELECT * FROM xf_xc_feedback_notification_queue
			WHERE sent=0
			ORDER BY `date` ASC
		");

        // $userCache=array();

        $handlerCache = array();

        $markAsRead = array();

        foreach ($notifications AS $notification) {
            $notification['extraData'] = $notification['extraData'] ? unserialize($notification['extraData']) : array();
            if ($notification['forUserId'] != $notification['extraData']['foruserid']) {
                $notification['extraData']['isAdmin'] = true;
            } else {
                $notification['extraData']['isAdmin'] = false;
            }

            if (!isset($handlerCache[$notification['handler']])) {
                $handlerCache[$notification['handler']] = new $notification['handler']();
            }

            /* @var $notificationHandler XenCentral_Feedback_NotificationQueue_Abstract */
            $notificationHandler = $handlerCache[$notification['handler']];


                $adminPreferences = new \XenCentral\Feedback\PreferencesContainer(
                    $self->_getPreferencesModel()->getAdminPreferences(),
                    $notification['extraData']);

                $userPreferences = new \XenCentral\Feedback\PreferencesContainer(
                    $self->_getPreferencesModel()->getUserNotificationPreferences($notification['forUserId']),
                    $notification['extraData']);

            $userPreferences->setUserId($notification['forUserId']);

            if (!$notificationHandler->checkSendDate($notification, $userPreferences->getPreferencesArray())) {
                continue;
            }
            if (!$notificationHandler->checkSendAdminDate($notification, $adminPreferences->getPreferencesArray())) {
                continue;
            }

            $notification['extraData']['userPreferences'] = $userPreferences;

            $orderedNotifications[$notification['forUserId']][$notification['handler']]['dateline'][] = $notification['extraData'];

            $markAsRead[] = $notification['id'];
        }

        unset($notifications);

        foreach ($orderedNotifications AS $userId => $handlers) {
            foreach ($handlers AS $handlerName => $notifications) {
                $handlerObject = $handlerCache[$handlerName];

                $notifications = $notifications['dateline'];

                $allFeedback = array();
                $userPreferences = false;
                foreach ($notifications AS $extraData) {
                    $userPreferences = $extraData['userPreferences'];
                    $allFeedback[$extraData['isAdmin'] + 1][] = $extraData;
                }
                if (!empty($allFeedback[1])) {
                    $handlerObject->send(
                        $userPreferences->getUser(),
                        $allFeedback[1]
                    );
                }
                if (!empty(\XF::options()->xcfs_admin_username)) {
                    $admins=\XF::options()->xcfs_admin_username;
                    foreach ($admins as $admin) {
                        $admin = \XF::app()->em()->find('XF:User', [
                            'user_id' => $admin
                        ]);
                        $userPreferences->setUserId($admin['user_id']);
                        if (!empty($allFeedback[2])) {
                            $handlerObject->send(
                                $userPreferences->getUser(),
                                $allFeedback[2],
                                '_admin'
                            );
                        }
                    }
                } else {
                    return;
                }


            }
        }

        if (!empty($markAsRead)) {
            \XF::db()->query("
				UPDATE xf_xc_feedback_notification_queue
				SET sent=1
				WHERE id IN(" . implode(',', $markAsRead) . ")
			");
        }
    }



    /*protected function _getAdministrators()
    {
        static $administrators;
        if (is_null($administrators)) {
            $administrators = array();

            $usergroupIds = \XF::options()->xcfs_admin_username;
            if (!empty($usergroupIds)) {
                $administrators = \XF::db()->fetchPairs(
                    '
                        SELECT user_id, is_primary
                        FROM xf_user_group_relation
                        WHERE user_group_id IN (?)
                        ORDER BY user_id
                    ',
                    array(implode(',', (array)$usergroupIds))
                );
            }
        }

        return $administrators;
    }*/
}