Comment.php 4.03 KB
<?php

namespace FootyRoom\Core\Comment;

use DateTime;
use FootyRoom\User\User;
use FootyRoom\Core\CoreException;
use FootyRoom\Core\EventGenerator;

class Comment
{
    use EventGenerator;

    /**
     * @var int
     */
    protected $id;

    /**
     * @var string
     */
    protected $discussionId;

    /**
     * @var \FootyRoom\Core\Comment\Author
     */
    protected $author;

    /**
     * @var string
     */
    protected $content;

    /**
     * @var string
     */
    protected $html;

    /**
     * @var \DateTime
     */
    protected $date;

    /**
     * @var int
     */
    protected $parentId;

    /**
     * @var bool
     */
    protected $isApproved;

    /**
     * Constructor.
     *
     * @param string $discussionId
     * @param \FootyRoom\Core\Comment\Author $author
     * @param string $content
     * @param string $html
     * @param int $parentId
     * @param bool $isApproved
     */
    public function __construct($discussionId, Author $author, $content, $html, $parentId = 0, $isApproved = true)
    {
        $this->discussionId = $discussionId;
        $this->author = $author;
        $this->setContent($content, $html);
        $this->parentId = $parentId;
        $this->isApproved = $isApproved;
        $this->date = new DateTime();
    }

    /**
     * Gets the value of discussionId.
     *
     * @return string
     */
    public function getDiscussionId()
    {
        return $this->discussionId;
    }

    /**
     * Gets the value of author.
     *
     * @return \FootyRoom\Core\Comment\Author
     */
    public function getAuthor()
    {
        return $this->author;
    }

    /**
     * Gets the value of id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Gets the value of content.
     *
     * @return string
     */
    public function getContent()
    {
        return $this->content;
    }

    /**
     * Gets the value of date.
     *
     * @return \DateTime
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Gets the value of parentId.
     *
     * @return int
     */
    public function getParentId()
    {
        return $this->parentId;
    }

    /**
     * Determines whether comment is approved by moderators.
     *
     * @return bool
     */
    public function isApproved()
    {
        return $this->isApproved;
    }

    /**
     * Edit comment content.
     *
     * @param string $content
     * @param string $html
     * @param \FootyRoom\User\User $editor
     */
    public function editContent($content, $html, User $editor)
    {
        // Check that new comment content is different from the current one.
        if ($content === $this->getContent()) {
            throw new CoreException('Edited comment is exactly the same as original.');
        }

        $oldContent = $this->content;
        $oldHtml = $this->html;

        $this->setContent($content, $html);

        $this->raise(new CommentEdited($this, $oldContent, $oldHtml, $editor));
    }

    /**
     * Sets content of comment.
     *
     * @param string $content
     * @param string $html
     */
    protected function setContent($content, $html)
    {
        // Check comment content is not empty.
        if (trim(preg_replace('/<br ?\/?>/', '', $content)) === '') {
            throw new CoreException('Your post content is empty.');
        }

        $this->content = $content;
        $this->html = $html;
    }

    /**
     * Gets the value of html.
     *
     * @return string
     */
    public function getHtml()
    {
        return $this->html;
    }

    /**
     * Approve an unapproved comment.
     */
    public function approve()
    {
        if (!$this->isApproved) {
            $this->isApproved = true;

            $this->raise(new CommentApproved($this));
        }
    }

    /**
     * Reject an approved comment.
     */
    public function reject()
    {
        if ($this->isApproved) {
            $this->isApproved = false;

            $this->raise(new CommentRemoved($this));
        }
    }
}