opnform/app/Http/Controllers/Forms/FormSubmissionController.php

96 lines
3.0 KiB
PHP
Raw Normal View History

2022-09-20 19:59:52 +00:00
<?php
namespace App\Http\Controllers\Forms;
use App\Http\Controllers\Controller;
use App\Http\Resources\FormSubmissionResource;
use App\Models\Forms\Form;
use App\Exports\FormSubmissionExport;
use App\Http\Requests\AnswerFormRequest;
use App\Jobs\Form\StoreFormSubmissionJob;
use App\Models\Forms\FormSubmission;
2022-09-20 19:59:52 +00:00
use App\Service\Forms\FormSubmissionFormatter;
use Illuminate\Http\Request;
2022-09-20 19:59:52 +00:00
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Facades\Excel;
use Vinkla\Hashids\Facades\Hashids;
2022-09-20 19:59:52 +00:00
class FormSubmissionController extends Controller
{
public function __construct()
{
2024-01-13 18:57:39 +00:00
$this->middleware('auth', ['except' => ['submissionFile']]);
$this->middleware('signed', ['only' => ['submissionFile']]);
2022-09-20 19:59:52 +00:00
}
public function submissions(string $id)
{
$form = Form::findOrFail((int)$id);
2022-09-20 19:59:52 +00: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));
return $this->success([
'message' => 'Record successfully updated.',
'data' => $data
]);
}
2022-09-20 19:59:52 +00:00
public function export(string $id)
{
$form = Form::findOrFail((int)$id);
2024-01-16 16:41:01 +00:00
$this->authorize('view', $form);
2022-09-20 19:59:52 +00:00
$allRows = [];
foreach ($form->submissions->toArray() as $row) {
$formatter = (new FormSubmissionFormatter($form, $row['data']))
->outputStringsOnly()
->setEmptyForNoValue()
->showRemovedFields()
->showHiddenFields()
->useSignedUrlForFiles();
$allRows[] = [
'id' => Hashids::encode($row['id']),
'created_at' => date("Y-m-d H:i", strtotime($row['created_at'])),
...$formatter->getCleanKeyValue()
];
2022-09-20 19:59:52 +00:00
}
$csvExport = (new FormSubmissionExport($allRows));
return Excel::download(
$csvExport,
$form->slug . '-submission-data.csv',
2022-09-20 19:59:52 +00:00
\Maatwebsite\Excel\Excel::CSV
);
}
public function submissionFile($id, $fileName)
{
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id) . '/'
. urldecode($fileName);
2022-09-20 19:59:52 +00:00
if (!Storage::exists($fileName)) {
2022-09-20 19:59:52 +00:00
return $this->error([
'message' => 'File not found.',
], 404);
}
2024-01-13 18:57:39 +00:00
if (config('filesystems.default') !== 's3') {
return response()->file(Storage::path($fileName));
}
2022-09-20 19:59:52 +00:00
return redirect(
Storage::temporaryUrl($fileName, now()->addMinute())
2022-09-20 19:59:52 +00:00
);
}
}