]> _ Git - fluidbook-toolbox.git/commitdiff
wip #7697 @2:00
authorsoufiane <soufiane@cubedesigners.com>
Mon, 8 Sep 2025 09:06:32 +0000 (11:06 +0200)
committersoufiane <soufiane@cubedesigners.com>
Mon, 8 Sep 2025 09:06:32 +0000 (11:06 +0200)
app/Http/Controllers/Admin/Operations/FluidbookCollection/SettingsExportOperation.php
app/Models/FluidbookCollection.php

index de5690ab0410ceff3c5e6444215b67b1cd12cb8e..45eff15d0f3c51701d697aca3c1714a1fb983119 100644 (file)
 
 namespace App\Http\Controllers\Admin\Operations\FluidbookCollection;
 
+use App\Fields\FluidbookComposition;
+use App\Http\Controllers\Admin\Operations\FluidbookPublication\CompositionOperation;
 use App\Http\Middleware\CheckIfAdmin;
 use App\Jobs\FluidbookSettingsExport;
 use App\Models\FluidbookCollection;
+use App\Models\FluidbookPublication;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Route;
+use Typesense\Client;
 
 trait SettingsExportOperation
 {
     protected function setupSettingsRoutes($segment, $routeName, $controller)
     {
         Route::match(['get', 'post'], $segment . '/{id}/download_settings', $controller . '@collectionSettings')->name("download_settings_by_ids");
+        Route::match(['post'], $segment . '/search', $controller . '@search');
     }
 
     protected function collectionSettings($id)
     {
+
         if (!can('fluidbook-publication:admin')) {
             abort('403');
         }
+
         $userId = backpack_user()->id;
         $publications = Arr::flatten(FluidbookCollection::where('id', $id)->get('publications')->toArray(), 2);
+
         $ids = Arr::join(array_column($publications, 'fluidbook'), ',');
         $file = (new FluidbookSettingsExport($ids, $userId, true))->handle();
+
+        $this->indexContent($publications, $id);
+
         return response()->download($file, 'settings_export.xlsx')->deleteFileAfterSend();
     }
+
+    protected function connectToSearchServer($id) {
+        $apiKey = FluidbookCollection::where('id', $id)->get('api_key')->toArray()[0]['api_key'];
+        $host = FluidbookCollection::where('id', $id)->get('server_search_host')->toArray()[0]['server_search_host'];
+
+        return new Client(
+            [
+                'api_key'         => $apiKey,
+                'nodes'           => [
+                    [
+                        'host'     => $host, // For Typesense Cloud use xxx.a1.typesense.net
+                        'port'     => '',// For Typesense Cloud use 443
+                        'protocol' => 'https',// For Typesense Cloud use https
+                    ],
+                ],
+                'connection_timeout_seconds' => 3600,
+            ]
+        );
+    }
+
+    protected function indexContent($publications, $id) {
+        $client = $this->connectToSearchServer($id);
+
+        $texts = [];
+        $content = '';
+
+        foreach ($publications as $publication) {
+            $book_id = $publication['fluidbook'];
+            $fb = FluidbookPublication::find($book_id);
+            $pages = $fb->getPagesNumber();
+            $ref = $fb->reference;
+
+            for($i = 1; $i <= $pages; $i++) {
+                $getContent = file_get_contents($fb->getTextFile($i));
+                if(in_array('gz', explode('.', $fb->getTextFile($i)))) {
+                    $content .= gzdecode($getContent);
+                }else {
+                    $content .= $getContent;
+                }
+                $content .= ' ';
+            }
+
+            $texts[$book_id] = [
+                "text" => $content,
+                "id" => $book_id,
+                "reference" => $ref ?? '-'
+            ];
+            $content = '';
+        }
+
+        $booksSchema = [
+            "name" => "fluidbooks",
+            "fields" => [
+                ["name"=> ".*", "type"=> "auto"]
+            ]
+        ];
+
+        $client->collections['fluidbooks']->delete();
+
+        $client->collections->create($booksSchema);
+        $this->addContent($client, $texts);
+    }
+
+    protected function addContent($client, $content) {
+        $client->collections["fluidbooks"]->documents->import($content, ['action' => 'create']);
+    }
 }
index a3fe25dd1623ca7db57626cdfa0aa8e83909f120..fb1b1d5de42b1caa39d48e77793985aa6e3bb1f9 100644 (file)
@@ -86,6 +86,9 @@ class FluidbookCollection extends ToolboxStatusModel
         $this->addField('override_settings', BunchOfFieldsMultiple::class, __('Redéfinir les paramètres lors de l\'export'), ['bunch' => Fluidbook_Setting::class]);
         $this->addField('linksAssets', FilesOrURL::class, __('Charger ou remplacer des assets sur tous les fluidbooks de la collection'), ['hint' => __('Cela écrasera les fichiers sur tous les fluidbooks de la collection si ils portent le même nom d\'un asset chargé ici')]);
         $this->addField('visits_counter', Integer::class, 'Compteur de visites', ['can' => 'fluidbook-collection:write', 'read_only' => true, 'default' => 0, 'column' => true, 'column_label' => '<i class="las la-chart-area" title="' . __('Compteur de visites du lien de préview') . '"></i>', 'searchLogic' => false]);
+        $this->addField('type_index', Text::class, __('Type d\'index'));
+        $this->addField('server_search_host', Text::class, __('Hôte du serveur de recherche'));
+        $this->addField('api_key', Text::class, __('Clé API'));
     }