• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nepada / file-upload-control / 3609782379

pending completion
3609782379

push

github

Petr Morávek
v1.4.0

637 of 706 relevant lines covered (90.23%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.59
/src/FileUploadControl/Storage/Metadata/FileSystemMetadataJournal.php
1
<?php
2
declare(strict_types = 1);
3

4
namespace Nepada\FileUploadControl\Storage\Metadata;
5

6
use Nepada\FileUploadControl\Storage\FileUploadId;
7
use Nepada\FileUploadControl\Utils\FileSystem;
8
use Nepada\FileUploadControl\Utils\Finder;
9
use Nette;
10
use Nette\Utils\Json;
11

12
final class FileSystemMetadataJournal implements MetadataJournal
13
{
14

15
    use Nette\SmartObject;
16

17
    private const METADATA_FILE_SUFFIX = '.json';
18

19
    private FileSystem $fileSystem;
20

21
    private string $directory;
22

23
    private Finder $finder;
24

25
    public function __construct(FileSystem $fileSystem, Finder $finder, string $directory)
1✔
26
    {
27
        $this->fileSystem = $fileSystem;
1✔
28
        $this->finder = $finder;
1✔
29
        if (! $this->fileSystem->directoryExists($directory)) {
1✔
30
            throw new \InvalidArgumentException("Directory '$directory' does not exist.");
×
31
        }
32
        if (! $this->fileSystem->isWritable($directory)) {
1✔
33
            throw new \InvalidArgumentException("Directory '$directory' is not writable.");
×
34
        }
35
        $this->directory = $directory;
1✔
36
    }
1✔
37

38
    /**
39
     * @return FileUploadId[]
40
     */
41
    public function list(): array
42
    {
43
        /** @var \SplFileInfo[] $metadataFiles */
44
        $metadataFiles = [];
1✔
45
        foreach ($this->finder->findFilesInDirectory($this->directory, '*' . self::METADATA_FILE_SUFFIX) as $file) {
1✔
46
            $metadataFiles[] = $file;
1✔
47
        }
48
        usort(
1✔
49
            $metadataFiles,
1✔
50
            fn (\SplFileInfo $a, \SplFileInfo $b): int => $a->getMTime() <=> $b->getMTime(),
1✔
51
        );
52
        return array_map(
1✔
53
            fn (\SplFileInfo $file): FileUploadId => FileUploadId::fromString($file->getBasename(self::METADATA_FILE_SUFFIX)),
1✔
54
            $metadataFiles,
55
        );
56
    }
57

58
    /**
59
     * @param FileUploadId $id
60
     * @return FileUploadMetadata
61
     * @throws FileUploadMetadataNotFoundException
62
     */
63
    public function load(FileUploadId $id): FileUploadMetadata
1✔
64
    {
65
        $file = $this->getFilePath($id);
1✔
66
        if (! $this->fileSystem->fileExists($file)) {
1✔
67
            throw FileUploadMetadataNotFoundException::withId($id);
1✔
68
        }
69
        $data = Json::decode($this->fileSystem->read($file), Json::FORCE_ARRAY);
1✔
70
        return FileUploadMetadata::fromArray($data);
1✔
71
    }
72

73
    /**
74
     * @param FileUploadId $id
75
     * @param FileUploadMetadata $metadata
76
     * @throws FileUploadMetadataAlreadyExistsException
77
     */
78
    public function save(FileUploadId $id, FileUploadMetadata $metadata): void
1✔
79
    {
80
        $file = $this->getFilePath($id);
1✔
81
        if ($this->fileSystem->fileExists($file)) {
1✔
82
            throw FileUploadMetadataAlreadyExistsException::withId($id);
1✔
83
        }
84
        $data = $metadata->toArray();
1✔
85
        $this->fileSystem->write($file, Json::encode($data));
1✔
86
    }
1✔
87

88
    public function delete(FileUploadId $id): void
1✔
89
    {
90
        $this->fileSystem->delete($this->getFilePath($id));
1✔
91
    }
1✔
92

93
    public function destroy(): void
94
    {
95
        $this->fileSystem->delete($this->directory);
1✔
96
    }
1✔
97

98
    private function getFilePath(FileUploadId $id): string
1✔
99
    {
100
        return $this->directory . DIRECTORY_SEPARATOR . $id->toString() . self::METADATA_FILE_SUFFIX;
1✔
101
    }
102

103
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc