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']);
+ }
}
$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'));
}