GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — master (#3)
by Evgeny
02:22
created

Parser::fillAndSaveMetaData()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 25
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 25
rs 8.439
cc 6
eloc 18
nc 10
nop 3
1
<?php
2
3
namespace SimaLand\API\Parser;
4
5
use SimaLand\API\AbstractList;
6
use SimaLand\API\Object;
7
use SimaLand\API\Record;
8
9
/**
10
 * Загрузка и сохранение всех записей сущностей.
11
 *
12
 * ```php
13
 *
14
 * $client = new \SimaLand\API\Rest\Client([
15
 *     'login' => 'login',
16
 *     'password' => 'password'
17
 * ]);
18
 * $itemList = new \SimaLand\API\Entities\ItemList($client);
19
 * $itemStorage = new Csv(['filename' => 'path/to/item.csv']);
20
 * $categoryList = new \SimaLand\API\Entities\CategoryList($client);
21
 * $categoryStorage = new Csv(['filename' => 'path/to/category.csv']);
22
 * $parser = new Parser(['metaFilename' => 'path/to/file']);
23
 * $parser->addEntity($itemList, $itemStorage);
24
 * $parser->addEntity($categoryList, $categoryStorage);
25
 * $parser->run();
26
 *
27
 * ```
28
 */
29
class Parser extends Object
30
{
31
    /**
32
     * Кол-во итерация после которого сохраняются мета данные.
33
     *
34
     * @var int
35
     */
36
    public $iterationCount = 1000;
37
38
    /**
39
     * @var array
40
     */
41
    private $list = [];
42
43
    /**
44
     * Путь до файла с мета данными.
45
     *
46
     * @var string
47
     */
48
    private $metaFilename;
49
50
    /**
51
     * Мета данные.
52
     *
53
     * @var array
54
     */
55
    private $metaData = [];
56
57
    /**
58
     * @inheritdoc
59
     */
60
    public function __construct(array $options = [])
61
    {
62
        if (!isset($options['metaFilename'])) {
63
            throw new \Exception('Param "metaFilename" can`t be empty');
64
        }
65
        $this->metaFilename = $options['metaFilename'];
66
        unset($options['metaFilename']);
67
        parent::__construct($options);
68
    }
69
70
    /**
71
     * @param AbstractList $entity
72
     * @param StorageInterface $storage
73
     * @return Parser
74
     */
75
    public function addEntity(AbstractList $entity, StorageInterface $storage)
76
    {
77
        $this->list[] = [
78
            'entity' => $entity,
79
            'storage' => $storage
80
        ];
81
        return $this;
82
    }
83
84
    /**
85
     * Сбросить мета данные.
86
     *
87
     * @return Parser
88
     */
89
    public function reset()
90
    {
91
        if (file_exists($this->metaFilename)) {
92
            unlink($this->metaFilename);
93
        }
94
        return $this;
95
    }
96
97
    /**
98
     * Запустить парсер.
99
     *
100
     * @param bool|false $continue Продолжить парсить с место обрыва.
101
     */
102
    public function run($continue = true)
103
    {
104
        $this->loadMetaData();
105
        foreach ($this->list as $el) {
106
            /** @var AbstractList $entity */
107
            $entity = $el['entity'];
108
            $entityName = $entity->getEntity();
109
            if ($continue && isset($this->metaData[$entityName])) {
110
                if (isset($this->metaData[$entityName]['finish']) && $this->metaData[$entityName]['finish']) {
111
                    continue;
112
                }
113
                $entity->addGetParams($this->metaData[$entityName]);
114
            }
115
            /** @var StorageInterface $storage */
116
            $storage = $el['storage'];
117
            foreach ($entity as $key => $record) {
118
                if ($continue) {
119
                    $this->fillAndSaveMetaData($entity, $record, $key);
120
                }
121
                $storage->save($record);
122
            }
123
            if ($continue) {
124
                $this->finishParseEntity($entity);
125
                $this->saveMetaData();
126
            }
127
        }
128
    }
129
130
    /**
131
     * Загрузить мета данные.
132
     */
133
    private function loadMetaData()
134
    {
135
        if (!file_exists($this->metaFilename)) {
136
            return;
137
        }
138
        $data = file_get_contents($this->metaFilename);
139
        $this->metaData = (array)json_decode($data, true);
140
    }
141
142
    /**
143
     * Заполнить мета данные.
144
     *
145
     * @param AbstractList $entity
146
     * @param Record $record
147
     * @param int $i
148
     */
149
    private function fillAndSaveMetaData(AbstractList $entity, Record $record, $i)
150
    {
151
        $entityName = $entity->getEntity();
152
        $pageKey = $record->meta ? $entity->keyThreads : $entity->keyAlternativePagination;
153
        if (!isset($this->metaData[$entityName])) {
154
            $this->metaData[$entityName] = [
155
                $pageKey => null,
156
                'perPage' => $record->meta['perPage'],
157
            ];
158
            return;
159
        }
160
        if ($record->meta) {
161
            if ($this->metaData[$entityName][$pageKey] == $record->meta['currentPage']) {
162
                return;
163
            }
164
            $this->metaData[$entityName][$pageKey] = $record->meta['currentPage'];
165
        } else {
166
            $id = $record->data['id'];
167
            if ($i % $this->iterationCount != 0) {
168
                return;
169
            }
170
            $this->metaData[$entityName][$pageKey] = $id;
171
        }
172
        $this->saveMetaData();
173
    }
174
175
    /**
176
     * Записать в мета данные об успешном сохранение сущности.
177
     *
178
     * @param AbstractList $entity
179
     */
180
    private function finishParseEntity(AbstractList $entity)
181
    {
182
        $entityName = $entity->getEntity();
183
        if (!isset($this->metaData[$entityName])) {
184
            $this->metaData[$entityName] = [];
185
        }
186
        $this->metaData[$entityName]['finish'] = true;
187
    }
188
189
    /**
190
     * Сохранить мета данные.
191
     */
192
    private function saveMetaData()
193
    {
194
        $data = json_encode($this->metaData);
195
        file_put_contents($this->metaFilename, $data);
196
    }
197
}
198