Compare commits

..

181 Commits

Author SHA1 Message Date
MakingCG
571fec7949 Fix backend code styling 2021-07-09 10:27:48 +00:00
Peter Papp
f9b5595ab6 versioning 2021-07-09 12:27:19 +02:00
Peter Papp
b358a614e2 Merge remote-tracking branch 'origin/oasis' into oasis 2021-07-09 12:23:43 +02:00
Peter Papp
7d9d2a9da9 production build 2021-07-09 12:23:35 +02:00
MakingCG
c132601f06 Fix backend code styling 2021-07-09 10:19:13 +00:00
Peter Papp
0e4595c30f Merge remote-tracking branch 'origin/oasis' into oasis
# Conflicts:
#	app/Http/helpers.php
2021-07-09 12:18:17 +02:00
Peter Papp
c323304f2e ability to delete ic dpb 2021-07-09 12:17:34 +02:00
Peter Papp
d9ee68db7c Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	app/Http/helpers.php
2021-07-09 12:06:58 +02:00
MakingCG
756e0c4ca3 Fix backend code styling 2021-06-29 16:40:19 +00:00
Peter Papp
c52c576f7c Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	.php-cs-fixer.cache
#	app/Http/helpers.php
#	app/Services/FileManagerService.php
#	composer.lock
#	public/chunks/environment-setup.js
#	public/chunks/files~chunks/shared/file-browser.js
#	public/js/main.js
#	public/mix-manifest.json
2021-06-29 18:38:53 +02:00
MakingCG
1a63f3aa07 Application Build 2021-05-27 10:37:31 +00:00
Peter Papp
f29a93f77b Merge remote-tracking branch 'origin/oasis' into oasis
# Conflicts:
#	public/mix-manifest.json
2021-05-27 12:34:24 +02:00
Peter Papp
f294c8f4a1 separated advance invoice number 2021-05-27 12:34:12 +02:00
MakingCG
959beae9e9 Application Build 2021-05-24 14:53:16 +00:00
Peter Papp
524b5a94df Merge remote-tracking branch 'origin/oasis' into oasis 2021-05-24 16:51:14 +02:00
Peter Papp
05dc227650 composer vuefilemanager-invoicing 2021-05-24 16:51:07 +02:00
MakingCG
350f130d98 Fix backend code styling 2021-05-24 14:48:13 +00:00
Peter Papp
99b4b030d2 Merge remote-tracking branch 'origin/oasis' into oasis
# Conflicts:
#	public/mix-manifest.json
2021-05-24 16:47:34 +02:00
Peter Papp
8a2af11f6a - invoice fixes
- optimization for new invoicing module
2021-05-24 16:47:21 +02:00
Peter Papp
26636dffab php cs fixer fix 2021-05-24 09:58:03 +02:00
Peter Papp
3dae2a72c9 configured private repository 2021-05-21 10:15:00 +02:00
MakingCG
38fadeec5e Application Build 2021-05-21 08:07:00 +00:00
Peter Papp
31954767b7 changeable frontend invoicing currency 2021-05-21 10:04:37 +02:00
Peter Papp
c760116cbf Merge remote-tracking branch 'origin/oasis' into oasis 2021-05-20 17:27:35 +02:00
Peter Papp
49131ddf97 - makingcg/vuefilemanager-invoicing to dev-master 2021-05-20 17:27:27 +02:00
MakingCG
fb7338c2bb Application Build 2021-05-20 14:46:50 +00:00
Peter Papp
d2391afb14 - frontpage redirect
- remove default login
2021-05-20 16:44:42 +02:00
Peter Papp
8e66900d8d Merge remote-tracking branch 'origin/oasis' into oasis
# Conflicts:
#	public/mix-manifest.json
2021-05-20 16:25:32 +02:00
Peter Papp
1a77ccdb9d makingcg/vuefilemanager-invoicing v1.0 included 2021-05-20 16:25:19 +02:00
MakingCG
50a96d9051 Application Build 2021-05-20 08:46:02 +00:00
Peter Papp
7baf8f0ec9 Merge remote-tracking branch 'origin/oasis' into oasis
# Conflicts:
#	public/mix-manifest.json
2021-05-20 10:43:12 +02:00
Peter Papp
8389f7a4d6 fixed invoice discount 2021-05-20 10:42:58 +02:00
MakingCG
b74f93a271 Application Build 2021-05-19 14:25:05 +00:00
Peter Papp
ed9c80eb74 Merge remote-tracking branch 'origin/oasis' into oasis 2021-05-19 16:22:49 +02:00
Peter Papp
147f82e9a8 Total widget in invoice editor 2021-05-19 16:22:41 +02:00
MakingCG
15a6ad6166 Application Build 2021-05-19 13:35:56 +00:00
Peter Papp
3fbf0ca093 Merge remote-tracking branch 'origin/oasis' into oasis 2021-05-19 15:33:54 +02:00
Peter Papp
2586e65cf9 - vuefilemanager-invoicing from git 2021-05-19 15:33:48 +02:00
MakingCG
b8731a108b Fix backend code styling 2021-05-19 13:31:18 +00:00
Peter Papp
2f238c90d9 Merge remote-tracking branch 'origin/oasis' into oasis 2021-05-19 15:30:46 +02:00
Peter Papp
6f9ae7ebfe - added new invoice strings 2021-05-19 15:30:36 +02:00
Peter Papp
983425b89a - decimal price fixes 2021-05-19 13:03:33 +02:00
MakingCG
ca9ed1029e Fix backend code styling 2021-05-19 06:38:55 +00:00
Peter Papp
78aa1a0779 - added unit into invoice 2021-05-19 08:38:21 +02:00
Peter Papp
4ec2d1077f Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	.github/workflows/backend-code-style-fix.yml
#	.github/workflows/unit-testing.yml
#	composer.lock
#	public/chunks/admin-account.js
#	public/chunks/admin.js
#	public/chunks/app-appearance.js
#	public/chunks/app-billings.js
#	public/chunks/app-email.js
#	public/chunks/app-index.js
#	public/chunks/app-language.js
#	public/chunks/app-others.js
#	public/chunks/app-payments.js
#	public/chunks/app-settings.js
#	public/chunks/app-setup.js
#	public/chunks/billings-detail.js
#	public/chunks/contact-us.js
#	public/chunks/create-new-password.js
#	public/chunks/dashboard.js
#	public/chunks/database.js
#	public/chunks/dynamic-page.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared/file-browser.js
#	public/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js
#	public/chunks/forgotten-password.js
#	public/chunks/homepage.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/page-edit.js
#	public/chunks/pages.js
#	public/chunks/plan-create.js
#	public/chunks/plan-delete.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plan.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/profile.js
#	public/chunks/purchase-code.js
#	public/chunks/settings-create-payment-methods.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-password.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings-storage.js
#	public/chunks/settings-subscription.js
#	public/chunks/settings.js
#	public/chunks/shared.js
#	public/chunks/shared/authenticate.js
#	public/chunks/shared/file-browser.js
#	public/chunks/shared/single-file.js
#	public/chunks/sign-in.js
#	public/chunks/sign-up.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.js
#	public/chunks/subscription-service.js
#	public/chunks/upgrade-billing.js
#	public/chunks/upgrade-plan.js
#	public/chunks/user-create.js
#	public/chunks/user-delete.js
#	public/chunks/user-detail.js
#	public/chunks/user-invoices.js
#	public/chunks/user-password.js
#	public/chunks/user-storage.js
#	public/chunks/user-subscription.js
#	public/chunks/user.js
#	public/chunks/users.js
#	public/css/app.css
#	public/js/main.js
#	public/mix-manifest.json
2021-05-19 06:53:33 +02:00
Peter Papp
e371b37016 Merge remote-tracking branch 'origin/oasis' into oasis 2021-05-17 10:08:51 +02:00
Peter Papp
05583f74af added Code Style Fix workflow 2021-05-17 10:04:22 +02:00
MakingCG
6cbffd08b2 Application Build 2021-05-17 08:03:54 +00:00
Peter Papp
66fe92653c added frontend build workflow 2021-05-17 10:01:42 +02:00
Peter Papp
b16b8b87cc - dark mode
- fixes
2021-05-17 10:00:01 +02:00
Peter Papp
04a1f88abb Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	composer.lock
#	public/chunks/admin-account.js
#	public/chunks/admin.js
#	public/chunks/app-appearance.js
#	public/chunks/app-billings.js
#	public/chunks/app-email.js
#	public/chunks/app-index.js
#	public/chunks/app-language.js
#	public/chunks/app-others.js
#	public/chunks/app-payments.js
#	public/chunks/app-settings.js
#	public/chunks/app-setup.js
#	public/chunks/billings-detail.js
#	public/chunks/dashboard.js
#	public/chunks/database.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared/file-browser.js
#	public/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js
#	public/chunks/homepage.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/page-edit.js
#	public/chunks/pages.js
#	public/chunks/plan-create.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plan.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/profile.js
#	public/chunks/profile~chunks/settings-password.js
#	public/chunks/purchase-code.js
#	public/chunks/settings-create-payment-methods.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings-storage.js
#	public/chunks/settings-subscription.js
#	public/chunks/settings.js
#	public/chunks/shared.js
#	public/chunks/shared/file-browser.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.js
#	public/chunks/subscription-service.js
#	public/chunks/upgrade-billing.js
#	public/chunks/upgrade-plan.js
#	public/chunks/user-create.js
#	public/chunks/user-detail.js
#	public/chunks/user-invoices.js
#	public/chunks/user-storage.js
#	public/chunks/user-subscription.js
#	public/chunks/user.js
#	public/chunks/users.js
#	public/js/main.js
#	public/mix-manifest.json
2021-05-15 07:27:01 +02:00
Peter Papp
0eee956011 setup billing profile redirect 2021-05-14 10:42:59 +02:00
Peter Papp
722eceb0c1 bug fixes 2021-05-14 10:29:46 +02:00
Peter Papp
b4e6561134 routes refactoring 2021-05-13 17:50:42 +02:00
Peter Papp
3af8bff13b - removed invoicing from oasis 2021-05-13 09:31:16 +02:00
Peter Papp
f5958dda57 - fixes 2021-05-11 18:24:22 +02:00
Peter Papp
e8ca132a8b - Invoice sorting refactored
- Frontend build
2021-05-11 10:57:30 +02:00
Peter Papp
a7a6ef9f0a Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	public/mix-manifest.json
#	resources/js/components/FilesView/Option.vue
#	resources/js/components/Others/MobileNavigation.vue
2021-05-11 10:37:31 +02:00
Peter Papp
a6db642db7 Invoice & Clients sorting 2021-05-11 10:09:50 +02:00
Peter Papp
1ea8f2ce60 share invoice on email frontend 2021-05-11 08:51:41 +02:00
Peter Papp
5ea898d716 share invoice on email backend 2021-05-11 07:45:38 +02:00
Peter Papp
9857a30d2c Helper methods refactoring 2021-05-11 07:27:26 +02:00
Peter Papp
ca255a7416 Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	public/chunks/admin-account.js
#	public/chunks/admin.js
#	public/chunks/app-appearance.js
#	public/chunks/app-billings.js
#	public/chunks/app-email.js
#	public/chunks/app-index.js
#	public/chunks/app-language.js
#	public/chunks/app-others.js
#	public/chunks/app-payments.js
#	public/chunks/app-setup.js
#	public/chunks/billings-detail.js
#	public/chunks/contact-us.js
#	public/chunks/dashboard.js
#	public/chunks/database.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/page-edit.js
#	public/chunks/pages.js
#	public/chunks/plan-create.js
#	public/chunks/plan-delete.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/profile.js
#	public/chunks/settings-create-payment-methods.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-password.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings.js
#	public/chunks/shared.js
#	public/chunks/shared/authenticate.js
#	public/chunks/shared/file-browser.js
#	public/chunks/shared/single-file.js
#	public/chunks/sign-in.js
#	public/chunks/sign-up.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.js
#	public/chunks/subscription-service.js
#	public/chunks/upgrade-billing.js
#	public/chunks/upgrade-plan.js
#	public/chunks/user-create.js
#	public/chunks/user-delete.js
#	public/chunks/user-detail.js
#	public/chunks/user-invoices.js
#	public/chunks/user-password.js
#	public/chunks/user-storage.js
#	public/chunks/user-subscription.js
#	public/chunks/user.js
#	public/chunks/users.js
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/helpers.js
2021-05-10 17:15:37 +02:00
Peter Papp
73672bc023 i18n implementation into invoice module 2021-05-07 11:32:48 +02:00
Peter Papp
070f8b4d40 frontend fixes 2021-05-07 07:35:03 +02:00
Peter Papp
f5f0663d07 Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	.php_cs.cache
#	public/mix-manifest.json
#	resources/js/components/FilesView/FilePreviewMedia.vue
#	resources/js/components/Sidebar/SidebarNavigation.vue
#	resources/js/helpers.js
2021-05-06 16:06:17 +02:00
Peter Papp
69deafeda0 Set up billing profile 2021-05-06 09:15:37 +02:00
Peter Papp
070a3aaba4 Invoice empty page 2021-05-05 17:51:59 +02:00
Peter Papp
599b238ab4 Edit invoice 2021-05-05 17:07:36 +02:00
Peter Papp
bdfd92872e added backend translations 2021-05-05 09:41:13 +02:00
Peter Papp
62820c8ddb invoice frontend improvements 2021-05-04 17:43:42 +02:00
Peter Papp
c65414f0c4 Merge remote-tracking branch 'origin/oasis' into oasis
# Conflicts:
#	.php_cs.cache
2021-05-04 16:40:27 +02:00
Peter Papp
7cc27938bf Mobile optimization 2021-05-04 16:39:59 +02:00
Peter Papp
0332f8b1fb invoice backend VAT & discount calculations 2021-05-04 09:44:55 +02:00
Peter Papp
fbde515a40 Create invoice frontend enhancements 2021-05-04 07:42:40 +02:00
MakingCG
cc4f9c0b89 Fix backend code styling 2021-05-03 14:53:43 +00:00
Peter Papp
8a784f4520 Merge remote-tracking branch 'origin/oasis' into oasis 2021-05-03 16:53:13 +02:00
Peter Papp
9793a55efd Discount calculations frontend 2021-05-03 16:52:32 +02:00
Peter Papp
eb2a7323e9 Vat calculations frontend 2021-05-03 15:26:56 +02:00
Peter Papp
d162018fcf highlight invoice icon in menubar 2021-05-03 09:12:41 +02:00
Peter Papp
23611defc1 mobile optimization 2021-05-03 09:07:35 +02:00
Peter Papp
434c45299c oasis setup script 2021-05-03 08:12:37 +02:00
MakingCG
878bdb3ce7 Fix backend code styling 2021-05-03 05:29:49 +00:00
Peter Papp
fe0ed38157 Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	composer.lock
2021-05-03 07:29:06 +02:00
Peter Papp
8f9bdc5918 Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	composer.json
#	composer.lock
2021-05-03 07:12:21 +02:00
MakingCG
ed6c968dae Fix backend code styling 2021-04-30 15:56:04 +00:00
Peter Papp
c923a40363 Merge remote-tracking branch 'origin/oasis' into oasis
# Conflicts:
#	.php_cs.cache
#	app/Http/Controllers/Oasis/ClientController.php
#	app/Http/Controllers/Oasis/InvoiceController.php
#	app/Http/Requests/Oasis/StoreInvoiceRequest.php
#	app/Http/Resources/Oasis/OasisInvoiceResource.php
2021-04-30 17:54:21 +02:00
Peter Papp
3c3e82758d Create invoice form part 1. 2021-04-30 17:53:19 +02:00
Peter Papp
5167ae520e navigation fix 2021-04-30 08:16:44 +02:00
Peter Papp
aea4213ec2 Client cards 2021-04-29 15:01:50 +02:00
Peter Papp
31dd782bae Resource refactoring 2021-04-29 12:53:17 +02:00
MakingCG
120973ae00 Fix backend code styling 2021-04-29 09:07:05 +00:00
Peter Papp
1486ce63fa Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	app/Console/Commands/SetupDevEnvironment.php
#	app/Console/Kernel.php
#	app/Http/Resources/InvoiceResource.php
#	app/Http/Resources/UserResource.php
#	app/Models/User.php
#	composer.lock
#	config/app.php
#	config/custom-language-translations.php
#	config/language-translations.php
#	public/chunks/admin.js
#	public/chunks/app-language.js
#	public/chunks/dashboard.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js
#	public/chunks/invoices.js
#	public/chunks/pages.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings-subscription.js
#	public/chunks/shared-files.js
#	public/chunks/shared.js
#	public/chunks/shared/file-browser.js
#	public/chunks/user-invoices.js
#	public/chunks/user-subscription.js
#	public/chunks/users.js
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/components/FilesView/FileItemGrid.vue
#	resources/js/components/FilesView/FileItemList.vue
2021-04-29 11:06:14 +02:00
Peter Papp
834b0ba5e0 Edit client detail 2021-04-29 10:54:10 +02:00
Peter Papp
19bce195b4 Create client frontend 2021-04-29 08:57:53 +02:00
Peter Papp
13ec1257e1 Delete invoice 2021-04-28 18:44:42 +02:00
Peter Papp
248825f2d1 Delete client 2021-04-28 18:15:33 +02:00
Peter Papp
b37edd298a Billing profile implementation 2021-04-28 15:55:01 +02:00
Peter Papp
1e4bbd10f3 update invoice profile 2021-04-28 08:34:37 +02:00
Peter Papp
bcf14595bf store invoice profile 2021-04-28 07:32:40 +02:00
Peter Papp
e7c4048258 added invoice profile 2021-04-27 10:16:31 +02:00
Peter Papp
f7135c9b27 get invoice from url 2021-04-27 08:57:00 +02:00
Peter Papp
5be490c8d5 invoice to mail 2021-04-27 07:31:16 +02:00
Peter Papp
7cf193abb7 pdf invoice generation scaffolding 2021-04-26 17:03:17 +02:00
Peter Papp
644fbaede4 pdf installation 2021-04-26 08:15:11 +02:00
Peter Papp
e65e3e88d7 PDF Invoice 2021-04-24 07:40:20 +02:00
Peter Papp
9a5f9fe49d Create client 2021-04-23 08:37:54 +02:00
Peter Papp
16c47465e6 backend refactored 2021-04-23 08:21:26 +02:00
Peter Papp
da55b3dd78 backend refactored 2021-04-23 08:15:38 +02:00
Peter Papp
894cef5d66 Searching mobile frontend 2021-04-22 16:40:45 +02:00
Peter Papp
90f91c47ce Searching mobile frontend 2021-04-22 10:10:26 +02:00
Peter Papp
3774a05edd Searching frontend 2021-04-22 10:06:31 +02:00
Peter Papp
73861f814c Searching backend 2021-04-22 09:33:52 +02:00
Peter Papp
5b70066900 Invoice wrapper 2021-04-22 08:29:00 +02:00
Peter Papp
4b0e4da013 - Client list
- Context menu
2021-04-22 07:36:52 +02:00
Peter Papp
eae212ac5d - Invoice listing in frontend 2021-04-21 16:53:39 +02:00
Peter Papp
5a9583be5b - client and invoice scaffolding 2021-04-21 15:22:54 +02:00
Peter Papp
aa585b60d5 - desktop toolbar 2021-04-21 08:03:49 +02:00
Peter Papp
8707a61144 - desktop navigation
- invoice vuex module
2021-04-21 07:56:15 +02:00
Peter Papp
597a600109 Invoice sorting menu 2021-04-20 16:06:12 +02:00
Peter Papp
4dfc5bcc35 Invoice create menu 2021-04-20 15:51:01 +02:00
Peter Papp
33d45408d2 Mobile main navigation 2021-04-20 15:24:44 +02:00
Peter Papp
90051cec91 - Invoice sidebar
- mobile invoice menu
2021-04-20 15:11:55 +02:00
Peter Papp
dd0d10afda Popover for create button 2021-04-20 09:24:13 +02:00
Peter Papp
af571317ff Invoice Desktop Toolbar 2021-04-20 09:09:52 +02:00
Peter Papp
80019b822d Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	public/chunks/admin-account.js
#	public/chunks/admin.js
#	public/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js
#	public/chunks/app-language.js
#	public/chunks/app-settings.js
#	public/chunks/app-setup.js
#	public/chunks/billings-detail.js
#	public/chunks/dashboard.js
#	public/chunks/database.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js
#	public/chunks/homepage.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/page-edit.js
#	public/chunks/pages.js
#	public/chunks/plan-create.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plan.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/profile.js
#	public/chunks/profile~chunks/settings-password.js
#	public/chunks/purchase-code.js
#	public/chunks/settings-create-payment-methods.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings-storage.js
#	public/chunks/settings-subscription.js
#	public/chunks/settings.js
#	public/chunks/shared-files.js
#	public/chunks/shared.js
#	public/chunks/shared/file-browser.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.js
#	public/chunks/subscription-service.js
#	public/chunks/upgrade-billing.js
#	public/chunks/upgrade-plan.js
#	public/chunks/user-create.js
#	public/chunks/user-delete.js
#	public/chunks/user-detail.js
#	public/chunks/user-invoices.js
#	public/chunks/user-storage.js
#	public/chunks/user-subscription.js
#	public/chunks/user.js
#	public/chunks/users.js
#	public/js/main.js
#	public/mix-manifest.json
#	public/vendors~chunks/platform~chunks/shared.js
2021-04-20 08:15:34 +02:00
Peter Papp
edafa1791b erase description from plan 2021-04-16 10:48:51 +02:00
Peter Papp
498f81b846 Changed contact informations on homepage 2021-04-16 10:34:06 +02:00
Peter Papp
56bbdc846c - Dashboard logo fix 2021-04-13 08:36:19 +02:00
Peter Papp
a2c606e1c7 - Dashboard logo
- Checkout mobile fix
- Frontend build
2021-04-13 08:32:48 +02:00
Peter Papp
3e61482a2c Merge remote-tracking branch 'origin/master' into oasis 2021-04-13 08:18:23 +02:00
Peter Papp
bec2dd0e03 frontend build 2021-04-12 06:59:15 +02:00
Peter Papp
0bf81164e7 Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	app/Console/Kernel.php
#	composer.json
#	composer.lock
#	public/chunks/admin-account.js
#	public/chunks/admin.js
#	public/chunks/app-appearance.js
#	public/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js
#	public/chunks/app-billings.js
#	public/chunks/app-email.js
#	public/chunks/app-index.js
#	public/chunks/app-language.js
#	public/chunks/app-others.js
#	public/chunks/app-payments.js
#	public/chunks/app-settings.js
#	public/chunks/app-setup.js
#	public/chunks/billings-detail.js
#	public/chunks/contact-us.js
#	public/chunks/create-new-password.js
#	public/chunks/dashboard.js
#	public/chunks/database.js
#	public/chunks/dynamic-page.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js
#	public/chunks/forgotten-password.js
#	public/chunks/homepage.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/page-edit.js
#	public/chunks/pages.js
#	public/chunks/plan-create.js
#	public/chunks/plan-delete.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plan.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/platform~chunks/shared.js
#	public/chunks/profile.js
#	public/chunks/profile~chunks/settings-password.js
#	public/chunks/purchase-code.js
#	public/chunks/settings-create-payment-methods.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-password.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings-storage.js
#	public/chunks/settings-subscription.js
#	public/chunks/settings.js
#	public/chunks/setup-wizard.js
#	public/chunks/shared-files.js
#	public/chunks/shared.js
#	public/chunks/shared/authenticate.js
#	public/chunks/shared/file-browser.js
#	public/chunks/shared/single-file.js
#	public/chunks/sign-in.js
#	public/chunks/sign-up.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.js
#	public/chunks/subscription-service.js
#	public/chunks/upgrade-billing.js
#	public/chunks/upgrade-plan.js
#	public/chunks/user-create.js
#	public/chunks/user-delete.js
#	public/chunks/user-detail.js
#	public/chunks/user-invoices.js
#	public/chunks/user-password.js
#	public/chunks/user-storage.js
#	public/chunks/user-subscription.js
#	public/chunks/user.js
#	public/chunks/users.js
#	public/js/main.js
#	public/mix-manifest.json
2021-04-12 06:57:47 +02:00
Peter Papp
e78f1ce731 - removed sign in credentials 2021-04-07 13:21:02 +02:00
Peter Papp
b00c8cdbed - updated composer 2021-04-07 08:16:29 +02:00
Peter Papp
44a656e5d5 - updated composer 2021-04-07 08:12:02 +02:00
Peter Papp
11c6690e50 - frontend build 2021-04-07 07:53:11 +02:00
Peter Papp
fac75c7e71 Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	composer.json
#	public/chunks/admin-account.js
#	public/chunks/admin.js
#	public/chunks/app-appearance.js
#	public/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js
#	public/chunks/app-billings.js
#	public/chunks/app-email.js
#	public/chunks/app-index.js
#	public/chunks/app-language.js
#	public/chunks/app-others.js
#	public/chunks/app-payments.js
#	public/chunks/app-settings.js
#	public/chunks/app-setup.js
#	public/chunks/billings-detail.js
#	public/chunks/contact-us.js
#	public/chunks/create-new-password.js
#	public/chunks/dashboard.js
#	public/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plans~chunks/user-invoices.js
#	public/chunks/database.js
#	public/chunks/dynamic-page.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser.js
#	public/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js
#	public/chunks/forgotten-password.js
#	public/chunks/homepage.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/page-edit.js
#	public/chunks/pages.js
#	public/chunks/plan-create.js
#	public/chunks/plan-delete.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.js
#	public/chunks/plan.js
#	public/chunks/plans.js
#	public/chunks/platform.js
#	public/chunks/platform~chunks/shared.js
#	public/chunks/profile.js
#	public/chunks/profile~chunks/settings-password.js
#	public/chunks/purchase-code.js
#	public/chunks/settings-create-payment-methods.js
#	public/chunks/settings-invoices.js
#	public/chunks/settings-password.js
#	public/chunks/settings-payment-methods.js
#	public/chunks/settings-storage.js
#	public/chunks/settings-subscription.js
#	public/chunks/settings.js
#	public/chunks/setup-wizard.js
#	public/chunks/shared-files.js
#	public/chunks/shared.js
#	public/chunks/shared/authenticate.js
#	public/chunks/shared/file-browser.js
#	public/chunks/shared/single-file.js
#	public/chunks/sign-in.js
#	public/chunks/sign-up.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.js
#	public/chunks/subscription-service.js
#	public/chunks/upgrade-billing.js
#	public/chunks/upgrade-plan.js
#	public/chunks/user-create.js
#	public/chunks/user-delete.js
#	public/chunks/user-detail.js
#	public/chunks/user-invoices.js
#	public/chunks/user-password.js
#	public/chunks/user-storage.js
#	public/chunks/user-subscription.js
#	public/chunks/user.js
#	public/chunks/users.js
#	public/css/app.css
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/router.js
#	resources/js/store/modules/userAuth.js
2021-04-07 07:52:07 +02:00
Peter Papp
57bab1a225 - frontend build
- fixes
2021-04-06 10:46:32 +02:00
Peter Papp
17ccf7b354 Merge remote-tracking branch 'origin/master' into oasis 2021-04-06 10:41:38 +02:00
Peter Papp
71147adb01 - flush cache after language upgrade
- Gateway fix
- extended language editor with textarea
2021-04-06 10:27:02 +02:00
Peter Papp
7cefcf8dab - fixed setup wizard
- fixed oasis UserAccountTest.php
2021-04-06 10:10:38 +02:00
Peter Papp
737adfa91a Merge remote-tracking branch 'origin/master' into oasis
# Conflicts:
#	public/js/main.js
#	public/mix-manifest.json
2021-04-06 10:02:20 +02:00
Peter Papp
20f8fe4b51 - i18n implementation into homepage 2021-04-06 08:26:35 +02:00
Peter Papp
e0daa46b50 - dark mode 2021-04-06 07:23:43 +02:00
Peter Papp
2ca4d4a02d - homepage mobile 2021-04-05 18:00:54 +02:00
Peter Papp
399748b01a - homepage desktop, ipad landscape 2021-04-05 16:43:12 +02:00
Peter Papp
2f4df83b31 - homepage illustrations part 2 2021-04-05 10:15:33 +02:00
Peter Papp
9ea78d103e - homepage illustrations part 1 2021-04-05 08:47:49 +02:00
Peter Papp
790da00420 - added OasisContact.vue
- Mobile responsivenes
2021-04-05 07:07:28 +02:00
Peter Papp
760d7a4687 Added OasisFooter.vue 2021-04-04 07:59:58 +02:00
Peter Papp
37ab6408ba Added OasisAboutUs.vue 2021-04-04 07:32:56 +02:00
Peter Papp
b3737c11ba Added OasisNavigation.vue and OasisPricing.vue 2021-04-03 11:28:05 +02:00
Peter Papp
4f667f7a94 Added OasisFeatures.vue and OasisHeader.vue 2021-04-03 10:44:32 +02:00
Peter Papp
377c471a6c Oasis landingpage scaffolding 2021-04-03 07:50:57 +02:00
Peter Papp
7cf09494e5 - Language implementation for oasis
- frontend build
2021-04-01 11:48:38 +02:00
Peter Papp
5d0348e2d0 Merge remote-tracking branch 'origin/v2' into oasis
# Conflicts:
#	app/Http/Controllers/User/AccountController.php
#	app/Http/helpers.php
#	public/mix-manifest.json
#	resources/js/components/FilesView/Icons/AlphabetIcon.vue
#	resources/js/components/FilesView/MobileActionButton.vue
#	resources/js/views/Admin/AppSettings/AppSettingsTabs/Appearance.vue
#	resources/js/views/Admin/Users/UserTabs/UserDetail.vue
#	resources/js/views/Upgrade/UpgradeBilling.vue
#	resources/views/index.blade.php
#	resources/views/vuefilemanager/invoice.blade.php
#	resources/views/vuefilemanager/others/color-template.blade.php
2021-04-01 10:45:10 +02:00
Peter Papp
6d5a43da72 frontend build 2021-03-26 16:59:08 +01:00
Peter Papp
d2a82aaa80 frontend build 2021-03-26 16:42:58 +01:00
Peter Papp
a3d4dfec3b - favicon fix
- checkout fix
- stripe prefered locales
- color theme
- stripe card info box in dev version
2021-03-26 16:02:02 +01:00
Peter Papp
ee1a8a6719 - cancel/resume subscription fix
- upload into root folder fix
- custom color theme part 3
2021-03-25 15:46:34 +01:00
Peter Papp
44fe96497c - cancel/resume subscription fix
- upload into root folder fix
- custom color theme part 3
2021-03-25 10:51:00 +01:00
Peter Papp
88c134918e - user not found fix in SignIn.vue page 2021-03-24 11:53:42 +01:00
Peter Papp
af79a28361 - redirect after sign in/up to payment page
- extended /api/oasis/subscribe function
- setup:dev extended data
2021-03-24 11:38:15 +01:00
Peter Papp
1bb3ca4fb5 - register route fix 2021-03-24 08:49:11 +01:00
Peter Papp
1ffa569ea3 - Zero capacity storage
- Set 0 storage capacity after creating order
2021-03-24 08:35:43 +01:00
Peter Papp
480f518ebc - Fixed UpgradeBilling.vue
- Fixed CreatePaymentMethod.vue
2021-03-24 08:19:52 +01:00
Peter Papp
888d76fea0 - scheduler command updates
- Order reminder notification
2021-03-24 07:32:08 +01:00
Peter Papp
47ce8c3eef - edit PaymentRequiredNotification.php 2021-03-24 06:55:48 +01:00
Peter Papp
75042e0c42 - set password backend 2021-03-23 15:32:28 +01:00
Peter Papp
9566a4a830 - set password and login frontend 2021-03-23 12:03:23 +01:00
Peter Papp
7521c588fc - payment for subscription frontend 2021-03-23 11:12:41 +01:00
Peter Papp
97f13c0b62 - added payment page 2021-03-23 09:07:31 +01:00
Peter Papp
4b97c674ba - creating user frontend 2021-03-23 08:20:54 +01:00
Peter Papp
0d4b8403ba - email template 2021-03-23 06:47:28 +01:00
Peter Papp
021e78e0c5 - Store creator into SubscriptionRequest 2021-03-22 15:48:46 +01:00
Peter Papp
778a94e5ba - Pay and subscribe from generated Subscription Request 2021-03-22 15:41:47 +01:00
Peter Papp
0db55b51d2 - get subscription request api 2021-03-22 12:05:45 +01:00
Peter Papp
45de6b557a - added subscriptionrequest
- Oasis model trait
2021-03-22 11:15:47 +01:00
Peter Papp
3c01ce5ad3 - admin client order 2021-03-22 10:43:37 +01:00
Peter Papp
80b24cd753 - added CzechRegisterSearchService
- oasis RouteServiceProvider.php
- oasis admincontroller
2021-03-22 08:19:50 +01:00
1439 changed files with 69170 additions and 73122 deletions

