diff --git a/assets/js/pages/files.vue b/assets/js/pages/files.vue index e5523bc..967dfa0 100644 --- a/assets/js/pages/files.vue +++ b/assets/js/pages/files.vue @@ -15,14 +15,14 @@ - {{ file.fileName }} + {{ file.file_name }}

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

- {{ formatSize(file.fileSize) }} + {{ file.file_size_human }} {{ file.extension }} download remove @@ -61,13 +61,6 @@ export default { deleteFile: function (fileId) { axios.get(window.location.origin + '/file/delete/' + fileId).then(() => this.getFiles()) }, - formatSize: function (bytes) { - if (bytes === 0) { - return "0.00 B"; - } - 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(this.getFilesEndpoint(), { headers: { diff --git a/src/Entity/Book.php b/src/Entity/Book.php index dc2c8da..95d6398 100644 --- a/src/Entity/Book.php +++ b/src/Entity/Book.php @@ -2,23 +2,30 @@ namespace App\Entity; +use ApiPlatform\Core\Annotation\ApiFilter; use ApiPlatform\Core\Annotation\ApiResource; use ApiPlatform\Core\Annotation\ApiSubresource; +use ApiPlatform\Core\Bridge\Doctrine\Common\Filter\SearchFilterInterface; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; use App\Repository\BookRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; #[ApiResource] #[ORM\Entity(repositoryClass: BookRepository::class)] +#[ApiFilter(SearchFilter::class, properties: ['title' => SearchFilterInterface::STRATEGY_PARTIAL])] class Book { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] + #[Groups('file:read')] private $id; #[ORM\Column(type: 'string', length: 255)] + #[Groups('file:read')] private $title; #[ORM\Column(type: 'string', length: 255)] @@ -50,6 +57,7 @@ class Book private $volume; #[ORM\Column(type: 'string', length: 255)] + #[Groups('file:read')] private $author; #[ORM\Column(type: 'text', nullable: true)] diff --git a/src/Entity/File.php b/src/Entity/File.php index a8a646e..8ba820d 100644 --- a/src/Entity/File.php +++ b/src/Entity/File.php @@ -5,23 +5,28 @@ namespace App\Entity; use ApiPlatform\Core\Annotation\ApiResource; use App\Repository\FileRepository; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; +use Symfony\Component\Serializer\Annotation\SerializedName; -#[ApiResource] +#[ApiResource(collectionOperations: ['get'], itemOperations: ['get'], denormalizationContext: ['groups' => ['file:write']], normalizationContext: ['groups' => ['file:read']])] #[ORM\Entity(repositoryClass: FileRepository::class)] class File { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] + #[Groups('file:read')] private $id; #[ORM\Column(type: 'string', length: 255)] + #[Groups('file:read')] private $file_name; #[ORM\Column(type: 'integer')] private $file_size; #[ORM\Column(type: 'string', length: 255)] + #[Groups('file:read')] private $extension; #[ORM\Column(type: 'string', length: 255)] @@ -29,6 +34,7 @@ class File #[ORM\ManyToOne(targetEntity: Book::class, inversedBy: 'files')] #[ORM\JoinColumn(nullable: false)] + #[Groups('file:read')] private $book; public function getId(): ?int @@ -53,6 +59,15 @@ class File return $this->file_size; } + #[Groups('file:read')] + #[SerializedName('file_size_human')] + public function getFileSizeHuman(): string + { + $base = log($this->file_size) / log(1024); + $suffix = array("B", "KB", "MB", "GB", "TB")[floor($base)]; + return round(pow(1024, $base - floor($base)), 2) . $suffix; + } + public function setFileSize(int $file_size): self { $this->file_size = $file_size;