Enhance Form Submission Export Functionality (#657)
* Enhance Form Submission Export Functionality * Validate new param 'columns' * Form submission export request as seprate class with validation * Test case for export --------- Co-authored-by: Julien Nahum <julien@nahum.net>
This commit is contained in:
@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Forms;
|
||||
use App\Exports\FormSubmissionExport;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\AnswerFormRequest;
|
||||
use App\Http\Requests\FormSubmissionExportRequest;
|
||||
use App\Http\Resources\FormSubmissionResource;
|
||||
use App\Jobs\Form\StoreFormSubmissionJob;
|
||||
use App\Models\Forms\Form;
|
||||
@@ -46,12 +47,13 @@ class FormSubmissionController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function export(string $id)
|
||||
public function export(FormSubmissionExportRequest $request, string $id)
|
||||
{
|
||||
$form = Form::findOrFail((int) $id);
|
||||
$form = $request->form;
|
||||
$this->authorize('view', $form);
|
||||
|
||||
$allRows = [];
|
||||
$displayColumns = collect($request->columns)->filter(fn ($value, $key) => $value === true)->toArray();
|
||||
foreach ($form->submissions->toArray() as $row) {
|
||||
$formatter = (new FormSubmissionFormatter($form, $row['data']))
|
||||
->outputStringsOnly()
|
||||
@@ -59,25 +61,32 @@ class FormSubmissionController extends Controller
|
||||
->showRemovedFields()
|
||||
->showHiddenFields()
|
||||
->useSignedUrlForFiles();
|
||||
$allRows[] = [
|
||||
'id' => Hashids::encode($row['id']),
|
||||
'created_at' => date('Y-m-d H:i', strtotime($row['created_at'])),
|
||||
...$formatter->getCleanKeyValue(),
|
||||
];
|
||||
$formattedData = $formatter->getCleanKeyValue();
|
||||
$filteredData = ['id' => Hashids::encode($row['id'])];
|
||||
foreach ($displayColumns as $column => $value) {
|
||||
$key = collect($formattedData)->keys()->first(fn ($key) => str_contains($key, $column));
|
||||
if ($key) {
|
||||
$filteredData[$key] = $formattedData[$key];
|
||||
}
|
||||
}
|
||||
if (isset($displayColumns['created_at'])) {
|
||||
$filteredData['created_at'] = date('Y-m-d H:i', strtotime($row['created_at']));
|
||||
}
|
||||
$allRows[] = $filteredData;
|
||||
}
|
||||
$csvExport = (new FormSubmissionExport($allRows));
|
||||
|
||||
return Excel::download(
|
||||
$csvExport,
|
||||
$form->slug.'-submission-data.csv',
|
||||
$form->slug . '-submission-data.csv',
|
||||
\Maatwebsite\Excel\Excel::CSV
|
||||
);
|
||||
}
|
||||
|
||||
public function submissionFile($id, $fileName)
|
||||
{
|
||||
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id).'/'
|
||||
.urldecode($fileName);
|
||||
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id) . '/'
|
||||
. urldecode($fileName);
|
||||
|
||||
if (! Storage::exists($fileName)) {
|
||||
return $this->error([
|
||||
|
||||
38
api/app/Http/Requests/FormSubmissionExportRequest.php
Normal file
38
api/app/Http/Requests/FormSubmissionExportRequest.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Models\Forms\Form;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class FormSubmissionExportRequest extends FormRequest
|
||||
{
|
||||
public Form $form;
|
||||
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->form = Form::findOrFail($request->route('id'));
|
||||
}
|
||||
|
||||
public function rules()
|
||||
{
|
||||
$validColumns = collect(array_merge(
|
||||
$this->form->properties,
|
||||
$this->form->removed_properties ?? []
|
||||
))->pluck('id')->toArray();
|
||||
$validColumns[] = 'created_at';
|
||||
|
||||
return [
|
||||
'columns' => 'required|array',
|
||||
'columns.*' => ['boolean', 'required'],
|
||||
'columns' => [function ($attribute, $value, $fail) use ($validColumns) {
|
||||
$submittedColumns = array_keys($value);
|
||||
$invalidColumns = array_diff($submittedColumns, $validColumns);
|
||||
if (!empty($invalidColumns)) {
|
||||
$fail('The columns contain invalid values: ' . implode(', ', $invalidColumns));
|
||||
}
|
||||
}],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user