ForumPost.php 3.14 KB
<?php

namespace FootyRoom\Core\ForumPost;

use DateTime;
use FootyRoom\Core\Comment\Comment;
use FootyRoom\Core\CoreException;
use FootyRoom\Core\Post\Post;
use Illuminate\Support\Str;

class ForumPost extends Post
{
    /**
     * @var string
     */
    protected $slug;

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

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

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

    /**
     * Constructor.
     *
     * @param string $title
     * @param int $categoryId
     * @param int $userId
     */
    public function __construct($title, $categoryId, $userId)
    {
        $this->userId = $userId;
        $this->setTitle($title);
        $this->categoryId = $categoryId;
        $this->status = 'publish';
        $this->discussionStatus = 'open';
        $this->date = new DateTime();

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

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

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

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

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

    /**
     * Edit posts title.
     *
     * @param string $title
     */
    public function editTitle($title)
    {
        if ($title !== $this->title) {
            $this->setTitle($title);
        }
    }

    /**
     * Move post to another category.
     *
     * @param int $categoryId
     */
    public function move($categoryId)
    {
        if ($this->categoryId !== $categoryId) {
            $previous = $this->categoryId;

            $this->categoryId = $categoryId;

            $this->raise(new Moved($this, $previous));
        }
    }

    /**
     * Change author of the post.
     *
     * @param int $userId
     */
    public function changeAuthor($userId)
    {
        $this->userId = $userId;
    }

    /**
     * Private setter for title.
     *
     * @param string $title
     */
    protected function setTitle($title)
    {
        // Make sure title is not empty.
        if (trim($title) === '') {
            throw new CoreException('Your post title is empty.');
        }

        // Make sure title is not over 120 characters.
        if (strlen($title) > 120) {
            throw new CoreException('Post title is limited 120 characters.');
        }

        $this->title = $title;

        $this->slug = Str::slug($this->title);
    }

    public function getCommentableType()
    {
        return 'forumPost';
    }

    /**
     * Run additional checks after comment is scheduled to be posted.
     *
     * @param \FootyRoom\Core\Comment\Comment $comment
     */
    protected function afterComment(Comment $comment)
    {
        parent::afterComment($comment);

        $this->raise(new ForumPostCommentPosted($comment, $this));
    }
}