From 5f05dcf8fef92d9aa57bda6d16a1e9cb24ec6f62 Mon Sep 17 00:00:00 2001 From: Vincent Auger Date: Fri, 13 Dec 2024 15:00:56 -0400 Subject: [PATCH 1/2] feat: upload of word files for supplementary files --- ...PublicationSupplementaryFileController.php | 4 +-- app/Models/Publication.php | 2 +- resources/src/locales/en.json | 3 ++ resources/src/locales/fr.json | 3 ++ .../src/models/Publication/Publication.ts | 2 +- ...icationSupplementaryFileManagementCard.vue | 6 ++-- tests/Feature/Models/PublicationTest.php | 30 +++++++++++++++++- .../Models/support_files/test_doc.docx | Bin 0 -> 12071 bytes 8 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 tests/Feature/Models/support_files/test_doc.docx diff --git a/app/Http/Controllers/PublicationSupplementaryFileController.php b/app/Http/Controllers/PublicationSupplementaryFileController.php index 5fad6b69..d5b5c717 100644 --- a/app/Http/Controllers/PublicationSupplementaryFileController.php +++ b/app/Http/Controllers/PublicationSupplementaryFileController.php @@ -47,13 +47,13 @@ public function store(Request $request, Publication $publication) Gate::authorize('update', $publication); $validated = $request->validate([ - 'pdf' => 'required|file|mimes:pdf|max:50000', + 'file' => 'required|file|mimes:pdf,doc,docx|max:50000', 'supplementary_file_type' => ['required', Rule::enum(SupplementaryFileType::class)], 'description' => 'nullable|string|max:200', ]); $type = SupplementaryFileType::tryFrom($validated['supplementary_file_type']); - $media = $publication->addSupplementaryFile($validated['pdf'], $type, $validated['description'] ?? null); + $media = $publication->addSupplementaryFile($validated['file'], $type, $validated['description'] ?? null); activity() ->performedOn($publication) diff --git a/app/Models/Publication.php b/app/Models/Publication.php index 36f911d2..0204829a 100644 --- a/app/Models/Publication.php +++ b/app/Models/Publication.php @@ -91,7 +91,7 @@ public function registerMediaCollections(): void ->acceptsMimeTypes(['application/pdf']); $this->addMediaCollection(MediaCollection::SUPPLEMENTARY_FILE->value) - ->acceptsMimeTypes(['application/pdf']); + ->acceptsMimeTypes(['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document']); } /** diff --git a/resources/src/locales/en.json b/resources/src/locales/en.json index 4b32c812..94b6e252 100644 --- a/resources/src/locales/en.json +++ b/resources/src/locales/en.json @@ -817,5 +817,8 @@ "external-authors-caption": "Authors with an external affiliation", "with-orcid": "With ORCID", "with-orcid-caption": "Authors with an associated ORCID" + }, + "publication-supplementary": { + "upload-hint": "Only PDF or Word files are accepted. Maximum file size is {max}MB." } } diff --git a/resources/src/locales/fr.json b/resources/src/locales/fr.json index 1ecb94ec..6b57c434 100644 --- a/resources/src/locales/fr.json +++ b/resources/src/locales/fr.json @@ -817,5 +817,8 @@ "external-authors-caption": "Auteurs avec une affiliation externe", "with-orcid": "Avec ORCID", "with-orcid-caption": "Auteurs avec un ORCID associé" + }, + "publication-supplementary": { + "upload-hint": "Seuls les fichiers PDF ou Word sont acceptés. \nLa taille maximale du fichier est de {max} Mo." } } diff --git a/resources/src/models/Publication/Publication.ts b/resources/src/models/Publication/Publication.ts index f6e96e4c..064fdb74 100644 --- a/resources/src/models/Publication/Publication.ts +++ b/resources/src/models/Publication/Publication.ts @@ -140,7 +140,7 @@ export class PublicationService { public static async attachSupplementaryFile(file: File, id: number, type: SupplementaryFileType, desc: string | null = null) { const formData = new FormData() - formData.append('pdf', file) + formData.append('file', file) formData.append('supplementary_file_type', type) if (desc) { formData.append('description', desc) diff --git a/resources/src/models/Publication/components/PublicationSupplementaryFileManagementCard.vue b/resources/src/models/Publication/components/PublicationSupplementaryFileManagementCard.vue index 0c35cd0c..5817d627 100644 --- a/resources/src/models/Publication/components/PublicationSupplementaryFileManagementCard.vue +++ b/resources/src/models/Publication/components/PublicationSupplementaryFileManagementCard.vue @@ -159,15 +159,15 @@ const hideMrf = computed(() => { outlined use-chips :label="t('common.select-file')" - :hint="t('mrf.upload-hint', { max: maxFileSizeMB })" - accept="application/pdf" + :hint="t('publication-supplementary.upload-hint', { max: maxFileSizeMB })" + accept="application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document" :max-file-size="maxFileSizeMB * 1e6" counter :loading="uploadingFile" @rejected="onFileRejected" > diff --git a/tests/Feature/Models/PublicationTest.php b/tests/Feature/Models/PublicationTest.php index ca8d73d9..ccec07cf 100644 --- a/tests/Feature/Models/PublicationTest.php +++ b/tests/Feature/Models/PublicationTest.php @@ -292,7 +292,7 @@ $response->assertForbidden(); $response = $this->actingAs($user)->postJson('/api/publications/'.$publication->id.'/supplementary-files', [ - 'pdf' => $file, + 'file' => $file, 'supplementary_file_type' => SupplementaryFileType::MANUSCRIPT_RECORD_FORM->value, 'description' => 'Test Description', ]); @@ -315,5 +315,33 @@ // delete the file $response = $this->actingAs($user)->deleteJson("/api/publications/{$publication->id}/supplementary-files/{$uuid}"); $response->assertNoContent(); +}); + +test('a user can upload a word document as a supplementary files', function () { + $publication = Publication::factory()->create(); + $user = $publication->user; + + // upload word document + $file = UploadedFile::fake()->createWithContent('test.docx', file_get_contents(__DIR__.'/support_files/test_doc.docx'))->size(1000); + + $response = $this->actingAs($user)->postJson('/api/publications/'.$publication->id.'/supplementary-files', [ + 'file' => $file, + 'supplementary_file_type' => SupplementaryFileType::MANUSCRIPT_RECORD_FORM->value, + 'description' => 'Test Description', + ]); + + $response->assertCreated(); + $uuid = $response->json('data.uuid'); + + // list the files + $response = $this->actingAs($user)->getJson('/api/publications/'.$publication->id.'/supplementary-files'); + $response->assertOk(); + $response->assertJsonCount(1, 'data'); + + $response2 = $this->actingAs($user)->get("/api/publications/{$publication->id}/supplementary-files/{$uuid}?download=true"); + $response2->assertDownload('test.docx'); + // delete the file + $response = $this->actingAs($user)->deleteJson("/api/publications/{$publication->id}/supplementary-files/{$uuid}"); + $response->assertNoContent(); }); diff --git a/tests/Feature/Models/support_files/test_doc.docx b/tests/Feature/Models/support_files/test_doc.docx new file mode 100644 index 0000000000000000000000000000000000000000..0c53c7e1b3f8c8296cd2275893fec10b8abd43e4 GIT binary patch literal 12071 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 Date: Fri, 13 Dec 2024 15:07:00 -0400 Subject: [PATCH 2/2] chore: bump leage/csv --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 3376beb2..b4cf8d19 100644 --- a/composer.lock +++ b/composer.lock @@ -4442,16 +4442,16 @@ }, { "name": "league/csv", - "version": "9.19.0", + "version": "9.20.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "f81df48a012a9e86d077e74eaff666fd15bfab88" + "reference": "553579df208641ada6ffb450b3a151e2fcfa4f31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/f81df48a012a9e86d077e74eaff666fd15bfab88", - "reference": "f81df48a012a9e86d077e74eaff666fd15bfab88", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/553579df208641ada6ffb450b3a151e2fcfa4f31", + "reference": "553579df208641ada6ffb450b3a151e2fcfa4f31", "shasum": "" }, "require": { @@ -4525,7 +4525,7 @@ "type": "github" } ], - "time": "2024-12-08T08:09:35+00:00" + "time": "2024-12-13T15:49:27+00:00" }, { "name": "league/flysystem",