From b4c37dfc89d970cd6ea965afea4853eecd5a26e3 Mon Sep 17 00:00:00 2001
From: Dominik Hebeler <dominik@suma-ev.de>
Date: Thu, 25 Feb 2021 12:05:09 +0100
Subject: [PATCH] Loading of Admitad Affiliates is working now

---
 app/Http/Controllers/MetaGerSearch.php | 23 ++++++++--
 app/MetaGer.php                        | 29 ++++++++++++-
 app/Models/Admitad.php                 | 60 +++++++++++++++++++++-----
 3 files changed, 95 insertions(+), 17 deletions(-)

diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php
index 350db3875..df9268fd2 100644
--- a/app/Http/Controllers/MetaGerSearch.php
+++ b/app/Http/Controllers/MetaGerSearch.php
@@ -93,11 +93,16 @@ class MetaGerSearch extends Controller
 
         # Ergebnisse der Suchmaschinen kombinieren:
         $metager->prepareResults($timings);
-        $admitad = null;
+        $admitad = [];
         if(!$metager->isApiAuthorized() && !$metager->isDummy()){
-            $admitad = new \App\Models\Admitad($metager);
+            $newAdmitad = new \App\Models\Admitad($metager);
+            if(!empty($newAdmitad->hash)){
+                $admitad[] = $newAdmitad;
+            }
         }
 
+        $metager->parseAdmitad($admitad);
+
         $finished = true;
         foreach ($metager->getEngines() as $engine) {
             if ($engine->loaded) {
@@ -204,6 +209,7 @@ class MetaGerSearch extends Controller
         $metager->setAdgoalHash($adgoal["adgoalHash"]);
 
         $metager->parseFormData($request, false);
+        $metager->setJsEnabled(true);
         # Nach Spezialsuchen überprüfen:
         $metager->checkSpecialSearches($request);
         $metager->restoreEngines($engines);
@@ -215,7 +221,15 @@ class MetaGerSearch extends Controller
 
         $metager->rankAll();
         $metager->prepareResults();
-        $metager->parseAdmitad($admitad);
+
+        if(!$metager->isApiAuthorized() && !$metager->isDummy()){
+            $newAdmitad = new \App\Models\Admitad($metager);
+            if(!empty($newAdmitad->hash)){
+                $admitad[] = $newAdmitad;
+            }
+        }
+
+        $admitadFinished = $metager->parseAdmitad($admitad);
 
         $result = [
             'finished' => true,
@@ -263,7 +277,7 @@ class MetaGerSearch extends Controller
             }
         }
 
-        if (!$metager->isAdgoalLoaded()) {
+        if (!$metager->isAdgoalLoaded() || !$admitadFinished) {
             $finished = false;
         }
 
@@ -280,6 +294,7 @@ class MetaGerSearch extends Controller
             "metager" => [
                 "apiAuthorized" => $metager->isApiAuthorized(),
             ],
+            "admitad" => $admitad,
             "adgoal" => [
                 "loaded" => $metager->isAdgoalLoaded(),
                 "adgoalHash" => $metager->getAdgoalHash(),
diff --git a/app/MetaGer.php b/app/MetaGer.php
index 397da6f34..b05f35f5c 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -48,6 +48,7 @@ class MetaGer
     protected $availableFoki = [];
     protected $startCount = 0;
     protected $canCache = false;
+    protected $javascript = false;
     # Daten über die Abfrage$
     protected $ip;
     protected $useragent;
@@ -435,8 +436,25 @@ class MetaGer
         }
     }
 
-    public function parseAdmitad(\App\Models\Admitad &$admitad){
-        $admitad->parseAffiliates($this->results);
+    /**
+     * @param \App\Models\Admitad[] $admitads
+     * @param Boolean $wait Wait for Results?
+     * @return Boolean whether or not all Admitad Objects are finished
+     */
+    public function parseAdmitad(&$admitads){
+        $wait = false;
+        $finished = true;
+        if(!$this->javascript){
+            $wait = true;
+        }
+        foreach ($admitads as $admitad) {
+            $admitad->fetchAffiliates($wait);
+            $admitad->parseAffiliates($this->results);
+            if(!$admitad->finished){
+                $finished = false;
+            }
+        }
+        return $finished;
     }
 
     public function humanVerification(&$results)
@@ -1940,6 +1958,13 @@ class MetaGer
         return $this->dummy;
     }
 
+    public function jsEnabled() {
+        return $this->javascript;
+    }
+    
+    public function setJsEnabled(bool $bool){
+        $this->javascript = $bool;
+    }
     /**
      * Used by JS result loader to restore MetaGer Object of previous request
      */
diff --git a/app/Models/Admitad.php b/app/Models/Admitad.php
index 6c523f02d..8bd2d3e9f 100644
--- a/app/Models/Admitad.php
+++ b/app/Models/Admitad.php
@@ -14,7 +14,9 @@ class Admitad
         "en"
     ];
 