View File

@@ -1,6 +1,6 @@
APP_NAME=VueFileManager
APP_ENV=local
APP_KEY=base64:sC1YuKsbWv7MdWugb9ZsYBqv2QZJ+QOuHZHEddOsAao=
APP_ENV=production
APP_KEY=base64:sB1YuKsbWv7MdWugb9ZsYBqv2QZJ+QOuHZHEddOsUuo=
APP_DEBUG=true
APP_URL=http://localhost
APP_DEMO=false
@@ -10,7 +10,7 @@ LOG_CHANNEL=daily
SCOUT_DRIVER=tntsearch
SCOUT_QUEUE=true
FILESYSTEM_DISK=local
FILESYSTEM_DRIVER=
CHUNK_SIZE=128
DB_CONNECTION=mysql
@@ -22,7 +22,7 @@ DB_PASSWORD=
DB_MYSQLDUMP_PATH=
BROADCAST_DRIVER=null
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=database
SESSION_DRIVER=file
@@ -41,56 +41,43 @@ MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS="${MAIL_USERNAME}"
MAIL_FROM_NAME="${MAIL_USERNAME}"
POSTMARK_TOKEN=
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MAILGUN_ENDPOINT=
OSS_ACCESS_KEY_ID=
OSS_SECRET_ACCESS_KEY=
OSS_REGION=
OSS_BUCKET=
OSS_ENDPOINT=
OSS_URL=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_SESSION_TOKEN=
AWS_BUCKET=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_DEFAULT_REGION=
S3_BUCKET=
S3_URL=
DO_SPACES_KEY=
DO_SPACES_SECRET=
DO_SPACES_ENDPOINT=
DO_SPACES_REGION=
DO_SPACES_BUCKET=
STRIPE_SECRET_KEY=
STRIPE_PUBLIC_KEY=
WASABI_KEY=
WASABI_SECRET=
WASABI_ENDPOINT=
WASABI_REGION=
WASABI_BUCKET=
BACKBLAZE_KEY=
BACKBLAZE_SECRET=
BACKBLAZE_ENDPOINT=
BACKBLAZE_REGION=
BACKBLAZE_BUCKET=
APP_DEPLOY_SECRET=
CASHIER_LOGGER=stack
CASHIER_CURRENCY=
STRIPE_KEY=
STRIPE_SECRET=
STRIPE_WEBHOOK_SECRET=
CASHIER_PAYMENT_NOTIFICATION=App\Notifications\ConfirmPayment
PAYSTACK_SECRET=
PAYSTACK_PUBLIC_KEY=
PAYPAL_CLIENT_ID=
PAYPAL_CLIENT_SECRET=
PAYPAL_WEBHOOK_ID=
PAYPAL_IS_LIVE=true
FACEBOOK_CLIENT_ID=
FACEBOOK_CLIENT_SECRET=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
RECAPTCHA_CLIENT_ID=
RECAPTCHA_CLIENT_SECRET=
SANCTUM_STATEFUL_DOMAINS=localhost,localhost:8000,127.0.0.1,127.0.0.1:8000,::1
PUSHER_APP_ID=local
PUSHER_APP_KEY=local
PUSHER_APP_SECRET=local
PUSHER_APP_CLUSTER=mt1
PUSHER_APP_HOST=
PUSHER_APP_PORT=
IS_ADMIN_VUEFILEMANAGER_BAR=true
IS_SETUP_WIZARD_DEMO=false
IS_SETUP_WIZARD_DEBUG=false
SANCTUM_STATEFUL_DOMAINS=localhost,localhost:8000,127.0.0.1,127.0.0.1:8000,::1

View File

@@ -1,11 +1,11 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:YE2Zo20UvRL3LkRLr54PjlayHUCoDEGVICIq76iFZlU=
APP_KEY=base64:47yorkyoH3qCrKKO4eG6LpZUogoTC51qey5vYq/O3AM=
APP_DEBUG=true
APP_URL=http://localhost
APP_DEMO=false
LOG_CHANNEL=stack
LOG_CHANNEL=daily
DB_CONNECTION=sqlite
DB_HOST=null
@@ -14,8 +14,8 @@ DB_DATABASE=database/test.sqlite
DB_USERNAME=null
DB_PASSWORD=null
FILESYSTEM_DISK=local
BROADCAST_DRIVER=null
FILESYSTEM_DRIVER=local
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
@@ -34,10 +34,10 @@ MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_DEFAULT_REGION=us-east-1
S3_BUCKET=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID=
PUSHER_APP_KEY=
@@ -45,9 +45,9 @@ PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
CASHIER_LOGGER=stack
CASHIER_CURRENCY=EUR
STRIPE_KEY=pk_test_51GsACaCBETHMUxzVsYkeApHtqb85paMuye7G77PDDQ28kXqDJ5HTmqLi13aM6xee81OQK1fhkTZ7vmDiWLStU9160061Yb2MtL
STRIPE_SECRET=sk_test_51GsACaCBETHMUxzVviYCrv0CeZMyWAOfBPe4uH5rkKJcJxrXhIciWQTr7UB1sgw9geoJMkNDVSWBQW36tuAsVznd00zhNHXhok
CASHIER_CURRENCY=CZK
STRIPE_KEY=pk_test_51HSO06BwlPpoyJNwCscZSl5kYHtck4ChaICquBQodULHWTQlQxpEpQ22rQAPY1B82k78dR2tquugI3qRv2HcFrx300pqiho4Dz
STRIPE_SECRET=sk_test_51HSO06BwlPpoyJNwOCWiJafj5ebRF5dYQ0VpaQnHVWLZYYgj8jl3CX2K51Sf1cjDKxUzzGMVsg6e98i2GgtFSSfu00Q1uo6Knz
STRIPE_WEBHOOK_SECRET=whsec_eKrDhqtpbMUXOKqrUHf78SrZxHHYOdrf
CASHIER_PAYMENT_NOTIFICATION=App\Notifications\ConfirmPayment
CASHIER_MODEL=App\Models\User

View File

@@ -2,11 +2,10 @@ name: Code Style Fix
on:
push:
branches: [ master ]
branches: [ oasis ]
pull_request:
branches: [ master ]
branches: [ oasis ]
workflow_dispatch:
jobs:
php-cs-fixer:

View File

@@ -2,9 +2,9 @@ name: Frontend Build
on:
push:
branches: [ master ]
branches: [ oasis ]
pull_request:
branches: [ master ]
branches: [ oasis ]
workflow_dispatch:
@@ -32,4 +32,4 @@ jobs:
- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Application Build
commit_message: Application Build

View File

@@ -2,9 +2,9 @@ name: Unit Testing
on:
push:
branches: [ master ]
branches: [ oasis ]
pull_request:
branches: [ master ]
branches: [ oasis ]
workflow_dispatch:
@@ -35,6 +35,10 @@ jobs:
run: |
echo "::add-matcher::${{ runner.tool_cache }}/php.json"
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
- uses: actions/labeler@v2
with:
repo-token: ${{ secrets.GTHB_TOKEN }}
- name: Install dependencies
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction

2
.gitignore vendored
View File

@@ -10,7 +10,6 @@
.env
.env.backup
.env.testing
.php-cs-fixer.cache
.phpunit.result.cache
.phpstorm.meta.php
.vscode/
@@ -20,4 +19,3 @@ Homestead.yaml
npm-debug.log
yarn-error.log
prettier.json
/public/temp

1
.php-cs-fixer.cache Normal file

File diff suppressed because one or more lines are too long

View File

