Completed
Push — master ( e7d78e...bc22ae )
by Dominik
02:15
created

Importer::importModels()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 9
rs 9.6666
cc 2
eloc 5
nc 2
nop 2
1
<?php
2
3
namespace Saxulum\ModelImporter;
4
5
use Psr\Log\LoggerInterface;
6
use Psr\Log\NullLogger;
7
8
class Importer
9
{
10
    /**
11
     * @var ReaderInterface
12
     */
13
    protected $reader;
14
15
    /**
16
     * @var WriterInterface
17
     */
18
    protected $writer;
19
20
    /**
21
     * @var LoggerInterface
22
     */
23
    protected $logger;
24
25
    /**
26
     * @param ReaderInterface $reader
27
     * @param WriterInterface $writer
28
     * @param LoggerInterface $logger
29
     */
30
    public function __construct(ReaderInterface $reader, WriterInterface $writer, LoggerInterface $logger = null)
31
    {
32
        $this->reader = $reader;
33
        $this->writer = $writer;
34
        $this->logger = null !== $logger ? $logger : new NullLogger();
35
    }
36
37
    /**
38
     * @param int $limit
39
     *
40
     * @return \DateTime
41
     */
42
    public function import($limit = 100)
43
    {
44
        $importDate = new \DateTime();
45
46
        $this->logger->info('Import started at {importDate}', ['importDate' => $importDate]);
47
48
        $offset = 0;
49
50
        while ([] !== $readerModels = $this->reader->getModels($offset, $limit)) {
51
            $this->logger->info('Read, offset: {offset}, limit: {limit}', ['offset' => $offset, 'limit' => $limit]);
52
            $this->importModels($readerModels, $importDate);
53
            $offset += $limit;
54
        }
55
56
        $this->writer->removeAllOutdated($importDate);
57
        $this->logger->info('Removed all outdates');
58
59
        return $importDate;
60
    }
61
62
    /**
63
     * @param ReaderModelInterface[]|array $readerModels
64
     * @param \DateTime                    $importDate
65
     */
66
    protected function importModels(array $readerModels, \DateTime $importDate)
67
    {
68
        foreach ($readerModels as $readerModel) {
69
            $this->importModel($readerModel, $importDate);
70
        }
71
72
        $this->writer->flush();
73
        $this->logger->info('Flushed models');
74
    }
75
76
    /**
77
     * @param ReaderModelInterface $readerModel
78
     * @param \DateTime            $importDate
79
     */
80
    protected function importModel(ReaderModelInterface $readerModel, \DateTime $importDate)
81
    {
82
        $writerModel = $this->writer->find($readerModel);
83
        if (null === $writerModel) {
84
            $writerModel = $this->writer->create($readerModel);
85
            $this->modelInfo($readerModel, 'created');
86
        } else {
87
            $this->writer->update($writerModel, $readerModel);
88
            $this->modelInfo($readerModel, 'updated');
89
        }
90
91
        $writerModel->setReaderIdentifier($readerModel->getIdentifier());
92
        $writerModel->setLastImportDate($importDate);
93
94
        $this->writer->persist($writerModel);
95
        $this->modelInfo($readerModel, 'persisted');
96
    }
97
98
    /**
99
     * @param ReaderModelInterface $readerModel
100
     * @param string               $action
101
     */
102
    protected function modelInfo(ReaderModelInterface $readerModel, $action)
103
    {
104
        $this->logger->info(
105
            ucfirst($action).' model with reader identifier {readerIdentifier}',
106
            ['readerIdentifier' => $readerModel->getIdentifier()]
107
        );
108
    }
109
}
110