baseImporter = $baseImporter; $this->client = $client; $this->logger = $logger; } public function import(string $lang = 'fr'): void { $fileDownloadUrl = $this->getFileDownloadUrl($lang); $response = $this->client->request('GET', $fileDownloadUrl); $tmpname = tempnam(sys_get_temp_dir(), 'postalcodes'); $tmpfile = fopen($tmpname, 'r+b'); if (false === $tmpfile) { throw new RuntimeException('could not create temporary file'); } foreach ($this->client->stream($response) as $chunk) { fwrite($tmpfile, $chunk->getContent()); } fclose($tmpfile); $uncompressedStream = gzopen($tmpname, 'r'); $csv = Reader::createFromStream($uncompressedStream); $csv->setDelimiter(','); $csv->setHeaderOffset(0); foreach ($csv as $offset => $record) { $this->handleRecord($record); } gzclose($uncompressedStream); unlink($tmpname); $this->logger->info(__CLASS__ . ' list of postal code downloaded'); $this->baseImporter->finalize(); $this->logger->info(__CLASS__ . ' postal code fetched', ['offset' => $offset ?? 0]); } private function getFileDownloadUrl(string $lang): string { try { $release = $this->client->request('GET', self::RELEASE) ->toArray(); } catch (TransportExceptionInterface $e) { throw new RuntimeException('could not get the release definition', 0, $e); } $postals = array_filter($release['assets'], static function (array $item) use ($lang) { return 'postals.' . $lang . '.csv.gz' === $item['name']; }); return array_values($postals)[0]['browser_download_url']; } private function handleRecord(array $record): void { $this->baseImporter->importCode( 'BE', trim($record['municipality_name']), trim($record['postal_info_objectid']), $record['municipality_objectid'], 'bestaddress', $record['Y'], $record['X'], 3812 ); } }