From 89e886b40cc4e0cf0a2f8ba3c5499c016b2c6d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Wed, 19 Jan 2022 09:00:54 +0100 Subject: [PATCH] qr code generator --- public/mix-manifest.json | 23 ++++++++++-- public/qr.png | Bin 24002 -> 0 bytes .../js/components/Others/ShareCreatePopup.vue | 2 +- .../js/components/Others/ShareEditPopup.vue | 20 +++++++++-- routes/api.php | 2 ++ .../Controllers/GetInvoiceController.php | 14 ++++---- .../GetShareLinkViaQrCodeController.php | 33 ++++++++++++++++++ tests/App/Users/UserAccountTest.php | 11 +++--- tests/Domain/Sharing/UserShareTest.php | 15 ++++++++ 9 files changed, 104 insertions(+), 16 deletions(-) delete mode 100644 public/qr.png create mode 100644 src/Domain/Sharing/Controllers/GetShareLinkViaQrCodeController.php diff --git a/public/mix-manifest.json b/public/mix-manifest.json index fa33869a..622039fa 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -64,7 +64,7 @@ "/chunks/plan-settings.js": "/chunks/plan-settings.js?id=7f623c8a4002f17eecef", "/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=7eff560fea52770a642f", "/chunks/plans.js": "/chunks/plans.js?id=293e7e8d59da542a9710", - "/chunks/platform.js": "/chunks/platform.js?id=1cd6e357b28006f2c0d0", + "/chunks/platform.js": "/chunks/platform.js?id=995d87d771ab3755300d", "/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=eb52b5029ab2132cc7a8", "/chunks/platform~chunks/shared~chunks/shared-with-me~chunks/team-folders.js": "/chunks/platform~chunks/shared~chunks/shared-with-me~chunks/team-folders.js?id=ca9ca67afd5839597647", "/chunks/profile.js": "/chunks/profile.js?id=8688d9c7ff850e6989e6", @@ -1031,5 +1031,24 @@ "/chunks/platform~chunks/shared.ea85f5cfae919a076286.hot-update.js": "/chunks/platform~chunks/shared.ea85f5cfae919a076286.hot-update.js", "/chunks/platform~chunks/shared.84634b8388c060112c1b.hot-update.js": "/chunks/platform~chunks/shared.84634b8388c060112c1b.hot-update.js", "/chunks/platform~chunks/shared.bad4a30908dd6677cf57.hot-update.js": "/chunks/platform~chunks/shared.bad4a30908dd6677cf57.hot-update.js", - "/chunks/platform~chunks/shared.7344fdb67d1d2c382527.hot-update.js": "/chunks/platform~chunks/shared.7344fdb67d1d2c382527.hot-update.js" + "/chunks/platform~chunks/shared.7344fdb67d1d2c382527.hot-update.js": "/chunks/platform~chunks/shared.7344fdb67d1d2c382527.hot-update.js", + "/chunks/platform.9935a3fb40cb1a6c789a.hot-update.js": "/chunks/platform.9935a3fb40cb1a6c789a.hot-update.js", + "/chunks/platform.5b66195d24b17de302b0.hot-update.js": "/chunks/platform.5b66195d24b17de302b0.hot-update.js", + "/chunks/platform.79d4290d27451ea79ccb.hot-update.js": "/chunks/platform.79d4290d27451ea79ccb.hot-update.js", + "/chunks/platform.7a437caaafe827fe07cc.hot-update.js": "/chunks/platform.7a437caaafe827fe07cc.hot-update.js", + "/chunks/platform.7187684ae9b0faa2a7f1.hot-update.js": "/chunks/platform.7187684ae9b0faa2a7f1.hot-update.js", + "/chunks/platform.bb37cb7d93d79c9e6a5a.hot-update.js": "/chunks/platform.bb37cb7d93d79c9e6a5a.hot-update.js", + "/chunks/platform.74e0ff5ead757ff49708.hot-update.js": "/chunks/platform.74e0ff5ead757ff49708.hot-update.js", + "/chunks/platform.ea1c3e65c26938bba387.hot-update.js": "/chunks/platform.ea1c3e65c26938bba387.hot-update.js", + "/chunks/platform.54c9d7a94fbee65e2da7.hot-update.js": "/chunks/platform.54c9d7a94fbee65e2da7.hot-update.js", + "/chunks/platform.1c70eca57aee433b8aa9.hot-update.js": "/chunks/platform.1c70eca57aee433b8aa9.hot-update.js", + "/chunks/platform.42f9d03cdae6611c56cd.hot-update.js": "/chunks/platform.42f9d03cdae6611c56cd.hot-update.js", + "/chunks/platform.ff639c6b90300df114a8.hot-update.js": "/chunks/platform.ff639c6b90300df114a8.hot-update.js", + "/chunks/platform.67a4de439a33f4a20333.hot-update.js": "/chunks/platform.67a4de439a33f4a20333.hot-update.js", + "/chunks/platform.a266c10be8a18abd0620.hot-update.js": "/chunks/platform.a266c10be8a18abd0620.hot-update.js", + "/chunks/platform.1cdf2801a1dc08744bfb.hot-update.js": "/chunks/platform.1cdf2801a1dc08744bfb.hot-update.js", + "/chunks/platform.59a13c955f76e3699f76.hot-update.js": "/chunks/platform.59a13c955f76e3699f76.hot-update.js", + "/chunks/platform.7a1f473c56b980ad30a0.hot-update.js": "/chunks/platform.7a1f473c56b980ad30a0.hot-update.js", + "/chunks/platform.2dff6a153cfe9e102eea.hot-update.js": "/chunks/platform.2dff6a153cfe9e102eea.hot-update.js", + "/chunks/platform.9fc0238e5466745ede6c.hot-update.js": "/chunks/platform.9fc0238e5466745ede6c.hot-update.js" } diff --git a/public/qr.png b/public/qr.png deleted file mode 100644 index 1553f1fd8c279bf70b189f964c82f46368197772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24002 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 - + diff --git a/resources/js/components/Others/ShareEditPopup.vue b/resources/js/components/Others/ShareEditPopup.vue index 8b2aaf61..6ee403a2 100644 --- a/resources/js/components/Others/ShareEditPopup.vue +++ b/resources/js/components/Others/ShareEditPopup.vue @@ -5,8 +5,11 @@
- - qr code + +
+ +
+
@@ -155,6 +158,7 @@ import AppInputSwitch from "../Admin/AppInputSwitch" import AppInputText from "../Admin/AppInputText" import {required} from 'vee-validate/dist/rules' + import Spinner from "../FilesView/Spinner" import {events} from '/resources/js/bus' import {mapGetters} from 'vuex' import axios from 'axios' @@ -179,6 +183,7 @@ SwitchInput, ButtonBase, required, + Spinner, }, computed: { ...mapGetters([ @@ -215,6 +220,7 @@ shareOptions: undefined, pickedItem: undefined, emails: undefined, + qrCode: undefined, isConfirmedDestroy: false, canChangePassword: false, isMoreOptions: false, @@ -223,6 +229,13 @@ } }, methods: { + getQrCode() { + axios.get(`/api/share/${this.shareOptions.token}/qr`) + .then(response => { + this.qrCode = response.data + }) + .catch(() => this.$isSomethingWrong()) + }, showSection(section = undefined) { this.activeSection = section }, @@ -321,6 +334,9 @@ if (args.section) this.activeSection = args.section + if (args.section === 'qr-code') + this.getQrCode() + this.canChangePassword = args.item.data.relationships.shared.data.attributes.protected }) diff --git a/routes/api.php b/routes/api.php index cf50eb50..ed452c87 100644 --- a/routes/api.php +++ b/routes/api.php @@ -24,6 +24,7 @@ use Domain\Browsing\Controllers\BrowseLatestFilesController; use Domain\Browsing\Controllers\BrowseSharedItemsController; use Domain\Browsing\Controllers\BrowseTrashContentController; use Domain\Homepage\Controllers\SendContactMessageController; +use Domain\Sharing\Controllers\GetShareLinkViaQrCodeController; use App\Users\Controllers\Authentication\RegisterUserController; // Pages @@ -67,6 +68,7 @@ Route::group(['middleware' => ['auth:sanctum']], function () { }); // Share + Route::get('/share/{token}/qr', GetShareLinkViaQrCodeController::class); Route::post('/share/{token}/email', ShareViaEmailController::class); Route::apiResource('/share', ShareController::class); diff --git a/src/Domain/Invoices/Controllers/GetInvoiceController.php b/src/Domain/Invoices/Controllers/GetInvoiceController.php index c9c96424..ad017a2a 100644 --- a/src/Domain/Invoices/Controllers/GetInvoiceController.php +++ b/src/Domain/Invoices/Controllers/GetInvoiceController.php @@ -1,20 +1,20 @@ with('settings', $settings) ->with('invoice', $invoice); } -} \ No newline at end of file +} diff --git a/src/Domain/Sharing/Controllers/GetShareLinkViaQrCodeController.php b/src/Domain/Sharing/Controllers/GetShareLinkViaQrCodeController.php new file mode 100644 index 00000000..7232b8af --- /dev/null +++ b/src/Domain/Sharing/Controllers/GetShareLinkViaQrCodeController.php @@ -0,0 +1,33 @@ + $token]); + + // Generate qr code + $svg = (new Writer( + new ImageRenderer( + new RendererStyle(192, 2, null, null, Fill::uniformColor(new Rgb(255, 255, 255), new Rgb(0, 0, 0))), + new SvgImageBackEnd + ) + ))->writeString($url); + + $qrCode = trim(substr($svg, strpos($svg, "\n") + 1)); + + // Return qr code + return response($qrCode, 201); + } +} diff --git a/tests/App/Users/UserAccountTest.php b/tests/App/Users/UserAccountTest.php index 3ab63903..6b839ae6 100644 --- a/tests/App/Users/UserAccountTest.php +++ b/tests/App/Users/UserAccountTest.php @@ -1,4 +1,5 @@ each( - fn ($size) => Storage::disk('local') + fn($size) => Storage::disk('local') ->assertExists("avatars/{$size['name']}-{$user->settings->getRawOriginal('avatar')}") ); } @@ -141,7 +142,7 @@ class UserAccountTest extends TestCase ->assertStatus(200) ->assertExactJson([ 'data' => [ - 'id' => (string) $user->id, + 'id' => (string)$user->id, 'type' => 'user', 'attributes' => [ 'avatar' => [ @@ -163,7 +164,7 @@ class UserAccountTest extends TestCase 'created_at' => format_date($user->created_at, '%d. %b. %Y'), 'updated_at' => format_date($user->updated_at, '%d. %B. %Y'), ], - 'meta' => [ + 'meta' => [ 'restrictions' => [ 'canCreateFolder' => true, 'canCreateTeamFolder' => true, @@ -178,7 +179,7 @@ class UserAccountTest extends TestCase ], 'settings' => [ 'data' => [ - 'id' => (string) $user->id, + 'id' => (string)$user->id, 'type' => 'settings', 'attributes' => [ 'avatar' => $user->settings->avatar, @@ -188,6 +189,8 @@ class UserAccountTest extends TestCase 'city' => $user->settings->city, 'postal_code' => $user->settings->postal_code, 'country' => $user->settings->country, + 'first_name' => $user->settings->first_name, + 'last_name' => $user->settings->last_name, 'phone_number' => $user->settings->phone_number, 'timezone' => $user->settings->timezone, ], diff --git a/tests/Domain/Sharing/UserShareTest.php b/tests/Domain/Sharing/UserShareTest.php index bd331f9a..fbf9c0e3 100644 --- a/tests/Domain/Sharing/UserShareTest.php +++ b/tests/Domain/Sharing/UserShareTest.php @@ -11,6 +11,21 @@ use Domain\Sharing\Notifications\SharedSendViaEmail; class UserShareTest extends TestCase { + /** + * @test + */ + public function it_generate_qr_code() + { + $user = User::factory() + ->hasSettings() + ->create(); + + $this + ->actingAs($user) + ->get('/api/share/123456789/qr') + ->assertCreated(); + } + /** * @test */