From 66747515f93cafcf5a844e59753c2c8cf8e01638 Mon Sep 17 00:00:00 2001 From: bernardhanna Date: Tue, 3 Feb 2026 16:26:37 +0000 Subject: [PATCH] upload feature for bulk resoource upload --- .../Controllers/ResourcesImportController.php | 35 ++++++++++++++++--- .../admin/resources-import/preview.blade.php | 12 +++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/ResourcesImportController.php b/app/Http/Controllers/ResourcesImportController.php index 6c09a387a..3d095b538 100644 --- a/app/Http/Controllers/ResourcesImportController.php +++ b/app/Http/Controllers/ResourcesImportController.php @@ -8,6 +8,7 @@ use App\Services\ResourcesUploadValidator; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Storage; use Illuminate\View\View; use Maatwebsite\Excel\Facades\Excel; @@ -131,26 +132,52 @@ public function preview(Request $request): View|RedirectResponse ->with('info', 'No preview data found. Please upload and verify a file first.'); } + $path = $request->session()->get(self::SESSION_FILE_PATH); + $importPayload = $path ? Crypt::encryptString(json_encode([ + 'path' => $path, + 'focus' => $focus, + ])) : ''; + return view('admin.resources-import.preview', [ 'rows' => $rows, 'focus' => $focus, + 'import_payload' => $importPayload, ]); } /** - * Run import with session file and request edits; clear session; redirect to report. + * Run import with file path (from form payload or session) and request edits; redirect to report. + * Uses encrypted form payload so import works when session is not shared (e.g. load-balanced servers). */ public function import(Request $request): RedirectResponse { - $path = $request->session()->get(self::SESSION_FILE_PATH); + $path = null; + $focus = false; + + $payload = $request->input('import_payload'); + if (is_string($payload) && $payload !== '') { + try { + $decoded = json_decode(Crypt::decryptString($payload), true); + if (is_array($decoded) && ! empty($decoded['path'])) { + $path = $decoded['path']; + $focus = (bool) ($decoded['focus'] ?? false); + } + } catch (\Throwable $e) { + // Invalid or expired payload, fall back to session + } + } + + if (! $path) { + $path = $request->session()->get(self::SESSION_FILE_PATH); + $focus = $request->session()->get(self::SESSION_FOCUS, false); + } + if (! $path || ! Storage::exists($path)) { $request->session()->forget([self::SESSION_FILE_PATH, self::SESSION_ROWS, self::SESSION_FOCUS]); return redirect()->route('admin.resources-import.index') ->withErrors(['import' => 'No verified file found. Please upload and verify a file first.']); } - - $focus = $request->session()->get(self::SESSION_FOCUS, false); $edits = $request->input('edits', []); if (! is_array($edits)) { $edits = []; diff --git a/resources/views/admin/resources-import/preview.blade.php b/resources/views/admin/resources-import/preview.blade.php index a6c8b2e21..4b21aeb0c 100644 --- a/resources/views/admin/resources-import/preview.blade.php +++ b/resources/views/admin/resources-import/preview.blade.php @@ -8,7 +8,7 @@
-

Review and edit the parsed rows below. All fields are editable. Then click Import to run the import.

+

Review and edit the parsed rows below. All fields are editable. Then click Import to run the import. Complete the import soon; if you see “419 Page Expired”, your session timed out — go back to Upload & verify and try again.

@if ($errors->any())
@@ -20,8 +20,9 @@
@endif -
+ @csrf +
@@ -119,6 +120,13 @@ class="w-full min-w-[160px] px-2 py-1 border rounded text-sm" placeholder="https + @endsection