each(function ($country) use (&$countries, &$cHash) {
$countries[] = $country;
$cHash[$country->country_name] = $country->country_code;
});
$this->countries = collect($countries);
$this->cHash = collect($cHash);
}
public function search(Request $request)
{
$itemCodes = $request->input("item_codes");
$ta_codes = explode(' ', str_replace('.', '', trim($itemCodes)));
$requests = $this->makeRequests($ta_codes[0]);
return $this->processResponse($requests,$ta_codes[0]);
}
public function compare($countries, $cHash, $aCodes){
$requests = $this->makeRequests($aCodes);
return $this->processResponse($requests, $aCodes);
}
public function makeRequests($ta_code)
{
$requests = Http::pool(fn (Pool $pool) => [
$this->countries->each(function ($country) use ($pool, $ta_code) {
Log::info('Getting page {url}', [ 'url' => $country->search_url . $ta_code ] );
return $pool->as($country->country_code)->get($country->search_url . $ta_code);
})
]);
return $requests;
}
public function makeRequest($ta_code, $country)
{
$country = CountryCode::where('country_name', $country)->first();
return Http::pool(fn (Pool $pool) => [
$pool->as($country->country_name)->get($country->search_url . $ta_code)
]);
}
public function processResponse($responses, $code)
{
$prices = [];
foreach ($this->countries as $c) {
$country = $c->country_code;
if ($responses[$country] instanceof \Illuminate\Http\Client\Response && $responses[$country]->ok()) {
$response = $responses[$country]->body();
switch ($country) {
case "BG":
case "BY":
case "GR":
$prices[$country] = $this->parseJson_CY_GR_BG($code, (string) $response, $country);
break;
case "IS":
$prices[$country] = $this->parseJson_IS($code, (string) $response, $country);
break;
case "TR":
$prices[$country] = $this->parseJson_TR((string) $response, $country);
break;
case "EE":
case "LT":
case "LV":
$prices[$country] = $this->parseJson_EE_LT_LV($code, (string) $response, $country);
break;
default:
$prices[$country] = $this->parseJson((string) $response, $country);
}
}
}
$products = [];
collect($prices)->each(function ($price) use (&$products) {
if (count($price))
$products[] = $price;
});
return collect($products);
}
// { "country": "AT", "code": "50161321", "url": "https://www.ikea.com/at/de/p/hol-aufbewahrungstisch-akazie-50161321/", "name": "HOL", "typeName": "Aufbewahrungstisch", "mainImageUrl": "https://www.ikea.com/at/de/images/products/hol-aufbewahrungstisch-akazie__0104310_pe251255_s5.jpg", "itemNoGlobal": "50161321", "salesPrice": "80.99", "tag": "FAMILY_PRICE", "last_mod": "2023-12-03 16:44:24" },
public function parseJson($json_raw, $country)
{
try {
$json_values = array();
$json_decoded = json_decode($json_raw, true);
//dd($json_decoded);
$searchResultPage = $json_decoded["searchResultPage"];
$products = $searchResultPage["products"];
$main = $products["main"];
$items = $main["items"];
foreach ($items as $item) {
$product = $item["product"];
$salesPrice = $product["salesPrice"];
$numeral = $salesPrice["numeral"];
$json_values = array(
'url' => $product['pipUrl'],
'tag' => $product['tag'],
'country' => $country,
'salesPrice' => $numeral,
);
break;
}
} catch (\Exception $e) {
return [];
}
return $json_values;
}
public function parseJson_TR($body,$country)
{
//echo "country: " . $country . ", code: " . $code . "
";
$dochtml = new \DOMDocument();
@$dochtml->loadHTML('' . $body);
$xpath = new \DOMXpath($dochtml);
$price = null;
//$c = ltrim($code, "0");
$json_values = array();
$url_product = $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue;
$price = $xpath->query('/html/head/meta[(@property="og:price:amount")]/@content')[0]->nodeValue;
$price = floatval(trim(str_replace('.', '', $price)));
$json_values = array(
'url' => $url_product,
'tag' => null,
'price' => floatval($price),
'country' => $country,
);
return $json_values;
}
public function parseJson_CY_GR_BG($code, $body , $country)
{
//echo "country: " . $country . ", code: " . $code . "
";
$dochtml = new \DOMDocument();
@$dochtml->loadHTML('' . $body);
$xpath = new \DOMXpath($dochtml);
$price = null;
$c = ltrim($code, "0");
$json_values = array();
try {
$price = $xpath->query('//*/div[(@class="yotpo yotpo-main-widget" and @data-product-id="' . $code . '")]/@data-price')[0]->nodeValue;
$url_product = $xpath->query('//*/div[(@class="yotpo yotpo-main-widget" and @data-product-id="' . $code . '")]/@data-url')[0]->nodeValue;
} catch (\Exception $e) {
return [];
}
$price = floatval($price);
$json_values = array(
'url' => $url_product,
'tag' => null,
'price' => floatval($price),
'country' => $country,
);
return $json_values;
}
public function parseJson_EE_LT_LV($code, $body, $country)
{
//echo "country: " . $country . ", code: " . $code . "
";
$dochtml = new \DOMDocument();
@$dochtml->loadHTML('' . $body);
$xpath = new \DOMXpath($dochtml);
$price = null;
$c = ltrim($code, "0");
$json_values = array();
try {
$price = $xpath->query('//*/div[(@class="itemPriceBox" and @data-item="' . $c . '")]//p[@class="itemNormalPrice display-6"]/span')[0]->nodeValue;
if (is_null($price) || empty($price)) {
$price = $xpath->query('//*/div[(@class="itemPriceBox" and @data-item="' . $c . '")]//div[@class="itemBTI display-6"]/span')[0]->nodeValue;
}
switch ($country) {
case "EE":
$url_product = "https://www.ikea.ee" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue;
break;
case "LT":
$url_product = "https://www.ikea.lt" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue;
break;
case "LV":
$url_product = "https://www.ikea.lv" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue;
break;
default:
$url_product = null;
}
} catch (\Exception $e) {
return [];
}
if (is_null($price) || empty($price)) {
$url_product = null;
}
$price = floatval(trim(str_replace(' ', '', str_replace(',', '.', str_replace(array('€'), '', $price)))));
$json_values = array(
'url' => $url_product,
'tag' => null,
'price' => $price,
'country' => $country,
);
return $json_values;
}
public function parseJson_IS($code, $body, $country)
{
//echo "country: " . $country . ", code: " . $code . "
";
$dochtml = new \DOMDocument();
@$dochtml->loadHTML('' . $body);
$xpath = new \DOMXpath($dochtml);
$price = null;
$c = ltrim($code, "0");
$json_values = array();
try {
$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemNormalPrice revamp_price price"]/span/span')[0]->nodeValue;
if (is_null($price) || empty($price)) {
$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemBTI display-6 revamp_price price"]/span/span')[0]->nodeValue;
}
$url_product = "https://www.ikea.is" . $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue;
//echo "url_product: " . $url_product . "
";
if (is_null($price) || empty($price)) {
$url_product = null;
}
} catch (\Exception $e) {
return [];
}
$price = floatval(trim(str_replace(' ', '', str_replace(',', '.', str_replace('.', '', str_replace(array('€'), '', $price))))));
$json_values = array(
'url' => $url_product,
'tag' => null,
'price' => $price,
'country' => $country,
);
return $json_values;
}
}