<?php
|
declare(strict_types=1);
|
|
namespace App\Controller;
|
|
use App\Entity\Book;
|
use App\Form\CoverType;
|
use App\Service\CoverProcessingException;
|
use App\Service\CoverStorage;
|
use App\Service\Library;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Requirement\Requirement;
|
|
class CoverController extends AbstractController {
|
#[Route('/cover/{name}', name: 'cover_original', requirements: ['name' => '[0-9a-f]{32}\.(jpg|png|webp)'], methods: ['GET'])]
|
public function original(string $name, CoverStorage $covers): Response {
|
$path = $covers->originalPath($name);
|
|
if (!is_file($path)) {
|
throw $this->createNotFoundException();
|
}
|
|
$response = new BinaryFileResponse($path);
|
$response->headers->set('X-Content-Type-Options', 'nosniff');
|
|
return $response;
|
}
|
|
#[Route('/book/{id}/cover', name: 'cover_upload', requirements: ['id' => Requirement::DIGITS], methods: ['POST'])]
|
public function upload(Request $request, Book $book, Library $library): Response {
|
$form = $this->createForm(CoverType::class);
|
$form->handleRequest($request);
|
|
if (!$form->isSubmitted()) {
|
$this->addFlash('error', 'cover_too_large');
|
} elseif (!$form->isValid()) {
|
$this->addFlash('error', $form->getErrors(true)->current()->getMessage());
|
} else {
|
try {
|
$library->changeCover($book, $form->getData()['cover']);
|
$this->addFlash('success', 'cover_saved');
|
} catch (CoverProcessingException) {
|
$this->addFlash('error', 'cover_failed');
|
}
|
}
|
|
return $this->redirectToRoute('book_show', ['id' => $book->getId()]);
|
}
|
|
#[Route('/book/{id}/cover/remove', name: 'cover_remove', requirements: ['id' => Requirement::DIGITS], methods: ['POST'])]
|
public function remove(Request $request, Book $book, Library $library): Response {
|
if ($this->isCsrfTokenValid('remove-cover' . $book->getId(), $request->getPayload()->getString('_token'))) {
|
$library->changeCover($book, null);
|
} else {
|
$this->addFlash('error', 'action_rejected');
|
}
|
|
return $this->redirectToRoute('book_show', ['id' => $book->getId()]);
|
}
|
}
|