From 9bf2f28b5b163af7abeb5d1ead5a30f5e3283d15 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Thu, 8 Jan 2026 14:59:18 +0100 Subject: [PATCH] wip #7930 @2 --- .../AuditLinksOperation.php | 87 ++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Admin/Operations/FluidbookCollection/AuditLinksOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookCollection/AuditLinksOperation.php index c51bf333b..aa614cc23 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookCollection/AuditLinksOperation.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookCollection/AuditLinksOperation.php @@ -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 = []; -- 2.39.5