objectManager = $objectManager; $this->amazonNameFactory = $amazonNameFactory; $this->escaper = $escaper; $this->addressDecoratorPool = $addressDecoratorPool; } /** * @param array $responseData * * @return AmazonAddressInterface * @throws LocalizedException */ public function create(array $responseData = []): AmazonAddressInterface { $address = $responseData['address']; $amazonName = $this->amazonNameFactory->create( [ 'name' => $this->escaper->escapeHtml($address['Name']), 'country' => $this->escaper->escapeHtml($address['CountryCode'])] ); $data = [ AmazonAddressInterface::POSTAL_CODE => isset($address['PostalCode']) ? $this->escaper->escapeHtml($address['PostalCode']) : '', AmazonAddressInterface::COUNTRY_CODE => $this->escaper->escapeHtml($address['CountryCode']), AmazonAddressInterface::TELEPHONE => isset($address['Phone']) ? $this->escaper->escapeHtml($address['Phone']) : '', AmazonAddressInterface::STATE_OR_REGION => isset($address['StateOrRegion']) ? $this->escaper->escapeHtml($address['StateOrRegion']) : '', AmazonAddressInterface::FIRST_NAME => $this->escaper->escapeHtml($amazonName->getFirstName()), AmazonAddressInterface::LAST_NAME => $this->escaper->escapeHtml($amazonName->getLastName()), AmazonAddressInterface::LINES => $this->getLines($address) ]; if (isset($address['City'])) { $data[AmazonAddressInterface::CITY] = $this->escaper->escapeHtml($address['City']); } $amazonAddress = $this->objectManager->create(AmazonAddress::class, ['data' => $data]); $countryCode = strtoupper($address['CountryCode']); if (empty($this->addressDecoratorPool[$countryCode])) { return $amazonAddress; } $amazonAddress = $this->objectManager->create( $this->addressDecoratorPool[$countryCode], [ 'amazonAddress' => $amazonAddress, ] ); if (!$amazonAddress instanceof AmazonAddressInterface) { throw new LocalizedException( __( 'Address country handler %1 must be of type %2', [$this->addressDecoratorPool[$countryCode], AmazonAddress::class] ) ); } return $amazonAddress; } /** * Returns address lines. * * @param array $responseData * @return array */ private function getLines(array $responseData = []): array { $lines = []; for ($i = 1; $i <= 3; $i++) { if (isset($responseData['AddressLine' . $i]) && $responseData['AddressLine' . $i]) { $lines[$i] = $this->escaper->escapeHtml($responseData['AddressLine' . $i]); } } return $lines; } }