@@ -2,10 +2,9 @@
$finder = PhpCsFixer\Finder::create()
->in([
__DIR__ . '/src',
__DIR__ . '/app',
__DIR__ . '/routes',
__DIR__ . '/config',
__DIR__ . '/tests',
])
->name('*.php')
->notName('*.blade.php')
@@ -13,68 +12,62 @@ $finder = PhpCsFixer\Finder::create()
->ignoreVCS(true);
$config = new PhpCsFixer\Config();
return $config->setRules([
'@PSR2' => true,
'nullable_type_declaration_for_default_null_value' => [
'use_nullable_type_declaration' => true
],
'array_syntax' => [
'@PSR2' => true,
'array_syntax' => [
'syntax' => 'short'
],
'ordered_imports' => [
'ordered_imports' => [
'sort_algorithm' => 'length'
],
'blank_line_before_statement' => [
'blank_line_before_statement' => [
'statements' => ['break', 'case', 'continue', 'declare', 'default', 'do', 'exit', 'for', 'foreach', 'goto', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', 'yield_from'],
],
'method_argument_space' => [
'method_argument_space' => [
'on_multiline' => 'ensure_fully_multiline',
'keep_multiple_spaces_after_comma' => true,
],
'no_extra_blank_lines' => [
'no_extra_blank_lines' => [
'tokens' => ['break', 'case', 'continue', 'curly_brace_block', 'default', 'extra', 'parenthesis_brace_block', 'return', 'square_brace_block', 'switch', 'throw', 'use', 'use_trait'],
],
'cast_spaces' => [
'cast_spaces' => [
'space' => 'single'
],
'use_arrow_functions' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_var_without_name' => true,
'single_space_after_construct' => true,
'single_line_after_imports' => true,
'no_unused_imports' => true,
'not_operator_with_successor_space' => true,
'trailing_comma_in_multiline' => ['elements' => ['arrays']],
'phpdoc_scalar' => true,
'unary_operator_spaces' => true,
'binary_operator_spaces' => ['operators' => ['=>' => 'align']],
'single_trait_insert_per_statement' => false,
'method_chaining_indentation' => true,
'array_indentation' => true,
'single_quote' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_empty_statement' => true,
'standardize_increment' => true,
'object_operator_without_whitespace' => true,
'ternary_operator_spaces' => true,
'no_leading_namespace_whitespace' => true,
'no_blank_lines_before_namespace' => true,
'blank_line_after_namespace' => true,
'fully_qualified_strict_types' => true,
'single_line_throw' => true,
'function_typehint_space' => true,
'simplified_if_return' => true,
'no_useless_else' => true,
'no_unneeded_curly_braces' => true,
'no_empty_comment' => true,
'no_blank_lines_after_class_opening' => true,
'whitespace_after_comma_in_array' => true,
'trim_array_spaces' => true,
'no_whitespace_before_comma_in_array' => true,
'constant_case' => true,
'lowercase_keywords' => true,
'lowercase_static_reference' => true,
'lambda_not_used_import' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_var_without_name' => true,
'single_space_after_construct' => true,
'single_line_after_imports' => true,
'no_unused_imports' => true,
'not_operator_with_successor_space' => true,
'trailing_comma_in_multiline' => ['elements' => ['arrays']],
'phpdoc_scalar' => true,
'unary_operator_spaces' => true,
'binary_operator_spaces' => ['operators' => ['=>' => 'align']],
'single_trait_insert_per_statement' => false,
'method_chaining_indentation' => true,
'array_indentation' => true,
'single_quote' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_empty_statement' => true,
'standardize_increment' => true,
'object_operator_without_whitespace' => true,
'ternary_operator_spaces' => true,
'no_leading_namespace_whitespace' => true,
'no_blank_lines_before_namespace' => true,
'blank_line_after_namespace' => true,
'fully_qualified_strict_types' => true,
'single_line_throw' => true,
'function_typehint_space' => true,
'simplified_if_return' => true,
'no_useless_else' => true,
'no_unneeded_curly_braces' => true,
'no_empty_comment' => true,
'no_blank_lines_after_class_opening' => true,
'whitespace_after_comma_in_array' => true,
'trim_array_spaces' => true,
'no_whitespace_before_comma_in_array' => true,
'constant_case' => true,
'lowercase_keywords' => true,
'lowercase_static_reference' => true,
])
->setFinder($finder);

File diff suppressed because one or more lines are too long

View File

@@ -51,24 +51,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -94,7 +93,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -142,7 +140,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -253,24 +250,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -296,7 +292,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -344,7 +339,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -455,24 +449,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -498,7 +491,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -546,7 +538,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -657,24 +648,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -700,7 +690,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -748,7 +737,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -859,24 +847,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -902,7 +889,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -950,7 +936,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -1061,24 +1046,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -1104,7 +1088,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -1152,7 +1135,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -1263,24 +1245,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -1306,7 +1287,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -1354,7 +1334,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -1465,24 +1444,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -1508,7 +1486,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -1556,7 +1533,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -1667,24 +1643,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -1710,7 +1685,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -1758,7 +1732,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -1869,24 +1842,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -1912,7 +1884,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -1960,7 +1931,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,
@@ -2071,24 +2041,23 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
'Laravel\Fortify\Contracts\LoginResponse' => \Laravel\Fortify\Http\Responses\LoginResponse::class,
'Laravel\Fortify\Contracts\LogoutResponse' => \Laravel\Fortify\Http\Responses\LogoutResponse::class,
'Laravel\Fortify\Contracts\PasswordConfirmedResponse' => \Laravel\Fortify\Http\Responses\PasswordConfirmedResponse::class,
'Laravel\Fortify\Contracts\PasswordUpdateResponse' => \Laravel\Fortify\Http\Responses\PasswordUpdateResponse::class,
'Laravel\Fortify\Contracts\RegisterResponse' => \Laravel\Fortify\Http\Responses\RegisterResponse::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Users\Actions\ResetUserPassword::class,
'Laravel\Fortify\Contracts\ResetsUserPasswords' => \App\Actions\Fortify\ResetUserPassword::class,
'Laravel\Fortify\Contracts\TwoFactorAuthenticationProvider' => \Laravel\Fortify\TwoFactorAuthenticationProvider::class,
'Laravel\Fortify\Contracts\TwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\TwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Users\Actions\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Users\Actions\UpdateUserProfileInformation::class,
'Laravel\Fortify\Contracts\UpdatesUserPasswords' => \App\Actions\Fortify\UpdateUserPassword::class,
'Laravel\Fortify\Contracts\UpdatesUserProfileInformation' => \App\Actions\Fortify\UpdateUserProfileInformation::class,
'Laravel\Scout\EngineManager' => \Laravel\Scout\EngineManager::class,
'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class,
'Spatie\Backup\Helpers\ConsoleOutput' => \Spatie\Backup\Helpers\ConsoleOutput::class,
'Spatie\Backup\Tasks\Cleanup\CleanupStrategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'Spatie\QueryBuilder\QueryBuilderRequest' => \Spatie\QueryBuilder\QueryBuilderRequest::class,
'Stripe\Util\LoggerInterface' => \Laravel\Cashier\Logger::class,
'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class,
'auth' => \Illuminate\Auth\AuthManager::class,
@@ -2114,7 +2083,6 @@ namespace PHPSTORM_META {
'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class,
'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class,
'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class,
'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class,
'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class,
'command.down' => \Illuminate\Foundation\Console\DownCommand::class,
'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class,
@@ -2162,7 +2130,6 @@ namespace PHPSTORM_META {
'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class,
'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class,
'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class,
'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class,
'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class,
'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class,
'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class,

View File

@@ -1,5 +0,0 @@
trailingComma: "es5"
tabWidth: 4
semi: false
singleQuote: true
printWidth: 120

172
README.md
View File

@@ -1,34 +1,48 @@
[![Frontend Build](https://github.com/MakingCG/vuefilemanager/actions/workflows/build.yml/badge.svg)](https://github.com/MakingCG/vuefilemanager/actions/workflows/build.yml)
[![Unit Testing](https://github.com/MakingCG/vuefilemanager/actions/workflows/unit-testing.yml/badge.svg)](https://github.com/MakingCG/vuefilemanager/actions/workflows/unit-testing.yml)
![logo](https://vuefilemanager.com/assets/images/vuefilemanager-horizontal-logo.svg)
# Private Cloud Storage Build by Laravel & Vue.js
# Private Cloud Storage Build on Laravel & Vue.js
## Contents
- [Installation](#installation)
- [Server Requirements](#server-requirements)
- [Installation](#installation)
- [Nginx Configuration](#nginx-configuration)
- [Apache Configuration](#apache-configuration)
- [Server Requirements](#server-requirements)
- [Installation](#installation)
- [PHP Configuration](#php-configuration)
- [Chunk Upload](#chunk-upload)
- [Nginx Configuration](#nginx-configuration)
- [Apache Configuration](#apache-configuration)
- [Upgrade Guide](#upgrade-guide)
- [Payments](#payments)
- [Get your active plans](#get-your-active-plans)
- [Manage Failed Payments](#manage-failed-payments)
- [Tax Rates](#tax-rates)
- [Developers](#developers)
- [Running development environment on your localhost](#running-development-environment-on-your-localhost)
- [Supported Storages](#supported-storages)
- [Others](#others)
- [Support](#support)
- [Security Vulnerabilities](#security-vulnerabilities)
- [Changelog](#changelog)
- [Support](#support)
- [Security Vulnerabilities](#security-vulnerabilities)
# Installation
## Server Requirements
**For running app make sure you have:**
- PHP >= 8.0.2 version (8.1+ recommended)
**For running app make sure you have installed:**
- PHP >= 7.3 version
- MySQL 5.6+
- Nginx or Apache
**These PHP Extensions are require:**
- Intl
- GD
- BCMath
- PDO
- SQLite3
- SQLite
- Ctype
- Fileinfo
- JSON
@@ -41,41 +55,59 @@
## Installation
#### 1. Upload files on your server
Upload project files to the web root folder of your domain. It's mostly located in `html`, `www` or `public_html` folder name.
Upload project files to web root folder of your domain. It's mostly located in `html`, `www` or `public_html` folder name.
#### 2. Configure your domain host root folder
Configure your web server's document root to point to the public directory of the files you previously uploaded. For example, if you've uploaded the files in `html` folder, your domain root directory should be changed to `html/project_files/public` folder or anything else where domain root is in project `/public` directory.
#### 2. Configure your web root folder
Configure your web server's document root to point to the public directory of the files you previously uploaded. For example, if you've uploaded the files in `html` folder, your domain root directory should be changed to `html/project_files/public` folder or anything else where domain root is in project `/public` directory.
#### 3. Set write permissions
Set `755` permission (CHMOD) to these files and folders directory within all children subdirectories:
Please don't try go to `yourdomain.com/public` URL address, you will have issue to verify your purchase code, this is not correct domain root setup, you must do this in your webhosting settings panel.
- /bootstrap
![Domain Root](https://vuefilemanager.com/assets/images/domain-root.jpg)
#### 3. Check your .env file
Make sure `.env` file was uploaded. This type of file can be hidden in default.
#### 4. Set write permissions
Set `755` permission (CHMOD) to these file and folders directory within all children subdirectories:
- /bootstrap/cache
- /storage
- /.env
#### 4. Open your application in your web browser
Then open your application in web browser. If everything works fine, you will be redirected to the setup wizard installation process.
#### 5. Open your application in your web browser
Then open your application in web browser. If everything works fine, you will be redirect to setup wizard installation process.
#### 5. Server Check
On the first page you will see server check. Make sure all items are green. If not, then correct your server setup by recommended values and refresh your setup wizard page.
At first step you have to verify your purchase code. **Subscription service with stripe payments is available only for Extended License.** If you can't verify your purchase code, check, if you did previously steps correctly.
#### 6. Follow setup wizard steps
That was the hardest part of installation process. Please follow instructions in every step of Setup Wizard to successfully install VueFileManager.
That was the hardest part of installation proces. Please follow instructions in every step of Setup Wizard to successfully install VueFileManager.
#### 7. Set up Cron
Add the following Cron entry to your server. Just update your php path (if it's different) and project path:
```
* * * * * /usr/local/bin/php /www/html/your-project/artisan schedule:run >> /dev/null 2>&1
* * * * * /usr/local/bin/php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
```
#### 8. Broadcasting
## PHP Configuration
There are several PHP settings good to know to setup before you try upload any file. Please set these values in your php.ini, we provide minimal setup for you. When you set `-1` then you set infinity limits.
Coming soon...
```
memory_limit = 512M
upload_max_filesize = 128M
post_max_size = 128M
max_file_uploads = 50
max_execution_time = 3600
```
## Chunk & Multipart Upload
VueFileManager in default supporting chunk upload. Default chunk upload size is `128MB`. If you wish change this default value, go to your `.env` and change `CHUNK_SIZE` attribute.
When you use external storage, and upload large files, to prevent failing upload process make sure you have enough space in your application space and set higher `max_execution_time` in your php.ini to move your files to external storage.
## Nginx Configuration
If you running VueFileManager under Nginx, don't forget set this value in your `nginx.conf` file:
If you running VueFileManager undex Nginx, don't forget set this value in your `nginx.conf` file:
```
http {
client_max_body_size 1024M;
@@ -135,41 +167,57 @@ Make sure you have enabled mod_rewrite. There is an example config for running V
</VirtualHost>
```
## Upgrade Guide
### Common Instructions
`Don't forget create backup of your database before make any changes in your production application. If you serve your files in local storage driver pay attention and don't delete your /storage folder!`
These instructions is applicable for all updates. Please follow this step:
- Just rewrite all project files with new excluded `/.env` file and `/storage` folder. These items must be preserved!
# Payments
VueFileManager is packed with **Stripe** payment options. To configure Stripe, you will be asked in Setup Wizard to set up. Or, if you skip this installation process, you will find stripe set up in you admin `Dashboard / Settings / Payments`.
## Manage Failed Payments
VueFileManager manage failed payments with additional email notification. But, there is more you can do for better User Experience. There is some additionals option in Stripe, look on [prevent failed payments](https://dashboard.stripe.com/settings/billing/automatic).
## Tax Rates
You are able to manage tax rates. When adding a new tax rate, if no Region is specified, the tax rate will apply to everyone. Add a [ISO 3166-1 alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) to the Region field if you wish to apply taxes per country.
Just log in to your stripe dashboard, and you will find taxes under `Dashboard / Products / Tax Rates`.
# Developers
## Running development environment on your localhost
**For running development environment make sure you have:**
- Node >= 14
- NPM >= 6
If you would like to express set up, please update your database credentials in .env file
When you download repository from GitHub, you have to rename your `.env.example` file to `.env`. Then run command below in your terminal to install vendors. Composer is required.
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
composer install
```
If you would like to generate demo content, run this command below. Demo account will be created with credentials `howdy@hi5ve.digital` and password `vuefilemanager`.
Set your `APP_ENV` to local mode, in default, it's in production mode.
```
php artisan setup:dev
APP_ENV=local
```
If you would like express installation without demo data, run this command below. Demo account will be created with credentials `howdy@hi5ve.digital` and password `vuefilemanager`.
```
php artisan setup:prod
```
After that, please make sure your current host/domain where you are running app is included in your .env SANCTUM_STATEFUL_DOMAINS variable.
Also, to debug application, set `APP_DEBUG` on true:
```
APP_DEBUG=true
```
To start server on your localhost, run command below.
To start server on your localhost, run command below. Then go to your generated localhost URL by terminal, and follow Setup Wizard steps to configure VueFileManager.
```
php artisan serve
```
For developing Vue front-end, you have to install npm modules by this command:
After successfully installation via Setup Wizard, stop your artisan server, clear config cache and run your artisan server again:
```
php artisan config:clear
php artisan serve
```
*After any change in your .env you have to restart your artisan server to reload your config cache.*
To develop your Vue front-end, you have to install npm modules by this command:
```
npm install
```
@@ -184,6 +232,31 @@ To compiles for production build, run this command
npm run prod
```
## Supported Storages
VueFileManager support these storages for your files:
- [Amazon Web Services S3](https://aws.amazon.com/s3/)
- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
- [Object Cloud Storage by Wasabi](https://wasabi.com/)
- [Backblaze B2 Cloud Storage](https://www.backblaze.com/b2/cloud-storage.html)
- Your local disk
In case of installation process, you will be able to set storage driver and credentials. After this, you can change your credentials later in `/.env` file.
To set or change your storage driver, you have to edit `FILESYSTEM_DRIVER` in your `/.env` file. Supported drivers are `s3`, `spaces`, `wasabi`,`backblaze` or `local`:
```
FILESYSTEM_DRIVER=local
```
Then you can find corresponding credentials options for your storage driver like key, secret, region in `/.env` file.
# Others
## Changelog
Refer to the [Changelog](https://vuefilemanager.com/changelog) for a full history of the project.
## GitHub Repository
[Join our GitHub repository](https://vuefilemanager.com/github-access) to submit your issues or suggestions, track VueFileManager progress and get new updates as fast as possible.
## Support
The following support channels are available at your fingertips:
@@ -191,8 +264,9 @@ The following support channels are available at your fingertips:
- [CodeCanyon support message](https://codecanyon.net/item/vue-file-manager-with-laravel-backend/25815986/support)
## Supporting VueFileManager
We are trying to make the best for VueFileManager. There are a lot of things to do, and a lot of features we can make.
But, it can't be done without you, development is more and more complicated and we have to hire new colleagues to help us. There is couple way you can support us, and then, we support you with all great new features we can make. Thank you for participating on this awesome application!
Hi, we are trying make the best experience with VueFileManager. There is a lot things to do, and a lot of features we can make.
But, it can't be done without you, development is more and more complicated and we have to hire new colleagues to help with it. There is couple way you can support us, and then, we support you with all great new features which can be. Thanks you for participating on this awesome software!
- [Buy me a Coffe](https://www.buymeacoffee.com/pepe)
- [Become a Patreon](https://www.patreon.com/vuefilemanager)

View File

@@ -3,7 +3,7 @@
/**
* A helper file for Laravel, to provide autocomplete information to your IDE
* Generated for Laravel 8.50.0.
* Generated for Laravel 8.41.0.
*
* This file should not be included in your code, only analyzed by your IDE!
*
@@ -989,7 +989,6 @@
* @param \Closure|string|null $concrete
* @param bool $shared
* @return void
* @throws \TypeError
* @static
*/
public static function bind($abstract, $concrete = null, $shared = false)
@@ -1088,32 +1087,6 @@
{ //Method inherited from \Illuminate\Container\Container
/** @var \Illuminate\Foundation\Application $instance */
$instance->singletonIf($abstract, $concrete);
}
/**
* Register a scoped binding in the container.
*
* @param string $abstract
* @param \Closure|string|null $concrete
* @return void
* @static
*/
public static function scoped($abstract, $concrete = null)
{ //Method inherited from \Illuminate\Container\Container
/** @var \Illuminate\Foundation\Application $instance */
$instance->scoped($abstract, $concrete);
}
/**
* Register a scoped binding if it hasn't already been registered.
*
* @param string $abstract
* @param \Closure|string|null $concrete
* @return void
* @static
*/
public static function scopedIf($abstract, $concrete = null)
{ //Method inherited from \Illuminate\Container\Container
/** @var \Illuminate\Foundation\Application $instance */
$instance->scopedIf($abstract, $concrete);
}
/**
* "Extend" an abstract type in the container.
@@ -1386,17 +1359,6 @@
{ //Method inherited from \Illuminate\Container\Container
/** @var \Illuminate\Foundation\Application $instance */
$instance->forgetInstances();
}
/**
* Clear all of the scoped instances from the container.
*
* @return void
* @static
*/
public static function forgetScopedInstances()
{ //Method inherited from \Illuminate\Container\Container
/** @var \Illuminate\Foundation\Application $instance */
$instance->forgetScopedInstances();
}
/**
* Get the globally available instance of the container.
@@ -1807,7 +1769,7 @@
/**
* Get the currently authenticated user.
*
* @return \App\Users\Models\User|null
* @return \App\Models\User|null
* @static
*/
public static function user()
@@ -1842,7 +1804,7 @@
* Log the given user ID into the application without sessions or cookies.
*
* @param mixed $id
* @return \App\Users\Models\User|false
* @return \App\Models\User|false
* @static
*/
public static function onceUsingId($id)
@@ -1920,7 +1882,7 @@
*
* @param mixed $id
* @param bool $remember
* @return \App\Users\Models\User|false
* @return \App\Models\User|false
* @static
*/
public static function loginUsingId($id, $remember = false)
@@ -1972,7 +1934,7 @@
*
* @param string $password
* @param string $attribute
* @return \App\Users\Models\User|null
* @return bool|null
* @throws \Illuminate\Auth\AuthenticationException
* @static
*/
@@ -1996,7 +1958,7 @@
/**
* Get the last user we attempted to authenticate.
*
* @return \App\Users\Models\User
* @return \App\Models\User
* @static
*/
public static function getLastAttempted()
@@ -2098,7 +2060,7 @@
/**
* Return the currently cached user.
*
* @return \App\Users\Models\User|null
* @return \App\Models\User|null
* @static
*/
public static function getUser()
@@ -2144,7 +2106,7 @@
/**
* Determine if the current user is authenticated. If not, throw an exception.
*
* @return \App\Users\Models\User
* @return \App\Models\User
* @throws \Illuminate\Auth\AuthenticationException
* @static
*/
@@ -2625,19 +2587,6 @@
{
/** @var \Illuminate\View\Compilers\BladeCompiler $instance */
return $instance->compileEndOnce();
}
/**
* Add a handler to be executed before echoing a given class.
*
* @param string|callable $class
* @param callable|null $handler
* @return void
* @static
*/
public static function stringable($class, $handler = null)
{
/** @var \Illuminate\View\Compilers\BladeCompiler $instance */
$instance->stringable($class, $handler);
}
/**
* Compile Blade echos into valid PHP.
@@ -2650,18 +2599,6 @@
{
/** @var \Illuminate\View\Compilers\BladeCompiler $instance */
return $instance->compileEchos($value);
}
/**
* Apply the echo handler for the value if it exists.
*
* @param $value string
* @return string
* @static
*/
public static function applyEchoHandler($value)
{
/** @var \Illuminate\View\Compilers\BladeCompiler $instance */
return $instance->applyEchoHandler($value);
}
}
@@ -2940,7 +2877,6 @@
*
* @param mixed $command
* @return mixed
* @throws \RuntimeException
* @static
*/
public static function dispatchToQueue($command)
@@ -3023,45 +2959,6 @@
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
$instance->assertNotDispatched($command, $callback);
}
/**
* Assert if a job was explicitly dispatched synchronously based on a truth-test callback.
*
* @param string|\Closure $command
* @param callable|int|null $callback
* @return void
* @static
*/
public static function assertDispatchedSync($command, $callback = null)
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
$instance->assertDispatchedSync($command, $callback);
}
/**
* Assert if a job was pushed synchronously a number of times.
*
* @param string $command
* @param int $times
* @return void
* @static
*/
public static function assertDispatchedSyncTimes($command, $times = 1)
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
$instance->assertDispatchedSyncTimes($command, $times);
}
/**
* Determine if a job was dispatched based on a truth-test callback.
*
* @param string|\Closure $command
* @param callable|null $callback
* @return void
* @static
*/
public static function assertNotDispatchedSync($command, $callback = null)
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
$instance->assertNotDispatchedSync($command, $callback);
}
/**
* Assert if a job was dispatched after the response was sent based on a truth-test callback.
@@ -3151,19 +3048,6 @@
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
return $instance->dispatched($command, $callback);
}
/**
* Get all of the jobs dispatched synchronously matching a truth-test callback.
*
* @param string $command
* @param callable|null $callback
* @return \Illuminate\Support\Collection
* @static
*/
public static function dispatchedSync($command, $callback = null)
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
return $instance->dispatchedSync($command, $callback);
}
/**
* Get all of the jobs dispatched after the response was sent matching a truth-test callback.
@@ -3209,18 +3093,6 @@
* @return bool
* @static
*/
public static function hasDispatchedSync($command)
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
return $instance->hasDispatchedSync($command);
}
/**
* Determine if there are any stored commands for a given class.
*
* @param string $command
* @return bool
* @static
*/
public static function hasDispatchedAfterResponse($command)
{
/** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */
@@ -4794,17 +4666,6 @@
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->raw($value);
}
/**
* Determine if the database connection has modified any database records.
*
* @return bool
* @static
*/
public static function hasModifiedRecords()
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->hasModifiedRecords();
}
/**
* Indicate if any records have been modified.
@@ -4817,18 +4678,6 @@
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
$instance->recordsHaveBeenModified($value);
}
/**
* Set the record modification state.
*
* @param bool $value
* @return \Illuminate\Database\MySqlConnection
* @static
*/
public static function setRecordModificationState($value)
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->setRecordModificationState($value);
}
/**
* Reset the record modification state.
@@ -4840,18 +4689,6 @@
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
$instance->forgetRecordModificationState();
}
/**
* Indicate that the connection should use the write PDO connection for reads.
*
* @param bool $value
* @return \Illuminate\Database\MySqlConnection
* @static
*/
public static function useWriteConnectionWhenReading($value = true)
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->useWriteConnectionWhenReading($value);
}
/**
* Is Doctrine available?
@@ -4977,17 +4814,6 @@
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->getName();
}
/**
* Get the database connection full name.
*
* @return string|null
* @static
*/
public static function getNameWithReadWriteType()
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->getNameWithReadWriteType();
}
/**
* Get an option from the configuration options.
@@ -5226,18 +5052,6 @@
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->setDatabaseName($database);
}
/**
* Set the read / write type of the connection.
*
* @param string|null $readWriteType
* @return \Illuminate\Database\MySqlConnection
* @static
*/
public static function setReadWriteType($readWriteType)
{ //Method inherited from \Illuminate\Database\Connection
/** @var \Illuminate\Database\MySqlConnection $instance */
return $instance->setReadWriteType($readWriteType);
}
/**
* Get the table prefix for the connection.
@@ -5364,7 +5178,6 @@
*
* @param callable $callback
* @return void
* @throws \RuntimeException
* @static
*/
public static function afterCommit($callback)
@@ -5756,7 +5569,6 @@
* @param string $path
* @param array $data
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
* @static
*/
public static function requireOnce($path, $data = [])
@@ -5912,7 +5724,6 @@
* @param string $target
* @param string $link
* @return void
* @throws \RuntimeException
* @static
*/
public static function relativeLink($target, $link)
@@ -5973,7 +5784,6 @@
*
* @param string $path
* @return string|null
* @throws \RuntimeException
* @static
*/
public static function guessExtension($path)
@@ -6900,7 +6710,6 @@
*
* @param string $locale
* @return void
* @throws \InvalidArgumentException
* @static
*/
public static function setLocale($locale)
@@ -6997,8 +6806,6 @@
/**
*
*
* @method static \Illuminate\Log\Logger withContext(array $context = [])
* @method static \Illuminate\Log\Logger withoutContext()
* @method static void write(string $level, string $message, array $context = [])
* @method static void listen(\Closure $callback)
* @see \Illuminate\Log\Logger
@@ -7271,7 +7078,6 @@
*
* @param array $config
* @return \Swift_Transport
* @throws \InvalidArgumentException
* @static
*/
public static function createTransport($config)
@@ -12054,7 +11860,6 @@
*
* @param string $type
* @return void
* @throws \InvalidArgumentException
* @static
*/
public static function defaultMorphKeyType($type)
@@ -12971,18 +12776,6 @@
{
/** @var \Illuminate\Filesystem\FilesystemManager $instance */
return $instance->cloud();
}
/**
* Build an on-demand disk.
*
* @param string|array $config
* @return \Illuminate\Filesystem\FilesystemAdapter
* @static
*/
public static function build($config)
{
/** @var \Illuminate\Filesystem\FilesystemManager $instance */
return $instance->build($config);
}
/**
* Create an instance of the local driver.
@@ -14126,17 +13919,6 @@
{
/** @var \Illuminate\Validation\Factory $instance */
$instance->replacer($rule, $replacer);
}
/**
* Indicate that unvalidated array keys should be excluded, even if the parent array was validated.
*
* @return void
* @static
*/
public static function excludeUnvalidatedArrayKeys()
{
/** @var \Illuminate\Validation\Factory $instance */
$instance->excludeUnvalidatedArrayKeys();
}
/**
* Set the Validator instance resolver.
@@ -14675,7 +14457,6 @@
* @param string $name
* @param string|null $content
* @return void
* @throws \InvalidArgumentException
* @static
*/
public static function slot($name, $content = null)
@@ -16305,7 +16086,7 @@ namespace {
* @param mixed $operator
* @param mixed $value
* @param string $boolean
* @return \Illuminate\Database\Eloquent\Model|static|null
* @return \Illuminate\Database\Eloquent\Model|static
* @static
*/
public static function firstWhere($column, $operator = null, $value = null, $boolean = 'and')
@@ -16642,7 +16423,8 @@ namespace {
* @param array $columns
* @param string $cursorName
* @param string|null $cursor
* @return \Illuminate\Contracts\Pagination\CursorPaginator
* @return \Illuminate\Contracts\Pagination\Paginator
* @throws \Illuminate\Pagination\CursorPaginationException
* @static
*/
public static function cursorPaginate($perPage = null, $columns = [], $cursorName = 'cursor', $cursor = null)
@@ -17264,19 +17046,6 @@ namespace {
return $instance->withAvg($relation, $column);
}
/**
* Add subselect queries to include the existence of related models.
*
* @param string|array $relation
* @return \Illuminate\Database\Eloquent\Builder|static
* @static
*/
public static function withExists($relation)
{
/** @var \Illuminate\Database\Eloquent\Builder $instance */
return $instance->withExists($relation);
}
/**
* Merge the where constraints from another query to the current query.
*
@@ -17336,7 +17105,6 @@ namespace {
* @param callable $callback
* @param int $count
* @return bool
* @throws \RuntimeException
* @static
*/
public static function each($callback, $count = 1000)
@@ -17382,7 +17150,6 @@ namespace {
*
* @param int $chunkSize
* @return \Illuminate\Support\LazyCollection
* @throws \InvalidArgumentException
* @static
*/
public static function lazy($chunkSize = 1000)
@@ -17398,7 +17165,6 @@ namespace {
* @param string|null $column
* @param string|null $alias
* @return \Illuminate\Support\LazyCollection
* @throws \InvalidArgumentException
* @static
*/
public static function lazyById($chunkSize = 1000, $column = null, $alias = null)
@@ -17435,6 +17201,21 @@ namespace {
return $instance->baseSole($columns);
}
/**
* Apply the callback's query changes if the given "value" is true.
*
* @param mixed $value
* @param callable $callback
* @param callable|null $default
* @return mixed|$this
* @static
*/
public static function when($value, $callback, $default = null)
{
/** @var \Illuminate\Database\Eloquent\Builder $instance */
return $instance->when($value, $callback, $default);
}
/**
* Pass the query to a given callback.
*
@@ -17449,27 +17230,12 @@ namespace {
}
/**
* Apply the callback if the given "value" is truthy.
* Apply the callback's query changes if the given "value" is false.
*
* @param mixed $value
* @param callable $callback
* @param callable|null $default
* @return mixed
* @static
*/
public static function when($value, $callback, $default = null)
{
/** @var \Illuminate\Database\Eloquent\Builder $instance */
return $instance->when($value, $callback, $default);
}
/**
* Apply the callback if the given "value" is falsy.
*
* @param mixed $value
* @param callable $callback
* @param callable|null $default
* @return mixed
* @return mixed|$this
* @static
*/
public static function unless($value, $callback, $default = null)
@@ -17997,7 +17763,7 @@ namespace {
/**
* Add an "or where null" clause to the query.
*
* @param string|array $column
* @param string $column
* @return \Illuminate\Database\Query\Builder
* @static
*/
@@ -18675,7 +18441,7 @@ namespace {
/**
* Add a descending "order by" clause to the query.
*
* @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string $column
* @param string $column
* @return \Illuminate\Database\Query\Builder
* @static
*/
@@ -18811,7 +18577,7 @@ namespace {
/**
* Remove all existing orders and optionally add a new order.
*
* @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string|null $column
* @param string|null $column
* @param string $direction
* @return \Illuminate\Database\Query\Builder
* @static
@@ -18886,31 +18652,6 @@ namespace {
return $instance->sharedLock();
}
/**
* Register a closure to be invoked before the query is executed.
*
* @param callable $callback
* @return \Illuminate\Database\Query\Builder
* @static
*/
public static function beforeQuery($callback)
{
/** @var \Illuminate\Database\Query\Builder $instance */
return $instance->beforeQuery($callback);
}
/**
* Invoke the "before query" modification callbacks.
*
* @return void
* @static
*/
public static function applyBeforeQueryCallbacks()
{
/** @var \Illuminate\Database\Query\Builder $instance */
$instance->applyBeforeQueryCallbacks();
}
/**
* Get the SQL representation of the query.
*

View File

@@ -0,0 +1,61 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use App\Models\Setting;
use App\Models\UserSettings;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\CreatesNewUsers;
class CreateNewUser implements CreatesNewUsers
{
use PasswordValidationRules;
/**
* Validate and create a newly registered user.
*
* @param array $input
* @return \App\Models\User
*/
public function create(array $input)
{
$settings = Setting::whereIn('name', ['storage_default', 'registration'])
->pluck('value', 'name');
// Check if account registration is enabled
if (! intval($settings['registration'])) {
abort(401);
}
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique(User::class),
],
'password' => $this->passwordRules(),
])->validate();
$user = User::create([
'email' => $input['email'],
'password' => bcrypt($input['password']),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $input['name'],
'storage_capacity' => $settings['storage_default'],
]);
UserSettings::reguard();
return $user;
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Rules;
namespace App\Actions\Fortify;
use Laravel\Fortify\Rules\Password;
@@ -7,8 +7,10 @@ trait PasswordValidationRules
{
/**
* Get the validation rules used to validate passwords.
*
* @return array
*/
protected function passwordRules(): array
protected function passwordRules()
{
return ['required', 'string', new Password, 'confirmed'];
}

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Actions;
namespace App\Actions\Fortify;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\ResetsUserPasswords;

View File

@@ -1,9 +1,8 @@
<?php
namespace App\Users\Actions;
namespace App\Actions\Fortify;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Users\Rules\PasswordValidationRules;
use Laravel\Fortify\Contracts\UpdatesUserPasswords;
class UpdateUserPassword implements UpdatesUserPasswords
@@ -25,7 +24,7 @@ class UpdateUserPassword implements UpdatesUserPasswords
'password' => $this->passwordRules(),
])->after(function ($validator) use ($user, $input) {
if (! isset($input['current_password']) || ! Hash::check($input['current_password'], $user->password)) {
$validator->errors()->add('current_password', __t('password_doesnt_match'));
$validator->errors()->add('current_password', __('The provided password does not match your current password.'));
}
})->validateWithBag('updatePassword');

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Actions;
namespace App\Actions\Fortify;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;

View File

@@ -0,0 +1,889 @@
<?php
namespace App\Console\Commands;
use App\Models\File;
use App\Models\User;
use App\Models\Share;
use App\Models\Folder;
use App\Models\Setting;
use Illuminate\Support\Str;
use App\Services\SetupService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\WithFaker;
class SetupDevEnvironment extends Command
{
use WithFaker;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'setup:dev';
protected $license = 'Extended';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Set up development environment with demo data';
private $setup;
public function __construct()
{
parent::__construct();
$this->setUpFaker();
$this->setup = resolve(SetupService::class);
}
/**
* Execute the console command.
* return @void
*/
public function handle(): void
{
$this->info('Setting up development environment');
$this->info('Creating system directories...');
$this->setup->create_directories();
$this->info('Migrating Databases...');
$this->migrate_and_generate();
$this->info('Storing default settings and content...');
$this->store_default_settings();
$this->setup->seed_default_pages();
$this->setup->seed_default_settings($this->license);
$this->setup->seed_default_language();
$this->info('Creating default admin...');
$this->create_admin();
$this->info('Creating demo users...');
$this->create_demo_users();
$this->info('Creating default admin content...');
$this->create_admin_default_content();
$this->create_share_records();
$this->info('Clearing application cache...');
$this->clear_cache();
$this->info('Dispatching jobs...');
$this->call('queue:work', [
'--stop-when-empty' => true,
]);
$this->info('Everything is done, congratulations! 🥳🥳🥳');
}
/**
* Create default admin account
*/
private function create_admin(): void
{
$user = User::forceCreate([
'role' => 'admin',
'email' => 'howdy@hi5ve.digital',
'password' => bcrypt('vuefilemanager'),
]);
$user
->settings()
->create([
'avatar' => 'avatars/avatar-01.png',
'storage_capacity' => 5,
'name' => 'Jane Doe',
'address' => $this->faker->address,
'state' => $this->faker->state,
'city' => $this->faker->city,
'postal_code' => $this->faker->postcode,
'country' => $this->faker->randomElement(['SK', 'CZ', 'DE', 'FR']),
'phone_number' => $this->faker->phoneNumber,
'timezone' => $this->faker->randomElement(['+1.0', '+2.0', '+3.0']),
]);
Storage::putFileAs('avatars', storage_path('demo/avatars/avatar-01.png'), 'avatar-01.png', 'private');
// Show user credentials
$this->info('Default admin account created. Email: howdy@hi5ve.digital and Password: vuefilemanager');
}
/**
* Create default admin account
*/
private function create_demo_users(): void
{
collect([
[
'avatar' => 'avatar-02.png',
],
[
'avatar' => 'avatar-03.png',
],
])->each(function ($user) {
$newbie = User::forceCreate([
'role' => 'user',
'email' => $this->faker->email,
'password' => bcrypt('vuefilemanager'),
]);
$newbie
->settings()
->create([
'avatar' => "avatars/{$user['avatar']}",
'storage_capacity' => 5,
'name' => $this->faker->name,
'address' => $this->faker->address,
'state' => $this->faker->state,
'city' => $this->faker->city,
'postal_code' => $this->faker->postcode,
'country' => $this->faker->randomElement(['SK', 'CZ', 'DE', 'FR']),
'phone_number' => $this->faker->phoneNumber,
'timezone' => $this->faker->randomElement(['+1.0', '+2.0', '+3.0']),
]);
Storage::putFileAs('avatars', storage_path("demo/avatars/{$user['avatar']}"), $user['avatar'], 'private');
$this->info("Generated user with email: $newbie->email and Password: vuefilemanager");
});
}
/**
* Create default admin content
*/
private function create_admin_default_content(): void
{
$user = User::whereEmail('howdy@hi5ve.digital')
->first();
// 1.
$shared_folder = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'author' => 'user',
'name' => 'Shared Folder',
'emoji' => [
'codes' => '1F680',
'char' => '🚀',
'name' => 'rocket',
'category' => 'Travel & Places (transport-air)',
'group' => 'Travel & Places',
'subgroup' => 'transport-air',
],
'created_at' => now(),
]);
Share::factory(Share::class)
->create([
'type' => 'folder',
'item_id' => $shared_folder->id,
'user_id' => $user->id,
'permission' => 'editor',
'is_protected' => false,
'password' => null,
'expire_in' => null,
]);
$peters_files = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $shared_folder->id,
'author' => 'visitor',
'name' => "Peter's Files",
]);
// 2.
$random_pics = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'author' => 'user',
'name' => 'Random Pics',
'emoji' => [
'codes' => '1F4F7',
'char' => '📷',
'name' => 'camera',
'category' => 'Objects (light & video)',
'group' => 'Objects',
'subgroup' => 'light & video',
],
'created_at' => now()->subMinutes(1),
]);
$nature = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $random_pics->id,
'author' => 'user',
'name' => 'Nature',
'emoji' => [
'codes' => '26F0',
'char' => '⛰',
'name' => 'mountain',
'category' => 'Travel & Places (place-geographic)',
'group' => 'Travel & Places',
'subgroup' => 'place-geographic',
],
]);
$apartments = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $random_pics->id,
'author' => 'user',
'name' => 'Apartments',
'emoji' => [
'codes' => '1F3E0',
'char' => '🏠',
'name' => 'house',
'category' => 'Travel & Places (place-building)',
'group' => 'Travel & Places',
'subgroup' => 'place-building',
],
]);
// 3.
$playable_media = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'author' => 'user',
'name' => 'Playable Media',
'created_at' => now()->subMinutes(2),
]);
$video = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $playable_media->id,
'author' => 'user',
'name' => 'Video',
]);
$audio = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $playable_media->id,
'author' => 'user',
'name' => 'Audio',
]);
// 4.
$multi_level = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'author' => 'user',
'name' => 'Multi Level Folder',
'created_at' => now()->subMinutes(3),
]);
$first_level = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $multi_level->id,
'author' => 'user',
'name' => 'First Level',
]);
$second_level = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $first_level->id,
'author' => 'user',
'name' => 'Second Level',
]);
$third_level = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'parent_id' => $second_level->id,
'author' => 'user',
'name' => 'Third Level',
]);
// 5.
$documents = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'author' => 'user',
'name' => 'Documents',
'created_at' => now()->subMinutes(4),
]);
Share::factory(Share::class)
->create([
'type' => 'folder',
'item_id' => $documents->id,
'user_id' => $user->id,
'permission' => 'editor',
'is_protected' => false,
'password' => null,
'expire_in' => null,
]);
// 6.
$videohive = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
'author' => 'user',
'name' => 'Videohive by MakingCG',
'created_at' => now()->subMinutes(5),
]);
$user
->favouriteFolders()
->sync([
$shared_folder->id,
$random_pics->id,
$documents->id,
$peters_files->id,
]);
// Get documents to root directory
collect([
[
'name' => 'Random Document',
'basename' => 'Licence.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'School Report',
'basename' => 'Project Notes.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'Personal Savings',
'basename' => 'School Report.pages',
'mimetype' => 'pages',
],
[
'name' => 'Top Secret Files',
'basename' => 'Stories of the Night Skies.pages',
'mimetype' => 'pages',
],
])
->each(function ($file) use ($user) {
$basename = Str::random(12) . '-' . $file['basename'];
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, 'private');
// Create file record
File::create([
'folder_id' => null,
'user_id' => $user->id,
'name' => $file['name'],
'basename' => $basename,
'type' => 'file',
'author' => 'user',
'mimetype' => $file['mimetype'],
'filesize' => rand(1000000, 4000000),
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get documents to documents folder
collect([
[
'name' => 'Home Improvement',
'basename' => 'Licence.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'Project Notes',
'basename' => 'Project Notes.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'Personal Savings',
'basename' => 'School Report.pages',
'mimetype' => 'pages',
],
[
'name' => 'License',
'basename' => 'Stories of the Night Skies.pages',
'mimetype' => 'pages',
],
])
->each(function ($file) use ($user, $documents) {
$basename = Str::random(12) . '-' . $file['basename'];
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, 'private');
// Create file record
File::create([
'folder_id' => $documents->id,
'user_id' => $user->id,
'name' => $file['name'],
'basename' => $basename,
'type' => 'file',
'author' => 'user',
'mimetype' => $file['mimetype'],
'filesize' => rand(1000000, 4000000),
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get documents to shared folder
collect([
[
'name' => 'Home plan',
'basename' => 'Licence.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'Software Licence',
'basename' => 'Project Notes.pdf',
'mimetype' => 'pdf',
],
])
->each(function ($file) use ($user, $shared_folder) {
$basename = Str::random(12) . '-' . $file['basename'];
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, 'private');
// Create file record
File::create([
'folder_id' => $shared_folder->id,
'user_id' => $user->id,
'name' => $file['name'],
'basename' => $basename,
'type' => 'file',
'author' => 'user',
'mimetype' => $file['mimetype'],
'filesize' => rand(1000000, 4000000),
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get documents to peter's files folder
collect([
[
'name' => 'Project Backup',
'basename' => 'Licence.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'Yearly report',
'basename' => 'Project Notes.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'Work Update',
'basename' => 'School Report.pages',
'mimetype' => 'pages',
],
[
'name' => 'Person Writing on Notebook',
'basename' => 'Stories of the Night Skies.pages',
'mimetype' => 'pages',
],
[
'name' => 'Blank Business Composition Computer',
'basename' => 'Licence.pdf',
'mimetype' => 'pdf',
],
[
'name' => '2020 April - Export',
'basename' => 'Project Notes.pdf',
'mimetype' => 'pdf',
],
[
'name' => 'Ballpen Blur Close Up Computer',
'basename' => 'School Report.pages',
'mimetype' => 'pages',
],
])
->each(function ($file) use ($user, $peters_files) {
$basename = Str::random(12) . '-' . $file['basename'];
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/documents/{$file['basename']}"), $basename, 'private');
// Create file record
File::create([
'folder_id' => $peters_files->id,
'user_id' => $user->id,
'name' => $file['name'],
'basename' => $basename,
'type' => 'file',
'author' => 'visitor',
'mimetype' => $file['mimetype'],
'filesize' => rand(1000000, 4000000),
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get videos
collect([
'Apple Watch App Video Promotion.mp4',
'Professional 3D Device Pack for Element 3D.mp4',
'Smart Watch 3D Device Pack for Element 3D.mp4',
'Sphere Bound 3D Titles.mp4',
])
->each(function ($file) use ($user, $videohive) {
$basename = Str::random(12) . '-' . $file;
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/video/$file"), $basename, 'private');
// Create file record
File::create([
'folder_id' => $videohive->id,
'user_id' => $user->id,
'name' => $file,
'basename' => $basename,
'type' => 'video',
'author' => 'user',
'mimetype' => 'mp4',
'filesize' => rand(1000000, 4000000),
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get video into video folder
collect([
'Apple Watch App Video Promotion.mp4',
])
->each(function ($file) use ($user, $video) {
$basename = Str::random(12) . '-' . $file;
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/video/$file"), $basename, 'private');
// Create file record
File::create([
'folder_id' => $video->id,
'user_id' => $user->id,
'name' => $file,
'basename' => $basename,
'type' => 'video',
'author' => 'user',
'mimetype' => 'mp4',
'filesize' => rand(1000000, 4000000),
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get audios
collect([
'D-Block & S-te-Fan - Bla Bla.mp3',
])
->each(function ($file) use ($user, $audio) {
$basename = Str::random(12) . '-' . $file;
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/audio/$file"), $basename, 'private');
// Create file record
File::create([
'folder_id' => $audio->id,
'user_id' => $user->id,
'name' => $file,
'basename' => $basename,
'type' => 'audio',
'author' => 'user',
'mimetype' => 'mp3',
'filesize' => rand(1000000, 4000000),
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get meme gallery
collect([
'Eggcited bro.jpg',
'Get a Rest.jpg',
'Get Your Shit Together.jpg',
'Happiness is when you are right beside me.jpg',
'Have a Nice Day.jpg',
'It Works On My Machine.jpg',
'I am Just Trying to shine.jpg',
'It Works On My Machine.jpg',
'Missing you It is Pig Time.jpg',
'Sofishticated.jpg',
'whaaaaat.jpg',
'You Are My Sunshine.jpg',
])
->each(function ($file) use ($user) {
$basename = Str::random(12) . '-' . $file;
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/images/memes/$file"), $basename, 'private');
Storage::putFileAs("files/$user->id", storage_path("demo/images/memes/thumbnail-$file"), "thumbnail-$basename", 'private');
// Create file record
File::create([
'folder_id' => null,
'user_id' => $user->id,
'name' => $file,
'basename' => $basename,
'type' => 'image',
'author' => 'user',
'mimetype' => 'jpg',
'filesize' => rand(1000000, 4000000),
'thumbnail' => "thumbnail-$basename",
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get apartments gallery
collect([
'Apartment Architecture Ceiling Chairs.jpg',
'Apartment Chair.jpg',
'Apartment Contemporary Couch Curtains.jpg',
'Brown Wooden Center Table.jpg',
'Home.jpg',
'Kitchen Appliances.jpg',
'Kitchen Island.jpg',
])
->each(function ($file) use ($user, $apartments) {
$basename = Str::random(12) . '-' . $file;
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/images/apartments/$file"), $basename, 'private');
Storage::putFileAs("files/$user->id", storage_path("demo/images/apartments/thumbnail-$file"), "thumbnail-$basename", 'private');
// Create file record
File::create([
'folder_id' => $apartments->id,
'user_id' => $user->id,
'name' => $file,
'basename' => $basename,
'type' => 'image',
'author' => 'user',
'mimetype' => 'jpg',
'filesize' => rand(1000000, 4000000),
'thumbnail' => "thumbnail-$basename",
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
// Get nature gallery
collect([
'Bird Patterncolorful Green.jpg',
'Close Up Of Peacock.jpg',
'Close Up Photography Of Tiger.jpg',
'Cold Nature Cute Ice.jpg',
'Landscape Photo of Forest.jpg',
'Photo of Hawksbill Sea Turtle.jpg',
'Photo Of Reindeer in The Snow.jpg',
'View Of Elephant in Water.jpg',
'Waterfall Between Trees.jpg',
'Wildlife Photography of Elephant During Golden Hour.jpg',
'Yellow Animal Eyes Fur.jpg',
])
->each(function ($file) use ($user, $nature) {
$basename = Str::random(12) . '-' . $file;
// Copy file into app storage
Storage::putFileAs("files/$user->id", storage_path("demo/images/nature/$file"), $basename, 'private');
Storage::putFileAs("files/$user->id", storage_path("demo/images/nature/thumbnail-$file"), "thumbnail-$basename", 'private');
// Create file record
File::create([
'folder_id' => $nature->id,
'user_id' => $user->id,
'name' => $file,
'basename' => $basename,
'type' => 'image',
'author' => 'user',
'mimetype' => 'jpg',
'filesize' => rand(1000000, 4000000),
'thumbnail' => "thumbnail-$basename",
'created_at' => now()->subMinutes(rand(1, 5)),
]);
});
}
private function create_share_records(): void
{
$user = User::whereEmail('howdy@hi5ve.digital')
->first();
$images = File::whereType('image')
->whereFolderId(null)
->take(3)
->pluck('id');
$images->each(function ($id) use ($user) {
Share::create([
'user_id' => $user->id,
'item_id' => $id,
'type' => 'file',
'is_protected' => false,
'permission' => 'editor',
'password' => null,
'expire_in' => null,
]);
});
$files = File::whereType('file')
->whereFolderId(null)
->take(2)
->pluck('id');
$files->each(function ($id) use ($user) {
Share::create([
'user_id' => $user->id,
'item_id' => $id,
'type' => 'file',
'is_protected' => false,
'permission' => 'editor',
'password' => null,
'expire_in' => null,
]);
});
}
/**
* Store main app settings into database
*/
private function store_default_settings(): void
{
// Get options
collect([
[
'name' => 'setup_wizard_database',
'value' => 1,
],
[
'name' => 'app_title',
'value' => 'VueFileManager',
],
[
'name' => 'app_description',
'value' => 'Your self-hosted storage cloud software powered by Laravel and Vue',
],
[
'name' => 'app_logo',
'value' => 'system/logo.svg',
],
[
'name' => 'app_logo_horizontal',
'value' => 'system/logo-horizontal.svg',
],
[
'name' => 'app_favicon',
'value' => 'system/favicon.png',
],
[
'name' => 'app_og_image',
'value' => 'system/og-image.jpg',
],
[
'name' => 'app_touch_icon',
'value' => 'system/touch-icon.png',
],
[
'name' => 'google_analytics',
'value' => '',
],
[
'name' => 'contact_email',
'value' => '',
],
[
'name' => 'registration',
'value' => 1,
],
[
'name' => 'payments_active',
'value' => 1,
],
[
'name' => 'storage_limitation',
'value' => 1,
],
[
'name' => 'storage_default',
'value' => 5,
],
[
'name' => 'setup_wizard_success',
'value' => 1,
],
[
'name' => 'license',
'value' => $this->license,
],
[
'name' => 'purchase_code',
'value' => '26b889eb-3602-4bf2-beb3-3sc378fcf484',
],
[
'name' => 'billing_address',
'value' => 'Palo Alto 20',
],
[
'name' => 'billing_city',
'value' => 'Palo Alto',
],
[
'name' => 'billing_country',
'value' => 'US',
],
[
'name' => 'billing_name',
'value' => 'VueFileManager Inc.',
],
[
'name' => 'billing_phone_number',
'value' => '312343141243214',
],
[
'name' => 'billing_postal_code',
'value' => '43213',
],
[
'name' => 'billing_state',
'value' => 'California',
],
[
'name' => 'billing_vat_number',
'value' => '41241241234',
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
// Get system images
collect(['logo.svg', 'logo-horizontal.svg', 'favicon.png', 'og-image.jpg', 'touch-icon.png'])
->each(function ($file) {
Storage::putFileAs('system', storage_path("demo/app/$file"), $file, 'private');
});
}
/**
* Migrate database and generate application keys
*/
private function migrate_and_generate(): void
{
// Migrate database
$this->call('migrate:fresh', [
'--force' => true,
]);
// Generate app key
$this->call('key:generate', [
'--force' => true,
]);
}
/**
* Clear app cache
*/
private function clear_cache(): void
{
$this->call('cache:clear');
$this->call('config:clear');
$this->call('view:clear');
}
}

View File

@@ -0,0 +1,100 @@
<?php
namespace App\Console\Commands;
use App\Models\Setting;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
class SetupOasisEnvironment extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'setup:oasis';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Setup Oasis demo content';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$this->info('Setting up Oasis environment');
$this->set_oasis_data();
$this->info('Dispatching jobs...');
$this->call('queue:work', [
'--stop-when-empty' => true,
]);
$this->info('Everything is done, congratulations! 🥳🥳🥳');
}
public function set_oasis_data()
{
Setting::updateOrCreate([
'name' => 'app_color',
], [
'value' => '#ae5fec',
]);
// Get system images
collect(['logo.png', 'logo-horizontal.png', 'favicon.png', 'oasis-og-image.jpg'])
->each(function ($file) {
Storage::putFileAs('system', storage_path("demo/oasis/$file"), $file, 'private');
});
collect([
[
'name' => 'app_title',
'value' => 'Oasis',
],
[
'name' => 'app_description',
'value' => 'Chytrý, bezpečný, pohodlný šanon vždy s Vámi.',
],
[
'name' => 'app_logo',
'value' => 'system/logo.png',
],
[
'name' => 'app_logo_horizontal',
'value' => 'system/logo-horizontal.png',
],
[
'name' => 'app_favicon',
'value' => 'system/favicon.png',
],
[
'name' => 'app_og_image',
'value' => 'system/oasis-og-image.jpg',
],
])->each(function ($option) {
Setting::updateOrCreate([
'name' => $option['name'],
], [
'value' => $option['value'],
]);
});
}
}

View File

@@ -1,23 +1,20 @@
<?php
namespace App\Console\Commands;
use App\Users\Models\User;
use App\Models\User;
use App\Models\Setting;
use App\Services\SetupService;
use Illuminate\Console\Command;
use Domain\Settings\Models\Setting;
use Illuminate\Foundation\Testing\WithFaker;
use Domain\Pages\Actions\SeedDefaultPagesAction;
use Domain\Settings\Actions\SeedDefaultSettingsAction;
use Domain\Localization\Actions\SeedDefaultLanguageAction;
use Domain\SetupWizard\Actions\CreateDiskDirectoriesAction;
class SetupProdEnvironment extends Command
{
use WithFaker;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'setup:prod {license=extended}';
protected $signature = 'setup:prod';
protected $license = 'Extended';
/**
* The console command description.
@@ -26,14 +23,12 @@ class SetupProdEnvironment extends Command
*/
protected $description = 'Set up production environment';
public function __construct(
private CreateDiskDirectoriesAction $createDiskDirectories,
private SeedDefaultSettingsAction $seedDefaultSettings,
private SeedDefaultLanguageAction $seedDefaultLanguage,
private SeedDefaultPagesAction $seedDefaultPages,
) {
private $setup;
public function __construct()
{
parent::__construct();
$this->setUpFaker();
$this->setup = resolve(SetupService::class);
}
/**
@@ -46,17 +41,16 @@ class SetupProdEnvironment extends Command
$this->info('Setting up production environment');
$this->info('Creating system directories...');
($this->createDiskDirectories)();
$this->setup->create_directories();
$this->info('Migrating Databases...');
$this->migrate_and_generate();
$this->info('Storing default settings and content...');
$this->store_default_settings();
($this->seedDefaultPages)();
($this->seedDefaultSettings)($this->argument('license'));
($this->seedDefaultLanguage)();
$this->setup->seed_default_pages();
$this->setup->seed_default_settings($this->license);
$this->setup->seed_default_language();
$this->info('Creating default admin...');
$this->create_admin();
@@ -64,13 +58,6 @@ class SetupProdEnvironment extends Command
$this->info('Clearing application cache...');
$this->clear_cache();
$this->info('Dispatching jobs...');
$this->call('queue:work', [
'--stop-when-empty' => true,
]);
$this->warn('Please make sure your current host/domain where you are running app is included in your .env SANCTUM_STATEFUL_DOMAINS variable.');
$this->info('Everything is done, congratulations! 🥳🥳🥳');
}
@@ -82,8 +69,8 @@ class SetupProdEnvironment extends Command
// Get options
collect([
[
'name' => 'app_color',
'value' => '#00BC7E',
'name' => 'setup_wizard_database',
'value' => 1,
],
[
'name' => 'app_title',
@@ -97,18 +84,10 @@ class SetupProdEnvironment extends Command
'name' => 'app_logo',
'value' => null,
],
[
'name' => 'app_logo_dark',
'value' => null,
],
[
'name' => 'app_logo_horizontal',
'value' => null,
],
[
'name' => 'app_logo_horizontal_dark',
'value' => null,
],
[
'name' => 'app_favicon',
'value' => null,
@@ -133,29 +112,21 @@ class SetupProdEnvironment extends Command
'name' => 'registration',
'value' => 0,
],
[
'name' => 'user_verification',
'value' => 1,
],
[
'name' => 'storage_limitation',
'value' => 1,
],
[
'name' => 'default_max_storage_amount',
'name' => 'storage_default',
'value' => 5,
],
[
'name' => 'default_max_team_member',
'value' => 10,
],
[
'name' => 'setup_wizard_success',
'value' => 1,
],
[
'name' => 'license',
'value' => $this->argument('license'),
'value' => $this->license,
],
[
'name' => 'purchase_code',
@@ -193,30 +164,12 @@ class SetupProdEnvironment extends Command
'name' => 'billing_vat_number',
'value' => null,
],
[
'name' => 'allowed_recaptcha',
'value' => 0,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
if ($this->argument('license') === 'extended') {
$choice = $this->choice('Choose subscription type', [
'metered' => 'Metered',
'fixed' => 'Fixed',
'none' => 'None',
]);
Setting::updateOrCreate([
'name' => 'subscription_type',
], [
'value' => $choice,
]);
}
}
/**
@@ -225,24 +178,16 @@ class SetupProdEnvironment extends Command
private function create_admin(): void
{
$user = User::forceCreate([
'role' => 'admin',
'email' => 'howdy@hi5ve.digital',
'password' => bcrypt('vuefilemanager'),
'email_verified_at' => now(),
'role' => 'admin',
'email' => 'howdy@hi5ve.digital',
'password' => bcrypt('vuefilemanager'),
]);
$user
->settings()
->create([
'first_name' => 'Jane',
'last_name' => 'Doe',
'address' => $this->faker->address,
'state' => $this->faker->state,
'city' => $this->faker->city,
'postal_code' => $this->faker->postcode,
'country' => $this->faker->randomElement(['SK', 'CZ', 'DE', 'FR']),
'phone_number' => $this->faker->phoneNumber,
'timezone' => $this->faker->randomElement(['+1.0', '+2.0', '+3.0']),
'storage_capacity' => 5,
'name' => 'Admin',
]);
// Show user credentials
@@ -263,12 +208,6 @@ class SetupProdEnvironment extends Command
$this->call('key:generate', [
'--force' => true,
]);
$currentHost = request()->getHost() . ',' . request()->getHost() . ':' . request()->getPort();
setEnvironmentValue([
'SANCTUM_STATEFUL_DOMAINS' => "localhost,localhost:8000,127.0.0.1,127.0.0.1:8000,::1,$currentHost",
]);
}
/**

77
app/Console/Kernel.php Normal file
View File

@@ -0,0 +1,77 @@
<?php
namespace App\Console;
use App\Services\SchedulerService;
use App\Services\Oasis\OasisService;
use Illuminate\Console\Scheduling\Schedule;
use App\Console\Commands\SetupDevEnvironment;
use App\Console\Commands\SetupProdEnvironment;
use App\Console\Commands\SetupOasisEnvironment;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
SetupDevEnvironment::class,
SetupProdEnvironment::class,
SetupOasisEnvironment::class,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$scheduler = resolve(SchedulerService::class);
$schedule->call(function () use ($scheduler) {
$scheduler->delete_expired_shared_links();
})->everyTenMinutes();
$schedule->call(function () use ($scheduler) {
$scheduler->delete_old_zips();
if (! is_storage_driver(['local'])) {
$scheduler->delete_failed_files();
}
})->everySixHours();
// Oasis Drive
$schedule->call(function () {
resolve(OasisService::class)->order_reminder();
})->hourly();
// Run queue jobs every minute
$schedule->command('queue:work --stop-when-empty')
->everyMinute()
->withoutOverlapping();
// Backup app database daily
$schedule->command('backup:clean')
->daily()
->at('01:00');
$schedule->command('backup:run --only-db')
->daily()
->at('01:30');
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__ . '/Commands');
require base_path('routes/console.php');
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\User;
use ByteUnits\Metric;
use App\Services\StripeService;
use Laravel\Cashier\Subscription;
use App\Http\Controllers\Controller;
use App\Http\Resources\UsersCollection;
class DashboardController extends Controller
{
private StripeService $stripe;
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Get data for dashboard
*
* @return array
*/
public function index()
{
// Get total premium users
$premium_users = Subscription::whereStripeStatus('active')
->count();
// Get total storage usage
$storage_usage = Metric::bytes(
\DB::table('files')->sum('filesize')
)->format();
return [
'license' => get_setting('license'),
'app_version' => config('vuefilemanager.version'),
'total_users' => User::count(),
'total_used_space' => $storage_usage,
'total_premium_users' => $premium_users,
];
}
/**
* Get the newest users
*
* @return UsersCollection
*/
public function newbies()
{
return new UsersCollection(
User::sortable(['created_at' => 'desc'])
->paginate(10)
);
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Invoice;
use App\Services\StripeService;
use App\Http\Controllers\Controller;
use App\Http\Resources\InvoiceResource;
use App\Http\Resources\InvoiceAdminCollection;
class InvoiceController extends Controller
{
private StripeService $stripe;
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Get all invoices
*
* @return InvoiceAdminCollection
*/
public function index()
{
return new InvoiceAdminCollection(
$this->stripe->getInvoices()['data']
);
}
/**
* Get single invoice by invoice $token
*
* @param $customer
* @param $token
* @return InvoiceResource|\Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
*/
public function show($customer, $token)
{
return view('vuefilemanager.invoice')
->with('settings', get_settings_in_json())
->with('invoice', $this->stripe->getUserInvoice($customer, $token));
}
}

View File

@@ -0,0 +1,138 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Setting;
use App\Models\Language;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use App\Http\Resources\LanguageResource;
use App\Http\Resources\LanguageCollection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\Languages\UpdateStringRequest;
use App\Http\Requests\Languages\CreateLanguageRequest;
use App\Http\Requests\Languages\UpdateLanguageRequest;
class LanguageController extends Controller
{
/**
* Get all languages for admin translate
*
* @return array|Application|ResponseFactory|Response
*/
public function get_languages()
{
return response(
new LanguageCollection(Language::sortable(['created_at', 'DESC'])->get()),
200
);
}
/**
* Get all language strings for admin translate
*
* @param Language $language
*/
public function get_language(Language $language)
{
return response(
new LanguageResource($language),
200
);
}
/**
* Create new language
*
* @param CreateLanguageRequest $request
* @return string
*/
public function create_language(CreateLanguageRequest $request)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$language = Language::create([
'name' => $request->input('name'),
'locale' => $request->input('locale'),
]);
return response(
new LanguageResource($language),
201
);
}
/**
* Update language
*
* @param UpdateLanguageRequest $request
* @param Language $language
*/
public function update_language(UpdateLanguageRequest $request, Language $language)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$language->update(make_single_input($request));
return response(
new LanguageResource($language),
201
);
}
/**
* Update string for language
*
* @param UpdateStringRequest $request
* @param Language $language
* @return Application|ResponseFactory|Response
*/
public function update_string(UpdateStringRequest $request, Language $language)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$language
->languageTranslations()
->where('key', $request->name)
->update([
'value' => $request->value,
]);
cache()->forget("language-translations-{$language->locale}");
return response(
'Done',
204
);
}
/**
* Delete the language with all children strings
* @param Language $language
* @return Response
*/
public function delete_language(Language $language): Response
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
abort_if($language->locale === 'en', 401, "Sorry, you can't delete default language.");
// If user try to delete language used as default,
// then set en language as default
if ($language->locale === get_setting('language')) {
Setting::whereName('language')->first()
->update(['value' => 'en']);
}
$language->delete();
return response(
'Done',
204
);
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Page;
use Illuminate\Http\Request;
use App\Services\DemoService;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use App\Http\Resources\PageResource;
use App\Http\Resources\PageCollection;
use Illuminate\Contracts\Routing\ResponseFactory;
class PagesController extends Controller
{
private $demo;
public function __construct()
{
$this->demo = resolve(DemoService::class);
}
/**
* Get all pages
*
* @return PageCollection
*/
public function index()
{
return new PageCollection(
Page::sortable()
->paginate(10)
);
}
/**
* Get single page resource
*
* @param $page
* @return PageResource
*/
public function show(Page $page)
{
return new PageResource($page);
}
/**
* Update page content
*
* @param Request $request
* @param Page $page
* @return ResponseFactory|Response
*/
public function update(Request $request, Page $page)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$page->update(
make_single_input($request)
);
return response(new PageResource($page), 204);
}
}

View File

@@ -0,0 +1,158 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Plan;
use App\Models\User;
use Illuminate\Http\Request;
use App\Services\DemoService;
use Illuminate\Http\Response;
use App\Services\StripeService;
use Laravel\Cashier\Subscription;
use App\Http\Controllers\Controller;
use App\Http\Resources\PlanResource;
use Illuminate\Support\Facades\Cache;
use App\Http\Resources\PlanCollection;
use App\Http\Resources\UsersCollection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
class PlanController extends Controller
{
private StripeService $stripe;
private DemoService $demo;
public function __construct()
{
$this->stripe = resolve(StripeService::class);
$this->demo = resolve(DemoService::class);
}
/**
* Get all plans
*
* @return PlanCollection|Application|ResponseFactory|Response
*/
public function index()
{
// Store or Get plans to cache
if (Cache::has('plans')) {
$plans = Cache::get('plans');
} else {
$plans = Cache::rememberForever('plans', function () {
return $this->stripe->getPlans();
});
}
return response(new PlanCollection($plans), 200);
}
/**
* Get plan record
*
* @param $id
* @return PlanResource|Application|ResponseFactory|Response
*/
public function show($id)
{
// Store or Get plan to cache
if (Cache::has('plan-' . $id)) {
$plan = Cache::get('plan-' . $id);
} else {
$plan = Cache::rememberForever('plan-' . $id, function () use ($id) {
return $this->stripe->getPlan($id);
});
}
return response(new PlanResource($plan), 200);
}
/**
* Create new plan
*
* @param Request $request
* @return PlanResource|Application|ResponseFactory|Response
*/
public function store(Request $request)
{
// TODO: inline request
if (is_demo()) {
if (Cache::has('plan-starter-pack')) {
$plan = Cache::get('plan-starter-pack');
} else {
$plan = Cache::rememberForever('plan-starter-pack', function () {
return $this->stripe->getPlan('starter-pack');
});
}
return new PlanResource($plan);
}
$plan = new PlanResource(
$this->stripe->createPlan($request)
);
// Clear cached plans
cache_forget_many(['plans', 'pricing']);
return response($plan, 201);
}
/**
* Update plan attribute
*
* @param Request $request
* @param $id
* @return ResponseFactory|Response
*/
public function update(Request $request, $id)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
// Update plan
$this->stripe->updatePlan($request, $id);
// Clear cached plans
cache_forget_many(['plans', 'pricing', 'plan-' . $id]);
return response('Saved!', 201);
}
/**
* Delete plan
*
* @param $id
* @return ResponseFactory|Response
*/
public function delete($id)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
// Delete plan
$this->stripe->deletePlan($id);
// Clear cached plans
cache_forget_many(['plans', 'pricing']);
return response('Done!', 204);
}
/**
* Get subscriptions
*
* @param $id
* @return mixed
*/
public function subscribers($id)
{
$subscribers = Subscription::whereStripePlan($id)
->pluck('user_id');
return new UsersCollection(
User::sortable()
->findMany($subscribers)
);
}
}

View File

@@ -0,0 +1,182 @@
<?php
namespace App\Http\Controllers\Admin;
use Stripe;
use Artisan;
use App\Models\Setting;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Http\Controllers\Controller;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SettingController extends Controller
{
private $demo;
public function __construct()
{
$this->demo = resolve(DemoService::class);
}
/**
* Get table content
*
* @param Request $request
* @return mixed
*/
public function show(Request $request)
{
if (strpos($request->column, '|') !== false) {
$columns = explode('|', $request->column);
return Setting::whereIn('name', $columns)
->pluck('value', 'name');
}
return Setting::where('name', $request->column)
->pluck('value', 'name');
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
// Store image if exist
if ($request->hasFile($request->name)) {
// Find and update image path
Setting::updateOrCreate([
'name' => $request->name,
], [
'value' => store_system_image($request, $request->name),
]);
return response('Done', 204);
}
// Find and update variable
Setting::updateOrCreate(
['name' => $request->name],
['value' => $request->value]
);
return response('Done', 204);
}
/**
* Set new email credentials to .env file
*
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function set_email(Request $request)
{
// TODO: pridat validator do requestu
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
if (! app()->runningUnitTests()) {
setEnvironmentValue([
'MAIL_DRIVER' => $request->driver,
'MAIL_HOST' => $request->host,
'MAIL_PORT' => $request->port,
'MAIL_USERNAME' => $request->username,
'MAIL_PASSWORD' => $request->password,
'MAIL_ENCRYPTION' => $request->encryption,
]);
// Clear config cache
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
/**
* Configure stripe additionally
*
* @param Request $request
*/
public function set_stripe(Request $request)
{
// TODO: pridat validator do requestu
// Check payment setup status
if (get_setting('payments_configured')) {
abort(401, 'Gone');
}
// Try to get stripe account details
try {
if (! app()->runningUnitTests()) {
Stripe::make($request->secret, '2020-03-02')
->account()
->details();
}
} catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage());
}
// Get options
collect([
[
'name' => 'stripe_currency',
'value' => $request->currency,
],
[
'name' => 'payments_configured',
'value' => 1,
],
[
'name' => 'payments_active',
'value' => 1,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
if (! app()->runningUnitTests()) {
// Set stripe credentials to .env
setEnvironmentValue([
'CASHIER_CURRENCY' => $request->currency,
'STRIPE_KEY' => $request->key,
'STRIPE_SECRET' => $request->secret,
'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
]);
// Clear cache
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
/**
* Clear application cache
*/
public function flush_cache()
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
if (! app()->runningUnitTests()) {
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
}

View File

@@ -0,0 +1,230 @@
<?php
namespace App\Http\Controllers\Admin;
use Storage;
use App\Models\User;
use App\Models\UserSettings;
use Illuminate\Http\Response;
use App\Services\StripeService;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use Illuminate\Support\Facades\Auth;
use App\Http\Resources\UsersCollection;
use App\Http\Resources\UserSubscription;
use Illuminate\Support\Facades\Password;
use App\Http\Resources\InvoiceCollection;
use App\Http\Resources\UserStorageResource;
use App\Http\Requests\Admin\ChangeRoleRequest;
use App\Http\Requests\Admin\CreateUserByAdmin;
use App\Http\Requests\Admin\DeleteUserRequest;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\Admin\ChangeStorageCapacityRequest;
class UserController extends Controller
{
private StripeService $stripe;
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Get user details
*
* @param User $user
* @return UserResource
*/
public function details(User $user)
{
return new UserResource(
$user
);
}
/**
* Get user storage details
*
* @param User $user
* @return UserStorageResource
*/
public function storage(User $user)
{
return new UserStorageResource(
$user
);
}
/**
* Get user storage details
*
* @param User $user
* @return InvoiceCollection
*/
public function invoices(User $user)
{
return new InvoiceCollection(
$this
->stripe
->getUserInvoices($user)
);
}
/**
* Get user subscription details
*
* @param User $user
* @return UserSubscription|Application|ResponseFactory|Response
*/
public function subscription(User $user)
{
if (! $user->stripeId() || ! $user->subscription('main')) {
return response("User doesn't have any subscription.", 404);
}
return new UserSubscription(
$user
);
}
/**
* Get all users
*
* @return UsersCollection
*/
public function users()
{
return new UsersCollection(
User::sortable(['created_at', 'DESC'])
->paginate(20)
);
}
/**
* Change user role
*
* @param ChangeRoleRequest $request
* @param User $user
* @return UserResource
*/
public function change_role(ChangeRoleRequest $request, User $user)
{
// Demo preview
if (is_demo_account('howdy@hi5ve.digial')) {
return new UserResource($user);
}
// Update user role
$user->role = $request->input('attributes.role');
$user->save();
return new UserResource(
$user
);
}
/**
* Change user storage capacity
*
* @param ChangeStorageCapacityRequest $request
* @param User $user
* @return UserStorageResource
*/
public function change_storage_capacity(ChangeStorageCapacityRequest $request, User $user)
{
$user
->settings()
->update(
$request->input('attributes')
);
return new UserStorageResource(
$user
);
}
/**
* Send user password reset link
*
* @param User $user
* @return ResponseFactory|Response
*/
public function reset_password(User $user)
{
// Demo preview
if (is_demo()) {
return response('Done!', 204);
}
// Get password token
$token = Password::getRepository()
->create($user);
// Send user email
$user->sendPasswordResetNotification($token);
return response('Done!', 204);
}
/**
* Create new user by admin
*
* @param CreateUserByAdmin $request
* @return UserResource|Application|ResponseFactory|Response
*/
public function create_user(CreateUserByAdmin $request)
{
// Create user
$user = User::forceCreate([
'role' => $request->role,
'email' => $request->email,
'password' => bcrypt($request->password),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $request->name,
'avatar' => store_avatar($request, 'avatar'),
'storage_capacity' => $request->storage_capacity,
]);
UserSettings::reguard();
return response(new UserResource($user), 201);
}
/**
* Delete user with all user data
*
* @param DeleteUserRequest $request
* @param User $user
* @return ResponseFactory|Response
* @throws \Exception
*/
public function delete_user(DeleteUserRequest $request, User $user)
{
if (is_demo()) {
return response('Done!', 204);
}
if ($user->subscribed('main')) {
abort(202, "You can\'t delete this account while user have active subscription.");
}
if ($user->id === Auth::id()) {
abort(406, "You can\'t delete your account");
}
if ($user->settings->name !== $request->name) {
abort(403, 'The name you typed is wrong!');
}
$user->delete();
return response('Done!', 204);
}
}

View File

@@ -0,0 +1,202 @@
<?php
namespace App\Http\Controllers\App;
use App\Models\Page;
use App\Models\Share;
use App\Models\Setting;
use App\Models\Language;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Services\StripeService;
use App\Http\Controllers\Controller;
use App\Http\Resources\PageResource;
use Illuminate\Support\Facades\Mail;
use App\Http\Mail\SendContactMessage;
use Illuminate\Support\Facades\Cache;
use Doctrine\DBAL\Driver\PDOException;
use Illuminate\Database\QueryException;
use App\Http\Resources\PricingCollection;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Requests\PublicPages\SendContactMessageRequest;
class AppFunctionsController extends Controller
{
/**
* List of allowed settings to get from public request
*
* @var array
*/
private array $blacklist = [
'purchase_code',
'license',
];
private StripeService $stripe;
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Show index page
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
try {
// Try to connect to database
\DB::getPdo();
// Get setup status
$setup_status = get_setup_status();
// Get app pages
$pages = Page::all();
// Get all settings
$settings = get_settings_in_json();
} catch (PDOException $e) {
$setup_status = 'setup-database';
}
return view('index')
->with('settings', $settings ?? null)
->with('legal', $pages ?? null)
->with('installation', $setup_status);
}
/**
* Get og site for web crawlers
*
* @param Share $shared
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
*/
public function og_site(Share $shared)
{
// Get file/folder record
$item = ('App\\Models\\' . ucfirst($shared->type))
::where('user_id', $shared->user->id)
->where('id', $shared->item_id)
->first();
if ($item->thumbnail) {
$item->setPublicUrl($shared->token);
}
return view('vuefilemanager.crawler.og-view')
->with('settings', get_settings_in_json())
->with('metadata', [
'url' => url('/share', ['token' => $shared->token]),
'is_protected' => $shared->is_protected,
'user' => $shared->user->settings->name,
'name' => $item->name,
'size' => $shared->type === 'folder'
? $item->items
: $item->filesize,
'thumbnail' => $item->thumbnail ?? null,
]);
}
/**
* Send contact message from pages
*
* @param SendContactMessageRequest $request
* @return ResponseFactory|Response
*/
public function contact_form(SendContactMessageRequest $request)
{
Mail::to(
get_setting('contact_email')
)->send(
new SendContactMessage($request->all())
);
return response('Done', 201);
}
/**
* Get single page content
*
* @param Page $page
* @return PageResource
*/
public function get_page(Page $page)
{
return new PageResource($page);
}
/**
* Get selected settings from public route
*
* @param Request $request
* @return mixed
*/
public function get_setting_columns(Request $request)
{
if (strpos($request->column, '|') !== false) {
$columns = collect(explode('|', $request->column))
->each(function ($column) {
if (in_array($column, $this->blacklist)) {
abort(401);
}
});
return Setting::whereIn('name', $columns)
->pluck('value', 'name');
}
if (in_array($request->column, $this->blacklist)) {
abort(401);
}
return Setting::where('name', $request->column)
->pluck('value', 'name');
}
/**
* Get all active storage plans
*
* @return PricingCollection
*/
public function get_storage_plans()
{
// Get pricing from cache
$pricing = Cache::rememberForever('pricing', function () {
return $this->stripe->getActivePlans();
});
// Format pricing to collection
$collection = new PricingCollection($pricing);
// Sort and return pricing
return $collection
->sortBy('product.metadata.capacity')
->values()
->all();
}
/**
* Get language translations for frontend app
*/
public function get_translations($lang)
{
$translations = cache()
->rememberForever("language-translations-$lang", function () use ($lang) {
try {
return Language::whereLocale($lang)
->firstOrFail()
->languageTranslations;
} catch (QueryException | ModelNotFoundException $e) {
return null;
}
});
return $translations
? map_language_translations($translations)
: get_default_language_translations();
}
}

View File

@@ -0,0 +1,84 @@
<?php
namespace App\Http\Controllers\App;
use Gate;
use Artisan;
use App\Models\Language;
use Illuminate\Http\Response;
use App\Services\LanguageService;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
class Maintenance extends Controller
{
/**
* Start maintenance mode
*/
public function up()
{
// Check admin permission
Gate::authorize('maintenance');
$command = Artisan::call('up');
if ($command === 0) {
echo 'System is in production mode';
}
}
/**
* End maintenance mode
*/
public function down()
{
// Check admin permission
Gate::authorize('maintenance');
$command = Artisan::call('down');
if ($command === 0) {
echo 'System is in maintenance mode';
}
}
/**
* Get new language translations from default translations
* and insert it into database
*
* @return Application|ResponseFactory|Response
*/
public function upgrade_translations()
{
// Check admin permission
Gate::authorize('maintenance');
resolve(LanguageService::class)
->upgrade_language_translations();
return response('Done.', 201);
}
/**
* @return int|mixed
*/
public function upgrade_database()
{
// Check admin permission
Gate::authorize('maintenance');
$command = Artisan::call('migrate', [
'--force' => true,
]);
if ($command === 0) {
echo 'Operation was successful.';
}
if ($command === 1) {
echo 'Operation failed.';
}
return $command;
}
}

View File

@@ -0,0 +1,479 @@
<?php
namespace App\Http\Controllers\App;
use Schema;
use Stripe;
use Artisan;
use App\Models\User;
use App\Models\Setting;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Services\SetupService;
use App\Services\StripeService;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Doctrine\DBAL\Driver\PDOException;
use Illuminate\Contracts\Routing\ResponseFactory;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use App\Http\Requests\SetupWizard\StoreAppSetupRequest;
use Symfony\Component\HttpKernel\Exception\HttpException;
use App\Http\Requests\SetupWizard\StoreStripePlansRequest;
use App\Http\Requests\SetupWizard\StoreStripeBillingRequest;
use App\Http\Requests\SetupWizard\StoreEnvironmentSetupRequest;
use App\Http\Requests\SetupWizard\StoreStripeCredentialsRequest;
use App\Http\Requests\SetupWizard\StoreDatabaseCredentialsRequest;
class SetupWizardController extends Controller
{
/**
* Inject Stripe Service
*/
public function __construct()
{
$this->stripe = resolve(StripeService::class);
$this->setup = resolve(SetupService::class);
$this->check_setup_status();
}
/**
* Verify Envato purchase code
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response|mixed
*/
public function verify_purchase_code(Request $request)
{
// Verify purchase code
$response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode);
if ($response->successful()) {
return response($response, 204);
}
return response('Purchase code is invalid.', 400);
}
/**
* Set up database credentials
*
* @param StoreDatabaseCredentialsRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function setup_database(StoreDatabaseCredentialsRequest $request)
{
if (! app()->runningUnitTests()) {
try {
// Set temporary database connection
config(['database.connections.test.driver' => $request->connection]);
config(['database.connections.test.host' => $request->host]);
config(['database.connections.test.port' => $request->port]);
config(['database.connections.test.database' => $request->name]);
config(['database.connections.test.username' => $request->username]);
config(['database.connections.test.password' => $request->password]);
// Test connection
\DB::connection('test')->getPdo();
} catch (PDOException $e) {
throw new HttpException(500, $e->getMessage());
}
// TODO: add SANCTUM_STATEFUL_DOMAINS parameter
setEnvironmentValue([
'DB_CONNECTION' => $request->connection,
'DB_HOST' => $request->host,
'DB_PORT' => $request->port,
'DB_DATABASE' => $request->name,
'DB_USERNAME' => $request->username,
'DB_PASSWORD' => $request->password,
]);
Artisan::call('config:cache');
Artisan::call('key:generate', [
'--force' => true,
]);
Artisan::call('migrate:fresh', [
'--force' => true,
]);
}
// Store setup wizard progress
Setting::forceCreate([
'name' => 'setup_wizard_database',
'value' => 1,
]);
return response('Done', 204);
}
/**
* Store and test stripe credentials
*
* @param StoreStripeCredentialsRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function store_stripe_credentials(StoreStripeCredentialsRequest $request)
{
if (! app()->runningUnitTests()) {
// Create stripe instance
$stripe = Stripe::make($request->secret, '2020-03-02');
try {
// Try to get stripe account details
$stripe->account()->details();
} catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage());
}
}
// Set settings
collect([
[
'name' => 'stripe_currency',
'value' => $request->currency,
],
[
'name' => 'payments_configured',
'value' => 1,
],
[
'name' => 'payments_active',
'value' => 1,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
if (! app()->runningUnitTests()) {
// Set stripe credentials to .env
setEnvironmentValue([
'CASHIER_CURRENCY' => $request->currency,
'STRIPE_KEY' => $request->key,
'STRIPE_SECRET' => $request->secret,
'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
]);
// Clear cache
Artisan::call('config:cache');
}
return response('Done', 204);
}
/**
* Store Stripe billings
*
* @param StoreStripeBillingRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function store_stripe_billings(StoreStripeBillingRequest $request)
{
// Get options
collect([
[
'name' => 'billing_phone_number',
'value' => $request->billing_phone_number,
],
[
'name' => 'billing_postal_code',
'value' => $request->billing_postal_code,
],
[
'name' => 'billing_vat_number',
'value' => $request->billing_vat_number,
],
[
'name' => 'billing_address',
'value' => $request->billing_address,
],
[
'name' => 'billing_country',
'value' => $request->billing_country,
],
[
'name' => 'billing_state',
'value' => $request->billing_state,
],
[
'name' => 'billing_city',
'value' => $request->billing_city,
],
[
'name' => 'billing_name',
'value' => $request->billing_name,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
if (! app()->runningUnitTests()) {
Artisan::call('config:cache');
}
return response('Done', 204);
}
/**
* Create Stripe subscription plan
*
* @param StoreStripePlansRequest $request
* @return \Illuminate\Contracts\Foundation\Application|ResponseFactory|\Illuminate\Http\Response
*/
public function store_stripe_plans(StoreStripePlansRequest $request)
{
foreach ($request->plans as $plan) {
$this->stripe->createPlan($plan);
}
return response('Done', 204);
}
/**
* Store environment setup
*
* @param StoreEnvironmentSetupRequest $request
* @return string
*/
public function store_environment_setup(StoreEnvironmentSetupRequest $request)
{
if (! app()->runningUnitTests()) {
$drivers = [
'local' => [
'FILESYSTEM_DRIVER' => 'local',
],
's3' => [
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
'AWS_ACCESS_KEY_ID' => $request->storage['key'] ?? null,
'AWS_SECRET_ACCESS_KEY' => $request->storage['secret'] ?? null,
'AWS_DEFAULT_REGION' => $request->storage['region'] ?? null,
'AWS_BUCKET' => $request->storage['bucket'] ?? null,
],
'spaces' => [
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
'DO_SPACES_KEY' => $request->storage['key'] ?? null,
'DO_SPACES_SECRET' => $request->storage['secret'] ?? null,
'DO_SPACES_ENDPOINT' => $request->storage['endpoint'] ?? null,
'DO_SPACES_REGION' => $request->storage['region'] ?? null,
'DO_SPACES_BUCKET' => $request->storage['bucket'] ?? null,
],
'wasabi' => [
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
'WASABI_KEY' => $request->storage['key'] ?? null,
'WASABI_SECRET' => $request->storage['secret'] ?? null,
'WASABI_ENDPOINT' => $request->storage['endpoint'] ?? null,
'WASABI_REGION' => $request->storage['region'] ?? null,
'WASABI_BUCKET' => $request->storage['bucket'] ?? null,
],
'backblaze' => [
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
'BACKBLAZE_KEY' => $request->storage['key'] ?? null,
'BACKBLAZE_SECRET' => $request->storage['secret'] ?? null,
'BACKBLAZE_ENDPOINT' => $request->storage['endpoint'] ?? null,
'BACKBLAZE_REGION' => $request->storage['region'] ?? null,
'BACKBLAZE_BUCKET' => $request->storage['bucket'] ?? null,
],
'oss' => [
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
'OSS_ACCESS_KEY_ID' => $request->storage['key'] ?? null,
'OSS_SECRET_ACCESS_KEY' => $request->storage['secret'] ?? null,
'OSS_ENDPOINT' => $request->storage['endpoint'] ?? null,
'OSS_REGION' => $request->storage['region'] ?? null,
'OSS_BUCKET' => $request->storage['bucket'] ?? null,
],
];
// Storage credentials for storage
setEnvironmentValue(
$drivers[$request->storage['driver']]
);
// Store credentials for mail
// TODO: add options for mailgun
setEnvironmentValue([
'MAIL_DRIVER' => $request->mail['driver'],
'MAIL_HOST' => $request->mail['host'],
'MAIL_PORT' => $request->mail['port'],
'MAIL_USERNAME' => $request->mail['username'],
'MAIL_PASSWORD' => $request->mail['password'],
'MAIL_ENCRYPTION' => $request->mail['encryption'],
]);
Artisan::call('config:cache');
}
return response('Done', 204);
}
/**
* Store app settings
* @param StoreAppSetupRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function store_app_settings(StoreAppSetupRequest $request)
{
// Get options
collect([
[
'name' => 'app_title',
'value' => $request->title,
],
[
'name' => 'app_description',
'value' => $request->description,
],
[
'name' => 'app_logo',
'value' => store_system_image($request, 'logo'),
],
[
'name' => 'app_logo_horizontal',
'value' => store_system_image($request, 'logo_horizontal'),
],
[
'name' => 'app_favicon',
'value' => store_system_image($request, 'favicon'),
],
[
'name' => 'app_og_image',
'value' => store_system_image($request, 'og_image'),
],
[
'name' => 'app_touch_icon',
'value' => store_system_image($request, 'touch_icon'),
],
[
'name' => 'google_analytics',
'value' => $request->googleAnalytics,
],
[
'name' => 'contact_email',
'value' => $request->contactMail,
],
[
'name' => 'registration',
'value' => $request->userRegistration,
],
[
'name' => 'storage_limitation',
'value' => $request->storageLimitation,
],
[
'name' => 'storage_default',
'value' => $request->defaultStorage ?? 5,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
if (! app()->runningUnitTests()) {
setEnvironmentValue([
'APP_NAME' => Str::camel($request->title),
]);
}
return response('Done', 204);
}
/**
* Create and login admin account
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response
*/
public function create_admin_account(Request $request)
{
// Validate request
// TODO: validator do requestu
$request->validate([
'email' => 'required|string|email|unique:users',
'password' => 'required|string|min:6|confirmed',
'name' => 'required|string',
'purchase_code' => 'required|string',
'license' => 'required|string',
'avatar' => 'sometimes|file',
]);
// Create user
$user = User::forceCreate([
'role' => 'admin',
'email' => $request->email,
'password' => bcrypt($request->password),
]);
$user
->settings()
->create([
'storage_capacity' => get_setting('storage_default') ?? 5,
'avatar' => store_avatar($request, 'avatar'),
'name' => $request->name,
]);
collect([
[
'name' => 'setup_wizard_success',
'value' => 1,
],
[
'name' => 'license',
'value' => $request->license,
],
[
'name' => 'purchase_code',
'value' => $request->purchase_code,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
// Set up application
$this->setup->seed_default_pages();
$this->setup->seed_default_settings($request->license);
$this->setup->seed_default_language();
// Login account
if (Auth::attempt($request->only(['email', 'password']))) {
$request->session()->regenerate();
return response('Registration was successful', 204);
}
return response('Something went wrong', 500);
}
/**
* Get setup wizard status
*
* @return false | null
*/
private function check_setup_status()
{
try {
// Check database connections
DB::getPdo();
// Get setup_wizard status
if (Schema::hasTable('settings') && get_setting('setup_wizard_success')) {
abort(410, 'Gone');
}
} catch (PDOException $e) {
return false;
}
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Models\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\CheckAccountRequest;
class AuthController extends Controller
{
/**
* Check if user account exist
*
* @param CheckAccountRequest $request
* @return mixed
*/
public function check_account(CheckAccountRequest $request)
{
// Get User
$user = User::whereEmail($request->email)
->first();
if (! $user) {
return response(__t('user_not_fount'), 404);
}
return [
'name' => $user->settings->name,
'avatar' => $user->settings->avatar,
];
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Controllers;
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Controllers;
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Controllers;
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Controllers;
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Controllers;
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;

View File

@@ -0,0 +1,215 @@
<?php
namespace App\Http\Controllers\FileManager;
use App\Models\File;
use App\Models\User;
use App\Models\Share;
use App\Models\Folder;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\FileBrowser\SearchRequest;
class BrowseController extends Controller
{
/**
* Get directory with files
*
* @param Request $request
* @param $id
* @return Collection
*/
public function folder(Request $request, $id)
{
$root_id = $id === 'undefined' ? null : $id;
// Get folder trash items
if ($request->query('trash')) {
// Get folders and files
$folders = Folder::onlyTrashed()
->with('parent')
->where('parent_id', $root_id)
->sortable()
->get();
$files = File::onlyTrashed()
->with('parent')
->where('folder_id', $root_id)
->sortable()
->get();
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
// Get folders and files
$folders = Folder::with(['parent:id,name', 'shared:token,id,item_id,permission,is_protected,expire_in'])
->where('parent_id', $root_id)
->where('user_id', Auth::id())
->sortable()
->get();
$files = File::with(['parent:id,name', 'shared:token,id,item_id,permission,is_protected,expire_in'])
->where('folder_id', $root_id)
->where('user_id', Auth::id())
->sortable()
->get();
// Collect folders and files to single array
return collect([$folders, $files])
->collapse();
}
/**
* Get latest user uploads
*
* @return mixed
*/
public function latest()
{
$user = User::with(['latest_uploads' => function ($query) {
$query->sortable(['created_at' => 'desc']);
}])
->where('id', Auth::id())
->first();
return $user->latest_uploads;
}
/**
* Get trashed files
*
* @return Collection
*/
public function trash()
{
$user_id = Auth::id();
// Get folders and files
$folders_trashed = Folder::onlyTrashed()
->with(['trashed_folders', 'parent'])
->where('user_id', $user_id)
->get(['parent_id', 'id', 'name']);
$folders = Folder::onlyTrashed()
->with(['parent'])
->where('user_id', $user_id)
->whereIn('id', filter_folders_ids($folders_trashed))
->sortable()
->get();
// Get files trashed
$files_trashed = File::onlyTrashed()
->with(['parent'])
->where('user_id', $user_id)
->where(function ($query) use ($folders_trashed) {
$query->whereNull('folder_id');
$query->orWhereNotIn('folder_id', array_values(array_unique(recursiveFind($folders_trashed->toArray(), 'id'))));
})
->sortable()
->get();
// Collect folders and files to single array
return collect([$folders, $files_trashed])
->collapse();
}
/**
* Get user shared items
*
* @return Collection
*/
public function shared()
{
$user_id = Auth::id();
// Get shared folders and files
$folder_ids = Share::where('user_id', $user_id)
->where('type', 'folder')
->pluck('item_id');
$file_ids = Share::where('user_id', $user_id)
->where('type', '!=', 'folder')
->pluck('item_id');
// Get folders and files
$folders = Folder::with(['parent', 'shared:token,id,item_id,permission,is_protected,expire_in'])
->where('user_id', $user_id)
->whereIn('id', $folder_ids)
->sortable()
->get();
$files = File::with(['parent', 'shared:token,id,item_id,permission,is_protected,expire_in'])
->where('user_id', $user_id)
->whereIn('id', $file_ids)
->sortable()
->get();
// Collect folders and files to single array
return collect([$folders, $files])
->collapse();
}
/**
* Get participant uploads
*
* @return mixed
*/
public function participant_uploads()
{
return File::with(['parent'])
->where('user_id', Auth::id())
->whereAuthor('visitor')
->sortable()
->get();
}
/**
* Get user folder tree
*
* @return array
*/
public function navigation_tree()
{
$folders = Folder::with('folders:id,parent_id,id,name')
->where('parent_id', null)
->where('user_id', Auth::id())
->sortable()
->get(['id', 'parent_id', 'id', 'name']);
return [
[
'name' => __t('home'),
'location' => 'base',
'folders' => $folders,
],
];
}
/**
* Search files
*
* @param SearchRequest $request
* @return Collection
*/
public function search(SearchRequest $request)
{
$user_id = Auth::id();
$query = remove_accents($request->input('query'));
// Search files id db
$searched_files = File::search($query)
->where('user_id', $user_id)
->get();
$searched_folders = Folder::search($query)
->where('user_id', $user_id)
->get();
// Collect folders and files to single array
return collect([$searched_folders, $searched_files])
->collapse();
}
}

View File

@@ -0,0 +1,167 @@
<?php
namespace App\Http\Controllers\FileManager;
use Exception;
use App\Models\File;
use App\Models\Folder;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Services\HelperService;
use App\Http\Controllers\Controller;
use App\Services\FileManagerService;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\FileFunctions\UploadRequest;
use App\Http\Requests\FileFunctions\MoveItemRequest;
use App\Http\Requests\FileFunctions\DeleteItemRequest;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\Http\Requests\FileFunctions\CreateFolderRequest;
class EditItemsController extends Controller
{
private $filemanager;
private $helper;
private $demo;
public function __construct()
{
$this->filemanager = resolve(FileManagerService::class);
$this->helper = resolve(HelperService::class);
$this->demo = resolve(DemoService::class);
}
/**
* Create new folder for authenticated master|editor user
*
* @param CreateFolderRequest $request
* @return Folder|array|Model
* @throws Exception
*/
public function create_folder(CreateFolderRequest $request)
{
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->create_folder($request);
}
// Create new folder
return $this->filemanager->create_folder($request);
}
/**
* Rename item for authenticated master|editor user
*
* @param RenameItemRequest $request
* @param $id
* @return mixed
* @throws Exception
*/
public function rename_item(RenameItemRequest $request, $id)
{
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->rename_item($request, $id);
}
// If request contain icon or color, then change it
if ($request->filled('emoji') || $request->filled('color')) {
$this->filemanager->edit_folder_properties($request, $id);
}
// Rename Item
return $this->filemanager->rename_item($request, $id);
}
/**
* Delete item for authenticated master|editor user
*
* @param DeleteItemRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
* @throws Exception
*/
public function delete_item(DeleteItemRequest $request)
{
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
foreach ($request->input('items') as $item) {
$this->filemanager->delete_item($item, $item['id']);
}
return response('Done', 204);
}
/**
* Upload file for authenticated master|editor user
*
* @param UploadRequest $request
* @return array|Model|\Illuminate\Support\Facades\File
* @throws Exception
*/
public function upload(UploadRequest $request)
{
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->upload($request);
}
return $this->filemanager->upload($request);
}
/**
* Move item for authenticated master|editor user
*
* @param MoveItemRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function move(MoveItemRequest $request)
{
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
$this->filemanager->move($request, $request->to_id);
return response('Done!', 204);
}
/**
* User download folder via zip
*
* @param $id
* @return string
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function zip_folder($id)
{
$folder = Folder::whereUserId(Auth::id())
->where('id', $id);
if (! $folder->exists()) {
abort(404, "Requested folder doesn't exists.");
}
$zip = $this->filemanager->zip_folder($id);
return response([
'url' => route('zip', $zip->id),
'name' => $zip->basename,
], 201);
}
/**
* User download multiple files via zip
*
* @param Request $request
* @return string
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function zip_multiple_files(Request $request)
{
$files = File::whereUserId(Auth::id())
->whereIn('id', $request->input('items'))
->get();
$zip = $this->filemanager->zip_files($files);
return response([
'url' => route('zip', $zip->id),
'name' => $zip->basename,
], 201);
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Http\Controllers\FileManager;
use App\Models\Folder;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
class FavouriteController extends Controller
{
/**
* FavouriteController constructor.
*/
public function __construct()
{
$this->demo = resolve(DemoService::class);
}
/**
* Add folder to user favourites
*
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function store(Request $request)
{
// todo: pridat validator ako AddToFavouritesRequest
foreach ($request->folders as $id) {
// Get user & folder
$user = Auth::user();
if (is_demo($user->id)) {
return $this->demo->favourites($user);
}
// Add folder to user favourites
$user
->favouriteFolders()
->syncWithoutDetaching($id);
}
// Return updated favourites
return response($user->favouriteFolders, 204);
}
/**
* Remove folder from user favourites
*
* @param $id
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function destroy($id)
{
// Get user
$user = Auth::user();
if (is_demo($user->id)) {
return $this->demo->favourites($user);
}
// Remove folder from user favourites
$user->favouriteFolders()->detach($id);
// Return updated favourites
return response($user->favouriteFolders, 204);
}
}

View File

@@ -0,0 +1,143 @@
<?php
namespace App\Http\Controllers\FileManager;
use App\Models\Zip;
use Illuminate\Http\Request;
use App\Services\HelperService;
use App\Models\File as UserFile;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
class FileAccessController extends Controller
{
private $helper;
public function __construct()
{
$this->helper = resolve(HelperService::class);
}
/**
* Get avatar
*
* @param $basename
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_avatar($basename)
{
// Check if file exist
if (! Storage::exists("/avatars/$basename")) {
abort(404);
}
// Return avatar
return Storage::download("/avatars/$basename", $basename);
}
/**
* Get system image
*
* @param $basename
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_system_image($basename)
{
// Check if file exist
if (! Storage::exists("/system/$basename")) {
abort(404);
}
// Return avatar
return Storage::download("/system/$basename", $basename);
}
/**
* Get file
*
* @param Request $request
* @param $filename
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_file(Request $request, $filename)
{
// Get file record
$file = UserFile::withTrashed()
->where('user_id', Auth::id())
->where('basename', $filename)
->firstOrFail();
// Check user permission
/*if (!$request->user()->tokenCan('master')) {
// Get shared token
$shared = get_shared($request->cookie('shared_token'));
// Check access to file
$this->check_file_access($shared, $file);
}*/
// Store user download size
$request->user()->record_download(
(int) $file->getRawOriginal('filesize')
);
return $this->helper->download_file($file, Auth::id());
}
/**
* Get generated zip for user
*
* @param $id
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
public function get_zip($id)
{
$disk = Storage::disk('local');
$zip = Zip::whereId($id)
->where('user_id', Auth::id())
->firstOrFail();
$zip
->user
->record_download(
$disk->size("zip/$zip->basename")
);
return $disk->download("zip/$zip->basename", $zip->basename, [
'Content-Type' => 'application/zip',
'Content-Length' => $disk->size("zip/$zip->basename"),
'Accept-Ranges' => 'bytes',
'Content-Range' => 'bytes 0-600/' . $disk->size("zip/$zip->basename"),
'Content-Disposition' => "attachment; filename=$zip->basename",
]);
}
/**
* Get image thumbnail
*
* @param Request $request
* @param $filename
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_thumbnail(Request $request, $filename)
{
// Get file record
$file = UserFile::withTrashed()
->whereUserId(Auth::id())
->whereThumbnail($filename)
->firstOrFail();
// Check user permission
/*if (!$request->user()->tokenCan('master')) {
$this->check_file_access($request, $file);
}*/
return $this->helper->download_thumbnail_file($file, Auth::id());
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace App\Http\Controllers\FileManager;
use Validator;
use App\Models\Zip;
use App\Models\Share;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Http\Resources\ShareResource;
use App\Notifications\SharedSendViaEmail;
use Illuminate\Support\Facades\Notification;
use App\Http\Requests\Share\CreateShareRequest;
use App\Http\Requests\Share\UpdateShareRequest;
use Illuminate\Contracts\Routing\ResponseFactory;
class ShareController extends Controller
{
/**
* Get shared record
*
* @param Share $shared
* @return ShareResource
*/
public function show(Share $shared)
{
return new ShareResource(
$shared
);
}
/**
* Generate file share link
*
* @param CreateShareRequest $request
* @param $id
* @return ShareResource
*/
public function store(CreateShareRequest $request, $id)
{
// Create shared options
$shared = Share::create([
'password' => $request->has('password') ? bcrypt($request->password) : null,
'type' => $request->type === 'folder' ? 'folder' : 'file',
'is_protected' => $request->isPassword,
'permission' => $request->permission ?? null,
'item_id' => $id,
'expire_in' => $request->expiration ?? null,
'user_id' => Auth::id(),
]);
// Send shared link via email
if ($request->has('emails')) {
foreach ($request->emails as $email) {
Notification::route('mail', $email)->notify(
new SharedSendViaEmail($shared->token)
);
}
}
// Return created shared record
return new ShareResource($shared);
}
/**
* Update sharing
*
* @param UpdateShareRequest $request
* @param $token
* @return ShareResource
*/
public function update(UpdateShareRequest $request, $token)
{
// Get sharing record
$shared = Share::where('token', $token)
->where('user_id', Auth::id())
->firstOrFail();
// Update sharing record
$shared->update([
'permission' => $request->permission,
'is_protected' => $request->protected,
'expire_in' => $request->expiration,
'password' => $request->password ? bcrypt($request->password) : $shared->password,
]);
// Return shared record
return new ShareResource($shared);
}
/**
* Delete sharing item
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function destroy(Request $request)
{
foreach ($request->tokens as $token) {
// Get sharing record
Share::where('token', $token)
->where('user_id', Auth::id())
->firstOrFail()
->delete();
// Get zip record
$zip = Zip::where('shared_token', $token)
->where('user_id', Auth::id())
->first();
if ($zip) {
$zip->delete();
}
}
return response('Done!', 204);
}
/**
* Send shared link via email to recipients
*
* @param $token
* @param $request
*/
public function send_to_emails_recipients(Request $request, $token)
{
// TODO: pridat validation request
// Make validation of array of emails
$validator = Validator::make($request->all(), [
'emails.*' => 'required|email',
]);
// Return error
if ($validator->fails()) {
abort(400, 'Bad email input');
}
// Send shared link via email
if ($request->has('emails')) {
foreach ($request->emails as $email) {
Notification::route('mail', $email)
->notify(new SharedSendViaEmail($token));
}
}
return response('Done!', 204);
}
}

View File

@@ -0,0 +1,121 @@
<?php
namespace App\Http\Controllers\FileManager;
use App\Models\File;
use App\Models\Folder;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\Routing\ResponseFactory;
class TrashController extends Controller
{
/**
* TrashController constructor.
*/
public function __construct()
{
$this->demo = resolve(DemoService::class);
}
/**
* Restore item from trash
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function restore(Request $request)
{
// Validate request
// TODO: zrefaktorovat validator do requestu
$validator = Validator::make($request->input('items'), [
'*.type' => 'required|string',
'*.id' => 'string',
]);
// Return error
if ($validator->fails()) {
abort(400, 'Bad input');
}
// Get user id
$user_id = Auth::id();
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
foreach ($request->input('items') as $restore) {
// Get folder
if ($restore['type'] === 'folder') {
// Get folder
$item = Folder::onlyTrashed()
->where('user_id', $user_id)
->where('id', $restore['id'])
->first();
// Restore item to home directory
if ($request->has('to_home') && $request->to_home) {
$item->parent_id = null;
$item->save();
}
} else {
// Get item
$item = File::onlyTrashed()
->where('user_id', $user_id)
->where('id', $restore['id'])
->first();
// Restore item to home directory
if ($request->has('to_home') && $request->to_home) {
$item->folder_id = null;
$item->save();
}
}
// Restore Item
$item->restore();
}
// Return response
return response('Done!', 204);
}
/**
* Empty user trash
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function dump()
{
// Get user id
$user_id = Auth::id();
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Get files and folders
$folders = Folder::onlyTrashed()->where('user_id', $user_id)->get();
$files = File::onlyTrashed()->where('user_id', $user_id)->get();
// Force delete folder
$folders->each->forceDelete();
// Force delete files
foreach ($files as $file) {
// Delete file
Storage::delete("/files/$user_id/{$file->basename}");
// Delete thumbnail if exist
if ($file->thumbnail) {
Storage::delete("/files/$user_id/{$file->getRawOriginal('thumbnail')}");
}
// Delete file permanently
$file->forceDelete();
}
// Return response
return response('Done!', 204);
}
}

View File

@@ -0,0 +1,125 @@
<?php
namespace App\Http\Controllers\Oasis;
use Hash;
use Notification;
use App\Models\User;
use Illuminate\Support\Str;
use App\Models\UserSettings;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Services\StripeService;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use App\Http\Requests\Admin\CreateUserByAdmin;
use App\Http\Requests\Oasis\CreateOrderRequest;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Services\Oasis\CzechRegisterSearchService;
use App\Notifications\Oasis\PaymentRequiredNotification;
class AdminController extends Controller
{
/**
* Get company details from czech company register
*
* @return array|Application|ResponseFactory|Response
*/
public function get_company_details()
{
$api = resolve(CzechRegisterSearchService::class);
$result = $api->findByIco(
request()->get('ico')
);
if (empty($result)) {
return response('Not Found', 404);
}
return response($result[0], 200);
}
/**
* Register new client and send email with payment details
*
* @param CreateOrderRequest $request
* @return Application|ResponseFactory|Response
*/
public function create_order(CreateOrderRequest $request)
{
// Create user
$newbie = User::create([
'email' => $request->email,
'password' => Hash::make(Str::random()),
]);
UserSettings::unguard();
// Store user settings
$newbie
->settings()
->create([
'storage_capacity' => 0,
'ico' => $request->ico ?? null,
'name' => $request->name,
'address' => $request->address,
'state' => $request->state,
'city' => $request->city,
'postal_code' => $request->postal_code,
'country' => $request->country,
'phone_number' => $request->phone_number ?? null,
'timezone' => '1.0',
]);
// Store subscription request
$newbie
->subscriptionRequest()
->create([
'requested_plan' => $request->plan,
]);
$plan = resolve(StripeService::class)
->getPlan($request->plan);
// Send notification with payment details
$newbie->notify(new PaymentRequiredNotification(
$newbie->subscriptionRequest,
$plan
));
return response(
new UserResource($newbie),
201
);
}
/**
* Create new user by admin
*
* @param CreateUserByAdmin $request
* @return UserResource|Application|ResponseFactory|Response
*/
public function create_user(CreateUserByAdmin $request)
{
// Create user
$user = User::forceCreate([
'role' => $request->role,
'email' => $request->email,
'password' => \Illuminate\Support\Facades\Hash::make($request->password),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $request->name,
'avatar' => store_avatar($request, 'avatar'),
'storage_capacity' => $request->storage_capacity,
'payment_activation' => 1,
]);
return response(new UserResource($user), 201);
}
}

View File

@@ -0,0 +1,135 @@
<?php
namespace App\Http\Controllers\Oasis;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Services\StripeService;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use App\Models\Oasis\SubscriptionRequest;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\User\UpdateUserPasswordRequest;
use App\Http\Resources\Oasis\SubscriptionRequestResource;
class SubscriptionController extends Controller
{
public function __construct()
{
$this->stripe = resolve(StripeService::class);
}
/**
* Get subscription request details
*
* @param SubscriptionRequest $order
* @return Application|ResponseFactory|Response
*/
public function get_subscription_request(SubscriptionRequest $order)
{
return response(
new SubscriptionRequestResource($order),
200
);
}
/**
* Get setup intent to register credit card
*
* @param SubscriptionRequest $order
* @return Application|ResponseFactory|Response
*/
public function get_setup_intent(SubscriptionRequest $order)
{
// Create stripe customer if not exist
$order->user->createOrGetStripeCustomer();
// Return setup intent
return response($order->user->createSetupIntent(), 201);
}
/**
* Subscribe user
*
* @param Request $request
* @param SubscriptionRequest $order
* @return Application|ResponseFactory|Response
*/
public function subscribe(Request $request, SubscriptionRequest $order)
{
// Make subscription from subscription request
if ($order->exists) {
// Create subscription
$order->user
->newSubscription('main', $order->requested_plan)
->create(
$this->stripe->getOrSetDefaultPaymentMethod($request, $order->user)
);
// Update Subscription request
$order->update(['status' => 'payed']);
$user = $order->user;
}
// Make subscription after user sign up and pay for the plan
if (! $order->exists) {
$user = Auth::user();
// Set user billing
$user->setBilling($request->billing);
// Update stripe customer billing info
$this->stripe->updateCustomerDetails($user);
// Make subscription
$this->stripe->createOrReplaceSubscription($request, $user);
}
// Get plan
$plan = $this->stripe->getPlan(
$order->requested_plan ?? $request->input('plan.data.id')
);
// Update user storage limit
$user
->settings()
->update([
'storage_capacity' => $plan['product']['metadata']['capacity'],
'payment_activation' => 1,
]);
return response('Done!', 204);
}
/**
* Set user password
*
* @param UpdateUserPasswordRequest $request
* @param SubscriptionRequest $order
* @return Application|ResponseFactory|Response
*/
public function set_password(UpdateUserPasswordRequest $request, SubscriptionRequest $order)
{
// Check unauthorized action
if ($order->status !== 'payed') {
abort(401, "Sorry, you don't have permission.");
}
// Set user password
$order->user->password = Hash::make($request->password);
$order->user->save();
// Update status
$order->update([
'status' => 'logged',
]);
// Log in user
Auth::login($order->user);
$request->session()->regenerate();
return response('Password was set.', 204);
}
}

View File

@@ -0,0 +1,248 @@
<?php
namespace App\Http\Controllers\Sharing;
use App\Models\File;
use App\Models\Share;
use App\Models\Folder;
use Illuminate\Support\Arr;
use Illuminate\Http\Request;
use App\Services\HelperService;
use Illuminate\Support\Collection;
use App\Http\Controllers\Controller;
use App\Http\Resources\FileResource;
use Illuminate\Support\Facades\Hash;
use App\Http\Resources\ShareResource;
use Illuminate\Support\Facades\Storage;
use App\Http\Requests\Share\AuthenticateShareRequest;
class BrowseShareController extends Controller
{
private $helper;
public function __construct()
{
$this->helper = resolve(HelperService::class);
}
/**
* Show page index and delete access_token & shared_token cookie
* @param Share $shared
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Symfony\Component\HttpFoundation\StreamedResponse
*/
public function index(Share $shared)
{
// Delete share_session if exist
if ($shared->is_protected) {
cookie()->queue('share_session', '', -1);
}
// Check if shared is image file and then show it
if ($shared->type === 'file' && ! $shared->is_protected) {
$image = File::whereUserId($shared->user_id)
->whereType('image')
->whereId($shared->item_id)
->first();
if ($image) {
// Store user download size
$shared
->user
->record_download(
(int) $image->getRawOriginal('filesize')
);
return $this->get_single_image($image, $shared->user_id);
}
}
return view('index')
->with('installation', 'setup-done')
->with('settings', get_settings_in_json() ?? null);
}
/**
* Check Password for protected item
*
* @param AuthenticateShareRequest $request
* @param Share $shared
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function authenticate(AuthenticateShareRequest $request, Share $shared)
{
// Check password
if (Hash::check($request->password, $shared->password)) {
$cookie = json_encode([
'token' => $shared->token,
'authenticated' => true,
]);
// Return authorize token with shared options
return response(new ShareResource($shared), 200)
->cookie('share_session', $cookie, 43200);
}
abort(401, __t('incorrect_password'));
}
/**
* Browse shared folder
*
* @param $id
* @param Share $shared
* @return Collection
*/
public function browse_folder($id, Share $shared)
{
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check if user can get directory
$this->helper->check_item_access($id, $shared);
// Get files and folders
list($folders, $files) = $this->helper->get_items_under_shared_by_folder_id($id, $shared);
// Set thumbnail links for public files
$files->map(function ($file) use ($shared) {
$file->setPublicUrl($shared->token);
});
// Collect folders and files to single array
return collect([$folders, $files])
->collapse();
}
/**
* Search shared files
*
* @param Request $request
* @param Share $shared
* @return Collection
*/
public function search(Request $request, Share $shared)
{
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
$query = remove_accents(
$request->input('query')
);
// Search files id db
$searched_files = File::search($query)
->where('user_id', $shared->user_id)
->get();
$searched_folders = Folder::search($query)
->where('user_id', $shared->user_id)
->get();
// Get all children content
$foldersIds = Folder::with('folders:id,parent_id,id,name')
->where('user_id', $shared->user_id)
->where('parent_id', $shared->item_id)
->get();
// Get accessible folders
$accessible_folder_ids = Arr::flatten([filter_folders_ids($foldersIds), $shared->item_id]);
// Filter files
$files = $searched_files->filter(function ($file) use ($accessible_folder_ids, $shared) {
// Set public urls
$file->setPublicUrl($shared->token);
// check if item is in accessible folders
return in_array($file->folder_id, $accessible_folder_ids);
});
// Filter folders
$folders = $searched_folders->filter(function ($folder) use ($accessible_folder_ids) {
// check if item is in accessible folders
return in_array($folder->id, $accessible_folder_ids);
});
// Collect folders and files to single array
return collect([$folders, $files])
->collapse();
}
/**
* Get navigation tree of shared folder
*
* @param Share $shared
* @return array
*/
public function navigation_tree(Share $shared)
{
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check if user can get directory
$this->helper->check_item_access($shared->item_id, $shared);
// Get folders
$folders = Folder::with('folders:id,parent_id,name')
->whereParentId($shared->item_id)
->whereUserId($shared->user_id)
->sortable()
->get(['id', 'parent_id', 'id', 'name']);
return [
[
'id' => $shared->item_id,
'name' => __t('home'),
'location' => 'public',
'folders' => $folders,
],
];
}
/**
* Get shared file record
*
* @param Share $shared
* @return mixed
*/
public function get_single_file(Share $shared)
{
// Check ability to access protected share files
$this->helper->check_protected_share_record($shared);
// Get file
$file = File::whereUserId($shared->user_id)
->whereId($shared->item_id)
->firstOrFail();
// Set access urls
$file->setPublicUrl($shared->token);
return response(new FileResource($file), 200);
}
/**
* Get image from storage and show it
*
* @param $file
* @param $user_id
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
private function get_single_image($file, $user_id)
{
// Format pretty filename
$file_pretty_name = $file->name . '.' . $file->mimetype;
// Get file path
$path = "/files/$user_id/$file->basename";
// Check if file exist
if (! Storage::exists($path)) {
abort(404);
}
return Storage::response($path, $file_pretty_name, [
'Content-Type' => Storage::mimeType($path),
'Content-Length' => Storage::size($path),
'Accept-Ranges' => 'bytes',
'Content-Range' => 'bytes 0-600/' . Storage::size($path),
]);
}
}

View File

@@ -0,0 +1,110 @@
<?php
namespace App\Http\Controllers\Sharing;
use App\Models\Zip;
use App\Models\Share;
use App\Services\HelperService;
use App\Models\File as UserFile;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class FileSharedAccessController extends Controller
{
private $helper;
public function __construct()
{
$this->helper = resolve(HelperService::class);
}
/**
* Get generated zip for guest
*
* @param $id
* @param $token
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
public function get_zip_public($id, $token)
{
$disk = Storage::disk('local');
$zip = Zip::where('id', $id)
->where('shared_token', $token)
->first();
$zip
->user
->record_download(
$disk->size("zip/$zip->basename")
);
return $disk
->download("zip/$zip->basename", $zip->basename, [
'Content-Type' => 'application/zip',
'Content-Length' => $disk->size("zip/$zip->basename"),
'Accept-Ranges' => 'bytes',
'Content-Range' => 'bytes 0-600/' . $disk->size("zip/$zip->basename"),
'Content-Disposition' => 'attachment; filename=' . $zip->basename,
]);
}
/**
* Get file public
*
* @param $filename
* @param Share $shared
* @return mixed
*/
public function get_file_public($filename, Share $shared)
{
// Check ability to access protected share files
$this->helper->check_protected_share_record($shared);
// Get file record
$file = UserFile::where('user_id', $shared->user_id)
->where('basename', $filename)
->firstOrFail();
// Check file access
$this->helper->check_guest_access_to_shared_items($shared, $file);
// Store user download size
$shared
->user
->record_download(
(int) $file->getRawOriginal('filesize')
);
return $this->helper->download_file($file, $shared->user_id);
}
/**
* Get public image thumbnail
*
* @param $filename
* @param Share $shared
* @return mixed
*/
public function get_thumbnail_public($filename, Share $shared)
{
// Check ability to access protected share files
$this->helper->check_protected_share_record($shared);
// Get file record
$file = UserFile::where('user_id', $shared->user_id)
->where('thumbnail', $filename)
->firstOrFail();
// Check file access
$this->helper->check_guest_access_to_shared_items($shared, $file);
// Store user download size
$shared
->user
->record_download(
(int) $file->getRawOriginal('filesize')
);
return $this->helper->download_thumbnail_file($file, $shared->user_id);
}
}

View File

@@ -0,0 +1,300 @@
<?php
namespace App\Http\Controllers\Sharing;
use App\Models\File;
use App\Models\Share;
use App\Models\Folder;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Services\HelperService;
use App\Http\Controllers\Controller;
use App\Services\FileManagerService;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\FileFunctions\UploadRequest;
use App\Http\Requests\FileFunctions\MoveItemRequest;
use App\Http\Requests\FileFunctions\DeleteItemRequest;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\Http\Requests\FileFunctions\CreateFolderRequest;
class ManipulateShareItemsController extends Controller
{
private $filemanager;
private $helper;
public function __construct()
{
$this->filemanager = resolve(FileManagerService::class);
$this->helper = resolve(HelperService::class);
$this->demo = resolve(DemoService::class);
}
/**
* Create new folder for guest user with edit permission
*
* @param CreateFolderRequest $request
* @param Share $shared
* @return array|\Illuminate\Contracts\Foundation\Application|ResponseFactory|\Illuminate\Http\Response
* @throws \Exception
*/
public function create_folder(CreateFolderRequest $request, Share $shared)
{
if (is_demo_account($shared->user->email)) {
return $this->demo->create_folder($request);
}
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check shared permission
if (is_visitor($shared)) {
abort(403);
}
// Check access to requested directory
$this->helper->check_item_access($request->parent_id, $shared);
// Create folder
$folder = $this->filemanager->create_folder($request, $shared);
return response($folder, 201);
}
/**
* Rename item for guest user with edit permission
*
* @param RenameItemRequest $request
* @param $id
* @param Share $shared
* @return mixed
* @throws \Exception
*/
public function rename_item(RenameItemRequest $request, $id, Share $shared)
{
if (is_demo_account($shared->user->email)) {
return $this->demo->rename_item($request, $id);
}
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check shared permission
if (is_visitor($shared)) {
abort(403);
}
// Get file|folder item
$item = get_item($request->type, $id);
// Check access to requested item
if ($request->type === 'folder') {
$this->helper->check_item_access($item->id, $shared);
} else {
$this->helper->check_item_access($item->folder_id, $shared);
}
// If request have a change folder icon values set the folder icon
if ($request->type === 'folder' && $request->filled('icon')) {
$this->filemanager->edit_folder_properties($request, $id);
}
// Rename item
$item = $this->filemanager->rename_item($request, $id, $shared);
// Set public url
if ($item->type !== 'folder') {
$item->setPublicUrl($shared->token);
}
return response($item, 201);
}
/**
* Delete item for guest user with edit permission
*
* @param DeleteItemRequest $request
* @param Share $shared
* @return ResponseFactory|\Illuminate\Http\Response
* @throws \Exception
*/
public function delete_item(DeleteItemRequest $request, Share $shared)
{
abort_if(is_demo_account($shared->user->email), 204, 'Done.');
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check shared permission
if (is_visitor($shared)) {
abort(403);
}
foreach ($request->items as $file) {
// Get file|folder item
$item = get_item($file['type'], $file['id']);
// Check access to requested item
if ($file['type'] === 'folder') {
$this->helper->check_item_access($item->id, $shared);
} else {
$this->helper->check_item_access($item->folder_id, $shared);
}
// Delete item
$this->filemanager->delete_item($file, $file['id'], $shared);
}
return response('Done', 204);
}
/**
* Delete file for guest user with edit permission
*
* @param UploadRequest $request
* @param Share $shared
* @return File|\Illuminate\Contracts\Foundation\Application|ResponseFactory|Model|\Illuminate\Http\Response
* @throws \Exception
*/
public function upload(UploadRequest $request, Share $shared)
{
if (is_demo_account($shared->user->email)) {
return $this->demo->upload($request);
}
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check shared permission
if (is_visitor($shared)) {
abort(403);
}
// Check access to requested directory
$this->helper->check_item_access($request->folder_id, $shared);
// Return new uploaded file
$new_file = $this->filemanager->upload($request, $shared);
// Set public access url
$new_file->setPublicUrl($shared->token);
return response($new_file, 201);
}
/**
* Move item for guest user with edit permission
*
* @param MoveItemRequest $request
* @param Share $shared
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function move(MoveItemRequest $request, Share $shared)
{
abort_if(is_demo_account($shared->user->email), 204, 'Done.');
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check shared permission
if (is_visitor($shared)) {
abort(403);
}
foreach ($request->items as $item) {
if ($item['type'] === 'folder') {
$this->helper->check_item_access([
$request->to_id, $item['id'],
], $shared);
}
if ($item['type'] !== 'folder') {
$file = File::where('id', $item['id'])
->where('user_id', $shared->user_id)
->firstOrFail();
$this->helper->check_item_access([
$request->to_id, $file->folder_id,
], $shared);
}
}
$this->filemanager->move($request, $request->to_id);
return response('Done!', 204);
}
/**
* Guest download folder via zip
*
* @param $id
* @param Share $shared
* @return string
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function zip_folder($id, Share $shared)
{
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
// Check access to requested folder
$this->helper->check_item_access($id, $shared);
// Get folder
$folder = Folder::whereUserId($shared->user_id)
->where('id', $id);
if (! $folder->exists()) {
abort(404, 'Requested folder doesn\'t exists.');
}
$zip = $this->filemanager->zip_folder($id, $shared);
// Get file
return response([
'url' => route('zip_public', [
'id' => $zip->id,
'token' => $shared->token,
]),
'name' => $zip->basename,
], 201);
}
/**
* Guest download multiple files via zip
*
* @param Request $request
* @param Share $shared
* @return string
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function zip_multiple_files(Request $request, Share $shared)
{
// Check ability to access protected share record
$this->helper->check_protected_share_record($shared);
$file_parent_folders = File::whereUserId($shared->user_id)
->whereIn('id', $request->items)
->get()
->pluck('folder_id')
->toArray();
// Check access to requested directory
$this->helper->check_item_access($file_parent_folders, $shared);
// Get requested files
$files = File::whereUserId($shared->user_id)
->whereIn('id', $request->items)
->get();
$zip = $this->filemanager->zip_files($files, $shared);
// Get file
return response([
'url' => route('zip_public', [
'id' => $zip->id,
'token' => $shared->token,
]),
'name' => $zip->basename,
], 201);
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers\Subscription;
use App\Models\User;
use App\Services\StripeService;
use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;
class StripeWebhookController extends CashierController
{
public function __construct()
{
$this->stripe = resolve(StripeService::class);
}
/**
* Handle a cancelled customer from a Stripe subscription.
*
* @param array $payload
* @return \Symfony\Component\HttpFoundation\Response
*/
public function handleCustomerSubscriptionDeleted($payload)
{
if ($user = $this->getUserByStripeId($payload['data']['object']['customer'])) {
$user->subscriptions->filter(function ($subscription) use ($payload) {
return $subscription->stripe_id === $payload['data']['object']['id'];
})->each(function ($subscription) {
$subscription->markAsCancelled();
});
}
// Get user
$user = User::whereStripeId($payload['data']['object']['customer'])
->firstOrFail();
// Update storage capacity
$user
->settings()
->update([
'storage_capacity' => get_setting('storage_default'),
]);
return $this->successMethod();
}
/**
* Handle Invoice Payment Succeeded
*
* @param $payload
* @return \Symfony\Component\HttpFoundation\Response
*/
public function handleInvoicePaymentSucceeded($payload)
{
// Get user
$user = User::whereStripeId($payload['data']['object']['customer'])
->firstOrFail();
// Get requested plan
$plan = $this->stripe->getPlan($user->subscription('main')->stripe_plan);
// Update user storage limit
$user
->settings()
->update([
'storage_capacity' => $plan['product']['metadata']['capacity'],
]);
return $this->successMethod();
}
}

View File

@@ -0,0 +1,128 @@
<?php
namespace App\Http\Controllers\User;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use Illuminate\Support\Facades\Auth;
use App\Http\Resources\InvoiceCollection;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\UserStorageResource;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\User\UpdateUserPasswordRequest;
class AccountController extends Controller
{
/**
* AccountController constructor.
*/
public function __construct()
{
$this->demo = resolve(DemoService::class);
}
/**
* Get all user data to frontend
*
* @return UserResource
*/
public function user()
{
return new UserResource(
Auth::user()
);
}
/**
* Get storage details
*
* @return UserStorageResource
*/
public function storage()
{
return new UserStorageResource(
Auth::user()
);
}
/**
* Get user invoices
*
* @return InvoiceCollection
*/
public function invoices()
{
return new InvoiceCollection(
Auth::user()->invoices()
);
}
/**
* Update user settings relationship
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function update_user_settings(Request $request)
{
// Validate request
// TODO: pridat validator do requestu
$validator = Validator::make($request->all(), [
'avatar' => 'sometimes|file',
'name' => 'string',
'value' => 'string',
]);
// Return error
if ($validator->fails()) {
abort(400, 'Bad input');
}
// Get user
$user = Auth::user();
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Update avatar
if ($request->hasFile('avatar')) {
$user
->settings()
->update([
'avatar' => store_avatar($request, 'avatar'),
]);
return response('Saved!', 204);
}
$user
->settings()
->update(
make_single_input($request)
);
return response('Saved!', 204);
}
/**
* Change user password
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function change_password(UpdateUserPasswordRequest $request)
{
// Get user
$user = Auth::user();
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Change and store new password
$user->password = bcrypt($request->input('password'));
$user->save();
return response('Changed!', 204);
}
}

View File

@@ -0,0 +1,164 @@
<?php
namespace App\Http\Controllers\User;
use Auth;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Services\StripeService;
use Laravel\Cashier\PaymentMethod;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
use App\Http\Resources\PaymentCardResource;
use App\Http\Resources\PaymentCardCollection;
use App\Http\Resources\PaymentDefaultCardResource;
use App\Http\Requests\Payments\RegisterNewPaymentMethodRequest;
class PaymentMethodsController extends Controller
{
private StripeService $stripe;
private DemoService $demo;
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
$this->demo = resolve(DemoService::class);
}
/**
* Get user payment methods grouped by default and others
*
* @return array
*/
public function index()
{
$user = Auth::user();
if (! $user->hasPaymentMethod()) {
return abort(204, 'User don\'t have any payment methods');
}
$slug_payment_methods = 'payment-methods-user-' . $user->id;
$slug_default_payment_method = 'default-payment-methods-user-' . $user->id;
if (Cache::has($slug_payment_methods) && Cache::has($slug_default_payment_method)) {
$defaultPaymentMethod = Cache::get($slug_default_payment_method);
$paymentMethodsMapped = Cache::get($slug_payment_methods);
} else {
// Get default payment method
$defaultPaymentMethod = Cache::rememberForever($slug_default_payment_method, function () use ($user) {
$defaultPaymentMethodObject = $user->defaultPaymentMethod();
return $defaultPaymentMethodObject instanceof PaymentMethod
? $defaultPaymentMethodObject->asStripePaymentMethod()
: $defaultPaymentMethodObject;
});
// filter payment methods without default payment
$paymentMethodsMapped = Cache::rememberForever($slug_payment_methods, function () use ($defaultPaymentMethod, $user) {
$paymentMethods = $user->paymentMethods()->filter(function ($paymentMethod) use ($defaultPaymentMethod) {
return $paymentMethod->id !== $defaultPaymentMethod->id;
});
// Get payment methods
return $paymentMethods->map(function ($paymentMethod) {
return $paymentMethod->asStripePaymentMethod();
})->values()->all();
});
}
if (! $user->card_brand || ! $user->stripe_id || is_null($paymentMethodsMapped) && is_null($paymentMethodsMapped)) {
return [
'default' => null,
'others' => [],
];
}
return [
'default' => $defaultPaymentMethod instanceof PaymentMethod
? new PaymentCardResource($defaultPaymentMethod)
: new PaymentDefaultCardResource($defaultPaymentMethod),
'others' => new PaymentCardCollection($paymentMethodsMapped),
];
}
/**
* Update default payment method
*
* @param Request $request
* @param $id
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function update($id)
{
$user = Auth::user();
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Update DefaultPayment Method
$user->updateDefaultPaymentMethod($id);
// Sync default payment method
$user->updateDefaultPaymentMethodFromStripe();
// Clear cached payment methods
cache_forget_many([
'payment-methods-user-' . $user->id,
'default-payment-methods-user-' . $user->id,
]);
return response('Done', 204);
}
/**
* Register new payment method for user
*
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function store(RegisterNewPaymentMethodRequest $request)
{
// Get user
$user = Auth::user();
// Check if is demo
if (is_demo($user->id)) {
return response('Done', 201);
}
// Register new payment method
$this->stripe->registerNewPaymentMethod($request, $user);
return response('Done', 201);
}
/**
* Delete user payment method
*
*/
public function delete($id)
{
$user = Auth::user();
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Get payment method
$paymentMethod = $user->findPaymentMethod($id);
// Delete payment method
$paymentMethod->delete();
// Sync default payment method
$user->updateDefaultPaymentMethodFromStripe();
// Clear cached payment methods
cache_forget_many([
'payment-methods-user-' . $user->id,
'default-payment-methods-user-' . $user->id,
]);
return response('Done!', 204);
}
}

View File

@@ -0,0 +1,151 @@
<?php
namespace App\Http\Controllers\User;
use Auth;
use App\Models\User;
use Stripe\SetupIntent;
use App\Services\DemoService;
use Illuminate\Http\Response;
use App\Services\StripeService;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
use App\Http\Resources\UserSubscription;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\Subscription\StoreUpgradeAccountRequest;
class SubscriptionController extends Controller
{
private $stripe;
private $demo;
public function __construct()
{
$this->stripe = resolve(StripeService::class);
$this->demo = DemoService::class;
}
/**
* Generate setup intent
*
* @return Application|ResponseFactory|Response|SetupIntent
*/
public function setup_intent()
{
return response(
$this->stripe->getSetupIntent(Auth::user()),
201
);
}
/**
* Get user subscription detail
*
* @return void
*/
public function show()
{
$user = User::find(Auth::id());
if (! $user->subscription('main')) {
return abort(204, 'User don\'t have any subscription');
}
$slug = 'subscription-user-' . $user->id;
if (Cache::has($slug)) {
return Cache::get($slug);
}
return Cache::rememberForever($slug, function () use ($user) {
return new UserSubscription(
$user
);
});
}
/**
* Upgrade account to subscription
*
* @param StoreUpgradeAccountRequest $request
* @return ResponseFactory|Response
*/
public function upgrade(StoreUpgradeAccountRequest $request)
{
// Get user
$user = Auth::user();
// Check if is demo
if (is_demo($user->id)) {
return $this->demo->response_204();
}
// Forget user subscription
Cache::forget('subscription-user-' . $user->id);
// Get requested plan
$plan = $this->stripe->getPlan($request->input('plan.data.id'));
// Set user billing
$user->setBilling($request->input('billing'));
// Update stripe customer billing info
$this->stripe->updateCustomerDetails($user);
// Make subscription
$this->stripe->createOrReplaceSubscription($request, $user);
// Update user storage limit
$user->settings()->update([
'storage_capacity' => $plan['product']['metadata']['capacity'],
]);
return response('Done!', 204);
}
/**
* Cancel Subscription
*
* @return ResponseFactory|Response
*/
public function cancel()
{
$user = User::find(Auth::id());
// Check if is demo
if (is_demo($user->id)) {
return $this->demo->response_204();
}
// Cancel subscription
$user->subscription('main')->cancel();
// Forget user subscription
Cache::forget('subscription-user-' . $user->id);
return response('Done!', 204);
}
/**
* Resume Subscription
*
* @return ResponseFactory|Response
*/
public function resume()
{
$user = User::find(Auth::id());
// Check if is demo
if (is_demo($user->id)) {
return $this->demo->response_204();
}
// Resume subscription
$user->subscription('main')->resume();
// Forget user subscription
Cache::forget('subscription-user-' . $user->id);
return response('Done!', 204);
}
}

68
app/Http/Kernel.php Normal file
View File

@@ -0,0 +1,68 @@
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
EnsureFrontendRequestsAreStateful::class,
//'throttle:api',
//\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Homepage\Mail;
namespace App\Http\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
@@ -8,16 +8,24 @@ use Illuminate\Queue\SerializesModels;
class SendContactMessage extends Mailable
{
use Queueable, SerializesModels;
private $request;
public function __construct(
private array $request
) {
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($request)
{
$this->request = $request;
}
/**
* Build the message.
*
* @return $this
*/
public function build(): static
public function build()
{
return $this->from(config('mail.from')['address'])
->replyTo($this->request['email'])

View File

@@ -1,5 +1,5 @@
<?php
namespace Support\Middleware;
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;

View File

@@ -1,5 +1,5 @@
<?php
namespace Support\Middleware;
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode as Middleware;

View File

@@ -1,5 +1,5 @@
<?php
namespace Support\Middleware;
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

View File

@@ -1,5 +1,5 @@
<?php
namespace Support\Middleware;
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;

View File

@@ -1,5 +1,5 @@
<?php
namespace Support\Middleware;
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;

View File

@@ -1,5 +1,5 @@
<?php
namespace Support\Middleware;
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string
*/
protected $proxies;
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Support\Middleware;
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

View File

@@ -0,0 +1,67 @@
<?php
namespace App\Http\Notifications;
use Laravel\Cashier\Payment;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class ConfirmPayment extends Notification implements ShouldQueue
{
use Queueable;
/**
* The PaymentIntent identifier.
*
* @var string
*/
public $paymentId;
/**
* The payment amount.
*
* @var string
*/
public $amount;
/**
* Create a new payment confirmation notification.
*
* @param \Laravel\Cashier\Payment $payment
* @return void
*/
public function __construct(Payment $payment)
{
$this->paymentId = $payment->id;
$this->amount = $payment->amount();
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
$url = route('cashier.payment', ['id' => $this->paymentId]);
return (new MailMessage)
->subject(__('cashier.confirm_payment'))
->greeting(__('cashier.confirm_amount', ['amount' => $this->amount]))
->line(__('cashier.confirm_description'))
->action(__('cashier.confirm_button'), $url);
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Admin\Requests;
namespace App\Http\Requests\Admin;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Admin\Requests;
namespace App\Http\Requests\Admin;
use Illuminate\Foundation\Http\FormRequest;
@@ -23,8 +23,8 @@ class ChangeStorageCapacityRequest extends FormRequest
public function rules()
{
return [
'attributes' => 'required|array',
'attributes.max_storage_amount' => 'required|digits_between:1,9',
'attributes' => 'required|array',
'attributes.storage_capacity' => 'required|digits_between:1,9',
];
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Admin\Requests;
namespace App\Http\Requests\Admin;
use Illuminate\Foundation\Http\FormRequest;
@@ -23,11 +23,12 @@ class CreateUserByAdmin extends FormRequest
public function rules()
{
return [
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
'name' => 'required|string|max:255',
'role' => 'required|string',
'avatar' => 'sometimes|file',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
'name' => 'required|string|max:255',
'storage_capacity' => 'required|digits_between:1,9',
'role' => 'required|string',
'avatar' => 'sometimes|file',
];
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Admin\Requests;
namespace App\Http\Requests\Admin;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Users\Requests;
namespace App\Http\Requests\Auth;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Items\Requests;
namespace App\Http\Requests\FileBrowser;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Folders\Requests;
namespace App\Http\Requests\FileFunctions;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Items\Requests;
namespace App\Http\Requests\FileFunctions;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Items\Requests;
namespace App\Http\Requests\FileFunctions;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Items\Requests;
namespace App\Http\Requests\FileFunctions;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,7 +1,7 @@
<?php
namespace Domain\Files\Requests;
namespace App\Http\Requests\FileFunctions;
use Domain\Admin\Rules\DisabledMimetypes;
use App\Rules\DisabledMimetypes;
use Illuminate\Foundation\Http\FormRequest;
class UploadRequest extends FormRequest
@@ -25,10 +25,7 @@ class UploadRequest extends FormRequest
{
return [
'filename' => 'required|string',
'parent_id' => 'nullable|uuid',
'path' => 'required|string',
'is_last' => 'sometimes|string',
'extension' => 'sometimes|string|nullable',
'folder_id' => 'nullable|uuid',
'file' => ['required', 'file', new DisabledMimetypes],
];
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Localization\Requests;
namespace App\Http\Requests\Languages;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Localization\Requests;
namespace App\Http\Requests\Languages;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Localization\Requests;
namespace App\Http\Requests\Languages;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Http\Requests\Oasis;
use Illuminate\Foundation\Http\FormRequest;
class CreateOrderRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'ico' => 'sometimes|nullable',
'name' => 'required|string',
'email' => 'required|email|unique:users',
'phone_number' => 'string|nullable',
'address' => 'required|string',
'state' => 'required|string',
'city' => 'required|string',
'postal_code' => 'required|string',
'country' => 'required|string',
'plan' => 'required|string',
];
}
}

View File

@@ -1,9 +1,9 @@
<?php
namespace Domain\Settings\Requests;
namespace App\Http\Requests\Payments;
use Illuminate\Foundation\Http\FormRequest;
class StoreStorageCredentialsRequest extends FormRequest
class RegisterNewPaymentMethodRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
@@ -23,7 +23,8 @@ class StoreStorageCredentialsRequest extends FormRequest
public function rules()
{
return [
'storage' => 'required|array',
'token' => 'required|string',
'default' => 'required|boolean',
];
}
}

View File

@@ -1,9 +1,9 @@
<?php
namespace App\Users\Requests;
namespace App\Http\Requests\PublicPages;
use Illuminate\Foundation\Http\FormRequest;
class UserCreateAccessTokenRequest extends FormRequest
class SendContactMessageRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
@@ -23,7 +23,8 @@ class UserCreateAccessTokenRequest extends FormRequest
public function rules()
{
return [
'name' => 'required|string|min:3',
'email' => 'required|email',
'message' => 'required|string',
];
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\SetupWizard\Requests;
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\SetupWizard\Requests;
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\SetupWizard\Requests;
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;
@@ -23,20 +23,20 @@ class StoreEnvironmentSetupRequest extends FormRequest
public function rules()
{
return [
'broadcast' => 'required|array',
'storage' => 'required|array',
'environment' => 'required|string',
'storage.driver' => 'required|string',
'storage.key' => 'sometimes|nullable|string',
'storage.secret' => 'sometimes|nullable|string',
'storage.endpoint' => 'sometimes|nullable|string',
'storage.region' => 'sometimes|nullable|string',
'storage.bucket' => 'sometimes|nullable|string',
'mailDriver' => 'required|string',
'smtp' => 'sometimes|array',
'ses' => 'sometimes|array',
'mailgun' => 'sometimes|array',
'postmark' => 'sometimes|array',
'mail' => 'required|array',
'mail.driver' => 'required|string',
'mail.host' => 'required|string',
'mail.port' => 'required|string',
'mail.username' => 'required|string',
'mail.password' => 'required|string',
'mail.encryption' => 'required|string',
];
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\SetupWizard\Requests;
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\SetupWizard\Requests;
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\SetupWizard\Requests;
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Sharing\Requests;
namespace App\Http\Requests\Share;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Sharing\Requests;
namespace App\Http\Requests\Share;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -1,5 +1,5 @@
<?php
namespace Domain\Sharing\Requests;
namespace App\Http\Requests\Share;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Http\FormRequest;

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests\Subscription;
use Illuminate\Foundation\Http\FormRequest;
class StoreUpgradeAccountRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// Billings
'billing' => 'required|array',
'billing.billing_address' => 'required|string',
'billing.billing_city' => 'required|string',
'billing.billing_country' => 'required|string',
'billing.billing_name' => 'required|string',
'billing.billing_phone_number' => 'required|string',
'billing.billing_postal_code' => 'required|string',
'billing.billing_state' => 'required|string',
// Payment
'payment' => 'required|array',
'payment.type' => 'required|string',
'payment.meta' => 'required|sometimes|array',
'payment.meta.pm' => 'required|sometimes|string',
// Plan
'plan.data' => 'required|array',
'plan.data.attributes' => 'required|array',
'plan.data.attributes.capacity' => 'required|digits_between:1,9',
'plan.data.attributes.capacity_formatted' => 'required|string',
'plan.data.attributes.currency' => 'required|string',
'plan.data.attributes.description' => 'sometimes|string|nullable',
'plan.data.attributes.name' => 'required|string',
'plan.data.attributes.price' => 'required|string',
'plan.data.id' => 'required|string',
'plan.data.type' => 'required|string',
];
}
}

View File

@@ -1,8 +1,7 @@
<?php
namespace App\Users\Requests;
namespace App\Http\Requests\User;
use Illuminate\Foundation\Http\FormRequest;
use App\Users\Rules\PasswordMatchWithCurrent;
class UpdateUserPasswordRequest extends FormRequest
{
@@ -24,7 +23,6 @@ class UpdateUserPasswordRequest extends FormRequest
public function rules()
{
return [
'current' => ['required', 'string', new PasswordMatchWithCurrent()],
'password' => 'required|string|min:6|confirmed',
];
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class FileResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => $this->id,
'type' => 'file',
'attributes' => [
'name' => $this->name,
'basename' => $this->basename,
'mimetype' => $this->mimetype,
'filesize' => $this->filesize,
'type' => $this->type,
'file_url' => $this->file_url,
'thumbnail' => $this->thumbnail,
'created_at' => $this->created_at,
'updated_at' => $this->created_at,
],
],
];
}
}

View File

@@ -1,11 +1,11 @@
<?php
namespace App\Users\Resources;
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UsersMinimalCollection extends ResourceCollection
class InvoiceAdminCollection extends ResourceCollection
{
public $collects = UserMinimalResource::class;
public $collects = InvoiceAdminResource::class;
/**
* Transform the resource collection into an array.

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Http\Resources;
use App\Models\User;
use Laravel\Cashier\Cashier;
use Illuminate\Http\Resources\Json\JsonResource;
class InvoiceAdminResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$user = User::where('stripe_id', $this['customer'])
->first();
return [
'data' => [
'id' => $this['id'],
'type' => 'invoices',
'attributes' => [
'customer' => $this['customer'],
'total' => Cashier::formatAmount($this['total']),
'currency' => $this['currency'],
'created_at_formatted' => format_date($this['created']),
'created_at' => $this['created'],
'order' => $this['number'],
'user_id' => $user->id ?? null,
'client' => [
'billing_address' => $this['customer_address'],
'billing_name' => $this['customer_name'],
'billing_phone_number' => $this['customer_phone'],
],
'bag' => [
'amount' => $this['lines']['data'][0]['amount'],
'currency' => $this['lines']['data'][0]['currency'],
'type' => $this['lines']['data'][0]['type'],
'description' => $this['lines']['data'][0]['description'],
],
'seller' => null,
],
$this->mergeWhen($user, function () use ($user) {
return [
'relationships' => [
'user' => [
'data' => [
'id' => $user->id,
'type' => 'user',
'attributes' => [
'name' => $user->settings->name,
'avatar' => $user->settings->avatar,
],
],
],
],
];
}),
],
];
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class InvoiceCollection extends ResourceCollection
{
public $collects = InvoiceResource::class;
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => $this->collection,
];
}
}

View File

@@ -0,0 +1,96 @@
<?php
namespace App\Http\Resources;
use App\Models\User;
use Illuminate\Http\Resources\Json\JsonResource;
class InvoiceResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$user = User::whereStripeId($this->customer)
->first();
return [
'data' => [
'id' => $this->id,
'type' => 'invoices',
'attributes' => [
'customer' => $this->customer,
'total' => $this->total(),
'currency' => $this->currency,
'created_at_formatted' => format_date($this->date(), '%d. %B. %Y'),
'created_at' => $this->created,
'order' => $this->number,
'user_id' => $user->id ?? null,
'client' => [
'billing_address' => $this->customer_address,
'billing_name' => $this->customer_name,
'billing_phone_number' => $this->customer_phone,
],
'seller' => null,
'invoice_items' => $this->get_invoice_items(),
'invoice_subscriptions' => $this->get_invoice_subscriptions(),
],
$this->mergeWhen($user, [
'relationships' => [
'user' => [
'data' => [
'id' => $user->id,
'type' => 'user',
'attributes' => [
'name' => $user->settings->name,
'avatar' => $user->settings->avatar,
],
],
],
],
]),
],
];
}
/**
* @return array
*/
private function get_invoice_subscriptions(): array
{
$array = [];
foreach ($this->subscriptions() as $item) {
array_push($array, [
'amount' => $item->total(),
'description' => $item->description,
'currency' => $item->currency,
'type' => $item->type,
]);
}
return $array;
}
/**
* @return array
*/
private function get_invoice_items(): array
{
$array = [];
foreach ($this->invoiceItems() as $item) {
array_push($array, [
'amount' => $item->total(),
'description' => $item->description,
'currency' => $item->currency,
'type' => $item->type,
]);
}
return $array;
}
}

View File

@@ -1,7 +1,7 @@
<?php
namespace Domain\Localization\Resources;
namespace App\Http\Resources;
use Domain\Localization\Models\Language;
use App\Models\Language;
use Illuminate\Http\Resources\Json\ResourceCollection;
class LanguageCollection extends ResourceCollection
@@ -17,7 +17,7 @@ class LanguageCollection extends ResourceCollection
public function toArray($request)
{
$current_language = Language::with('languageTranslations')
->whereLocale(get_settings('language') ?? 'en')
->whereLocale(get_setting('language') ?? 'en')
->first();
return [

Some files were not shown because too many files have changed in this diff Show More