-    private $hash;
+    public $hash;
+    public $finished = false; // Is true when the Request was sent to and read from Admitad App
+    private $affiliates = [];
 
     /**
      * Creates a new Admitad object which will start a request for affiliate links
@@ -29,7 +31,13 @@ class Admitad
         // Generate a list of URLs
         $resultLinks = [];
         foreach($results as $result){
-            $resultLinks[] = $result->originalLink;
+            if ($result->new) {
+                $resultLinks[] = $result->originalLink;
+            }
+        }
+
+        if(empty($resultLinks)){
+            return;
         }
 
         $lang = LaravelLocalization::getCurrentLocale();
@@ -69,19 +77,51 @@ class Admitad
     }
 
     /**
-     * Parses the response from Admitad server and converts all Affiliate Links.
-     * 
-     * @param \App\Models\Result[] $results
+     * Fetches the Admitad Response from Redis
+     * @param Boolean $wait Whether or not to wait for a response
      */
-    public function parseAffiliates(&$results){
-        $answer = Cache::get($this->hash);
+    public function fetchAffiliates($wait = false) {
+        if($this->finished){
+            return;
+        }
+
+        $answer = null;
+        $startTime = microtime(true);
+        if($wait){
+            while (microtime(true) - $startTime < 5) {
+                $answer = Cache::get($this->hash);
+                if ($answer === null) {
+                    usleep(50 * 1000);
+                } else {
+                    break;
+                }
+            }
+        }else{
+            $answer = Cache::get($this->hash);
+        }
         $answer = json_decode($answer, true);
+        
+        // If the fetcher had an Error
+        if($answer === "no-result"){
+            $this->finished = true;
+            return;
+        }
 
         if(empty($answer) || !isset($answer["error"]) || $answer["error"] || !is_array($answer["result"])){
             return;
         }
 
-        foreach($answer["result"] as $linkResult){
+        $this->affiliates = $answer["result"];
+        $this->finished = true;
+    }
+
+    /**
+     * Converts all Affiliate Links.
+     * 
+     * @param \App\Models\Result[] $results
+     */
+    public function parseAffiliates(&$results){
+        foreach($this->affiliates as $linkResult){
             $originalUrl = $linkResult["originalUrl"];
             $redirUrl = $linkResult["redirUrl"];
             $image = $linkResult["image"];
@@ -94,7 +134,7 @@ class Admitad
             foreach ($results as $result) {
                 if ($result->originalLink === $originalUrl) {
                     # Ein Advertiser gefunden
-                    if ($result->image !== "") {
+                    if ($result->image !== "" && !$result->partnershop) {
                         $result->logo = $image;
                     } else {
                         $result->image = $image;
@@ -107,7 +147,5 @@ class Admitad
                 }
             }
         }
-
-        Log::info("tzewst");
     }
 }
-- 
GitLab