Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
93.75% covered (success)
93.75%
15 / 16
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
ImportExportController
93.75% covered (success)
93.75%
15 / 16
75.00% covered (warning)
75.00%
3 / 4
7.01
0.00% covered (danger)
0.00%
0 / 1
 export
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 template
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 preview
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 import
85.71% covered (warning)
85.71%
6 / 7
0.00% covered (danger)
0.00%
0 / 1
3.03
1<?php
2
3namespace App\Http\Controllers\admin;
4
5use App\Http\Controllers\Controller;
6use App\Services\ImportExport\ImportExportManager;
7use Illuminate\Http\JsonResponse;
8use Illuminate\Http\RedirectResponse;
9use Illuminate\Http\Request;
10use Symfony\Component\HttpFoundation\BinaryFileResponse;
11
12/**
13 * Generic import/export endpoints. Any list page drops in <x-data-tools> and
14 * gets Export (xlsx/csv, current filters), a blank Template, and an Import
15 * wizard (dry-run preview → confirm) — all driven by config/importexport.php.
16 */
17class ImportExportController extends Controller
18{
19    public function export(Request $request, string $resource, ImportExportManager $manager): BinaryFileResponse
20    {
21        abort_unless($manager->has($resource), 404);
22        $format = $request->query('format') === 'csv' ? 'csv' : 'xlsx';
23
24        return $manager->export($resource, $format, $request->except(['format', 'page']));
25    }
26
27    public function template(string $resource, ImportExportManager $manager): BinaryFileResponse
28    {
29        abort_unless($manager->has($resource), 404);
30
31        return $manager->template($resource);
32    }
33
34    /** Dry run: parse + validate the upload, return a summary. Saves nothing. */
35    public function preview(Request $request, string $resource, ImportExportManager $manager): JsonResponse
36    {
37        abort_unless($manager->has($resource), 404);
38        $request->validate(['file' => 'required|file|mimes:xlsx,xls,csv,txt|max:5120']);
39
40        $result = $manager->import($resource, $request->file('file'), dryRun: true);
41
42        return response()->json($result);
43    }
44
45    /** Commit: same parse, actually persist. */
46    public function import(Request $request, string $resource, ImportExportManager $manager): RedirectResponse
47    {
48        abort_unless($manager->has($resource), 404);
49        $request->validate(['file' => 'required|file|mimes:xlsx,xls,csv,txt|max:5120']);
50
51        $result = $manager->import($resource, $request->file('file'), dryRun: false);
52
53        $msg = "Import finished — {$result['created']} added, {$result['updated']} updated";
54        if ($result['skipped'] > 0) {
55            $msg .= "{$result['skipped']} skipped";
56        }
57
58        return back()->with($result['skipped'] > 0 ? 'warning' : 'success', $msg . '.');
59    }
60}