156 lines
5.4 KiB
PHP
156 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
use App\Entity\Book;
|
|
use App\Entity\File;
|
|
use App\Form\BookType;
|
|
use App\Repository\BookRepository;
|
|
use App\Repository\FileRepository;
|
|
use App\Service\FileService;
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\Routing\Annotation\Route;
|
|
use Techtube\Bookinfo\BookFinder;
|
|
|
|
#[Route('/book')]
|
|
class BookController extends AbstractController
|
|
{
|
|
#[Route('/', name: 'app_book_index', methods: ['GET'])]
|
|
public function index(BookRepository $bookRepository): Response
|
|
{
|
|
return $this->render('book/index.html.twig', [
|
|
'books' => $bookRepository->findAll(),
|
|
]);
|
|
}
|
|
|
|
#[Route('/new', name: 'app_book_new', methods: ['GET', 'POST'])]
|
|
public function new(Request $request, BookRepository $bookRepository): Response
|
|
{
|
|
$book = new Book();
|
|
$form = $this->createForm(BookType::class, $book);
|
|
$form->handleRequest($request);
|
|
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
$bookRepository->add($book, true);
|
|
|
|
$bookRequest = $request->request->all('book');
|
|
if (!empty($bookRequest['cover_url'])) {
|
|
file_put_contents(
|
|
$this->getParameter('book_covers') . 'cover_' . $book->getId() . '.jpg',
|
|
file_get_contents($bookRequest['cover_url'])
|
|
);
|
|
} else {
|
|
$cover = $request->files->get('book')['cover'];
|
|
if ($cover) {
|
|
$cover->move(
|
|
$this->getParameter('book_covers'),
|
|
'cover_' . $book->getId() . '.' . $cover->guessClientExtension()
|
|
);
|
|
}
|
|
}
|
|
|
|
$ebook = $request->files->get('book')['ebook'];
|
|
if ($ebook) {
|
|
$ebook->move(
|
|
$this->getParameter('book_files'),
|
|
'ebook_' . $book->getId() . '.' . $ebook->guessClientExtension()
|
|
);
|
|
}
|
|
|
|
return $this->redirectToRoute('app_book_index', [], Response::HTTP_SEE_OTHER);
|
|
}
|
|
|
|
return $this->renderForm('book/new.html.twig', [
|
|
'book' => $book,
|
|
'form' => $form,
|
|
]);
|
|
}
|
|
|
|
#[Route('/search/{phrase}', name: 'app_book_search', methods: ['GET'])]
|
|
public function search(string $phrase): JsonResponse
|
|
{
|
|
$bookFinder = new BookFinder();
|
|
return new JsonResponse($bookFinder->search($phrase));
|
|
}
|
|
|
|
#[Route('/info/{urlInBase64}', name: 'app_book_info', methods: ['GET'])]
|
|
public function info(string $urlInBase64): JsonResponse
|
|
{
|
|
$bookFinder = new BookFinder();
|
|
return new JsonResponse($bookFinder->byUrl(base64_decode($urlInBase64)));
|
|
}
|
|
|
|
#[Route('/{id}', name: 'app_book_show', methods: ['GET'])]
|
|
public function show(Book $book): Response
|
|
{
|
|
return $this->render('book/show.html.twig', [
|
|
'book' => $book,
|
|
]);
|
|
}
|
|
|
|
#[Route('/{id}/edit', name: 'app_book_edit', methods: ['GET', 'POST'])]
|
|
public function edit(
|
|
Request $request,
|
|
Book $book,
|
|
BookRepository $bookRepository,
|
|
FileRepository $fileRepository
|
|
): Response {
|
|
$form = $this->createForm(BookType::class, $book);
|
|
$form->handleRequest($request);
|
|
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
$cover = $request->files->get('book')['cover'];
|
|
if ($cover) {
|
|
$cover->move(
|
|
$this->getParameter('book_covers'),
|
|
'cover_' . $book->getId() . '.jpg'
|
|
);
|
|
}
|
|
|
|
/** @var \Symfony\Component\HttpFoundation\File\UploadedFile[] $ebooks */
|
|
$ebooks = $request->files->get('book')['ebook'];
|
|
if (count($ebooks) > 0) {
|
|
foreach ($ebooks as $ebook) {
|
|
$file = new File();
|
|
$file->setFileName(trim($ebook->getClientOriginalName()));
|
|
$file->setFileSize($ebook->getSize());
|
|
$file->setExtension($ebook->guessClientExtension());
|
|
$file->setBook($book);
|
|
$fileRepository->add($file, true);
|
|
|
|
$ebook->move(
|
|
$this->getParameter('book_files'),
|
|
'ebook_' . $book->getId() . '_' .
|
|
md5($file->getFileName()) . '.' .
|
|
$file->getExtension()
|
|
);
|
|
}
|
|
}
|
|
|
|
$bookRepository->add($book, true);
|
|
|
|
return $this->redirectToRoute('app_book_edit', ['id' => $book->getId()], Response::HTTP_SEE_OTHER);
|
|
}
|
|
|
|
return $this->renderForm('book/edit.html.twig', [
|
|
'book' => $book,
|
|
'form' => $form,
|
|
]);
|
|
}
|
|
|
|
#[Route('/{id}', name: 'app_book_delete', methods: ['POST'])]
|
|
public function delete(Request $request, Book $book, BookRepository $bookRepository, FileService $fileService): Response
|
|
{
|
|
if ($this->isCsrfTokenValid('delete' . $book->getId(), $request->request->get('_token'))) {
|
|
$fileService->removeFiles($book->getFiles());
|
|
$bookRepository->remove($book, true);
|
|
|
|
}
|
|
|
|
return $this->redirectToRoute('app_book_index', [], Response::HTTP_SEE_OTHER);
|
|
}
|
|
}
|