From: soufiane Date: Mon, 8 Sep 2025 09:06:32 +0000 (+0200) Subject: wip #7697 @2:00 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=61d30094d012bc0af397f3c901f8427f974b950a;p=fluidbook-toolbox.git wip #7697 @2:00 --- diff --git a/app/Http/Controllers/Admin/Operations/FluidbookCollection/SettingsExportOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookCollection/SettingsExportOperation.php index de5690ab0..45eff15d0 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookCollection/SettingsExportOperation.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookCollection/SettingsExportOperation.php @@ -2,28 +2,105 @@ 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']); + } } diff --git a/app/Models/FluidbookCollection.php b/app/Models/FluidbookCollection.php index a3fe25dd1..fb1b1d5de 100644 --- a/app/Models/FluidbookCollection.php +++ b/app/Models/FluidbookCollection.php @@ -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' => '', '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')); }