]> _ Git - fluidbook-toolbox.git/commitdiff
wip #7930 @2
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 8 Jan 2026 13:59:18 +0000 (14:59 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 8 Jan 2026 13:59:18 +0000 (14:59 +0100)
app/Http/Controllers/Admin/Operations/FluidbookCollection/AuditLinksOperation.php

index c51bf333b524adcf6aa28f1a981150182b25009d..aa614cc2337bd6ae40a7572e27c6462ecf64fa0b 100644 (file)
@@ -2,8 +2,12 @@
 
 namespace App\Http\Controllers\Admin\Operations\FluidbookCollection;
 
+use App\Fluidbook\Link\LinksData;
 use App\Models\FluidbookAuditLink;
 use App\Models\FluidbookCollection;
+use App\Models\FluidbookPublication;
+use Cubist\Excel\Excel;
+use Cubist\Excel\ExcelToArray;
 use Cubist\Util\Files\Files;
 use Cubist\Util\Str;
 use Illuminate\Support\Facades\Route;
@@ -23,16 +27,79 @@ trait AuditLinksOperation
     protected function setupAuditLinksRoutes($segment, $routeName, $controller)
     {
         Route::match(['get', 'post'], $segment . '/{id}/export_excel', $controller . '@exportExcel')->name("download_audit_links");
+        Route::match(['get', 'post'], $segment . '/{id}/import_excel', $controller . '@importExcel')->name("import_audit_links");
+        Route::match(['get', 'post'], $segment . '/{cid}/import_excel_confirm', $controller . '@importExcel')->name("import_audit_links");
     }
 
-    public function exportExcel($id)
+    protected function importExcel($id)
     {
+        ExcelToArray::setCache(protected_path('fluidbookcollection/cache/exceltoarray'));
+        if (!FluidbookCollection::hasPermission($id)) {
+            abort(401);
+        }
+        try {
+            $data = ExcelToArray::excelToArrayIndexKeyVarsAll(request()->file('file')->getPathname());
+        } catch (\Exception $e) {
+            return ['error' => __('Invalid file') . ': ' . $e->getMessage()];
+        }
+
+        $columns = self::_columns();
 
         /** @var FluidbookCollection $collection */
-        $collection = FluidbookCollection::find($id);
+        $collection = FluidbookCollection::withoutGlobalScopes()->find($id);
         $fluidbooks = $collection->getFluidbooksID();
+        $updates = [];
+        $changedFluidbooks = [];
 
-        $columns = [
+        foreach ($data as $sheet) {
+            foreach ($sheet as $link) {
+                $new_url = $link[$columns['new_url']];
+                if (!$new_url) {
+                    continue;
+                }
+                $fluidbook_id = $link[$columns['fluidbook_id']];
+                $link_id = $link[$columns['link_id']];
+                if (in_array($fluidbook_id, $fluidbooks)) {
+                    // not in the collection
+                    continue;
+                }
+                $changedFluidbooks[] = $fluidbook_id;
+                $updates[] = ['fluidbook_id' => $fluidbook_id, 'link_id' => $link_id, 'new_url' => $new_url];
+            }
+
+        }
+        $allLinks = [];
+        foreach ($changedFluidbooks as $fluidbook_id) {
+            LinksData::getLinksAndRulers($fluidbook_id, $links, $rulers);
+            $allLinks[$fluidbook_id] = $links;
+        }
+
+        $actualUpdates = [];
+        foreach ($updates as $u) {
+            if (!isset($allLinks[$u['fluidbook_id']][$u['link_id']])) {
+                // The links doesnt exists anymore
+                continue;
+            }
+            if ($allLinks[$u['fluidbook_id']][$u['link_id']]['to'] == $u['new_url']) {
+                // The links already has the "new url"
+                continue;
+            }
+            $actualUpdates[] = $u;
+        }
+
+        $count = count($actualUpdates);
+        if ($count == 0) {
+            return ['alert' => __('Ce fichier ne contient aucun lien à modifier')];
+        } else {
+            $cid = rand(1000, 1000000000);
+            cache()->set('auditlinks_confirmation_data_' . $cid, $actualUpdates, 360);
+            return ['confirm' => ['message' => __('Vous vous apprêtez à modifier :nb liens. Veuillez confirmer cette opération.', ['nb' => $count]), 'confirm_action' => url('/fluidbookcollection/' . $cid . '/import_excel_confirm')]];
+        }
+    }
+
+    protected static function _columns()
+    {
+        return [
             'fluidbook_id' => 'Fluidbook #',
             'page' => 'Page',
             'link_id' => 'Link #',
@@ -44,6 +111,20 @@ trait AuditLinksOperation
             'updated_at' => 'Tested at',
             'new_url' => 'New URL',
         ];
+    }
+
+    public function exportExcel($id)
+    {
+
+        if (!FluidbookCollection::hasPermission($id)) {
+            abort(401);
+        }
+        /** @var FluidbookCollection $collection */
+        $collection = FluidbookCollection::find($id);
+        $fluidbooks = $collection->getFluidbooksID();
+
+
+        $columns = self::_columns();
 
         $links = FluidbookAuditLink::where('http_code', '!=', '200')->whereIn('fluidbook_id', $fluidbooks)->get();
         $errors = [];