opnform-host-nginx/api/app/Http/Controllers/Forms/FormSubmissionController.php

106 lines
3.5 KiB
PHP
Raw Normal View History

2022-09-20 21:59:52 +02:00
<?php
namespace App\Http\Controllers\Forms;
use App\Exports\FormSubmissionExport;
2024-02-23 11:54:12 +01:00
use App\Http\Controllers\Controller;
use App\Http\Requests\AnswerFormRequest;
use App\Http\Requests\FormSubmissionExportRequest;
2024-02-23 11:54:12 +01:00
use App\Http\Resources\FormSubmissionResource;
use App\Jobs\Form\StoreFormSubmissionJob;
2024-02-23 11:54:12 +01:00
use App\Models\Forms\Form;
use App\Models\Forms\FormSubmission;
2022-09-20 21:59:52 +02:00
use App\Service\Forms\FormSubmissionFormatter;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Facades\Excel;
use Vinkla\Hashids\Facades\Hashids;
2022-09-20 21:59:52 +02:00
class FormSubmissionController extends Controller
{
public function __construct()
{
2024-01-13 19:57:39 +01:00
$this->middleware('auth', ['except' => ['submissionFile']]);
$this->middleware('signed', ['only' => ['submissionFile']]);
2022-09-20 21:59:52 +02:00
}
public function submissions(string $id)
{
2024-02-23 11:54:12 +01:00
$form = Form::findOrFail((int) $id);
2022-09-20 21:59:52 +02:00
$this->authorize('view', $form);
return FormSubmissionResource::collection($form->submissions()->paginate(100));
}
public function update(AnswerFormRequest $request, $id, $submissionId)
{
$form = $request->form;
$this->authorize('update', $form);
$job = new StoreFormSubmissionJob($request->form, $request->validated());
$job->setSubmissionId($submissionId)->handle();
$data = new FormSubmissionResource(FormSubmission::findOrFail($submissionId));
2024-02-23 11:54:12 +01:00
return $this->success([
'message' => 'Record successfully updated.',
2024-02-23 11:54:12 +01:00
'data' => $data,
]);
}
public function export(FormSubmissionExportRequest $request, string $id)
2022-09-20 21:59:52 +02:00
{
$form = $request->form;
2024-01-16 17:41:01 +01:00
$this->authorize('view', $form);
2022-09-20 21:59:52 +02:00
$allRows = [];
$displayColumns = collect($request->columns)->filter(fn ($value, $key) => $value === true)->toArray();
2022-09-20 21:59:52 +02:00
foreach ($form->submissions->toArray() as $row) {
$formatter = (new FormSubmissionFormatter($form, $row['data']))
->outputStringsOnly()
->setEmptyForNoValue()
->showRemovedFields()
->showHiddenFields()
->useSignedUrlForFiles();
$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;
2022-09-20 21:59:52 +02:00
}
$csvExport = (new FormSubmissionExport($allRows));
2024-02-23 11:54:12 +01:00
2022-09-20 21:59:52 +02:00
return Excel::download(
$csvExport,
$form->slug . '-submission-data.csv',
2022-09-20 21:59:52 +02:00
\Maatwebsite\Excel\Excel::CSV
);
}
public function submissionFile($id, $fileName)
{
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id) . '/'
. urldecode($fileName);
2022-09-20 21:59:52 +02:00
2024-02-23 11:54:12 +01:00
if (! Storage::exists($fileName)) {
2022-09-20 21:59:52 +02:00
return $this->error([
'message' => 'File not found.',
], 404);
}
2024-01-13 19:57:39 +01:00
if (config('filesystems.default') !== 's3') {
return response()->file(Storage::path($fileName));
}
2022-09-20 21:59:52 +02:00
return redirect(
Storage::temporaryUrl($fileName, now()->addMinute())
2022-09-20 21:59:52 +02:00
);
}
}