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

namespace XF\Service\Report;

use
XF\Entity\Report;
use
XF\Entity\ReportComment;

use function
strlen;

class
Commenter extends \XF\Service\AbstractService
{
    use \
XF\Service\ValidateAndSavableTrait;

   
/**
     * @var Report
     */
   
protected $report;

   
/**
     * @var ReportComment
     */
   
protected $comment;

   
/**
     * @var CommentPreparer
     */
   
protected $commentPreparer;

    protected
$alertComment;
    protected
$sendAlert = false;

    public function
__construct(\XF\App $app, Report $report)
    {
       
parent::__construct($app);

       
$this->report = $report;
       
$this->comment = $report->getNewComment();
       
$this->comment->addCascadedSave($this->report);
       
$this->commentPreparer = $this->service('XF:Report\CommentPreparer', $this->comment);
       
$this->setCommentDefaults();
    }

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

    public function
getComment()
    {
        return
$this->comment;
    }

    public function
getCommentPreparer()
    {
        return
$this->commentPreparer;
    }

    protected function
setCommentDefaults()
    {
       
$visitor = \XF::visitor();

       
$this->commentPreparer->setUser($visitor);
       
$this->comment->is_report = false;
       
$this->comment->comment_date = \XF::$time;

       
$this->report->last_modified_date = time();
       
$this->report->last_modified_user_id = $visitor->user_id;
       
$this->report->last_modified_username = $visitor->username;

        if (
$this->report->isClosed())
        {
           
$this->setReportState('open');
        }
    }

    public function
setReportState($newState = null, \XF\Entity\User $assignedUser = null)
    {
       
$oldState = $this->report->getExistingValue('report_state');
        if (
$newState)
        {
           
$this->report->report_state = $newState;
            if (
$assignedUser && $newState == 'assigned')
            {
               
$this->report->assigned_user_id = $assignedUser->user_id;
            }

            if (
$newState == 'open')
            {
               
$this->report->assigned_user_id = 0;
            }
        }

        if (
$newState && ($newState != $oldState || $this->report->isChanged('assigned_user_id')))
        {
           
$this->comment->state_change = $newState;
        }
    }

    public function
setupClosedAlert($alertComment)
    {
       
$this->alertComment = $alertComment;
       
$this->sendAlert = true;
    }

    public function
setMessage($message, $format = true)
    {
        return
$this->commentPreparer->setMessage($message, $format);
    }

    protected function
finalSetup()
    {
       
$comment = $this->comment;

        if (
$this->sendAlert && $comment->isClosureComment())
        {
           
// Include resolution/rejection alert inside the comment.

           
$appendPhrase = \XF::phrase('report_resolution_alert_comment_append', [
               
'alert' => $this->alertComment ?: '-'
           
]);
           
$message = trim($comment->message . "\n\n" . $appendPhrase->render('raw'));

           
$comment->set('message', $message, ['forceSet' => true]);
        }
    }
   
    public function
hasSaveableChanges()
    {
        return
$this->comment->hasSaveableChanges();
    }

    protected function
_validate()
    {
       
$this->finalSetup();

       
$this->comment->preSave();
        return
$this->comment->getErrors();
    }

    protected function
_save()
    {
       
$comment = $this->comment;
       
$report = $this->report;

       
$db = $this->db();
       
$db->beginTransaction();

       
// This will save the report, also.
       
$comment->save(true, false);

        if (
strlen($comment->message))
        {
           
$report->fastUpdate('comment_count', $report->comment_count + 1);
        }

       
$db->commit();

        return
$comment;
    }

    public function
sendNotifications()
    {
       
// TODO: send quote notifications, assigned notifications?

       
if ($this->comment->isClosureComment() && $this->sendAlert)
        {
           
/** @var \XF\Service\Report\ClosureNotifier $closureNotifier */
           
$closureNotifier = $this->service('XF:Report\ClosureNotifier', $this->report);
           
$closureNotifier->setAlertComment($this->alertComment);
           
$closureNotifier->notify();
        }

       
/** @var \XF\Service\Report\Notifier $notifier */
       
$notifier = $this->service('XF:Report\Notifier', $this->report, $this->comment);
       
$notifier->setNotifyMentioned($this->commentPreparer->getMentionedUserIds());
       
$notifier->notify();
    }
}