View file app/Controllers/NotificationController.php

File size: 2.14Kb
<?php

declare(strict_types=1);

namespace App\Controllers;

use App\Repositories\NotificationRepository;
use App\Services\Session;
use App\Services\Validator;
use App\Services\View;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

/**
 * NotificationController
 */
class NotificationController extends Controller
{
    public function __construct(
        protected NotificationRepository $notificationRepository,
        protected Session $session,
        protected Validator $validator,
        protected View $view,
    ) {}

    /**
     * Notifications
     *
     * @param Request  $request
     * @param Response $response
     *
     * @return Response
     */
    public function index(Request $request, Response $response): Response
    {
        $notifications = $this->notificationRepository->getNotifications();
        $this->notificationRepository->markAsRead();

        return $this->view->render(
            $response,
            'notifications/index',
            compact('notifications')
        );
    }

    /**
     * Destroy
     *
     * @param int $id
     * @param Request $request
     * @param Response $response
     *
     * @return Response
     */
    public function destroy(int $id, Request $request, Response $response): Response
    {
        $notification = $this->notificationRepository->getUserNotificationById($id);
        if (! $notification) {
            abort(404, 'Уведомление не найдено!');
        }

        $input = (array) $request->getParsedBody();

        $this->validator
            ->required('csrf')
            ->same('csrf', $this->session->get('csrf'), 'Неверный идентификатор сессии, повторите действие!');

        if ($this->validator->isValid($input)) {
            $notification->delete();

            $this->session->set('flash', ['success' => 'Уведомление успешно удалено!']);
        } else {
            $this->session->set('flash', ['errors' => $this->validator->getErrors()]);
        }

        return $this->redirect($response, route('notifications'));
    }
}