Source of file DataMapper.php
Size: 5,902 Bytes - Last Modified: 2021-12-23T10:06:30+00:00
/var/www/docs.ssmods.com/process/src/src/API/DataMapper.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 | <?php namespace NobrainerWeb\Bilinfo\API; use NobrainerWeb\Bilinfo\Listings\CallForPriceListing; use NobrainerWeb\Bilinfo\Listings\Dealer; use NobrainerWeb\Bilinfo\Listings\Equipment; use NobrainerWeb\Bilinfo\Listings\LeaseListing; use NobrainerWeb\Bilinfo\Interfaces\Listing; use NobrainerWeb\Bilinfo\Listings\ListingImage; use NobrainerWeb\Bilinfo\Listings\Make; use NobrainerWeb\Bilinfo\Listings\RetailPriceListing; use NobrainerWeb\Bilinfo\Listings\TaxFreeRetailPriceListing; use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Injector\Injectable; use SilverStripe\ORM\ArrayList; class DataMapper { use Configurable; use Injectable; /** * Response data as array * * @var array */ protected $data = []; private static $listing_fields_map = [ 'Id' => 'ExternalID', 'ModifiedDate' => 'ExternalModifiedDate', 'CreatedDate' => 'ExternalCreatedDate', 'DeletedDate' => 'ExternalDeletedDate', ]; /** * Various types a listing can be. The keys in this array are the values of the PriceType field in the API response * * @var array */ private static $listing_type_map = [ 'RetailPrice' => RetailPriceListing::class, 'TaxFreeRetailPrice' => TaxFreeRetailPriceListing::class, 'Leasing' => LeaseListing::class, 'CallForPrice' => CallForPriceListing::class ]; private static $dealer_fields_map = [ 'DealerId' => 'ExternalID', 'DealerName' => 'Name', 'DealerAddressStreetLine1' => 'StreetLine1', 'DealerAddressStreetLine2' => 'StreetLine2', 'DealerAddressZipCode' => 'Zip', 'DealerAddressCity' => 'City', ]; public function __construct(array $data) { $this->data = $data; } /** * @param string $make * @return Make */ public function mapMake(string $make): Make { return Make::create(['Title' => $make]); } /** * @return ArrayList */ public function mapMakes(): ArrayList { $list = ArrayList::create(); foreach ($this->data as $listing) { $make = $listing['Make']; if (!$make) { continue; } if (!$list->find('Title', $make)) { $list->push($this->mapMake($make)); } } return $list; } /** * @param string $name * @return Equipment */ public function mapEquipmentItem(string $name): Equipment { return Equipment::create(['Title' => $name]); } /** * @return ArrayList */ public function mapEquipment(): ArrayList { $list = ArrayList::create(); foreach ($this->data as $listing) { $equipment = $listing['EquipmentList']; if (!$equipment || empty($equipment)) { continue; } foreach ($equipment as $name) { if (!$list->find('Title', $name)) { $list->push($this->mapEquipmentItem($name)); } } } return $list; } /** * @param string $url * @return ListingImage */ public function mapListingImage(string $url): ListingImage { return ListingImage::create(['URL' => $url]); } /** * @return ArrayList */ public function mapListingImages(): ArrayList { $list = ArrayList::create(); foreach ($this->data as $listing) { $images = $listing['Pictures']; if (!$images || empty($images)) { continue; } foreach ($images as $url) { $list->push($this->mapListingImage($url)); } } return $list; } /** * @param array $data * @return Dealer|null */ public function mapDealer(array $data): ?Dealer { $dealer = []; foreach (self::config()->get('dealer_fields_map') as $apiField => $localField) { if ($val = $data[$apiField]) { $dealer[$localField] = $val; } } if (empty($dealer)) { return null; } return Dealer::create($dealer); } /** * @return ArrayList */ public function mapDealers(): ArrayList { $dealers = ArrayList::create(); foreach ($this->data as $listing) { $dealer = $this->mapDealer($listing); if ($dealer && !$dealers->find('ExternalID', $dealer->ExternalID)) { $dealers->push($dealer); } } return $dealers; } /** * TODO creation of various types of listings * * @param array $data * @return Listing */ public function mapListing(array $data): Listing { $listing = []; // Map fields that do not have the same name locally as in the external APi foreach (self::config()->get('listing_fields_map') as $apiField => $localField) { if (isset($data[$apiField]) && ($val = $data[$apiField])) { $listing[$localField] = $val; } } // might clash with our DB unset($data['Id']); $listing = array_merge($listing, $data); $types = self::config()->get('listing_type_map'); $type = $types[$listing['PriceType']] ?? \NobrainerWeb\Bilinfo\Listings\Listing::class; return $type::create($listing); } /** * @return ArrayList */ public function mapListings(): ArrayList { $list = ArrayList::create(); foreach ($this->data as $listing) { $listing = $this->mapListing($listing); $list->push($listing); } return $list; } } |