From 6e634eda5a81e239d14ac1b69d323196aa4e2594 Mon Sep 17 00:00:00 2001 From: Sallu9007 Date: Sun, 11 May 2025 15:41:58 +0530 Subject: [PATCH] Feat: Create a Service for Download Proof and make it reusable --- .../ActivitiesAttendedController.php | 59 ++------------ app/Services/ProofDownloadService.php | 81 +++++++++++++++++++ .../components/download-proofs.blade.php | 52 ++++++++++++ .../pages/activities-attended/index.blade.php | 7 +- 4 files changed, 141 insertions(+), 58 deletions(-) create mode 100644 app/Services/ProofDownloadService.php create mode 100644 resources/views/components/download-proofs.blade.php diff --git a/app/Http/Controllers/ActivitiesAttendedController.php b/app/Http/Controllers/ActivitiesAttendedController.php index 9c42b3f..e7ae25e 100644 --- a/app/Http/Controllers/ActivitiesAttendedController.php +++ b/app/Http/Controllers/ActivitiesAttendedController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Yajra\DataTables\Facades\DataTables; use App\Models\ActivitiesAttended; use Illuminate\Support\Facades\Storage; +use App\Services\ProofDownloadService; class ActivitiesAttendedController extends Controller { @@ -113,7 +114,7 @@ class ActivitiesAttendedController extends Controller return response()->json(['success' => 'Record deleted successfully']); } - public function downloadProofs(Request $request) + public function downloadProofs(Request $request, ProofDownloadService $proofDownloadService) { // Validate the request $request->validate([ @@ -122,62 +123,14 @@ class ActivitiesAttendedController extends Controller $ids = json_decode($request->input('ids')); - if (empty($ids)) { - return back()->with('error', 'No items selected'); - } + $result = $proofDownloadService->downloadProofs(ActivitiesAttended::class, $ids); - // Get the records with proofs - $responses = ActivitiesAttended::whereIn('id', $ids) - ->whereNotNull('proof') - ->get(); - - if ($responses->isEmpty()) { - return back()->with('error', 'No valid proofs found'); - } - - // Create a temporary zip file - $zipFileName = 'proofs_' . time() . '.zip'; - $zipFilePath = storage_path('app/public/temp/' . $zipFileName); - - // Ensure the temp directory exists - if (!Storage::disk('public')->exists('temp')) { - Storage::disk('public')->makeDirectory('temp'); - } - - $zip = new \ZipArchive(); - - if ($zip->open($zipFilePath, \ZipArchive::CREATE) !== TRUE) { - return back()->with('error', 'Could not create zip file'); - } - - $fileCount = 0; - - foreach ($responses as $response) { - if (Storage::disk('public')->exists($response->proof)) { - $fileContent = Storage::disk('public')->get($response->proof); - - // Get original filename from path - $originalName = basename($response->proof); - - // Add file to the zip with a prefix to avoid duplicate names - $fileNameInZip = $response->id . '_' . $originalName; - $zip->addFromString($fileNameInZip, $fileContent); - $fileCount++; - } - } - - $zip->close(); - - if ($fileCount === 0) { - // Delete the empty zip file - if (file_exists($zipFilePath)) { - unlink($zipFilePath); - } - return back()->with('error', 'No files found to download'); + if (isset($result['error'])) { + return back()->with('error', $result['error']); } // Return the zip file as a download - return response()->download($zipFilePath, $zipFileName)->deleteFileAfterSend(true); + return response()->download($result['filePath'], $result['fileName'])->deleteFileAfterSend(true); } public function getActivitiesAttendedResponses(Request $request) diff --git a/app/Services/ProofDownloadService.php b/app/Services/ProofDownloadService.php new file mode 100644 index 0000000..172ea4a --- /dev/null +++ b/app/Services/ProofDownloadService.php @@ -0,0 +1,81 @@ + 'No items selected', + ]; + } + + // Fetch records with proofs + $responses = $model::whereIn('id', $ids) + ->whereNotNull($filePathColumn) + ->get(); + + if ($responses->isEmpty()) { + return [ + 'error' => 'No valid proofs found', + ]; + } + + // Create a temporary zip file + $zipFileName = 'proofs_' . time() . '.zip'; + $zipFilePath = storage_path('app/public/temp/' . $zipFileName); + + // Ensure the temp directory exists + if (!Storage::disk('public')->exists('temp')) { + Storage::disk('public')->makeDirectory('temp'); + } + + $zip = new ZipArchive(); + + if ($zip->open($zipFilePath, ZipArchive::CREATE) !== true) { + return [ + 'error' => 'Could not create zip file', + ]; + } + + $fileCount = 0; + + foreach ($responses as $response) { + if (Storage::disk('public')->exists($response->$filePathColumn)) { + $fileContent = Storage::disk('public')->get($response->$filePathColumn); + + // Get original filename from path + $originalName = basename($response->$filePathColumn); + + // Add file to the zip with a prefix to avoid duplicate names + $fileNameInZip = $response->id . '_' . $originalName; + $zip->addFromString($fileNameInZip, $fileContent); + $fileCount++; + } + } + + $zip->close(); + + if ($fileCount === 0) { + // Delete the empty zip file + if (file_exists($zipFilePath)) { + unlink($zipFilePath); + } + return [ + 'error' => 'No files found to download', + ]; + } + + return [ + 'success' => true, + 'filePath' => $zipFilePath, + 'fileName' => $zipFileName, + ]; + } +} diff --git a/resources/views/components/download-proofs.blade.php b/resources/views/components/download-proofs.blade.php new file mode 100644 index 0000000..00305ce --- /dev/null +++ b/resources/views/components/download-proofs.blade.php @@ -0,0 +1,52 @@ +
+ + + + +
diff --git a/resources/views/pages/activities-attended/index.blade.php b/resources/views/pages/activities-attended/index.blade.php index 7670149..8351cce 100644 --- a/resources/views/pages/activities-attended/index.blade.php +++ b/resources/views/pages/activities-attended/index.blade.php @@ -139,12 +139,10 @@ - + + -
@@ -265,7 +263,6 @@ @endif - @endsection @section('scripts')