Skip to content
Snippets Groups Projects
EpisodeComment.php 3.89 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    declare(strict_types=1);
    
    /**
     * @copyright  2020 Podlibre
     * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
     * @link       https://castopod.org/
     */
    
    namespace App\Entities;
    
    
    use App\Models\EpisodeCommentModel;
    
    use App\Models\EpisodeModel;
    use CodeIgniter\I18n\Time;
    use Michalsn\Uuid\UuidEntity;
    use RuntimeException;
    
    /**
     * @property string $id
     * @property string $uri
     * @property int $episode_id
     * @property Episode|null $episode
     * @property int $actor_id
     * @property Actor|null $actor
     * @property string $in_reply_to_id
    
     * @property EpisodeComment|null $reply_to_comment
    
     * @property string $message
     * @property string $message_html
     * @property int $likes_count
     * @property int $replies_count
     * @property Time $created_at
     * @property int $created_by
    
     *
     * @property EpisodeComment[] $replies
    
    class EpisodeComment extends UuidEntity
    
    {
        protected ?Episode $episode = null;
    
        protected ?Actor $actor = null;
    
    
        protected ?EpisodeComment $reply_to_comment = null;
    
        /**
         * @var EpisodeComment[]|null
         */
        protected ?array $replies = null;
    
        protected bool $has_replies = false;
    
    
        /**
         * @var string[]
         */
        protected $dates = ['created_at'];
    
        /**
         * @var array<string, string>
         */
        protected $casts = [
            'id' => 'string',
            'uri' => 'string',
            'episode_id' => 'integer',
            'actor_id' => 'integer',
            'in_reply_to_id' => '?string',
            'message' => 'string',
            'message_html' => 'string',
            'likes_count' => 'integer',
            'replies_count' => 'integer',
            'created_by' => 'integer',
            'is_from_post' => 'boolean',
        ];
    
        public function getEpisode(): ?Episode
        {
            if ($this->episode_id === null) {
                throw new RuntimeException('Comment must have an episode_id before getting episode.');
            }
    
            if (! $this->episode instanceof Episode) {
                $this->episode = (new EpisodeModel())->getEpisodeById($this->episode_id);
            }
    
            return $this->episode;
        }
    
        /**
         * Returns the comment's actor
    
         *
         * @noRector ReturnTypeDeclarationRector
    
        public function getActor(): ?Actor
    
        {
            if ($this->actor_id === null) {
                throw new RuntimeException('Comment must have an actor_id before getting actor.');
            }
    
            if ($this->actor === null) {
    
                // @phpstan-ignore-next-line
    
                $this->actor = model(ActorModel::class, false)
    
            // @phpstan-ignore-next-line
    
        /**
         * @return EpisodeComment[]
         */
        public function getReplies(): array
        {
            if ($this->id === null) {
                throw new RuntimeException('Comment must be created before getting replies.');
            }
    
            if ($this->replies === null) {
                $this->replies = (new EpisodeCommentModel())->getCommentReplies($this->id);
            }
    
            return $this->replies;
        }
    
    
        public function getHasReplies(): bool
        {
    
        /**
         * @noRector ReturnTypeDeclarationRector
         */
    
        public function getReplyToComment(): ?self
        {
            if ($this->in_reply_to_id === null) {
                throw new RuntimeException('Comment is not a reply.');
            }
    
            if ($this->reply_to_comment === null) {
    
                $this->reply_to_comment = model(EpisodeCommentModel::class, false)
    
                    ->getCommentById($this->in_reply_to_id);
            }
    
            return $this->reply_to_comment;
        }
    
    
        public function setMessage(string $message): static
        {
    
    
            $messageWithoutTags = strip_tags($message);
    
            $this->attributes['message'] = $messageWithoutTags;
            $this->attributes['message_html'] = str_replace("\n", '<br />', linkify($messageWithoutTags));
    
            return $this;
        }
    }