client = $client; $this->baseImporter = $baseImporter; } public function import(string $lang, array $lists): void { foreach ($lists as $list) { $this->importList($lang, $list); } } private function getDownloadUrl(string $lang, string $list): string { try { $release = $this->client->request('GET', self::RELEASE) ->toArray(); } catch (TransportExceptionInterface $e) { throw new RuntimeException('could not get the release definition', 0, $e); } $asset = array_filter($release['assets'], static function (array $item) use ($lang, $list) { return 'addresses-' . $list . '.' . $lang . '.csv.gz' === $item['name']; }); return array_values($asset)[0]['browser_download_url']; } private function importList(string $lang, string $list): void { $downloadUrl = $this->getDownloadUrl($lang, $list); $response = $this->client->request('GET', $downloadUrl); if (200 !== $response->getStatusCode()) { throw new Exception('Could not download CSV: ' . $response->getStatusCode()); } $tmpname = tempnam(sys_get_temp_dir(), 'php-add-' . $list . $lang); $file = fopen($tmpname, 'r+b'); foreach ($this->client->stream($response) as $chunk) { fwrite($file, $chunk->getContent()); } fclose($file); $uncompressedStream = gzopen($tmpname, 'r'); $csv = Reader::createFromStream($uncompressedStream); $csv->setDelimiter(','); $csv->setHeaderOffset(0); $stmt = Statement::create() ->process($csv); foreach ($stmt as $record) { $this->baseImporter->importAddress( $record['best_id'], $record['municipality_objectid'], $record['postal_info_objectid'], $record['streetname'], $record['housenumber'] . $record['boxnumber'], 'bestaddress.' . $list, (float) $record['X'], (float) $record['Y'], 3812 ); } $this->baseImporter->finalize(); gzclose($uncompressedStream); } }