From cd36e99958024cc33431f76f35099a71e26e3bce Mon Sep 17 00:00:00 2001
From: Rasmus Fuhse <fuhse@data-quest.de>
Date: Tue, 6 Jun 2023 06:58:46 +0000
Subject: [PATCH] =?UTF-8?q?Resolve=20"OER=20Campus:=20OERSI=20Ergebnisse?=
 =?UTF-8?q?=20unvollst=C3=A4ndig"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #2521

Merge request studip/studip!1825
---
 app/controllers/oer/market.php | 17 ++++++++++++++++-
 lib/models/OERHost.php         |  3 ++-
 lib/models/OERHostOERSI.php    | 27 ++++++++++-----------------
 lib/models/OERMaterial.php     |  8 +++++---
 4 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/app/controllers/oer/market.php b/app/controllers/oer/market.php
index 9e15406bd57..d1138fbd13e 100644
--- a/app/controllers/oer/market.php
+++ b/app/controllers/oer/market.php
@@ -188,9 +188,24 @@ class Oer_MarketController extends StudipController
                     "oer_tags_material.tag_hash = oer_tags.tag_hash",
                     "LEFT JOIN"
                 );
+                $search->join(
+                    "oer_material_users",
+                    "oer_material_users.material_id = oer_material.material_id",
+                    "LEFT JOIN"
+                );
+                $search->join(
+                    "external_users",
+                    "oer_material_users.user_id = external_users.external_contact_id AND oer_material_users.external_contact = '1'",
+                    "LEFT JOIN"
+                );
+                $search->join(
+                    "auth_user_md5",
+                    "oer_material_users.user_id = auth_user_md5.user_id AND oer_material_users.external_contact = '0'",
+                    "LEFT JOIN"
+                );
                 $search->where(
                     "textsearch",
-                    "(oer_material.name LIKE :search OR oer_material.description LIKE :search OR oer_material.short_description LIKE :search OR oer_tags.name LIKE :search)",
+                    "(oer_material.name LIKE :search OR oer_material.description LIKE :search OR oer_material.short_description LIKE :search OR oer_tags.name LIKE :search OR external_users.name LIKE :search OR CONCAT(auth_user_md5.Vorname, ' ', auth_user_md5.Nachname) LIKE :search)",
                     ['search' => '%'.Request::get("search").'%']
                 );
             }
diff --git a/lib/models/OERHost.php b/lib/models/OERHost.php
index 19f2bb23338..6db0747c6ca 100644
--- a/lib/models/OERHost.php
+++ b/lib/models/OERHost.php
@@ -264,8 +264,9 @@ class OERHost extends OERIdentity
     {
         $users = [];
         foreach ($material->users as $materialdata) {
-            if ($materialdata['external_contact']) {
+            if ($materialdata['oeruser']) {
                 $user = $materialdata['oeruser'];
+
                 $users[] = [
                     'user_id' => $user['foreign_id'],
                     'name' => $user['name'],
diff --git a/lib/models/OERHostOERSI.php b/lib/models/OERHostOERSI.php
index 3bb5d9f7029..5e6b9dcf519 100644
--- a/lib/models/OERHostOERSI.php
+++ b/lib/models/OERHostOERSI.php
@@ -69,13 +69,20 @@ class OERHostOERSI extends OERHost
                         'front_image_url' => $material_data['_source']['image'],
                         'download' => $material_data['_source']['encoding'][0]['contentUrl'] ?: '',
                         'id' => $material_data['_id'],
-                        'authors' => $material_data['_source']['creator'],
                         'organization' => $material_data['_source']['sourceOrganization'][0]['name'] ?: $material_data['_source']['publisher'][0]['name']
                     ];
                     $material->store();
 
-                    //set topics:
-                    //$material->setUsers([]);
+                    //set users:
+                    $userdata = [];
+                    foreach ((array) $material_data['_source']['creator'] as $creator) {
+                        $userdata[] = [
+                            'user_id' => md5($creator['name']),
+                            'name' => $creator['name'],
+                            'host_url' => $this['url']
+                        ];
+                    }
+                    $material->setUsers($userdata);
 
                     //set topics:
                     $material->setTopics($material_data['_source']['keywords']);
@@ -128,7 +135,6 @@ class OERHostOERSI extends OERHost
                 $data['data'] = $material['data']->getArrayCopy();
                 $data['data']['download'] = $output['encoding'][0]['contentUrl'] ?? '';
                 $data['data']['front_image_url'] = $output['image'] ?? '';
-                $data['data']['authors'] = $output['creator'];
                 $data['data']['organization'] = $output['sourceOrganization'][0]['name'] ?? $output['publisher'][0]['name'] ?? '';
                 return [
                     'data' => $data,
@@ -167,19 +173,6 @@ class OERHostOERSI extends OERHost
         return false;
     }
 
-    public function getAuthorsForMaterial(OERMaterial $material)
-    {
-        $users = [];
-        $data = $material->data->getArrayCopy();
-        foreach ((array) $data['authors'] as $author) {
-            $users[] = [
-                'name' => $author['name'],
-                'hostname' => $data['organization'] ?: $this['name']
-            ];
-        }
-        return $users;
-    }
-
     public function getDownloadURLForMaterial(OERMaterial $material)
     {
         return $material['uri'];
diff --git a/lib/models/OERMaterial.php b/lib/models/OERMaterial.php
index 911aaa2de1a..ea36035d78e 100644
--- a/lib/models/OERMaterial.php
+++ b/lib/models/OERMaterial.php
@@ -166,9 +166,11 @@ class OERMaterial extends SimpleORMap
         $cache_name = "oer_remote_searched_for_".md5($text)."_".($tag ? 1 : 0);
         $already_searched = (bool) StudipCacheFactory::getCache()->read($cache_name);
         if (!$already_searched) {
-            $host = OERHost::findOneBySQL("index_server = '1' AND allowed_as_index_server = '1' ORDER BY RAND()");
-            if ($host && !$host->isMe()) {
-                $host->fetchRemoteSearch($text, $tag);
+            $hosts = OERHost::findBySQL("index_server = '1' AND allowed_as_index_server = '1' ORDER BY RAND()");
+            foreach ($hosts as $host) {
+                if (!$host->isMe()) {
+                    $host->fetchRemoteSearch($text, $tag);
+                }
             }
             StudipCacheFactory::getCache()->read($cache_name, "1", 60);
         }
-- 
GitLab