$address, 'provider_lookup' => $providerLookup, ]; $response = $this->httpGet('/v4/address/validate', $params); return $this->hydrateResponse($response, ValidateResponse::class); } /** * @param string $listId * @param $filePath - file path or file content * @return mixed|ResponseInterface * @throws Exception */ public function createBulkJob(string $listId, $filePath) { Assert::stringNotEmpty($listId); if (strlen($filePath) < PHP_MAXPATHLEN && is_file($filePath)) { $fileData = ['filePath' => $filePath]; } else { $fileData = [ 'fileContent' => $filePath, 'filename' => 'file', ]; } $postDataMultipart = []; $postDataMultipart[] = $this->prepareFile('file', $fileData); $response = $this->httpPostRaw(sprintf('/v4/address/validate/bulk/%s', $listId), $postDataMultipart); $this->closeResources($postDataMultipart); return $this->hydrateResponse($response, CreateBulkJobResponse::class); } /** * @param string $fieldName * @param array $filePath ['fileContent' => 'content'] or ['filePath' => '/foo/bar'] * * @return array */ private function prepareFile(string $fieldName, array $filePath): array { $filename = isset($filePath['filename']) ? $filePath['filename'] : null; if (isset($filePath['fileContent'])) { // File from memory $resource = fopen('php://temp', 'r+'); fwrite($resource, $filePath['fileContent']); rewind($resource); } elseif (isset($filePath['filePath'])) { // File form path $path = $filePath['filePath']; // Remove leading @ symbol if (0 === strpos($path, '@')) { $path = substr($path, 1); } $resource = fopen($path, 'r'); } else { throw new InvalidArgumentException('When using a file you need to specify parameter "fileContent" or "filePath"'); } return [ 'name' => $fieldName, 'content' => $resource, 'filename' => $filename, ]; } /** * Close open resources. * @param array $params */ private function closeResources(array $params): void { foreach ($params as $param) { if (is_array($param) && array_key_exists('content', $param) && is_resource($param['content'])) { fclose($param['content']); } } } /** * @param string $listId * @return DeleteBulkJobResponse|ResponseInterface * @throws Exception */ public function deleteBulkJob(string $listId) { Assert::stringNotEmpty($listId); $response = $this->httpDelete(sprintf('/v4/address/validate/bulk/%s', $listId)); return $this->hydrateResponse($response, DeleteBulkJobResponse::class); } /** * @param string $listId * @return GetBulkJobResponse|ResponseInterface * @throws Exception */ public function getBulkJob(string $listId) { Assert::stringNotEmpty($listId); $response = $this->httpGet(sprintf('/v4/address/validate/bulk/%s', $listId)); return $this->hydrateResponse($response, GetBulkJobResponse::class); } /** * @param int $limit * @return GetBulkJobsResponse|ResponseInterface * @throws Exception */ public function getBulkJobs(int $limit = 500) { Assert::integer($limit); Assert::greaterThan($limit, 0); $response = $this->httpGet('/v4/address/validate/bulk', [ 'limit' => $limit, ]); return $this->hydrateResponse($response, GetBulkJobsResponse::class); } public function getBulkPreviews(int $limit = 500) { Assert::integer($limit); Assert::greaterThan($limit, 0); $response = $this->httpGet('/v4/address/validate/preview', [ 'limit' => $limit, ]); return $this->hydrateResponse($response, GetBulkPreviewsResponse::class); } /** * @param string $previewId * @param $filePath * @return mixed|ResponseInterface * @throws Exception */ public function createBulkPreview(string $previewId, $filePath) { Assert::stringNotEmpty($previewId); if (strlen($filePath) < PHP_MAXPATHLEN && is_file($filePath)) { $fileData = ['filePath' => $filePath]; } else { $fileData = [ 'fileContent' => $filePath, 'filename' => 'file', ]; } $postDataMultipart = []; $postDataMultipart[] = $this->prepareFile('file', $fileData); $response = $this->httpPostRaw(sprintf('/v4/address/validate/preview/%s', $previewId), $postDataMultipart); $this->closeResources($postDataMultipart); return $this->hydrateResponse($response, CreateBulkPreviewResponse::class); } /** * @param string $previewId * @return mixed|ResponseInterface * @throws Exception */ public function getBulkPreview(string $previewId) { Assert::stringNotEmpty($previewId); $response = $this->httpGet(sprintf('/v4/address/validate/preview/%s', $previewId)); return $this->hydrateResponse($response, GetBulkPreviewResponse::class); } /** * @param string $previewId * @return bool */ public function deleteBulkPreview(string $previewId) { Assert::stringNotEmpty($previewId); $response = $this->httpDelete(sprintf('/v4/address/validate/preview/%s', $previewId)); return $response->getStatusCode() === 204; } /** * @param string $previewId * @return mixed|ResponseInterface * @throws Exception */ public function promoteBulkPreview(string $previewId) { Assert::stringNotEmpty($previewId); $response = $this->httpPut(sprintf('/v4/address/validate/preview/%s', $previewId)); return $this->hydrateResponse($response, PromoteBulkPreviewResponse::class); } }