Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/Report/ClosureNotifier.php
<?php

namespace XF\Service\Report;

use
XF\Entity\Report;

class
ClosureNotifier extends \XF\Service\AbstractService
{
   
/**
     * @var Report
     */
   
protected $report;

    protected
$notifyUserIds = [];

    protected
$alertComment = '';
    protected
$alertType = null;

    public function
__construct(\XF\App $app, Report $report, array $notifyUserIds = null)
    {
       
parent::__construct($app);
       
$this->report = $report;
       
$this->alertType = $this->report->report_state;
       
$this->setNotifyUserIds($notifyUserIds);
    }

    public function
getReport()
    {
        return
$this->report;
    }

    public function
setNotifyUserIds(array $notifyUserIds = null)
    {
        if (
$notifyUserIds === null)
        {
           
$notifyUserIds = $this->determineNotifiableUserIds();
        }

       
$this->notifyUserIds = $notifyUserIds;
    }

    public function
getNotifyUserIds()
    {
        return
$this->notifyUserIds;
    }

    public function
setAlertComment($comment)
    {
       
$this->alertComment = $comment;
    }

    public function
getAlertComment()
    {
        return
$this->alertComment;
    }

    public function
setAlertType($type)
    {
       
$this->alertType = $type;
    }

    public function
getAlertType()
    {
        return
$this->alertType;
    }

    public function
notify()
    {
       
$users = $this->app->em()->findByIds('XF:User', $this->notifyUserIds, ['Profile', 'Option']);
        foreach (
$users AS $user)
        {
           
$this->sendClosureNotification($user);
        }
       
$this->notifyUserIds = [];
    }

    protected function
sendClosureNotification(\XF\Entity\User $user)
    {
       
$report = $this->report;

       
$title = $report->title;
        if (
$title instanceof \XF\Phrase)
        {
           
$title = $title->render('raw');
        }
       
$link = $report->link;

       
/** @var \XF\Repository\UserAlert $alertRepo */
       
$alertRepo = $this->repository('XF:UserAlert');
       
$alertSent = $alertRepo->alertFromUser(
           
$user, null,
           
'user', $user->user_id,
           
"report_{$this->alertType}",
            [
               
'comment' => $this->alertComment,
               
'title' => $title,
               
'link' => $link
           
]
        );

        return
$alertSent;
    }

    public function
determineNotifiableUserIds()
    {
       
$reportId = $this->report->report_id;
       
$db = $this->db();

       
$lastOpenDate = $db->fetchOne("
            SELECT comment_date
            FROM xf_report_comment
            WHERE report_id = ?
                AND state_change = 'open'
            ORDER BY comment_date DESC
            LIMIT 1
        "
, $reportId);
       
$userIds = $db->fetchAllColumn("
            SELECT DISTINCT user_id
            FROM xf_report_comment
            WHERE report_id = ?
                AND comment_date >= ?
                AND is_report = 1
                AND user_id <> 0
        "
, [$reportId, $lastOpenDate ?: 0]);

        return
array_unique($userIds);
    }
}