From 91432c4aed5d27e6e385c40eb939b3a78af1661c Mon Sep 17 00:00:00 2001 From: Julien Nahum Date: Sat, 13 Jan 2024 19:57:39 +0100 Subject: [PATCH] Fix file submissions preview --- app/Exceptions/Handler.php | 2 +- .../Forms/FormSubmissionController.php | 12 ++--- app/Http/Middleware/Authenticate.php | 2 +- app/Http/Resources/FormSubmissionResource.php | 6 ++- .../open/forms/OpenCompleteForm.vue | 24 +++++----- .../open/tables/components/OpenFile.vue | 37 ++++++++++------ client/composables/useOpnApi.js | 3 +- client/lib/file-uploads.js | 44 +++++++------------ client/opnform.config.js | 3 +- client/pages/forms/[slug]/index.vue | 2 +- client/pages/subscriptions/success.vue | 2 +- routes/api.php | 5 ++- 12 files changed, 73 insertions(+), 69 deletions(-) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 830207d..966ea02 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -48,7 +48,7 @@ class Handler extends ExceptionHandler { return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) - : redirect()->guest(url('/login')); + : redirect(front_url('login')); } public function report(Throwable $exception) diff --git a/app/Http/Controllers/Forms/FormSubmissionController.php b/app/Http/Controllers/Forms/FormSubmissionController.php index 75d1a90..dca04b1 100644 --- a/app/Http/Controllers/Forms/FormSubmissionController.php +++ b/app/Http/Controllers/Forms/FormSubmissionController.php @@ -15,7 +15,8 @@ class FormSubmissionController extends Controller { public function __construct() { - $this->middleware('auth'); + $this->middleware('auth', ['except' => ['submissionFile']]); + $this->middleware('signed', ['only' => ['submissionFile']]); } public function submissions(string $id) @@ -51,9 +52,6 @@ class FormSubmissionController extends Controller public function submissionFile($id, $fileName) { - $form = Form::findOrFail((int) $id); - $this->authorize('view', $form); - $fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id).'/' .urldecode($fileName); @@ -63,8 +61,12 @@ class FormSubmissionController extends Controller ], 404); } + if (config('filesystems.default') !== 's3') { + return response()->file(Storage::path($fileName)); + } + return redirect( - Storage::temporaryUrl($fileName, now()->addMinute()) + Storage::temporaryUrl($fileName, now()->addMinute()) ); } } diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 513b77e..b481f9f 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -15,7 +15,7 @@ class Authenticate extends Middleware protected function redirectTo($request) { if (! $request->expectsJson()) { - return redirect('/login'); + return redirect(front_url('login')); } } } diff --git a/app/Http/Resources/FormSubmissionResource.php b/app/Http/Resources/FormSubmissionResource.php index 6018e9e..ad2b932 100644 --- a/app/Http/Resources/FormSubmissionResource.php +++ b/app/Http/Resources/FormSubmissionResource.php @@ -50,7 +50,11 @@ class FormSubmissionResource extends JsonResource return $file !== null && $file; })->map(function ($file) { return [ - 'file_url' => route('open.forms.submissions.file', [$this->form_id, $file]), + 'file_url' => \URL::signedRoute( + 'open.forms.submissions.file', + [$this->form_id, $file], + now()->addMinutes(10) + ), 'file_name' => $file, ]; }); diff --git a/client/components/open/forms/OpenCompleteForm.vue b/client/components/open/forms/OpenCompleteForm.vue index 4d54b4f..204e63a 100644 --- a/client/components/open/forms/OpenCompleteForm.vue +++ b/client/components/open/forms/OpenCompleteForm.vue @@ -117,6 +117,7 @@ import VButton from '~/components/global/VButton.vue' import FormCleanings from '../../pages/forms/show/FormCleanings.vue' import VTransition from '~/components/global/transitions/VTransition.vue' import {pendingSubmission} from "~/composables/forms/pendingSubmission.js"; +import clonedeep from "clone-deep"; export default { components: { VTransition, VButton, OpenFormButton, OpenForm, FormCleanings }, @@ -176,29 +177,24 @@ export default { this.loading = true // this.closeAlert() form.post('/forms/' + this.form.slug + '/answer').then((data) => { - this.$logEvent('form_submission', { + useAmplitude().logEvent('form_submission', { workspace_id: this.form.workspace_id, form_id: this.form.id }) - if (this.isIframe) { - window.parent.postMessage({ - type: 'form-submitted', - form: { - slug: this.form.slug, - id: this.form.id - }, - submission_data: form.data() - }, '*') - } - window.postMessage({ + const payload = clonedeep({ type: 'form-submitted', form: { slug: this.form.slug, id: this.form.id }, submission_data: form.data() - }, '*') + }) + + if (this.isIframe) { + window.parent.postMessage(payload, '*') + } + window.postMessage(payload, '*') try { this.pendingSubmission.remove() @@ -221,7 +217,7 @@ export default { this.confetti.play() } }).catch((error) => { - console.log('here') + console.error(error) if (error.response && error.data && error.data.message) { useAlert().error(error.data.message) } diff --git a/client/components/open/tables/components/OpenFile.vue b/client/components/open/tables/components/OpenFile.vue index 5fc8b47..3291715 100644 --- a/client/components/open/tables/components/OpenFile.vue +++ b/client/components/open/tables/components/OpenFile.vue @@ -1,20 +1,20 @@