Completed
Branch master (f88599)
by Dominik
04:43 queued 02:34
created

Importer::importModel()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 17
rs 9.4285
cc 2
eloc 12
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
            foreach ($readerModels as $readerModel) {
53
                $this->importModel($readerModel, $importDate);
54
            }
55
56
            $this->writer->flush();
57
            $this->logger->info('Flushed models');
58
59
            $offset += $limit;
60
        }
61
62
        $this->writer->removeAllOutdated($importDate);
63
        $this->logger->info('Removed all outdates');
64
65
        return $importDate;
66
    }
67
68
    /**
69
     * @param ReaderModelInterface $readerModel
70
     * @param \DateTime            $importDate
71
     */
72
    protected function importModel(ReaderModelInterface $readerModel, \DateTime $importDate)
73
    {
74
        $writerModel = $this->writer->find($readerModel);
75
        if (null === $writerModel) {
76
            $writerModel = $this->writer->create($readerModel);
77
            $this->modelInfo($readerModel, 'created');
78
        } else {
79
            $this->writer->update($writerModel, $readerModel);
80
            $this->modelInfo($readerModel, 'updated');
81
        }
82
83
        $writerModel->setReaderIdentifier($readerModel->getIdentifier());
84
        $writerModel->setLastImportDate($importDate);
85
86
        $this->writer->persist($writerModel);
87
        $this->modelInfo($readerModel, 'persisted');
88
    }
89
90
    /**
91
     * @param ReaderModelInterface $readerModel
92
     * @param string               $action
93
     */
94
    protected function modelInfo(ReaderModelInterface $readerModel, $action)
95
    {
96
        $this->logger->info(
97
            ucfirst($action).' model with reader identifier {readerIdentifier}',
98
            ['readerIdentifier' => $readerModel->getIdentifier()]
99
        );
100
    }
101
}
102