JsonImportHistory::fileWasImported()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 7
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 12
rs 10
1
<?php
2
3
/**
4
 * This file is part of byrokrat\giroapp.
5
 *
6
 * byrokrat\giroapp is free software: you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License as published
8
 * by the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * byrokrat\giroapp is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with byrokrat\giroapp. If not, see <http://www.gnu.org/licenses/>.
18
 *
19
 * Copyright 2016-21 Hannes Forsgård
20
 */
21
22
declare(strict_types=1);
23
24
namespace byrokrat\giroapp\Db\Json;
25
26
use byrokrat\giroapp\Db\ImportHistoryInterface;
27
use byrokrat\giroapp\Exception\FileAlreadyImportedException;
28
use byrokrat\giroapp\Filesystem\FileInterface;
29
use byrokrat\giroapp\Domain\FileThatWasImported;
30
use byrokrat\giroapp\Utils\SystemClock;
31
use hanneskod\yaysondb\CollectionInterface;
32
33
final class JsonImportHistory implements ImportHistoryInterface
34
{
35
    public const TYPE = 'giroapp/import_history:1.0';
36
37
    /** @var CollectionInterface&iterable<array> */
38
    private $collection;
39
40
    /** @var SystemClock */
41
    private $systemClock;
42
43
    /**
44
     * @param CollectionInterface&iterable<array> $collection
45
     */
46
    public function __construct(CollectionInterface $collection, SystemClock $systemClock)
47
    {
48
        $this->collection = $collection;
49
        $this->systemClock = $systemClock;
50
    }
51
52
    public function addToImportHistory(FileInterface $file): void
53
    {
54
        if ($fileThatWasImported = $this->fileWasImported($file)) {
55
            throw new FileAlreadyImportedException(sprintf(
56
                'File %s was previously imported at %s',
57
                $file->getFilename(),
58
                $fileThatWasImported->getDatetime()->format('Ymd')
59
            ));
60
        }
61
62
        $this->collection->insert(
63
            [
64
                'type' => self::TYPE,
65
                'filename' => $file->getFilename(),
66
                'checksum' => $file->getChecksum(),
67
                'datetime' => $this->systemClock->getNow()->format(\DateTime::W3C)
68
            ],
69
            $file->getChecksum()
70
        );
71
    }
72
73
    public function fileWasImported(FileInterface $file): ?FileThatWasImported
74
    {
75
        if (!$this->collection->has($file->getChecksum())) {
76
            return null;
77
        }
78
79
        $data = $this->collection->read($file->getChecksum());
80
81
        return new FileThatWasImported(
82
            $data['filename'] ?? '',
83
            $data['checksum'] ?? '',
84
            new \DateTimeImmutable($data['datetime'] ?? '')
85
        );
86
    }
87
}
88