From 20e450f868432016ba2f37beee9bca29f5ebe54a Mon Sep 17 00:00:00 2001 From: krzysiej Date: Wed, 8 Jun 2022 15:03:55 +0200 Subject: [PATCH] List of all the books added as a separate page. --- assets/js/pages/files.vue | 21 +++++++++++++++++--- src/Controller/BookController.php | 11 +++++------ src/Controller/FileController.php | 32 +++++++++++++++++++++++++++---- templates/base.html.twig | 4 ++-- templates/book/show.html.twig | 2 +- templates/file/index.html.twig | 5 ++++- 6 files changed, 58 insertions(+), 17 deletions(-) diff --git a/assets/js/pages/files.vue b/assets/js/pages/files.vue index 816780b..0aceeee 100644 --- a/assets/js/pages/files.vue +++ b/assets/js/pages/files.vue @@ -17,7 +17,13 @@ {{ file.id }} - {{ file.fileName }} + {{ file.fileName }} +

+ {{ + file.book.title + }}{{ file.book.author }} +

+ {{ formatSize(file.fileSize) }} {{ file.extension }} download @@ -44,6 +50,9 @@ export default { files: [] } }, + props: { + bookId: {type: Number, default: null} + }, mounted() { this.getFiles(); }, @@ -58,11 +67,17 @@ export default { if (bytes === 0) { return "0.00 B"; } - var e = Math.floor(Math.log(bytes) / Math.log(1024)); + const e = Math.floor(Math.log(bytes) / Math.log(1024)); return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B'; }, getFiles: function () { - axios.get(window.location.href.replace(window.location.hash, '') + '/files').then(response => this.files = response.data) + axios.get(this.getFilesEndpoint()).then(response => this.files = response.data) + }, + getFilesEndpoint: function () { + if (this.bookId) { + return '/book/' + this.bookId + '/files'; + } + return '/file/all'; } } } diff --git a/src/Controller/BookController.php b/src/Controller/BookController.php index 232ebbc..0f3cd40 100644 --- a/src/Controller/BookController.php +++ b/src/Controller/BookController.php @@ -3,12 +3,11 @@ namespace App\Controller; use App\Entity\Book; -use App\Entity\File; use App\Form\BookType; use App\Form\FileType; use App\Form\SearchType; use App\Repository\BookRepository; -use App\Service\ProgressService; +use App\Service\FileService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\JsonResponse; @@ -29,7 +28,7 @@ class BookController extends AbstractController } #[Route('/new', name: 'app_book_new', methods: ['GET', 'POST'])] - public function new(Request $request, BookRepository $bookRepository, ProgressService $fileService): Response + public function new(Request $request, BookRepository $bookRepository, FileService $fileService): Response { $book = new Book(); $form = $this->createForm(BookType::class, $book); @@ -95,7 +94,7 @@ class BookController extends AbstractController public function show( Book $book, Request $request, - ProgressService $fileService + FileService $fileService ): Response { $fileForm = $this->createForm(FileType::class); $fileForm->handleRequest($request); @@ -124,7 +123,7 @@ class BookController extends AbstractController Request $request, Book $book, BookRepository $bookRepository, - ProgressService $fileService + FileService $fileService ): Response { $form = $this->createForm(BookType::class, $book); $form->handleRequest($request); @@ -162,7 +161,7 @@ class BookController extends AbstractController Request $request, Book $book, BookRepository $bookRepository, - ProgressService $fileService + FileService $fileService ): Response { if ($this->isCsrfTokenValid('delete' . $book->getId(), $request->request->get('_token'))) { $fileService->removeFiles($book->getFiles()); diff --git a/src/Controller/FileController.php b/src/Controller/FileController.php index 33a5eb7..d74ca87 100644 --- a/src/Controller/FileController.php +++ b/src/Controller/FileController.php @@ -2,25 +2,49 @@ namespace App\Controller; +use App\Entity\Book; use App\Entity\File; 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 Symfony\Component\Serializer\Normalizer\AbstractNormalizer; +#[Route('/file')] class FileController extends AbstractController { - #[Route('/file', name: 'app_file')] - public function index(): Response + #[Route('/', name: 'app_file_index')] + public function index(FileRepository $fileRepository): Response { return $this->render('file/index.html.twig', [ 'controller_name' => 'FileController', + 'files' => $fileRepository->findAll() ]); } - #[Route('/file/delete/{id}', name: 'app_file_delete')] + #[Route('/all', name: 'app_file_all', methods: ['GET'])] + public function files(FileRepository $fileRepository): JsonResponse + { + return $this->json($fileRepository->findAll(), context: [ + AbstractNormalizer::ATTRIBUTES => [ + 'id', + 'fileName', + 'fileSize', + 'extension', + 'type', + 'book' => [ + 'id', + 'title', + 'author' + ] + ] + ]); + } + + #[Route('/delete/{id}', name: 'app_file_delete')] public function delete( Request $request, FileRepository $fileRepository, @@ -32,7 +56,7 @@ class FileController extends AbstractController return $this->redirect($request->headers->get('referer')); } - #[Route('/file/{id}', name: 'app_file_download', methods: ['GET'])] + #[Route('/{id}', name: 'app_file_download', methods: ['GET'])] public function get(File $file, FileService $fileService) { return $this->file($fileService->getFilePath($file), $file->getFileName()); diff --git a/templates/base.html.twig b/templates/base.html.twig index 636ef31..b07f2ef 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -26,10 +26,10 @@ {{ form_start(file_form) }} diff --git a/templates/file/index.html.twig b/templates/file/index.html.twig index e4142a6..cb12c07 100644 --- a/templates/file/index.html.twig +++ b/templates/file/index.html.twig @@ -3,7 +3,10 @@ {% block title %}Hello FileController!{% endblock %} {% block body %} -
+
+ +
+ {% endblock %} {% block javascripts %}