ChangeApprovalHandler.php 2.25 KB
<?php

namespace FootyRoom\App\Comment;

use FootyRoom\Core\Comment\ChangeApprovalPolicy;
use FootyRoom\Core\Comment\CommentChange;
use FootyRoom\Repositories\CommentRepository;
use FootyRoom\Repositories\UserRepository;
use Illuminate\Contracts\Events\Dispatcher;

class ChangeApprovalHandler
{
    /**
     * @var \FootyRoom\Repositories\CommentRepository
     */
    protected $commentRepo;

    /**
     * @var \FootyRoom\Repositories\UserRepository
     */
    protected $userRepo;

    /**
     * @var \Illuminate\Contracts\Events\Dispatcher
     */
    protected $events;

    /**
     * Constructor.
     *
     * @param \FootyRoom\Repositories\CommentRepository $commentRepo
     * @param \FootyRoom\Repositories\UserRepository $userRepo
     * @param \Illuminate\Contracts\Events\Dispatcher $events
     */
    public function __construct(
        CommentRepository $commentRepo,
        UserRepository $userRepo,
        Dispatcher $events
    ) {
        $this->commentRepo = $commentRepo;
        $this->userRepo = $userRepo;
        $this->events = $events;
    }

    /**
     * Edits approval comment.
     *
     * @param \FootyRoom\App\Comment\EditApprovalDto $editDto
     * @param \FootyRoom\User\User $user
     */
    public function handle(ChangeApprovalCommand $command)
    {
        $user = $this->userRepo->findById($command->userId);

        $comment = $this->commentRepo->findById($command->commentId);

        ChangeApprovalPolicy::check($user, $comment->getDiscussionId(), true);

        // Make sure we are changing status.
        if ($command->isApproved === $comment->isApproved()) {
            return;
        }

        if ($command->isApproved) {
            $comment->approve();
        } else {
            $comment->reject();
        }

        $change = new CommentChange(
            $command->commentId,
            $command->isApproved ? 'undelete' : 'delete',
            $user->getUserId(),
            $user->getUsername(),
            $command->reason,
            date('Y-m-d H:m:s')
        );

        $this->commentRepo->updateApproval($comment->getId(), $comment->isApproved());

        $this->commentRepo->createChange($change);

        foreach ($comment->releaseEvents() as $event) {
            $this->events->dispatch($event);
        }
    }
}