Compare commits

...

1483 Commits
1.7.7 ... light

Author SHA1 Message Date
Čarodej
c0907d81f9 removing files 2022-05-10 16:21:18 +02:00
Čarodej
1ed8a119c6 build 2022-05-10 16:15:10 +02:00
Čarodej
8470e8dcb7 changelog update 2022-05-10 16:08:36 +02:00
Čarodej
9720d34d6a Merge remote-tracking branch 'origin/master' into light
# Conflicts:
#	.env.testing
#	README.md
#	composer.json
#	composer.lock
#	config/language-translations.php
#	config/vuefilemanager.php
#	public/chunks/admin.js
#	public/chunks/database.js
#	public/chunks/demo.js
#	public/chunks/files.js
#	public/chunks/my-shared-items.js
#	public/chunks/platform.js
#	public/chunks/recent-uploads.js
#	public/chunks/settings-storage.js
#	public/chunks/settings.js
#	public/chunks/shared.js
#	public/chunks/shared/browser.js
#	public/chunks/shared/single-file.js
#	public/chunks/sign-in.js
#	public/chunks/status-check.js
#	public/chunks/trash.js
#	public/chunks/user-storage.js
#	public/css/tailwind.css
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/components/Subscription/UserFixedSubscriptionDetail.vue
#	resources/js/store/modules/userAuth.js
#	resources/js/views/Admin.vue
#	resources/js/views/Admin/PaymentSettings/PaymentSettingsTab/Payments.vue
#	resources/js/views/Admin/Plans.vue
#	resources/js/views/Admin/Plans/Create/CreateFixedPlan.vue
#	resources/js/views/Admin/Settings/AppSettingsTabs/SignInUp.vue
#	resources/js/views/Demo.vue
#	resources/js/views/Frontpage/Homepage.vue
#	resources/js/views/Platform.vue
#	resources/views/index.blade.php
#	src/App/Console/Commands/SetupWebsocketEnvironment.php
#	src/App/Users/Models/UserLimitation.php
#	src/Domain/RemoteUpload/Controllers/RemoteUploadFileController.php
#	src/Domain/RemoteUpload/Controllers/UploadFilesRemotelyForUploadRequestController.php
#	src/Domain/RemoteUpload/Controllers/VisitorRemoteUploadFileController.php
#	src/Domain/RemoteUpload/Requests/RemoteUploadRequest.php
#	src/Domain/Settings/Controllers/StoreBroadcastServiceCredentialsController.php
#	src/Domain/Settings/Controllers/StorePaymentServiceCredentialsController.php
#	src/Domain/SetupWizard/Controllers/StoreEnvironmentSettingsController.php
#	src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php
#	src/Support/Upgrading/Controllers/UpgradingVersionsController.php
2022-05-10 16:06:09 +02:00
Čarodej
ed17ed1a79 build 2022-05-10 11:17:01 +02:00
Čarodej
8c75166980 Fixed issue when you create plan with 0 team members amount 2022-05-10 10:48:05 +02:00
Čarodej
6472997cc1 fixed trash navigator issue 2022-05-10 10:25:42 +02:00
Čarodej
209667f55e fixed homepage redirection when homepage is disabled 2022-05-10 09:53:13 +02:00
Čarodej
73c84075c5 facebook authentication fix 2022-05-10 08:41:43 +02:00
Čarodej
5d7fed7de8 UnableToRetrieveMetadata error 2022-05-10 07:53:41 +02:00
Čarodej
b6cf1e2799 increase folder item count after drag in file 2022-05-10 07:09:28 +02:00
Čarodej
acfbbd56ca format code 2022-05-10 06:59:11 +02:00
Čarodej
b9a6bc05ff PayPal connection test 2022-05-10 06:58:34 +02:00
Čarodej
e3293f0b1a Stripe connection test 2022-05-09 17:38:38 +02:00
Čarodej
4eb901dae0 Paystack connection test 2022-05-09 17:32:44 +02:00
Čarodej
911f15d493 - Fixed upload issue 2022-05-09 16:58:14 +02:00
Čarodej
a43c799d59 - Fixed issue when upload doesn't start after you drag the file into empty view
- pointer cursor over file item
2022-05-09 15:06:21 +02:00
Čarodej
e9824bb807 show errors for recaptcha 2022-05-09 10:33:39 +02:00
Čarodej
2c933c65a7 added plan synchronization button 2022-05-09 09:57:25 +02:00
Čarodej
0b2d05a899 sanitizing env value before storing into the .env file 2022-05-09 08:23:38 +02:00
Čarodej
4e2ac2b890 moved subscription section in readme 2022-05-09 07:26:23 +02:00
Čarodej
6bd7456f2e bcmath in index moved into try/catch block 2022-05-09 07:25:18 +02:00
Čarodej
b8101087a7 file chunk fix 2022-05-08 10:59:52 +02:00
Čarodej
bbd6df4175 build 2022-05-08 10:46:13 +02:00
Čarodej
70fe106e45 - team members fix 2022-05-08 10:35:44 +02:00
Čarodej
1331409920 chunk issue 2022-05-08 10:13:22 +02:00
Čarodej
01970af8de websockets:install description redefined 2022-05-06 18:24:00 +02:00
Čarodej
63a72d6fe4 version change 2022-05-06 18:01:01 +02:00
Čarodej
9b5f8731d2 s3 private as a default 2022-05-06 17:28:00 +02:00
Čarodej
a08cc3172d demo url fix 2022-05-03 10:57:23 +02:00
Čarodej
e11b37e7fa build 2022-05-03 10:55:26 +02:00
Čarodej
a9aa9195a3 added demo page with button redirection
(cherry picked from commit 37cc94aeda)
2022-05-03 10:52:37 +02:00
Čarodej
37cc94aeda added demo page with button redirection 2022-05-03 10:48:31 +02:00
Čarodej
89689816ad exif fix 2022-05-02 07:00:26 +02:00
Čarodej
3b6391a74b build 2022-05-01 12:46:20 +02:00
Čarodej
50b6e635dc setup wizard database password as optional
(cherry picked from commit ba58e76d3b)
2022-05-01 12:45:00 +02:00
Čarodej
ba58e76d3b setup wizard database password as optional 2022-05-01 12:44:34 +02:00
Čarodej
623b7a9c9a build 2022-04-29 09:14:49 +02:00
Čarodej
241b4c04ba mimetype fix 2022-04-29 09:12:57 +02:00
Čarodej
12d7b3e92b mimetype fix 2022-04-29 09:09:53 +02:00
Čarodej
c8ebb5db9f refactoring 2022-04-29 08:24:35 +02:00
Čarodej
8cae9f2757 readme update 2022-04-29 08:18:59 +02:00
Čarodej
869dbd4797 build 2022-04-27 17:32:58 +02:00
Čarodej
35f6144569 - creating admin fix
- fixed hamburger menu in public folder
- red cancel sharing button

(cherry picked from commit 4b8bd3be52)
2022-04-27 17:28:48 +02:00
Čarodej
4b8bd3be52 - creating admin fix
- fixed hamburger menu in public folder
- red cancel sharing button
2022-04-27 17:28:03 +02:00
Čarodej
68d1e2e60b fixes 2022-04-27 16:30:48 +02:00
Čarodej
08ee6567bc setup wizard refactoring 2022-04-27 11:42:28 +02:00
Čarodej
39c94473c8 readme edit 2022-04-27 11:11:50 +02:00
Čarodej
7f08af4643 language fix 2022-04-27 10:50:49 +02:00
Čarodej
95629ad57d build 2022-04-27 10:33:04 +02:00
Čarodej
e645291855 language translation deletion 2022-04-27 10:29:06 +02:00
Čarodej
3b3bf62cb8 code deletion 2022-04-27 09:57:31 +02:00
Čarodej
a4aa329bf4 version change 2022-04-27 08:22:06 +02:00
Čarodej
97a807a5e5 deleted frontend code 2022-04-27 08:18:39 +02:00
Čarodej
eb4d5b4cba deleted frontend code 2022-04-27 08:17:06 +02:00
Čarodej
f45c1eb576 deleted pro code 2022-04-26 14:08:20 +02:00
Čarodej
188d5613b7 deleted pro files 2022-04-26 10:53:24 +02:00
Čarodej
92561d137d get exif data refactoring 2022-04-26 10:08:11 +02:00
Čarodej
43368c7555 added pdo_mysql into required php modules 2022-04-26 08:33:52 +02:00
Čarodej
5e9e4142d0 mimetype hotfix 2022-04-25 20:10:41 +02:00
Čarodej
7be7203b96 version change 2022-04-25 20:04:49 +02:00
Čarodej
0adc0f4fcd version change 2022-04-25 20:04:22 +02:00
Čarodej
110a22d317 mimetype reading fix 2022-04-25 20:03:55 +02:00
Čarodej
68b4722668 readme/changelog update 2022-04-25 12:44:59 +02:00
Čarodej
612298ebec queue:work command edit 2022-04-25 12:27:28 +02:00
Čarodej
48492f87be remote upload demo functionality 2022-04-25 12:18:02 +02:00
Čarodej
01735b4e1f remote upload demo functionality 2022-04-25 12:11:37 +02:00
Čarodej
e769c33af6 build 2022-04-25 11:01:35 +02:00
Čarodej
b635a17644 remote upload refactoring 2022-04-25 10:56:15 +02:00
Čarodej
954f0e3361 implemented remote upload progress counter 2022-04-25 10:13:10 +02:00
Čarodej
6a9fa9ceec readme update 2022-04-23 09:56:15 +02:00
Čarodej
20162ac366 language translation enhancement 2022-04-23 09:52:30 +02:00
Čarodej
0a9740a363 broadcast new files to the frontend after file was remotely uploaded 2022-04-23 09:44:43 +02:00
Čarodej
4b366747b6 Merge remote-tracking branch 'origin/remote-upload-merge'
# Conflicts:
#	public/mix-manifest.json
2022-04-22 16:37:07 +02:00
Čarodej
c2595a0de4 readme updated with broadcasting section 2022-04-22 16:36:29 +02:00
Čarodej
6e8714aec5 websocket allowed origins implementation 2022-04-22 09:44:40 +02:00
Čarodej
5e86799a82 vuefilemanager broadcast server enhancements 2022-04-22 08:58:00 +02:00
Čarodej
d586eb9d7e extractExtensionFromUrl refactoring 2022-04-21 18:05:34 +02:00
Čarodej
35d89e2be1 remote upload implementation into file request 2022-04-21 17:31:47 +02:00
Čarodej
409ab8c03f refactor user in upload controllers 2022-04-21 16:57:38 +02:00
Čarodej
8be0ae2a62 remote upload for shared route 2022-04-21 16:47:22 +02:00
Čarodej
d43efad45e Merge remote-tracking branch 'origin/master' 2022-04-21 09:12:58 +02:00
Čarodej
c86f93ac1e build 2022-04-21 09:12:47 +02:00
Čarodej
64b0dff8fb - The switch button in archived plans is now hidden
- updated readme.md
- Fixed upload progressbar in mobile version
- Added Viet Nam language into the language editor
2022-04-21 09:11:57 +02:00
Čarodej
ca76463fab fixed issue in backblaze connection test 2022-04-21 08:28:40 +02:00
Čarodej
e4dd9de931 reload view after remote upload was finished 2022-04-20 19:20:48 +02:00
Čarodej
dc8e3c8141 remote upload backend functionality 2022-04-20 18:19:25 +02:00
Čarodej
97ef846a44 composer lock fix 2022-04-20 17:30:05 +02:00
Čarodej
5b130d01af build 2022-04-19 19:11:53 +02:00
Čarodej
552e5e02c9 google button fix 2022-04-19 19:10:18 +02:00
Čarodej
19e29e69e0 file chunks refactoring 2022-04-19 09:40:31 +02:00
Čarodej
6c3e7801da remote upload popup frontend 2022-04-14 15:16:43 +02:00
Čarodej
50eb67ac79 fixed issue with overflowing text in small screen for FilePreview 2022-04-14 11:08:51 +02:00
Čarodej
cd5af37bfe store refactoring 2022-04-13 16:26:11 +02:00
Čarodej
338f8664b7 vue components refactoring 2022-04-13 16:19:10 +02:00
Čarodej
6a4bfa8bfe readme update 2022-04-13 08:45:06 +02:00
Čarodej
b439fc1070 build 2022-04-12 11:11:31 +02:00
Čarodej
8baa466782 update for setEnvironmentValue function 2022-04-12 11:10:38 +02:00
Čarodej
8df7794484 ftp setup added 2022-04-12 10:43:23 +02:00
Čarodej
e71810a9bb mail setup refactoring 2022-04-12 08:36:10 +02:00
Čarodej
b37bbe38dc storage setup refactoring 2022-04-11 17:20:59 +02:00
Peter Papp
a051ab568d Merge pull request #14 from VueFileManager/dependabot/npm_and_yarn/follow-redirects-1.14.8
Bump follow-redirects from 1.14.7 to 1.14.8
2022-04-11 15:57:07 +02:00
Peter Papp
ab2c8b8371 Merge pull request #5 from VueFileManager/dependabot/npm_and_yarn/dns-packet-1.3.4
Bump dns-packet from 1.3.1 to 1.3.4
2022-04-11 15:56:56 +02:00
Peter Papp
b803c32b41 Merge pull request #15 from VueFileManager/dependabot/npm_and_yarn/node-forge-1.3.0
Bump node-forge from 1.2.1 to 1.3.0
2022-04-11 15:56:44 +02:00
Peter Papp
5d1d883fb1 Merge pull request #16 from VueFileManager/dependabot/npm_and_yarn/minimist-1.2.6
Bump minimist from 1.2.5 to 1.2.6
2022-04-11 15:56:21 +02:00
Čarodej
e5f4bad9a9 azure implementation 2022-04-11 11:59:16 +02:00
Čarodej
fbc9eed30b ftp implementation 2022-04-11 09:34:25 +02:00
Čarodej
7740e1673f build 2022-04-08 10:35:00 +02:00
Čarodej
9de6c65643 Test ses connection before storing credentials into the app 2022-04-08 10:30:44 +02:00
Čarodej
9a15f2ecd8 Test postmark connection before storing credentials into the app 2022-04-08 09:44:58 +02:00
Čarodej
86090d5192 Test mailgun connection before storing credentials into the app 2022-04-08 08:00:13 +02:00
Čarodej
6ed2efcc4e default color for avatar was changed 2022-04-07 15:44:41 +02:00
Čarodej
85d4f535eb tnt search tweaked 2022-04-07 15:04:31 +02:00
Čarodej
03d78937dc replaced google icon 2022-04-07 14:48:42 +02:00
Čarodej
596fa5f95c fixed uploading in demo account 2022-04-07 14:30:28 +02:00
Čarodej
8d1ee24c7a updated language translations 2022-04-07 14:17:46 +02:00
Čarodej
18ffb24941 after cancelled shared link in SharedLinks, remove items from view 2022-04-07 12:17:49 +02:00
Čarodej
f5879c0670 fixed language tab in mobile version 2022-04-07 12:08:55 +02:00
Čarodej
60a3c46ffe added spinner into button when user accept or reject team invitation 2022-04-07 12:05:14 +02:00
Čarodej
76b32f551f responsive paginator fix 2022-04-07 11:42:14 +02:00
Čarodej
03d42bee51 - language strings fix
- scrolling fix
2022-04-07 11:31:37 +02:00
Čarodej
e240ce7736 dashboard app bar refactored 2022-04-07 11:18:47 +02:00
Čarodej
93dbaa081d iOs window height fix 2022-04-07 11:00:24 +02:00
Čarodej
eb48aa46e3 - fixed issue with centering and overflowing info sidebar 2022-04-07 10:37:11 +02:00
Čarodej
7bd1079ce9 in image share link, return s3 url address of image 2022-04-07 09:11:49 +02:00
Čarodej
ade6b05bd0 codecanyon.html updated 2022-04-07 08:19:26 +02:00
Čarodej
7e0913b363 open searched file from spotlight in FilePreview 2022-04-06 18:17:50 +02:00
Čarodej
736a809e83 open searched file from spotlight in FilePreview 2022-04-06 18:16:07 +02:00
Čarodej
9a11af3b39 Move item grid to folder bug 2022-04-06 15:22:09 +02:00
Čarodej
4ae4e70fe4 Move item grid to folder bug 2022-04-06 10:55:15 +02:00
Čarodej
657248aa43 The delay after first upload in file request when the interface wasn't showing was removed 2022-04-06 10:35:13 +02:00
Čarodej
b0f1bb46d7 clear howdy file requests in demo account 2022-04-06 09:36:10 +02:00
Čarodej
490fe5a120 readme update 2022-04-06 09:24:29 +02:00
Čarodej
953e7892b7 Wasabi region list updated 2022-04-06 08:32:32 +02:00
Čarodej
34bd1d3a3c language moved 2022-04-05 17:09:34 +02:00
Čarodej
8035ea2b23 feb 2022-04-05 16:47:53 +02:00
Čarodej
993dfc8fa1 updates automatically handled on the background 2022-04-05 16:43:12 +02:00
Čarodej
3649b6b7cf update language strings action added 2022-04-05 14:25:45 +02:00
Čarodej
23fdab0f68 npm upgrade 2022-04-05 11:04:37 +02:00
Čarodej
736174fda7 readme update 2022-04-05 11:03:42 +02:00
Čarodej
4e9c40d7ed delete language transaction in 2.0.14 update 2022-04-05 10:02:24 +02:00
Čarodej
10d8b592ea confirm token in 2fa challenge 2022-04-05 09:52:49 +02:00
Čarodej
9f783fcd95 Added new app settings shortcuts findable by spotlight - Application, Login & Registration, Appearance, Adsense, Homepage, Environment, Server 2022-04-05 08:05:32 +02:00
Čarodej
d386f70be8 set default max team members in admin and setup wizard 2022-04-05 07:47:37 +02:00
Čarodej
2c86c62d7f meta infinite members fix 2022-04-05 07:06:18 +02:00
Čarodej
4e9e8c47c0 language string fix 2022-04-05 06:44:42 +02:00
Čarodej
ba308fa70a item grid sm image 2022-04-04 19:35:14 +02:00
Čarodej
e8a0c421e9 plan import fix 2022-04-04 19:11:35 +02:00
Čarodej
bf6bc17d7d auto plan synchronization 2022-04-04 19:05:02 +02:00
Čarodej
80b2371868 delete only howdy share links in demo mode 2022-04-04 17:49:18 +02:00
Čarodej
3d9272b05e - spotlight mobile fix with opening image 2022-04-04 17:38:22 +02:00
Čarodej
2fa73dc3d2 - set paypal mode in credentials setup 2022-04-04 16:52:50 +02:00
Čarodej
b219c00113 - set paypal mode in credentials setup 2022-04-04 16:48:29 +02:00
Čarodej
c1f775975d - image thumbnail fix in s3
- svg thumbnail fix
2022-04-04 12:58:07 +02:00
Čarodej
a3805b4bff removed pcntl 2022-04-02 20:31:18 +02:00
Čarodej
be37f95404 - Added status column to the fixed plan table
- Ability to delete fixed plan if there isn't any subscribed user
- Improved error handling in subscription module
2022-04-02 17:52:48 +02:00
Čarodej
086dab99cd feb 2022-04-01 17:19:51 +02:00
Čarodej
2d4c7241ef test smtp connection before set up 2022-04-01 17:18:51 +02:00
Čarodej
d4199a796d test s3 connection before set up 2022-04-01 13:01:18 +02:00
Čarodej
e4d44fc5eb Ability to set custom s3 compatible service in administration settings and setup wizard 2022-04-01 11:26:59 +02:00
Čarodej
40b13acbb9 improved email setup 2022-04-01 10:14:50 +02:00
Čarodej
b1160a1327 added pcntl extension to the required 2022-04-01 09:04:21 +02:00
Čarodej
9cfe6118a9 item popup fix 2022-03-31 17:45:03 +02:00
Čarodej
64dbcf287d spatie config notification fix 2022-03-31 17:20:24 +02:00
Čarodej
bfe4c257a2 max_execution_time fix 2022-03-31 16:56:14 +02:00
Čarodej
1615be340a added spinner into dashboard AlertBox.vue 2022-03-31 13:03:29 +02:00
Čarodej
2ce165dd65 feb 2022-03-31 12:08:06 +02:00
Čarodej
c5bfd99df7 fixed demo under envato iframe 2022-03-31 12:04:36 +02:00
Čarodej
182451515c auto delete all shared links every day in demo mode 2022-03-31 11:22:13 +02:00
Čarodej
ff476251f5 .dwg fix 2022-03-31 11:18:09 +02:00
Čarodej
ef9f654834 added chunk size edit to the admin 2022-03-31 10:41:50 +02:00
Čarodej
ab042cc4b3 readme update 2022-03-31 10:09:18 +02:00
Čarodej
3f8fc1c9ce dashboard alert box for new system upgrade 2022-03-30 18:12:41 +02:00
Čarodej
dff804153e upgrade functionality for v2.0.10 fix 2022-03-30 13:43:08 +02:00
Čarodej
d362b37cd3 upgrade functionality for v2.0.10 2022-03-30 13:36:28 +02:00
Čarodej
621f6770c5 demo generator team update 2022-03-30 12:03:31 +02:00
Čarodej
d1d58711c5 disabled moving and deleting folders from root of TeamFolders 2022-03-30 09:56:14 +02:00
Čarodej
36883d1c0d disabled moving and deleting folders from root of TeamFolders 2022-03-30 09:56:09 +02:00
Čarodej
0ca67c2348 - when member upload files or create folder in team folder, the true owner of the content is creator of team member. That means the upload bandwidth and storage go to creator responsibility 2022-03-30 09:34:25 +02:00
Čarodej
0fbb8fd8ee build 2022-03-29 12:30:39 +02:00
Čarodej
b0829c71e9 build 2022-03-29 12:29:32 +02:00
Čarodej
af3f08e728 fixed moving issue when user move folder with files into team folder 2022-03-29 12:28:22 +02:00
Čarodej
32d4873715 disabled 2fa set up in demo mode for howdy account 2022-03-29 10:49:08 +02:00
dependabot[bot]
b8a1390220 Bump minimist from 1.2.5 to 1.2.6
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-29 08:27:02 +00:00
Čarodej
9d4d1ba9aa s3 bandwidth usage fix 2022-03-29 10:06:20 +02:00
Čarodej
8c59501907 - build 2022-03-28 18:40:05 +02:00
Čarodej
ed67927672 unlimited team members text fix 2022-03-28 18:03:38 +02:00
Čarodej
e604c8e4fd text logo fix on shared page 2022-03-28 17:13:41 +02:00
Čarodej
4ea76419db contact form fix 2022-03-28 17:03:30 +02:00
Čarodej
8d13d82af9 removed todo 2022-03-28 16:58:10 +02:00
Čarodej
6ee142b58c user delete fix 2022-03-28 11:49:09 +02:00
Čarodej
5964bebad2 user storage fix 2022-03-28 11:38:05 +02:00
Čarodej
6a48beb793 adsense fix 2022-03-28 10:49:15 +02:00
Čarodej
bbd8e70c9d - s3 direct download 2022-03-25 19:14:32 +01:00
Čarodej
e232543ea4 - language updates 2022-03-25 18:47:12 +01:00
Čarodej
62c6331845 - direct download link 2022-03-25 18:20:27 +01:00
Čarodej
43f2a43d6c - app logo extension fix
- redirect when user is logged in sign in/up page
2022-03-25 16:48:15 +01:00
Čarodej
c5810e962b - download/upload statistics in admin panel fix 2022-03-25 11:36:50 +01:00
Čarodej
d7d95e22ea - share by email fix 2022-03-25 11:10:35 +01:00
Čarodej
8c1e59d81a - bug in demo folder favourites fixed 2022-03-25 10:51:20 +01:00
Čarodej
3c1c6eb5b9 license upgrade function 2022-03-25 10:34:39 +01:00
Čarodej
df05eb0433 s3 configuration fix 2022-03-25 07:38:22 +01:00
Čarodej
bb1d775585 codecanyon text update 2022-03-24 19:18:30 +01:00
Čarodej
7f49ae011c readme update 2022-03-23 19:26:51 +01:00
Čarodej
a608678bb9 plan tables for fixed billing
language translation fix
2022-03-23 19:16:40 +01:00
Čarodej
aa515b5450 deleted some files 2022-03-23 16:57:09 +01:00
dependabot[bot]
87466e4596 Bump node-forge from 1.2.1 to 1.3.0
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.2.1 to 1.3.0.
- [Release notes](https://github.com/digitalbazaar/forge/releases)
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.2.1...v1.3.0)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-22 18:48:10 +00:00
Čarodej
3f01dd3f95 s3 multipart upload fix 2022-03-22 19:25:38 +01:00
Čarodej
5531be6640 - language fix
- move item popup fix
2022-03-21 11:56:31 +01:00
Čarodej
1d144d6c9e notification mobile fix 2022-03-21 09:38:15 +01:00
Čarodej
b043878eed chunk upload fix 2022-03-21 09:35:13 +01:00
Čarodej
a2d0b26b68 language fix 2022-03-21 08:34:59 +01:00
Čarodej
381a440c61 codecanyon images 2022-03-20 22:10:45 +01:00
Čarodej
95efdc3993 changelog 2022-03-20 21:41:55 +01:00
Čarodej
dece343d8b composer update 2022-03-20 19:20:35 +01:00
Čarodej
5d15f3da51 build 2022-03-20 19:02:34 +01:00
Čarodej
42245317f4 fixes 2022-03-20 19:00:46 +01:00
Čarodej
73ef6e6c1f backend language strings updates 2022-03-20 14:26:53 +01:00
Čarodej
881facc867 language strings updates 2022-03-20 12:12:09 +01:00
Čarodej
98d9f3ab0d language strings refactoring 2022-03-19 10:14:11 +01:00
Čarodej
7564c01fa3 removed unused language strings 2022-03-19 09:26:43 +01:00
Čarodej
1ad8fbdd57 alert icon in mobile menu 2022-03-18 07:21:33 +01:00
Čarodej
10f37e645b alert icon in mobile menu 2022-03-17 18:31:10 +01:00
Čarodej
ca883a6f93 server status fix 2022-03-17 17:54:04 +01:00
Čarodej
0d59fe5b8e composer update 2022-03-17 16:58:16 +01:00
Čarodej
fea2d839e7 fakeRenameFileOrFolder fixes 2022-03-17 16:52:58 +01:00
Čarodej
0c334f5daf fakeRenameFileOrFolder fixes 2022-03-17 14:43:46 +01:00
Čarodej
87bcd50e44 SetUploadRequestAsFilledController demo fix 2022-03-17 14:36:29 +01:00
Čarodej
01588fa06b - admin registration fixes
- alert popup refactoring
2022-03-17 12:31:09 +01:00
Čarodej
e8f59ef0a9 fixes 2022-03-17 10:06:29 +01:00
Čarodej
9c040cfe48 folder creation fix 2022-03-17 09:38:49 +01:00
Čarodej
4b899d8f29 composer fix 2022-03-16 17:25:45 +01:00
Čarodej
e8c3fd74b1 added AdminBonusAddedNotification.php and InsufficientBalanceNotification.php 2022-03-16 17:22:55 +01:00
Čarodej
1d1e6823c7 added AdminBonusAddedNotification.php and InsufficientBalanceNotification.php 2022-03-16 11:45:08 +01:00
Čarodej
bc197cbb5e added SubscriptionWasCreatedNotification 2022-03-16 11:08:57 +01:00
Čarodej
9a6abbd6e8 added BillingAlertTriggeredNotification 2022-03-16 10:37:55 +01:00
Čarodej
60407f9dce cron indicator improvement 2022-03-16 09:50:49 +01:00
Čarodej
9d955799d3 set broadcasting in admin and setup wizard 2022-03-16 09:37:17 +01:00
Čarodej
4bab179e17 feb 2022-03-15 18:04:26 +01:00
Čarodej
aa5742dafa dark mode logo 2022-03-15 18:03:28 +01:00
Čarodej
f6f4184fb2 barchart center fix 2022-03-15 16:51:33 +01:00
Čarodej
f6ea18fce2 - admin form fix
- backblaze new region
- webhook url new place
2022-03-15 16:39:17 +01:00
Čarodej
a544578b38 backspace fix 2022-03-15 11:47:32 +01:00
Čarodej
5fa205de27 Revert "removed backspace functionality for team folder and sharedwithme homepage"
This reverts commit dfeef6fd
2022-03-15 11:47:16 +01:00
Čarodej
806af9da5c space between mobilemultiselect toolbar 2022-03-15 11:40:57 +01:00
Čarodej
dfeef6fdf8 removed backspace functionality for team folder and sharedwithme homepage 2022-03-15 11:21:14 +01:00
Čarodej
d0b4b729c9 hide overlays by esc shortcut 2022-03-15 10:59:38 +01:00
Čarodej
1c4b4c6279 - fixed create menu items
- reload team folder after update team member
2022-03-15 10:39:43 +01:00
Čarodej
556f6d0813 fixed uploaded image default rotation 2022-03-15 09:08:54 +01:00
Čarodej
3f4263393e file preview fix 2022-03-15 08:35:16 +01:00
Čarodej
a51dece5ee - readme update
- command update
2022-03-14 18:16:50 +01:00
Čarodej
a7db1a22d2 installation release image 2022-03-14 11:41:43 +01:00
Čarodej
ee80f454fb readme update 2022-03-14 11:15:44 +01:00
Čarodej
2c4175b708 check write permission added into setup wizard and server status 2022-03-14 10:51:19 +01:00
Čarodej
fe3fbe7db7 UI Fixes part III. 2022-03-14 10:10:23 +01:00
Čarodej
3c35ea9a4e UI Fixes part II. 2022-03-14 09:02:40 +01:00
Čarodej
f835c6a7c2 UI Fixes 2022-03-14 08:45:26 +01:00
Čarodej
5e48af22a2 setup wizard debug 2022-03-13 18:30:03 +01:00
Čarodej
2bba6dc051 added registration bonus notification 2022-03-12 09:34:26 +01:00
Čarodej
ab03b471f7 click outside of notification center hide notification popup 2022-03-12 09:10:34 +01:00
Čarodej
9e973b89ce notification implementation into the toaster 2022-03-12 08:40:35 +01:00
Čarodej
0e45092795 pusher update 2022-03-11 12:56:18 +01:00
Čarodej
c1ace2854f pusher update 2022-03-11 09:27:56 +01:00
Čarodej
4e471cb077 pusher update 2022-03-11 09:21:15 +01:00
Čarodej
ffa4f67cbd feb 2022-03-11 09:17:53 +01:00
Čarodej
8e4fc55b23 feb 2022-03-11 09:11:20 +01:00
Čarodej
ee516fd384 added wss 2022-03-11 09:09:46 +01:00
Čarodej
da27c47d7a pusher host setup 2022-03-11 08:58:54 +01:00
Čarodej
28d99cce78 pusher host fix 2022-03-11 08:43:41 +01:00
Čarodej
0905a0660c - demo notifications generator
- frontend build
2022-03-11 08:40:32 +01:00
Čarodej
d02ca13197 - demo notifications generator
- frontend build
2022-03-10 16:45:18 +01:00
Čarodej
9ae2d54a5e team invitation notification with broadcasting 2022-03-10 16:23:13 +01:00
Čarodej
64e80d387b backend notifications implementation 2022-03-10 11:49:02 +01:00
Čarodej
70d7f2f5bd Merge remote-tracking branch 'origin/sockets'
# Conflicts:
#	composer.lock
#	public/mix-manifest.json
2022-03-10 07:14:08 +01:00
Čarodej
4315cddcb2 extended UploadRequestFulfilledNotification with array 2022-03-10 07:13:38 +01:00
Čarodej
26f7cdb80f added notification center UI 2022-03-10 06:27:04 +01:00
Čarodej
8495ed5422 websocket implementation 2022-03-09 07:40:05 +01:00
Čarodej
2a0b01e888 chunkFilename added 2022-03-08 11:50:15 +01:00
Čarodej
6ebf5dc3cb added file request MobileContextMenu 2022-03-08 11:45:36 +01:00
Čarodej
dd1f3b299d ability to download log from admin 2022-03-08 10:51:32 +01:00
Čarodej
4e2155b75a set storage driver via admin 2022-03-08 09:42:18 +01:00
Čarodej
c0ca83193f prematurely 2fa switched before 2fa was set fix 2022-03-08 08:51:31 +01:00
Čarodej
08175d4dba image changes 2022-03-07 17:43:43 +01:00
Čarodej
e6043e4530 fixed avatar 2022-03-07 16:49:34 +01:00
Čarodej
bf62c007ac Merge remote-tracking branch 'origin/master'
# Conflicts:
#	codecanyon.html
2022-03-07 16:48:28 +01:00
Čarodej
1cf50206cb demo images 2022-03-07 16:48:01 +01:00
Čarodej
9bc0ce3c3d demo images 2022-03-07 11:24:22 +01:00
Čarodej
2fa0b5cd77 extended teams demo 2022-03-07 10:31:37 +01:00
Čarodej
241190104e subscription repository update 2022-03-06 10:13:04 +01:00
Čarodej
23054c2257 dark mode revision 2022-03-06 09:25:11 +01:00
Čarodej
1e4649eec2 demo functions refactoring 2022-03-05 18:09:53 +01:00
Čarodej
81f227c5e7 added callback url to the socialite settings 2022-03-05 16:55:02 +01:00
Čarodej
5829eaacc4 removed SocialiteCallback.vue 2022-03-05 11:35:17 +01:00
Čarodej
e0e488860d socialite fix 2022-03-05 11:18:53 +01:00
Čarodej
2c90db8e04 credentials settings fix 2022-03-05 10:15:50 +01:00
Čarodej
0a30ca0b98 create new subscription if stripe was previously cancelled 2022-03-05 09:35:42 +01:00
Čarodej
ae138bb4d4 swap stripe subscription 2022-03-04 18:51:06 +01:00
Čarodej
ad5b741feb paystack refactoring 2022-03-04 13:37:28 +01:00
Čarodej
cad1a1680c paystack refactoring 2022-03-04 13:36:28 +01:00
Čarodej
0f6dd0304f auto redirect 2022-03-04 12:25:46 +01:00
Čarodej
2724fb1873 fb 2022-03-04 11:50:54 +01:00
Čarodej
0f4b80ddac upgrade subscription popup 2022-03-04 11:35:38 +01:00
Čarodej
6155173d82 fb 2022-03-03 17:32:45 +01:00
Čarodej
6ca2269c80 fixes part 6 2022-03-03 07:37:28 +01:00
Čarodej
4b751a29c2 env variables refactoring 2022-03-02 10:43:27 +01:00
Čarodej
ff9198a03e frontend build 2022-03-02 09:02:11 +01:00
Čarodej
0c0a2424b7 frontend build 2022-03-02 07:47:10 +01:00
Čarodej
a3abfd670a fixes part 5 2022-03-02 07:43:20 +01:00
Čarodej
90303458a0 fixes part 4 2022-03-01 18:04:36 +01:00
Čarodej
3f0a69a062 fixes part 3 2022-03-01 11:35:01 +01:00
Čarodej
a303ffffdc fixes part 2 2022-03-01 10:15:50 +01:00
Čarodej
64d1883f53 fixes part 1 2022-03-01 08:24:51 +01:00
Čarodej
071bdc1bcd file request language strings added 2022-02-28 18:25:18 +01:00
Čarodej
30025271c2 toggle favourites refactor 2022-02-28 17:38:18 +01:00
Čarodej
8ae24a9a6e multi email input refactoring 2022-02-28 17:06:41 +01:00
Čarodej
dee1614297 transaction date fix 2022-02-28 09:08:51 +01:00
Čarodej
c2e4b50df5 fixed missing days and sorting in traffic widget 2022-02-28 09:03:57 +01:00
Čarodej
2e80da830a file metadata refactoring 2022-02-28 07:26:35 +01:00
Čarodej
c84850e8d2 Merge remote-tracking branch 'origin/exif_metadata'
# Conflicts:
#	public/mix-manifest.json
#	resources/js/App.vue
#	resources/js/components/FilesView/ImageMetaData.vue
#	resources/js/components/FilesView/InfoSidebar.vue
#	resources/js/components/FilesView/SearchBar.vue
#	resources/js/components/Spotlight/Spotlight.vue
#	resources/js/views/Shared.vue
#	src/Domain/Files/Resources/FileResource.php
2022-02-25 18:23:08 +01:00
Čarodej
6fd8ddf680 FileResource.php refactor 2022-02-25 18:12:14 +01:00
Čarodej
ab3a307dc1 Laravel 9 upgrade 2022-02-25 17:37:17 +01:00
Čarodej
c3a6f5d703 UI enhancements for file request 2022-02-25 09:42:55 +01:00
Čarodej
293eb679fa - added file request into the spotlight
- after enter stop editing item name
2022-02-25 08:35:21 +01:00
Čarodej
45dcdcce16 added email notification about fulfilling upload request 2022-02-24 10:43:35 +01:00
Čarodej
a589ee5f7a browsing through upload request 2022-02-24 10:20:38 +01:00
Čarodej
06b28aeee3 file preview optimization for upload request 2022-02-23 16:43:20 +01:00
Čarodej
047b907c60 it move file to another folder in upload request 2022-02-23 11:13:29 +01:00
Čarodej
eb7b319ebd get navigation tree for upload request 2022-02-23 10:39:50 +01:00
Čarodej
aef715e061 delete items in file request 2022-02-23 10:05:09 +01:00
Čarodej
fdfb5f57d7 create folder in upload request 2022-02-23 08:26:16 +01:00
Čarodej
0501e3e3d5 Rename upload request item 2022-02-23 07:53:34 +01:00
Čarodej
efb0fc4734 InfoSidebarUploadRequest for upload request 2022-02-23 06:53:29 +01:00
Čarodej
f15c81d342 auto expiration after latest upload 2022-02-22 16:41:17 +01:00
Čarodej
6feadfd188 auto expiration for upload request 2022-02-22 11:53:51 +01:00
Čarodej
ee67b8050d mobile file request 2022-02-22 11:36:28 +01:00
Čarodej
c3398f0da4 finish file request 2022-02-22 09:35:06 +01:00
Čarodej
171ee5fa04 security of request upload item 2022-02-19 12:49:56 +01:00
Čarodej
1107bf66af upload file into request folder and get their thumbnails 2022-02-19 12:32:19 +01:00
Čarodej
5be55b52bd create folder after upload first file 2022-02-18 09:32:19 +01:00
Čarodej
6db8b0662a create/get upload request backend 2022-02-17 16:55:35 +01:00
Čarodej
45a3b5415b create/get upload request backend 2022-02-17 10:11:43 +01:00
Čarodej
394a7b6baf upload request prototype UI 2022-02-16 16:57:57 +01:00
Čarodej
3fafc811fe UI Fixes 4 2022-02-15 18:30:58 +01:00
Čarodej
5ee77da25f UI Fixes 2 2022-02-15 17:39:59 +01:00
Čarodej
421388b360 UI Fixes 2022-02-15 16:08:12 +01:00
dependabot[bot]
8828432e4d Bump follow-redirects from 1.14.7 to 1.14.8
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-15 10:02:43 +00:00
Čarodej
820f0b3890 latest database backups included into the admin settings 2022-02-15 10:40:59 +01:00
Čarodej
b897eaf482 server status included into the admin settings 2022-02-15 09:33:53 +01:00
Čarodej
da74a38605 invitation fix 2022-02-14 08:54:26 +01:00
Čarodej
00c6562719 handle team invitation for non registered user 2022-02-12 11:28:08 +01:00
Čarodej
4498461e70 none billing app fixes 2022-02-12 09:16:36 +01:00
Čarodej
948c7453a6 fixed billing app fixes 2022-02-11 17:25:39 +01:00
Čarodej
eb948f9000 metered billing app fixes 2022-02-11 17:02:17 +01:00
Čarodej
3fd43936e7 improved email setup in admin settings 2022-02-11 10:52:14 +01:00
Čarodej
03730b80c0 setup wizard funcionality upgrade for v2 2022-02-11 10:05:12 +01:00
Čarodej
3867c9cd67 admin creation via setup wizard refactoring 2022-02-10 09:06:47 +01:00
Čarodej
b5c00e98df email setup test 2022-02-10 08:57:47 +01:00
Čarodej
9f5172da85 added multiple email drivers into setup wizard 2022-02-09 16:17:31 +01:00
Čarodej
a6940379cb setup wizard refactoring 2022-02-09 14:04:51 +01:00
Čarodej
a9e4daed35 UI enhancements 2022-02-09 08:40:28 +01:00
Čarodej
e7d9fca9c2 contextmenu fix 2022-02-08 18:12:07 +01:00
Čarodej
638a1a9a72 video preview in shared single page 2022-02-08 17:34:07 +01:00
Čarodej
4df575f5e9 Shared pages refactoring part 3 2022-02-08 14:25:28 +01:00
Čarodej
7b0f9a19de Shared pages refactoring part 2 2022-02-08 12:58:47 +01:00
Čarodej
f04c057490 Shared pages refactoring part 1 2022-02-08 10:01:38 +01:00
Čarodej
09774b1d48 Google adsense implementation 2022-02-07 17:47:29 +01:00
Čarodej
81362fef2d pdfvuer resolve 2022-02-06 15:43:26 +01:00
Čarodej
58fae35085 drag ui refactoring 2022-02-06 14:56:11 +01:00
Čarodej
21e184f373 resolved timezones 2022-02-06 14:26:42 +01:00
Čarodej
38e86b4b8b UI fixes 2022-02-05 12:30:02 +01:00
Čarodej
6980c28c57 ad test 2022-02-04 14:25:26 +01:00
Čarodej
e794ef5c17 ad test 2022-02-04 11:20:40 +01:00
Čarodej
f8317e761b frontend build 2022-02-04 10:58:24 +01:00
Čarodej
5a28eeef1e UI improvements 3 2022-02-03 18:50:12 +01:00
Čarodej
cad8c31422 UI improvements 2 2022-02-03 18:19:10 +01:00
Čarodej
78f69ca816 UI improvements 2022-02-03 11:58:52 +01:00
Čarodej
bb9280d050 File preview refactoring 2022-02-03 10:49:14 +01:00
Čarodej
b751429dc5 UI/UX improvements 2022-02-01 16:01:57 +01:00
Milos Holba
45a46bbc65 added windows shortcut for spotlight 2022-02-01 14:21:12 +01:00
Čarodej
b38b532cbe added prettier 2022-02-01 12:21:38 +01:00
Čarodej
5ae875233b tailwind 3 upgrade part 4 2022-02-01 11:36:25 +01:00
Milos Holba
2ca42f530b addded test for save file exif metadata 2022-01-29 12:48:21 +01:00
Čarodej
dcba1e8407 tailwind 3 upgrade part 3 2022-01-28 16:32:01 +01:00
Čarodej
854ae6d8fd tailwind 3 upgrade part 2 2022-01-28 13:48:42 +01:00
Čarodej
940a2de13d tailwind 3 upgrade part 1 2022-01-28 11:41:13 +01:00
Čarodej
42c2ffc274 UI improvements part 5 2022-01-28 09:17:36 +01:00
Čarodej
0c71329dee UI improvements part 4 2022-01-28 08:15:25 +01:00
Čarodej
f74bb7cec5 UI improvements part 3 2022-01-27 17:04:12 +01:00
Čarodej
d855739bf2 UI improvements part 2 2022-01-27 13:14:57 +01:00
Čarodej
a2726ae2c5 UI improvements part 1 2022-01-27 10:40:06 +01:00
Čarodej
0b3fc946bd fixed navigation for mobile version 2022-01-26 18:28:19 +01:00
Milos Holba
d16d73680f create separated exif metadata table for files 2022-01-26 17:42:01 +01:00
Čarodej
438e930e06 create token UI refactoring 2022-01-26 16:59:36 +01:00
Čarodej
737fb7f32f login & registration settings refactoring 2022-01-26 16:35:45 +01:00
Čarodej
e22ae97a87 responsive version enhancements 2022-01-26 11:43:49 +01:00
Čarodej
fb91c1883a datatable refactoring 2022-01-26 10:39:10 +01:00
Čarodej
3652c64738 mobile toolbar implementation 2022-01-26 07:45:22 +01:00
Čarodej
3d32e8f7e0 Merge remote-tracking branch 'origin/recaptcha'
# Conflicts:
#	public/mix-manifest.json
#	src/Domain/Settings/Controllers/StoreSocialServiceCredentialsController.php
2022-01-25 16:29:37 +01:00
Čarodej
995319cfe5 updates 2022-01-25 16:27:45 +01:00
Milos Holba
1085062d10 recaptcha fix 2022-01-25 14:33:34 +01:00
Milos Holba
8b1a3f0476 implemented reCaptcha 2022-01-25 14:28:22 +01:00
Čarodej
630cefee41 Folder buttons UI refactoring 2022-01-25 13:39:21 +01:00
Čarodej
5725753052 CreateFolderStructureAction refactoring 2022-01-25 10:55:48 +01:00
Čarodej
ec92295fbf CreateFolderStructureAction refactoring 2022-01-24 11:20:47 +01:00
Čarodej
87dbcbceb8 test refactoring 2022-01-24 09:25:32 +01:00
Čarodej
3677e51c8f merge fixes 2022-01-24 08:35:58 +01:00
Čarodej
4396965d4d Merge remote-tracking branch 'origin/folders_upload' into folder_upload_v2
# Conflicts:
#	composer.lock
#	config/language-translations.php
#	public/mix-manifest.json
#	resources/js/components/FilesView/DesktopToolbar.vue
#	resources/js/helpers.js
#	resources/js/store/modules/fileFunctions.js
#	src/Domain/Files/Actions/UploadFileAction.php
#	src/Domain/Files/Requests/UploadRequest.php
#	tests/Domain/Admin/AdminTest.php
#	tests/Domain/Files/FileTest.php
#	tests/Domain/Folders/FolderTest.php
#	tests/Domain/Sharing/VisitorManipulatingTest.php
#	tests/Domain/Traffic/TrafficTest.php
#	tests/Domain/Trash/TrashTest.php
#	tests/Domain/Zip/UserZippingTest.php
2022-01-24 08:05:04 +01:00
Čarodej
4319533873 refactoring 2022-01-24 07:25:38 +01:00
Čarodej
1c16f0001c MobileActionButton refactoring 2022-01-23 11:05:53 +01:00
Čarodej
1f48abae0f mobile navigation refactoring 2022-01-22 14:27:21 +01:00
Čarodej
a7fd410a68 popup header refactoring 2022-01-22 14:05:22 +01:00
Čarodej
f5e45126db confirmation popup refactoring 2022-01-22 13:43:24 +01:00
Čarodej
fc74682e62 contextmenu refactoring 2022-01-22 13:23:57 +01:00
Čarodej
26bf65af88 info sidebar refactoring 2022-01-22 12:31:27 +01:00
Čarodej
ba05cdde83 Sidebar desktop navigation refactoring 2022-01-21 18:23:27 +01:00
Čarodej
e2cfdd5345 Folder tree dynamic navigator 2022-01-21 16:46:17 +01:00
Čarodej
6cb2a1bb9a popover over bar chart 2022-01-21 10:48:57 +01:00
Čarodej
aa28118d75 refactoring 2022-01-21 09:55:11 +01:00
Čarodej
c2667ab481 confirm password when 2fa setup refactored 2022-01-21 09:43:11 +01:00
Čarodej
03e4f98ad6 confirm password to get recovery codes 2022-01-21 09:23:18 +01:00
Čarodej
4fc61afc11 added current password to the password changing form 2022-01-21 07:41:26 +01:00
Čarodej
6b71eabfa2 UI setup for emojis and theme mode 2022-01-20 17:05:48 +01:00
Čarodej
bb4f66f159 account settings refactoring 2022-01-20 10:51:24 +01:00
Čarodej
7f33df62a5 toggle emoji via spotlight 2022-01-20 10:08:30 +01:00
Čarodej
e1de316774 emoji component refactoring 2022-01-20 09:19:14 +01:00
Čarodej
34fcbdc55c create folder emoji picker refactoring 2022-01-19 15:45:59 +01:00
Čarodej
24edb85b24 Merge remote-tracking branch 'origin/master' 2022-01-19 14:04:38 +01:00
Čarodej
1342dfa20f emoji picker refactoring 2022-01-19 14:04:29 +01:00
MakingCG
5adf9bd2be Fix backend code styling 2022-01-19 08:01:36 +00:00
Čarodej
ea59624091 Merge remote-tracking branch 'origin/master' 2022-01-19 09:01:05 +01:00
Čarodej
89e886b40c qr code generator 2022-01-19 09:00:54 +01:00
Čarodej
09449539fa Popups refactoring 2022-01-19 08:21:32 +01:00
Čarodej
c711150793 ShareEditPopup refactoring 2022-01-19 08:05:33 +01:00
Čarodej
509fb32c81 update shared item fix 2022-01-18 16:56:28 +01:00
MakingCG
763e63db55 Fix backend code styling 2022-01-18 15:46:38 +00:00
Čarodej
b456a562a0 sing up forms refactoring 2022-01-18 16:43:50 +01:00
Čarodej
148f5982a9 sing in forms refactoring 2022-01-18 11:18:33 +01:00
Čarodej
59414a1e31 paginator refactor 2022-01-18 09:18:59 +01:00
Čarodej
ffebe7fecc Invoice page 2022-01-18 08:28:58 +01:00
Čarodej
2403f89ca3 show transaction usage history detail 2022-01-17 13:30:44 +01:00
Čarodej
97b429f8d1 readme update 2022-01-17 10:17:46 +01:00
Čarodej
ec83c0e018 added WidgetLatestTransactions 2022-01-14 17:39:42 +01:00
Čarodej
51701214a2 toggle paypal sandbox/live 2022-01-14 11:55:14 +01:00
Čarodej
7dd116a769 splitted user name 2022-01-14 11:17:00 +01:00
Čarodej
7e9e9ee25b Allow user pay only more than their debt 2022-01-14 10:18:51 +01:00
Čarodej
662ba988a0 build 2022-01-14 09:30:59 +01:00
Čarodej
5c59296724 fixes & UI improvements 3 2022-01-14 09:28:27 +01:00
Čarodej
703a49711c fixes & UI improvements 2 2022-01-14 09:10:41 +01:00
Čarodej
1d0ba4d679 fixes & UI improvements 2022-01-14 08:50:59 +01:00
Čarodej
ceba8f5cc1 fixes 2022-01-13 18:55:10 +01:00
Čarodej
8eff3969d3 empty states for pages 2022-01-13 18:13:34 +01:00
Čarodej
7b3bd1135c UI fixes 2022-01-13 17:32:33 +01:00
Čarodej
e77e0cda03 set webhook secret for payment services 2022-01-13 16:16:39 +01:00
Čarodej
8d67d089bf create plan fix 2022-01-13 12:25:50 +01:00
Čarodej
d4220254db frontend production 2022-01-13 12:22:40 +01:00
Čarodej
4fa93512b5 frontend production 2022-01-13 11:43:04 +01:00
Čarodej
66de377657 test refactoring 2022-01-13 11:41:40 +01:00
Čarodej
6cf7e5d26d refactor 2022-01-13 11:17:31 +01:00
Čarodej
3b34dc43ce refactor 2022-01-12 18:32:39 +01:00
Čarodej
d498446911 admin bar chart fix 2022-01-12 16:11:51 +01:00
Čarodej
4feba76f57 admin dashboard refactoring 2022-01-12 13:58:51 +01:00
Čarodej
e1bb4b2cbe mobile admin menu refactoring 2022-01-12 08:28:12 +01:00
Čarodej
53a2950dd3 Admin menu refactored 2022-01-12 07:45:33 +01:00
Čarodej
68563b9e10 Plan settings refactoring 2022-01-11 15:20:33 +01:00
Čarodej
1c188081b3 - set social login credentials
- disallow registration refactoring
2022-01-11 13:22:25 +01:00
Čarodej
62cbcd14ed ghost bar chart 2022-01-11 08:27:07 +01:00
Čarodej
9dbc3ab969 UI improvements 2022-01-11 07:27:15 +01:00
Čarodej
ca48d430bb added subscription demo generators 2022-01-10 16:29:44 +01:00
Čarodej
08139c8f96 - usage metric fix
- ui fix
- index:usage artisan command
- demo payment settings
2022-01-10 15:43:55 +01:00
Čarodej
5de2b8b0e0 credit bonus after user registration 2022-01-10 11:20:34 +01:00
Čarodej
26aa8b46df it_register_user_when_metered_billing_is_active 2022-01-10 10:20:13 +01:00
Čarodej
0d8f1b64a7 login refactor 2022-01-10 09:09:20 +01:00
Čarodej
ead4f65e1a refactor 2022-01-10 08:31:44 +01:00
Čarodej
8a64fe070b Merge remote-tracking branch 'origin/social_authentication' into subscription
# Conflicts:
#	.env.example
#	composer.lock
#	public/mix-manifest.json
#	resources/js/views/User/Password.vue
#	routes/api.php
#	src/App/Users/Actions/CreateNewUserAction.php
#	tests/App/Users/UserAccountTest.php
2022-01-10 07:38:56 +01:00
Milos Holba
f017be476f refactoring v1 2022-01-08 14:36:57 +01:00
Čarodej
0b5fcfe676 payment logo implementation 2022-01-07 17:36:39 +01:00
Čarodej
a2e6a3bd2f subscription Type Change via admin 2022-01-07 16:51:08 +01:00
Čarodej
e823e57c71 CopyShareLink.vue refactoring dark mode 2022-01-07 16:32:37 +01:00
Čarodej
a113fffbf0 CopyShareLink.vue refactoring 2022-01-07 16:26:54 +01:00
Čarodej
10c25cf9d5 CopyInput.vue refactoring 2022-01-07 13:49:00 +01:00
Čarodej
6a957fa9fc Payment setting frontend part 3 - added paypal 2022-01-07 13:29:06 +01:00
Čarodej
5d2071ea91 Payment setting frontend part 3 - added paystack 2022-01-07 13:06:54 +01:00
Čarodej
e892e0e94f Payment setting frontend part 2 - payment setup front/backend 2022-01-07 12:42:47 +01:00
Čarodej
8b7a80e10d Payment setting frontend part 1 2022-01-07 09:53:59 +01:00
Čarodej
86dac75071 added Toggle Grid/List View into the spotlight 2022-01-06 15:05:45 +01:00
Čarodej
31ec9b4fda context menu fix 2022-01-06 14:35:11 +01:00
Čarodej
21b838eda4 popover fix 2022-01-06 14:17:20 +01:00
Čarodej
e5e713659e Frontend upload restrict consolidation 2022-01-06 12:24:27 +01:00
Čarodej
8d53ed1531 - Frontend restriction shared page 2022-01-06 11:05:49 +01:00
Čarodej
05f6023053 - Frontend restriction alerts 2022-01-05 18:57:02 +01:00
Čarodej
29a954e21b - Refactoring
- Download restriction
2022-01-05 18:29:07 +01:00
Čarodej
ec29764c3f - Restrictions for team folders 2022-01-05 17:52:08 +01:00
Čarodej
b4887cea0e - Restriction UI warning
- create folder restriction
- fixed UI bugs
2022-01-05 12:48:07 +01:00
Čarodej
c7c11fe5b9 Limitation API skelet with can upload tests 2022-01-05 11:20:57 +01:00
Čarodej
49c6f25acb UI improvements 3 2022-01-04 06:47:59 +01:00
Čarodej
3b4085f0ca UI improvements 2 2022-01-03 17:27:39 +01:00
Čarodej
09d8b84870 Subscription UI refactoring 2022-01-03 16:18:36 +01:00
Čarodej
9d189b3d12 upgrade plan UI improvements 2022-01-03 11:14:27 +01:00
Čarodej
2363592dcd full screen mode 2021-12-31 14:11:10 +01:00
Čarodej
22733619d1 Socialite callback test 2021-12-31 12:23:44 +01:00
Čarodej
4ab5e17068 translation update 2021-12-30 16:05:18 +01:00
Čarodej
50abdc3266 transaction UI refactoring 2021-12-30 15:42:09 +01:00
Čarodej
6f5b3c05ad List failed payments 2021-12-30 15:25:34 +01:00
Čarodej
aa8851aacb refactoring 2021-12-30 11:03:57 +01:00
Čarodej
0cc3285ee9 delete credit card 2021-12-29 11:19:27 +01:00
Čarodej
6ec3c88690 list credit card in metered billing 2021-12-29 10:24:49 +01:00
Čarodej
88948af6d9 - credit/card refactoring 2021-12-28 19:06:16 +01:00
Čarodej
da69898051 - set payment card frontend 2021-12-28 17:08:10 +01:00
Čarodej
47e834c368 - register stripe payment method 2021-12-28 16:26:12 +01:00
Čarodej
0194e546fd - transaction type for metered billing in transaction tables 2021-12-23 17:12:51 +01:00
Čarodej
f88ed999c5 - process single charge 2021-12-23 13:07:41 +01:00
Čarodej
606765561d - charge members 2021-12-22 18:45:07 +01:00
Čarodej
b1cb7be678 - Create/Update metered billing plan 2021-12-22 09:05:15 +01:00
Čarodej
6bb7789232 - Flat fee implementation
- Fixed/Metered plan pages
2021-12-21 17:28:17 +01:00
Čarodej
60b34e53a3 - Storage, users page refactoring 2021-12-21 13:49:37 +01:00
Čarodej
f5e182baf6 format 2021-12-21 10:34:15 +01:00
Čarodej
dc0dedffea Merge remote-tracking branch 'origin/thumbnails_queue' into subscription
# Conflicts:
#	public/mix-manifest.json
#	src/Domain/Files/Models/File.php
#	webpack.mix.js
2021-12-21 10:33:05 +01:00
Čarodej
56a5bfd483 refactoring 2021-12-21 10:26:45 +01:00
Čarodej
534d474307 fixes 2021-12-21 09:15:47 +01:00
Milos Holba
22ae148a22 added socialite provider for the user 2021-12-20 15:15:05 +01:00
Čarodej
e5a2be112b update/delete billing alert 2021-12-18 16:52:11 +01:00
Čarodej
401b511b40 showing storage size refactoring 2021-12-17 11:23:02 +01:00
Čarodej
afb8323541 set/update/delete billing alert 2021-12-17 10:44:50 +01:00
Čarodej
04e46b7fcb tests fix 2021-12-17 08:36:32 +01:00
Milos Holba
f37c4f62b7 create Socialite Login/Register 2021-12-16 14:07:33 +01:00
Čarodej
27753f30ad format usage estimates refactoring & test 2021-12-16 13:44:36 +01:00
Čarodej
b4dfbd1623 Balance & Estimates backend implementation 2021-12-15 17:52:01 +01:00
Čarodej
b368d56bbc - balance implementation
- invoice refactoring
2021-12-15 11:24:41 +01:00
Čarodej
6cb3503870 metered subscription page 2021-12-15 10:53:59 +01:00
Čarodej
bb7831f717 credit usage fe implementation mobile 2021-12-15 08:54:48 +01:00
Čarodej
43738bf8db - SidebarNavigation refactored
- credit usage fe implementation
2021-12-15 08:38:44 +01:00
Čarodej
d8a33703ab filter suggestions 2021-12-14 17:59:22 +01:00
Čarodej
86eee2f533 spotlight functions indexing 2021-12-14 17:14:02 +01:00
Čarodej
342d07126a spotlight page indexing 2021-12-14 16:02:50 +01:00
Čarodej
5439ba1aae spotlight tweaks 2021-12-14 13:54:01 +01:00
Čarodej
42487d43f1 actions implementation for spotlight 2021-12-14 12:00:25 +01:00
Čarodej
9275487cfa record daily usage 2021-12-10 16:37:00 +01:00
Čarodej
26f367031e updated transaction tables 2021-12-10 11:00:30 +01:00
Milos Holba
e645eebc4d move create folder structure to new action 2021-12-09 12:49:38 +01:00
Milos Holba
5382da0b1f add image width variable to generation thumbnail queue action 2021-12-08 18:50:27 +01:00
Milos Holba
c6b4a767da fix thumbnail generation mutated data 2021-12-08 12:25:20 +01:00
Čarodej
78a6cf0c92 update payments constraints for UI 2021-12-07 08:09:52 +01:00
Čarodej
9e4de3657e spotlight action concept 2021-12-06 06:50:31 +01:00
Čarodej
2d0a166ad7 spotlight action concept 2021-12-06 06:33:32 +01:00
Čarodej
17a40ea808 stripe checkout button 2021-12-05 14:22:01 +01:00
Čarodej
0179dcb068 stripe logo added 2021-12-02 16:14:23 +01:00
Milos Holba
7d685fa166 thumbnail generation refectoring 2021-12-01 22:25:58 +01:00
Čarodej
8242ba860f traffic sorting 2021-12-01 15:13:02 +01:00
Čarodej
dd3e477593 added search button for users admin page 2021-12-01 09:42:47 +01:00
Čarodej
b08662b307 spotlight ability to search users with 'u ' keyword 2021-12-01 09:19:51 +01:00
Čarodej
de047f7dd8 record daily traffic instead of monthly 2021-11-30 17:57:00 +01:00
Čarodej
ca257ae113 - set default_max_team_member
- generate traffic for all users
2021-11-30 17:46:21 +01:00
Čarodej
c7c81dda34 get data from dataabse and upload/download storage chart 2021-11-30 17:32:25 +01:00
Milos Holba
e5322d6c2e delete from TrashTest old thumbnail test 2021-11-30 16:23:06 +01:00
Milos Holba
067c123aa8 make queue for thumbnails generation 2021-11-30 15:49:33 +01:00
Čarodej
751ebcb7eb upload/download storage chart 2021-11-30 10:53:09 +01:00
Čarodej
69e167a337 update payments method for subscription 2021-11-30 09:01:47 +01:00
Čarodej
7f0d00017f feb 2021-11-29 10:34:02 +01:00
Čarodej
d80fa81f36 feb 2021-11-29 10:25:51 +01:00
Čarodej
fa3cb93b19 sorting datatables 2021-11-29 08:01:12 +01:00
Čarodej
5d4486a4ad progress line refactoring 2021-11-29 06:49:31 +01:00
Čarodej
8456aaf01e frontend validation of team members limitation 2021-11-26 16:44:23 +01:00
Čarodej
459087337c team members limitation frontend/backend 2021-11-26 10:53:30 +01:00
Čarodej
5626a054da refactoring 2021-11-26 07:48:38 +01:00
Čarodej
64e8bccb31 - user subscribe deletion
- fixes
2021-11-26 06:57:16 +01:00
Čarodej
16823b9566 routes refactoring 2021-11-25 15:51:46 +01:00
Čarodej
13287ce6b0 paystack dark mode logo 2021-11-25 14:25:19 +01:00
Čarodej
7f6598238e create plan page refactoring 2021-11-25 14:19:04 +01:00
Čarodej
3bfca2ac83 implemented subscription page 2021-11-25 10:11:50 +01:00
Čarodej
03ddb61d33 plan details refactoring 2021-11-25 09:47:26 +01:00
Čarodej
d8f1f396d5 plan pages refactoring 2021-11-25 09:35:12 +01:00
Čarodej
936af4497b plan list refactoring 2021-11-25 07:41:09 +01:00
Čarodej
2fb3cff98b admin menu refactoring 2021-11-25 07:09:16 +01:00
Čarodej
4e069b98f6 added logo to the transaction service 2021-11-25 07:03:01 +01:00
Čarodej
9503ecbd79 labels fix 2021-11-24 18:06:11 +01:00
Čarodej
f71a31ab78 dark mode improvements 2021-11-24 17:59:05 +01:00
Čarodej
be04715f8b added user into transaction list 2021-11-24 17:13:12 +01:00
Čarodej
8ff3b408cc invoice admin page 2021-11-24 16:57:03 +01:00
Čarodej
b447d2ea83 cancel subscription 2021-11-24 16:11:13 +01:00
Čarodej
7fe576ba26 subscription detail page 2021-11-24 10:31:37 +01:00
Čarodej
913bdf70ad tables refactoring 2021-11-24 07:03:41 +01:00
Čarodej
f711ec7d89 tables refactoring 2021-11-23 16:26:38 +01:00
Čarodej
946dfa7d99 storage page refactoring 2021-11-23 15:53:18 +01:00
Čarodej
c5aadd3c6e refactoring 2021-11-23 10:39:44 +01:00
Čarodej
884c36a5a3 card navigation refactoring 2021-11-23 10:31:45 +01:00
Čarodej
b6c77a6685 popups form refactoring 2021-11-23 09:23:25 +01:00
Čarodej
21d75678c0 pages refactoring 2021-11-23 08:24:56 +01:00
Čarodej
78541c1c3c language editor refactoring 2021-11-23 08:01:43 +01:00
Čarodej
0ad8afcfe2 admin settings inputs refactoring 2021-11-23 07:09:03 +01:00
Čarodej
d958da933d users inputs refactoring 2021-11-23 06:51:18 +01:00
Čarodej
d039700b90 user inputs refactoring 2021-11-22 19:22:59 +01:00
Čarodej
4ea46f5e81 page inputs refactoring 2021-11-22 18:01:30 +01:00
Čarodej
88234d5748 user profile inputs refactoring 2021-11-22 17:55:49 +01:00
Čarodej
6dd40df7d5 settings inputs refactoring 2021-11-22 17:41:46 +01:00
Čarodej
79281e80f6 language editor refactor 2021-11-22 16:37:11 +01:00
Čarodej
67bbc79f20 pages refactor 2021-11-22 16:00:44 +01:00
Čarodej
d798f06d36 users page refactor part 2 2021-11-22 15:54:25 +01:00
Čarodej
9cece789a0 users page refactor 2021-11-22 14:50:00 +01:00
Čarodej
054c0eb32c user profile page refactor 2021-11-22 14:39:57 +01:00
Čarodej
a2e0c1810d user admin page refactor 2021-11-22 11:17:14 +01:00
Čarodej
d16a37f2ed settings page refactor 2021-11-22 10:47:24 +01:00
Čarodej
0a4d5dea8a searchbar tweaks 2021-11-22 08:33:48 +01:00
Čarodej
8faa865fb7 handle SubscriptionWasCreated, SubscriptionWasExpired, SubscriptionWasUpdated on VueFileManager backend 2021-11-19 19:53:16 +01:00
Čarodej
6ca84d9041 implementation of user limits and refactoring 2021-11-19 18:44:46 +01:00
Čarodej
4851fb5eab append subscription to the UserResource.php 2021-11-19 17:40:57 +01:00
Čarodej
7c5cb79677 event implementation 2021-11-19 17:08:49 +01:00
Čarodej
496a6ea5a7 composer update 2021-11-19 16:21:50 +01:00
Čarodej
f402141bfb removed old subscription backend 2021-11-19 16:18:27 +01:00
Čarodej
34eaf3e411 - currency computes removed
- billable namespace update
2021-11-18 16:06:14 +01:00
Čarodej
6514102df2 feb 2021-11-16 17:21:03 +01:00
Čarodej
c7dab4b268 - get plans via api
- subscribe to plan at the frontend
2021-11-11 14:57:53 +01:00
Čarodej
8387467ee7 paypal test 2021-11-11 06:53:25 +01:00
Čarodej
9744344146 set storage in event handleSubscriptionWasCreated 2021-11-10 06:55:56 +01:00
Čarodej
a5b8744082 receive events from subscription package 2021-11-09 08:31:09 +01:00
Čarodej
eb22f25b07 receive events from subscription package 2021-11-08 15:54:38 +01:00
Čarodej
0cc39f8575 FEB 2021-11-08 10:19:59 +01:00
Čarodej
9d52da4e3a - paystack test
- FEB
2021-11-08 09:27:50 +01:00
Čarodej
18ff8a6dc7 - test refactoring
- removed laravel/cashier
2021-11-06 16:07:31 +01:00
Čarodej
1f5f0a7fbb subscription installation 2021-11-06 15:55:04 +01:00
MakingCG
73cd950054 Fix backend code styling 2021-11-05 06:02:23 +00:00
Čarodej
5c12334d92 Merge remote-tracking branch 'origin/master' 2021-11-05 07:01:53 +01:00
Čarodej
8b5e5fecfb Transfer Content Ownership To Team Folder Owner after member was deleted by author of team folder 2021-11-05 07:01:44 +01:00
MakingCG
77d14a9d80 Fix backend code styling 2021-11-04 16:38:21 +00:00
Čarodej
02582f2ae3 Merge remote-tracking branch 'origin/master' 2021-11-04 17:37:47 +01:00
Čarodej
d600ee7830 Transfer Content Ownership To Team Folder Owner 2021-11-04 17:37:25 +01:00
Čarodej
8d8fdbf9ba action:confirmed fix in leaving shared folder 2021-11-04 10:45:27 +01:00
MakingCG
de9d91da62 Fix backend code styling 2021-11-04 09:21:28 +00:00
Čarodej
29cb889283 Merge remote-tracking branch 'origin/teams'
# 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/database.js
#	public/chunks/environment-setup.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/page-edit.js
#	public/chunks/plan-create.js
#	public/chunks/plan-delete.js
#	public/chunks/plan-settings.js
#	public/chunks/plan-subscribers.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/single-file.js
#	public/chunks/status-check.js
#	public/chunks/stripe-credentials.js
#	public/chunks/subscription-plans.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/js/main.js
#	public/mix-manifest.json
2021-11-04 10:20:33 +01:00
Čarodej
ee86fbbe66 - convert folders into teams folders in convert/delete events
- composer update
2021-11-04 10:05:29 +01:00
Čarodej
aec5b98313 - mark folder as team folder after folder was created
- show members in spotlight search
2021-11-04 09:14:12 +01:00
Čarodej
5a9f2985c9 search team folder contents 2021-11-04 08:06:37 +01:00
Čarodej
cdaad931bb format 2021-11-03 17:34:46 +01:00
Čarodej
98823504ba Generate thumbnails for demo data fix 2021-11-03 17:24:30 +01:00
Čarodej
6203581893 Generate thumbnails for demo data 2021-11-03 17:10:23 +01:00
Čarodej
f139dbae08 Generate multiple avatar sizes for better performance loading and frugal traffic 2021-11-03 16:28:14 +01:00
Čarodej
dc8ec5f20b Generate multiple avatar sizes 2021-11-02 16:11:53 +01:00
Čarodej
9b2dbe06c7 - filebrowser contextmenu fix 2021-11-02 10:06:18 +01:00
Čarodej
23602f5e4f - border fix in share popup
- folder icon fix
2021-11-02 09:29:12 +01:00
Čarodej
b232701783 file filter icon change 2021-11-02 08:29:59 +01:00
Čarodej
54167ae366 Move item popup refactoring 2021-11-02 08:13:09 +01:00
Čarodej
ffbf809b1e team list debugging 2021-11-01 18:24:05 +01:00
Čarodej
bf4d860bb8 - add button to email input in team popup 2021-11-01 16:20:14 +01:00
Čarodej
4e86e7dd4b - toaster fix
- go back animation in location title
2021-11-01 15:58:56 +01:00
Čarodej
60a2a88805 spotlight to tailwind refactoring 2021-11-01 13:05:17 +01:00
Čarodej
e6133d6071 Fixes:
- [x] Ipad landscape in teams missing heads widget
- [x] Ipad portrait (sm) full screen mode
- [x] Ipad landscape add file handler button
- [x] In recent upload, shared items and trash is search instead spotlight text button
- [x] Dissapearing mobile context menu animation is buggy
- [x] Fileitemgrid in single shared item refactoring
- [x] Ipad landscape add eye icon to show info details list/grid
2021-11-01 11:22:23 +01:00
Čarodej
1e515ede88 - dark mode fixes
- sort reloading
2021-10-29 17:54:34 +02:00
Čarodej
57506fc34f text fixes 2021-10-29 17:25:50 +02:00
Čarodej
06bb51989e empty page fix
grid fix
auth page fix
2021-10-29 17:22:33 +02:00
Čarodej
b1a6fc3bf2 spotlight fix 2021-10-29 16:38:52 +02:00
Čarodej
351d57b103 UI fixes & refactoring 2021-10-29 15:58:54 +02:00
Čarodej
2d7b6e4e05 $showMobileMenu helper implementation 2021-10-29 11:51:46 +02:00
Čarodej
ce846cc076 Teams mobile implementation 2021-10-29 11:43:55 +02:00
Čarodej
0f08d9fe38 ui fixes 2021-10-29 09:59:26 +02:00
Čarodej
d018dcba06 - search UI icon in desktop implemented
- spotlight refactoring
2021-10-28 15:44:54 +02:00
Čarodej
ceb1e5c9dd grid enhancement 2021-10-28 15:23:52 +02:00
Čarodej
b53d9fb93a grid view implementation 2021-10-28 14:49:12 +02:00
Čarodej
240880e2ad file browser refactoring 2021-10-28 09:18:55 +02:00
Čarodej
3dfee77042 mobile fixes 2021-10-28 08:49:35 +02:00
Čarodej
9c26c764bd File icons refactoring 2021-10-28 07:45:55 +02:00
Čarodej
407f2d2874 File item refactoring 2021-10-27 16:48:43 +02:00
Čarodej
cd44274690 EmptyFilePage fix 2021-10-27 10:14:02 +02:00
Čarodej
265cc393e1 EmptyFilePage refactoring 2021-10-27 10:04:36 +02:00
Čarodej
21d6410f76 file view refactoring 2021-10-27 09:53:59 +02:00
Čarodej
e3ddf27023 optimized browsing 2021-10-26 10:14:33 +02:00
Čarodej
15e154176d - ability leave team folder
- refactoring
2021-10-26 09:05:08 +02:00
Čarodej
6ef50978d5 fixes 2021-10-26 07:56:57 +02:00
Čarodej
54af098148 TeamMembersButton.vue tailwind refactoring 2021-10-26 07:06:45 +02:00
Čarodej
fda82d6dbf dark mode for teams 2021-10-26 06:57:40 +02:00
Čarodej
d4990d8d5f Team member preview refactoring 2021-10-25 18:03:43 +02:00
Čarodej
524791f251 invitation page implementation 2021-10-25 17:14:27 +02:00
Čarodej
b45662942d headline refactoring in auth pages 2021-10-25 10:33:14 +02:00
Čarodej
3f93373f60 issue fixing 2021-10-25 09:53:24 +02:00
Čarodej
018b973c0f tailwind refactoring 2021-10-25 09:09:46 +02:00
Čarodej
133dd5285d tailwind implementation 2021-10-25 09:02:00 +02:00
Čarodej
3ec5166936 added file owner into file detail panel 2021-10-25 08:30:41 +02:00
Čarodej
69fccfeaad show owner in team members information 2021-10-25 08:06:51 +02:00
Čarodej
c9631a9727 author thumbnail in file 2021-10-22 17:48:42 +02:00
Čarodej
841c1db54a implemented navigation tree controller for teams 2021-10-22 16:39:53 +02:00
Čarodej
705281325f DesktopToolbar.vue team members widget resolving 2021-10-22 10:53:04 +02:00
Čarodej
cea881ce38 clear SharedWithMe.vue view 2021-10-22 09:50:27 +02:00
Čarodej
3fee035e9e clear SharedWithMe.vue view 2021-10-22 08:43:19 +02:00
Čarodej
2aac3fc966 - protect edition of team folder from team member
- zip migration deleted
2021-10-22 08:08:56 +02:00
Čarodej
07b249346b get and browse team folders shared with me 2021-09-24 16:56:18 +02:00
Čarodej
37cad85a86 TeamFoldersController@show refactored 2021-09-24 11:32:32 +02:00
Čarodej
19cc01131b - gate implementation
- protected shared view fix
2021-09-24 10:52:19 +02:00
Čarodej
d40108f6a9 addded new folder icon 2021-09-22 17:58:10 +02:00
Čarodej
f715cd897f - moving files fix 2021-09-22 16:41:55 +02:00
Čarodej
a9556896ca encoding troubleshooting 2021-09-08 18:18:36 +02:00
Peter Papp
1db153aeef unit test fixes 2021-08-31 16:09:11 +02:00
Peter Papp
6f9b6835a7 TeamFolders.vue refactoring 2021-08-31 15:36:44 +02:00
Peter Papp
d1cb1a378b desktop toolbar refactoring 2021-08-31 15:14:55 +02:00
Peter Papp
c916916a4d navigation after created team folder 2021-08-31 14:36:40 +02:00
Peter Papp
a3516769de team folder browsing with static team folder details 2021-08-31 14:08:47 +02:00
Peter Papp
f44e262d6e TypedAvatar.vue colored background 2021-08-31 09:52:22 +02:00
Peter Papp
ac62a432fe added TypedAvatar.vue component 2021-08-30 15:06:26 +02:00
Peter Papp
2bfdf5c311 TeamMembersPreview refactoring 2021-08-30 14:43:52 +02:00
Peter Papp
e751a6bc90 team folder generator 2021-08-30 09:16:48 +02:00
Peter Papp
eb38ca8c9a api resource refactoring part 6 2021-08-27 16:42:13 +02:00
Peter Papp
4304fb1ddb api resource refactoring part 5 2021-08-27 13:02:28 +02:00
Peter Papp
7984ce3ef1 api resource refactoring part 4 2021-08-27 11:23:17 +02:00
Peter Papp
d299183ecd api resource refactoring part 3 2021-08-27 11:01:44 +02:00
Peter Papp
174f2a2c1f api resource refactoring part 2 2021-08-27 10:05:20 +02:00
Peter Papp
e0e060e5a1 api resource refactoring 2021-08-27 09:41:14 +02:00
Peter Papp
5c6a873b02 - added file resource
- frontend refactoring
2021-08-26 18:01:57 +02:00
Peter Papp
f5f2179145 added folder resource 2021-08-26 15:06:39 +02:00
Peter Papp
bee7352b28 team folders page 2021-08-26 12:20:36 +02:00
Peter Papp
7020720392 added request validators 2021-08-25 17:53:15 +02:00
Peter Papp
8282defbe3 updating team members/invitations 2021-08-25 17:37:07 +02:00
Peter Papp
49c147f609 - it_update_member_permission_in_team_folder
- it_remove_member_from_team_folder
- it_add_member_into_team_folder
2021-08-24 18:38:43 +02:00
Peter Papp
dfa82535eb - it_update_member_permission_in_team_folder
- it_remove_member_from_team_folder
- it_add_member_into_team_folder
2021-08-24 18:28:20 +02:00
Peter Papp
bcfe813e1e it_get_team_folders_shared_with_another_user 2021-08-24 17:24:36 +02:00
Peter Papp
78bf913d92 it_get_content_of_team_folder 2021-08-24 17:04:11 +02:00
Peter Papp
0c6621494e it_get_all_team_folders 2021-08-24 16:54:05 +02:00
Peter Papp
e0ecfce382 it_dissolve_team_folder 2021-08-24 14:25:10 +02:00
Peter Papp
80a86bbddd it_convert_folder_into_team_folder 2021-08-24 14:05:32 +02:00
Peter Papp
60f0f3c329 it_reject_team_folder_invite 2021-08-24 13:39:05 +02:00
Peter Papp
d53a4964ae it_accept_team_folder_invite 2021-08-24 13:29:45 +02:00
Peter Papp
ca1d037975 create team folder 2021-08-24 10:58:03 +02:00
Peter Papp
fdd9c5a591 team folders test skelet 2021-08-24 09:12:57 +02:00
Peter Papp
d4e3957598 refactoring part 6 2021-08-24 09:03:42 +02:00
Peter Papp
f24d57d88d refactoring part 5 2021-08-23 17:55:38 +02:00
Peter Papp
fd313e3d83 refactoring part 4 2021-08-23 17:49:28 +02:00
Peter Papp
527a0790e3 refactoring part 3 2021-08-23 16:31:25 +02:00
Peter Papp
42210233dc refactoring part 2 2021-08-23 15:22:43 +02:00
Peter Papp
cc0436b8f3 refactoring part 1 2021-08-23 09:32:21 +02:00
Peter Papp
a926545146 navigation through public folders 2021-08-23 09:16:01 +02:00
Peter Papp
26e3194f21 public share navigation 2021-08-23 08:30:34 +02:00
Peter Papp
882b5543f0 team UI dark mode 2021-08-23 07:02:24 +02:00
Peter Papp
1f529ae7e0 MultiSelectToolbar.vue refactoring 2021-08-21 11:19:03 +02:00
Peter Papp
a6e60d2efa MobileContextMenu.vue refactoring 2021-08-21 10:53:56 +02:00
Peter Papp
d71dbea246 create list mobile refactoring 2021-08-21 09:47:30 +02:00
Peter Papp
5ac786fb4c mobile filter refactoring 2021-08-21 09:41:34 +02:00
Peter Papp
8cf6b6ea78 FileActionsMobile.vue refactoring 2021-08-21 09:21:36 +02:00
Peter Papp
a99cbc2841 panel navigator refactoring 2021-08-20 18:07:26 +02:00
Peter Papp
b23259309c empty page refactored 2021-08-20 17:51:58 +02:00
Peter Papp
b5a8fe8b1a current folder functionality 2021-08-20 17:36:46 +02:00
Peter Papp
c697f8a451 vue routes refactoring 2021-08-20 17:00:35 +02:00
Peter Papp
fb6dfbe7b4 DesktopToolbar.vue refactoring 2021-08-20 16:49:51 +02:00
Peter Papp
15fba236d7 - added recent uploads
- added my shared items
- added trash
2021-08-20 11:08:50 +02:00
Peter Papp
99e9c0086e contextmenu refactoring 2021-08-20 09:54:00 +02:00
Peter Papp
c57a244ae1 reorganization of FileView 2021-08-20 09:04:56 +02:00
Peter Papp
e13a2cd18f UI changes for team folders 2021-08-19 18:14:38 +02:00
Peter Papp
58b7e6d584 added CreateTeamFolderPopup.vue 2021-08-19 10:42:46 +02:00
Peter Papp
1d569f13c2 added team into DesktopToolbar.vue 2021-08-19 07:55:52 +02:00
MakingCG
a521f88859 Application Build 2021-08-19 04:37:21 +00:00
Peter Papp
a824e4d78e delete index.html 2021-08-19 06:35:16 +02:00
Milos Holba
3d491c7e58 added FolderUploadIcon 2021-08-18 18:51:25 +02:00
Peter Papp
52842c61e5 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	public/mix-manifest.json
2021-08-18 18:50:33 +02:00
Milos Holba
4e3e63ba00 new test for folders upload 2021-08-18 18:50:32 +02:00
Peter Papp
0c7a416cb5 generate iframe from shared link 2021-08-18 18:50:22 +02:00
Peter Papp
63b4aa0e1d Create share record popup changes 2021-08-18 16:58:52 +02:00
Milos Holba
09dfaaa34a fix upload progress count 2021-08-17 17:41:56 +02:00
Milos Holba
a4231ea30a added folder upload via Upload Folder button 2021-08-17 15:08:13 +02:00
Milos Holba
387c824647 Merge remote-tracking branch 'origin/master' into folders_upload 2021-08-11 17:46:57 +02:00
Milos Holba
ec2a10e32f fixed upload files in the nested levels of folders 2021-08-11 17:15:02 +02:00
MakingCG
34a1f31f96 Application Build 2021-08-11 07:22:32 +00:00
Peter Papp
20b26ce57d Merge remote-tracking branch 'origin/spotlight'
# Conflicts:
#	public/mix-manifest.json
2021-08-11 09:18:47 +02:00
Milos Holba
717f28608f folder upload 2021-08-10 17:50:08 +02:00
Peter Papp
dc60ba972f frontend refactoring 2021-08-10 17:49:22 +02:00
Peter Papp
98688b81c0 file preview refactoring 2021-08-10 11:43:05 +02:00
Peter Papp
843a1bc690 single file preview in spotlight 2021-08-10 11:14:04 +02:00
Peter Papp
8b360edb2b mobile spotlight fix 2021-08-10 10:24:16 +02:00
Peter Papp
1175724e43 mobile spotlight 2021-08-10 10:19:10 +02:00
Peter Papp
79295e77b6 spotlight optimizing UI 2021-08-10 08:38:57 +02:00
Peter Papp
f78cedbc0c spotlight desktop UI 2021-08-10 08:16:34 +02:00
MakingCG
cea889d912 Application Build 2021-08-09 08:17:14 +00:00
Peter Papp
98691dcdd4 desktop searchbar restyle 2021-08-09 10:15:30 +02:00
Peter Papp
6a6e05f035 - mobile create menu 2021-08-09 10:03:58 +02:00
Peter Papp
60337934cb - removed participant upload 2021-08-09 09:38:08 +02:00
Peter Papp
9a80c044fc added create icon into desktopToolbar 2021-08-09 09:23:10 +02:00
MakingCG
5341fbedc6 Fix backend code styling 2021-07-29 14:12:15 +00:00
Peter Papp
53f667372d Merge remote-tracking branch 'origin/zipstream' 2021-07-29 16:11:02 +02:00
Peter Papp
cd39606905 shared page password error fix 2021-07-29 16:10:21 +02:00
Peter Papp
2d6f375c8b setup wizard StoreEnvironmentSettingsController.php tweaks 2021-07-29 16:04:27 +02:00
Peter Papp
46dcdc5e94 s3 template in .env.example 2021-07-29 13:41:25 +02:00
Peter Papp
79826a3601 comments 2021-07-29 13:38:26 +02:00
Peter Papp
826e90c087 single folder zip name 2021-07-29 13:34:43 +02:00
Peter Papp
087b6e77cc upload chunk fix 2021-07-29 13:22:39 +02:00
Peter Papp
94f30e5c9f fe build 2021-07-29 13:08:40 +02:00
Peter Papp
1f1f646f62 visitor zipping 2021-07-29 13:01:25 +02:00
Peter Papp
0ea7447901 user zipping 2021-07-29 10:51:58 +02:00
Peter Papp
1b893d59ea zip unit testing 2021-07-29 09:29:02 +02:00
Peter Papp
6a805b03fa deleted old files 2021-07-28 18:33:13 +02:00
Peter Papp
71a1eb8e7c Zipping on the fly 2021-07-28 18:16:20 +02:00
MakingCG
3823fb22d9 Fix backend code styling 2021-07-24 09:35:00 +00:00
Peter Papp
8810880616 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	public/mix-manifest.json
2021-07-24 11:34:11 +02:00
Peter Papp
cb496281b7 Implemented setup wizard server check functionality 2021-07-24 11:33:58 +02:00
MakingCG
a65ec6e8c7 Application Build 2021-07-23 16:15:56 +00:00
Peter Papp
7576904587 Merge remote-tracking branch 'origin/master' 2021-07-23 18:14:05 +02:00
Peter Papp
f8cb879e42 queueable email sharing 2021-07-23 18:13:58 +02:00
MakingCG
5f4fa23a68 Fix backend code styling 2021-07-23 15:54:00 +00:00
Peter Papp
c2771be913 Merge remote-tracking branch 'origin/master' 2021-07-23 17:53:28 +02:00
Peter Papp
7a85a03fea added user_with_full_storage_capacity_try_to_upload_new_file 2021-07-23 17:53:17 +02:00
Peter Papp
5c848f75a6 set default charset and collation into db migrations 2021-07-23 17:41:42 +02:00
Peter Papp
7b65d868c4 - added it_test_user_timezone
- refactored set_time_by_user_timezone
2021-07-23 17:36:05 +02:00
MakingCG
35fefdc383 Fix backend code styling 2021-07-23 15:17:30 +00:00
Peter Papp
32d54fa50e Dark mode switcher 2021-07-23 17:16:42 +02:00
Peter Papp
be2690fd1c Merge remote-tracking branch 'origin/master'
# Conflicts:
#	.php-cs-fixer.cache
2021-07-23 13:28:50 +02:00
Peter Papp
eaec744356 Disable account registering from disabled email provider 2021-07-23 13:28:40 +02:00
Peter Papp
8951ebc69f php cs fixer tweak 2021-07-23 10:50:29 +02:00
MakingCG
c38ecb412b Fix backend code styling 2021-07-22 15:39:39 +00:00
Peter Papp
d190eeb46d Merge remote-tracking branch 'origin/master' 2021-07-22 17:39:12 +02:00
Peter Papp
03fc533848 php unit fixes 2021-07-22 17:39:01 +02:00
MakingCG
7cb485fb43 Fix backend code styling 2021-07-22 15:28:36 +00:00
Peter Papp
fffede1c10 fixes 2021-07-22 17:26:22 +02:00
Peter Papp
093c9451ec Refactoring 2021-07-22 14:24:07 +02:00
Peter Papp
69eb8dacce share delete fix 2021-07-22 12:39:32 +02:00
Peter Papp
b0e8bfa3ce Setup Wizard middleware implemented 2021-07-22 12:27:36 +02:00
Peter Papp
5167f082f7 controller refactoring part 25 2021-07-22 07:49:25 +02:00
Peter Papp
6d8a7a429c controller refactoring part 24 2021-07-21 18:46:55 +02:00
Peter Papp
54f1f4c9a8 controller refactoring part 24 2021-07-21 18:14:23 +02:00
Peter Papp
91cb795054 controller refactoring part 23 2021-07-21 18:00:45 +02:00
Peter Papp
9fb9b8a1b0 controller refactoring part 22 2021-07-21 17:21:19 +02:00
Peter Papp
d55f5c3b41 controller refactoring part 21 2021-07-21 17:20:19 +02:00
Peter Papp
91fc7f2d9d controller refactoring part 20 2021-07-21 12:22:26 +02:00
Peter Papp
3860faf851 controller refactoring part 19 2021-07-21 12:01:44 +02:00
Peter Papp
76e1cd1113 controller refactoring part 18 2021-07-21 11:41:50 +02:00
Peter Papp
dccf98602d controller refactoring part 17 2021-07-21 11:20:41 +02:00
Peter Papp
e0eaf5cede controller refactoring part 16 2021-07-21 10:00:41 +02:00
Peter Papp
58d8724cea controller refactoring part 15 2021-07-21 09:42:39 +02:00
Peter Papp
1534696e0d controller refactoring part 14 2021-07-21 09:01:51 +02:00
Peter Papp
b659f2ad8d controller refactoring part 13 2021-07-20 17:46:38 +02:00
Peter Papp
2333b52d68 controller refactoring part 12 2021-07-20 17:27:18 +02:00
Peter Papp
b0859f71cd controller refactoring part 11 2021-07-20 17:17:18 +02:00
Peter Papp
2d814f3839 controller refactoring part 10 2021-07-20 16:45:17 +02:00
Peter Papp
8b250e94cb controller refactoring part 9 2021-07-20 13:13:33 +02:00
Peter Papp
0633131a73 controller refactoring part 8 2021-07-20 12:54:54 +02:00
Peter Papp
dc98c839a2 controller refactoring part 7 2021-07-20 12:22:48 +02:00
Peter Papp
0232a7abeb controller refactoring part 6 2021-07-20 11:50:03 +02:00
Peter Papp
cde8b6aae3 controller refactoring part 5 2021-07-20 11:23:45 +02:00
Peter Papp
8c493395c4 controller refactoring part 4 2021-07-20 10:27:00 +02:00
Peter Papp
2e52af5275 controller refactoring part 3 2021-07-20 10:17:40 +02:00
Peter Papp
20a6404d8d controller refactoring part 2 2021-07-20 09:50:23 +02:00
Peter Papp
d6db2f3a7c controller refactoring part 1 2021-07-20 08:58:20 +02:00
Peter Papp
29d1b68dd5 namespaces refactoring part 3 2021-07-19 13:40:26 +02:00
Peter Papp
54dc57fcbf namespaces refactoring part 2 2021-07-18 18:05:33 +02:00
Peter Papp
8f77a497b5 namespaces refactoring 2021-07-18 17:21:37 +02:00
Peter Papp
a1778eab52 test groups refactoring 2021-07-18 16:53:12 +02:00
Peter Papp
18150cd920 test folder refactoring 2021-07-18 14:53:00 +02:00
Peter Papp
5046071f3a src folder refactoring 2021-07-18 14:43:50 +02:00
MakingCG
fc952d089b Fix backend code styling 2021-07-18 11:47:18 +00:00
Peter Papp
79e2dfc502 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	public/mix-manifest.json
2021-07-18 13:46:42 +02:00
Peter Papp
c14aefd5ea added translations for Personal Access Token UI 2021-07-18 13:46:31 +02:00
Peter Papp
a9a572c434 Personal Access Token page implementation 2021-07-18 13:32:08 +02:00
Peter Papp
ddf88304ff CreatePersonaTokenPopup implementation 2021-07-18 11:38:44 +02:00
Peter Papp
aeb5c8419a PersonalAccessTokenTest refactoring 2021-07-18 10:20:47 +02:00
MakingCG
49d8b5abd9 Application Build 2021-07-17 18:46:26 +00:00
Peter Papp
4384e50f34 Merge remote-tracking branch 'origin/master' 2021-07-17 20:44:25 +02:00
Peter Papp
90efc51359 it_get_user_data fix 2021-07-17 20:44:18 +02:00
MakingCG
ec6d11b7ae Fix backend code styling 2021-07-17 18:38:41 +00:00
Peter Papp
9ba3d9a6ba - PhpCsFixer rules 3.0 upgrade 2021-07-17 20:38:11 +02:00
Peter Papp
66cca02b36 Merge remote-tracking branch 'origin/master' 2021-07-17 20:36:26 +02:00
Peter Papp
c1d9622879 - removed token profile page
- PhpCsFixer fix
2021-07-17 20:36:11 +02:00
MakingCG
840bdc3878 Application Build 2021-07-17 18:27:49 +00:00
Peter Papp
460b95e6de Merge remote-tracking branch 'origin/2fa'
# Conflicts:
#	.php-cs-fixer.cache
#	config/language-translations.php
#	public/mix-manifest.json
#	resources/js/views/Auth/SignIn.vue
#	webpack.mix.js
2021-07-17 20:25:30 +02:00
Peter Papp
a438f8fb99 added "I have already 2FA app" into recovery 2fa page 2021-07-16 18:16:11 +02:00
Peter Papp
097a930245 Two Factor Recovery Codes functionality 2021-07-16 17:38:01 +02:00
Peter Papp
40866405fc twoFactorChallenge() refactoring 2021-07-16 11:26:27 +02:00
Peter Papp
d90af84311 2fa polishing 2021-07-16 11:00:46 +02:00
Peter Papp
cdd99f66b7 Merge remote-tracking branch 'origin/master' 2021-07-16 09:26:15 +02:00
Peter Papp
36cea4853f it_use_user_token_in_public_api_request test 2021-07-16 09:26:07 +02:00
MakingCG
d05e9bf43e Application Build 2021-07-15 12:03:29 +00:00
Peter Papp
8ac41837b2 Merge remote-tracking branch 'origin/email-verification'
# Conflicts:
#	composer.lock
#	public/mix-manifest.json
#	tests/TestCase.php
2021-07-15 14:00:43 +02:00
Peter Papp
157427c750 email verification review 2021-07-15 13:55:49 +02:00
MakingCG
e7cfa07392 Fix backend code styling 2021-07-09 10:05:40 +00:00
Peter Papp
82019f4833 safety functions helper 2021-07-09 12:05:09 +02:00
Milos Holba
838a412823 repeat login after fail of the 2fa code / recovery_code 2021-07-05 10:38:50 +02:00
Milos Holba
16eb105f03 Create TwoFactorAuthentication Popup 2021-06-30 13:37:44 +02:00
Milos Holba
14eaf6da4e 2fa page translation 2021-06-29 19:07:35 +02:00
Milos Holba
7d28e09042 add 2fa, make 2fa login page 2021-06-29 18:41:23 +02:00
Peter Papp
5215d7d38d Merge remote-tracking branch 'origin/master' 2021-06-29 18:31:28 +02:00
Peter Papp
dd271ea8cc composer upgrade 2021-06-29 18:31:21 +02:00
MakingCG
6397ce9a67 Application Build 2021-06-23 16:17:49 +00:00
Peter Papp
8568a815a0 Merge remote-tracking branch 'origin/master' 2021-06-23 18:15:52 +02:00
Peter Papp
6fc29eac8e language fix 2021-06-23 18:15:44 +02:00
MakingCG
449724e78a Fix backend code styling 2021-06-18 15:35:41 +00:00
Peter Papp
e5de408ab0 Merge remote-tracking branch 'origin/master' 2021-06-18 17:35:16 +02:00
Peter Papp
1c057e9f86 Mobile navigation fix with hidden back button 2021-06-18 17:35:05 +02:00
Peter Papp
f6f9199b87 Filename as original 2021-06-18 17:23:40 +02:00
MakingCG
cb99e105c0 Fix backend code styling 2021-06-15 16:37:41 +00:00
Peter Papp
24676e2392 Merge remote-tracking branch 'origin/master' 2021-06-15 18:37:11 +02:00
Peter Papp
c0da1b0b07 Alibaba OSS support 2021-06-15 18:37:03 +02:00
MakingCG
d7b8214406 Fix backend code styling 2021-06-15 16:04:53 +00:00
Peter Papp
3fc11b781b Merge remote-tracking branch 'origin/master' 2021-06-15 18:04:23 +02:00
Peter Papp
f2be4059cf Set app locale 2021-06-15 18:04:02 +02:00
Milos Holba
edfcf8e1bd changes in email verify function 2021-06-14 17:02:19 +02:00
MakingCG
081a69450a Fix backend code styling 2021-06-07 15:43:26 +00:00
Peter Papp
b50e0041e0 - chunking translations query
- language translations fallback
2021-06-07 17:42:53 +02:00
Peter Papp
847221d385 - chunking translations query 2021-06-07 16:42:18 +02:00
Milos Holba
2bba4f961a added Successfully verify email send route(Vue) 2021-05-31 18:19:42 +02:00
Milos Holba
359ae80e22 add user_verification option to settings for Setup Dev/Prod Enviroment 2021-05-29 12:55:04 +02:00
dependabot[bot]
dd489d48ba Bump dns-packet from 1.3.1 to 1.3.4
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-29 06:01:28 +00:00
Milos Holba
9189d73df9 create AccessToken route(Vue) 2021-05-28 16:47:14 +02:00
Milos Holba
6456950081 Merge remote-tracking branch 'origin/master' into email-verification 2021-05-26 13:17:39 +02:00
Milos Holba
0df72b1803 change text in the successfully verified page 2021-05-26 13:08:31 +02:00
Milos Holba
904e2d705f change in backend-code-style-fix after rename the file 2021-05-22 19:41:09 +02:00
Milos Holba
4d078dc24a create new register route(Laravel) , create new email successfully verified route(Vue) 2021-05-22 19:36:02 +02:00
Milos Holba
a7e26cb61f update tests for the user email verification 2021-05-22 16:01:25 +02:00
Milos Holba
fd7a23225c added schedule for delete users older as 30 days 2021-05-22 13:12:03 +02:00
Milos Holba
0139cc92bf added user verification option in admin settings 2021-05-20 21:18:28 +02:00
MakingCG
7cefc8dfa1 Fix backend code styling 2021-05-17 09:50:10 +00:00
Peter Papp
0000909ec0 Merge remote-tracking branch 'origin/master' 2021-05-17 11:49:42 +02:00
Peter Papp
61824a511c - mad zipper hotfix 2021-05-17 11:49:19 +02:00
MakingCG
cb239fb3bc Fix backend code styling 2021-05-17 08:50:44 +00:00
Peter Papp
08099b9671 Merge remote-tracking branch 'origin/master' 2021-05-17 10:50:16 +02:00
Peter Papp
bb8a205b7e - php fixer upgrade 2021-05-17 10:50:06 +02:00
MakingCG
09dda32dfd Application Build 2021-05-17 08:47:48 +00:00
Peter Papp
790052804e - php fixer upgrade
- workflow update
- npm update
2021-05-17 10:45:50 +02:00
MakingCG
2e233990a2 Application Build 2021-05-15 05:28:00 +00:00
Peter Papp
8a1c20bf4a setup:dev fix 2021-05-15 07:26:02 +02:00
Peter Papp
6dc34964d8 upload fix 2021-05-15 07:22:57 +02:00
Peter Papp
d8bbfcd4d2 External storage fix 2021-05-14 20:03:07 +02:00
Peter Papp
26f23863c0 setup account fix 2021-05-14 19:31:23 +02:00
Milos Holba
32bc3bacc0 add user email verification 2021-05-14 11:41:48 +02:00
MakingCG
688f234ae1 Application Build 2021-05-11 08:36:10 +00:00
Peter Papp
6e330046b3 Added arrows to Option.vue component 2021-05-11 10:34:08 +02:00
Peter Papp
438ddbb868 removed padding in mobile pdf view 2021-05-11 10:16:12 +02:00
MakingCG
bcd4209aca Application Build 2021-05-11 06:38:21 +00:00
Peter Papp
88ac70bc67 Merge pull request #2 from MakingCG/dependabot/npm_and_yarn/axios-0.21.1
Bump axios from 0.19.2 to 0.21.1
2021-05-11 08:36:35 +02:00
Peter Papp
b31fb4f7d2 Merge pull request #1 from MakingCG/dependabot/npm_and_yarn/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21
2021-05-11 08:36:24 +02:00
Peter Papp
862fc68134 Merge pull request #3 from MakingCG/dependabot/npm_and_yarn/url-parse-1.5.1
Bump url-parse from 1.4.7 to 1.5.1
2021-05-11 08:36:10 +02:00
Peter Papp
a04c2de84f Merge pull request #4 from MakingCG/dependabot/npm_and_yarn/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9
2021-05-11 08:35:53 +02:00
dependabot[bot]
6ac8089cd7 Bump hosted-git-info from 2.8.8 to 2.8.9
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 06:33:58 +00:00
dependabot[bot]
f29a2571df Bump url-parse from 1.4.7 to 1.5.1
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.1.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 06:33:11 +00:00
dependabot[bot]
c0d1fa6965 Bump axios from 0.19.2 to 0.21.1
Bumps [axios](https://github.com/axios/axios) from 0.19.2 to 0.21.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.19.2...v0.21.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 06:32:42 +00:00
dependabot[bot]
499e4e8f7c Bump lodash from 4.17.20 to 4.17.21
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 06:32:01 +00:00
MakingCG
e9a1ad9f09 Application Build 2021-05-10 15:14:43 +00:00
Peter Papp
dccf006f1e Merge remote-tracking branch 'origin/master' 2021-05-10 17:12:43 +02:00
Peter Papp
a2e467b65d Merge remote-tracking branch 'origin/file-preview-context-menu'
# Conflicts:
#	composer.lock
#	public/mix-manifest.json
2021-05-10 17:12:20 +02:00
Peter Papp
3d876835f6 ContextMenu refactoring in file preview 2021-05-10 10:42:21 +02:00
Peter Papp
5e0007764e Stripe get plans fix 2021-05-10 08:07:41 +02:00
MakingCG
21142c1171 Application Build 2021-05-08 07:42:52 +00:00
Peter Papp
50bdac62dc fixed static issues 2021-05-08 09:41:10 +02:00
Peter Papp
ac75cb5d0f context menu skelet 2021-05-08 07:54:06 +02:00
Milos Holba
1ba685c484 make personal token for the users 2021-05-07 16:22:31 +02:00
MakingCG
8b3c6cfc27 Application Build 2021-05-06 14:04:22 +00:00
Peter Papp
f252a0ba23 Color input fix 2021-05-06 10:39:03 +02:00
Peter Papp
3c8d6ac862 Fixed renaming item in desktop 2021-05-06 10:23:10 +02:00
Peter Papp
bd881da856 - allow empty input
- allow svg avatar
2021-05-06 10:08:58 +02:00
Peter Papp
86b6844d62 PDF background shadow 2021-05-06 09:55:25 +02:00
Peter Papp
da38580504 - reverse pdf zoom icons
- store pdf zoom level into localstorage
2021-05-06 09:50:43 +02:00
Peter Papp
9fbd5fd472 removed shared files single page 2021-05-06 09:28:31 +02:00
MakingCG
6b43464e85 Fix backend code styling 2021-05-03 05:28:54 +00:00
Peter Papp
8c6e0321fd added spatie/laravel-tail 2021-05-03 07:28:26 +02:00
Peter Papp
25d9691a31 Merge remote-tracking branch 'origin/master' 2021-05-03 07:09:30 +02:00
Peter Papp
6052174b83 psalm implementation 2021-05-02 16:27:18 +02:00
Peter Papp
583d65a1da php 8 support 2021-05-02 16:23:06 +02:00
Peter Papp
856d3b6aa1 Update README.md
added unit test badge
2021-05-02 08:50:04 +02:00
Peter Papp
33a65b1c77 die windows 2021-05-01 18:10:17 +02:00
Peter Papp
4613c72412 unit testing on push/pr into master, oasis branch 2021-05-01 18:02:42 +02:00
Peter Papp
04fa824d16 default test 2021-05-01 17:50:15 +02:00
Peter Papp
75e51c3f10 unit test github action 2021-05-01 17:48:57 +02:00
Peter Papp
ca7944b17a unit test github action 2021-05-01 17:45:09 +02:00
Milos Holba
23c0e8b0f7 create CheckBox component 2021-04-27 18:46:31 +02:00
Peter Papp
7d020b0bbc Update README.md 2021-04-25 09:39:55 +02:00
Peter Papp
93e5a29d40 build.yml edit 2021-04-25 09:21:30 +02:00
Peter Papp
3ee8c255d5 Merge remote-tracking branch 'origin/master' 2021-04-25 09:18:19 +02:00
Peter Papp
7e50e221f2 build.yml edit 2021-04-25 09:17:47 +02:00
MakingCG
6f6c987538 Application Build 2021-04-25 07:17:29 +00:00
Peter Papp
5dcf8df751 build 2021-04-25 09:15:24 +02:00
Peter Papp
b895cbc9c0 build 2021-04-25 09:14:33 +02:00
Peter Papp
321e62fb0a removed workflow_dispatch: 2021-04-25 09:09:27 +02:00
Peter Papp
e9aca0a6c3 Merge remote-tracking branch 'origin/master' 2021-04-25 09:08:09 +02:00
Peter Papp
717dcb02ef right click fix 2021-04-25 09:07:58 +02:00
MakingCG
9744780022 Fix backend code styling 2021-04-25 07:02:58 +00:00
Peter Papp
c47886fb8b code style fix 2021-04-25 09:02:00 +02:00
Peter Papp
e103e61617 Merge remote-tracking branch 'origin/master' 2021-04-25 08:58:06 +02:00
Peter Papp
e65ccf0680 fix database in languageTest 2021-04-25 08:57:44 +02:00
Peter Papp
85613dd846 Create backend-code-style-fix.yml 2021-04-25 08:56:46 +02:00
Peter Papp
b52fe0454b added code style fixer 2021-04-25 08:44:08 +02:00
Peter Papp
3645b3e8f7 Changed workflow - Build Application Frontend 2021-04-24 18:38:39 +02:00
MakingCG
01e94b97ba Application Build 2021-04-24 16:27:50 +00:00
Peter Papp
2e906daf58 CI for frontend build 2021-04-24 18:26:11 +02:00
Peter Papp
25a28c37c8 FileSidebar refactored 2021-04-20 08:11:05 +02:00
Peter Papp
7e8511ab3f Popover refactored 2021-04-19 17:41:41 +02:00
Peter Papp
7cd29fce98 - data renamed to entries 2021-04-19 09:39:09 +02:00
Peter Papp
b0c81a692c - fileinfodetail renamed to clipboard 2021-04-19 09:22:50 +02:00
Peter Papp
b71072ddda - frontend build 2021-04-19 08:47:15 +02:00
Peter Papp
79d3e2beac - select search dark mode
- file showing fix on mobile devices
- frontend build
2021-04-19 08:43:18 +02:00
Peter Papp
fc11a38457 language fixes 2021-04-17 10:12:26 +02:00
Peter Papp
be6ccecee6 frontend build 2021-04-16 17:40:40 +02:00
Peter Papp
66198a50e1 - mobile search fix
- mobile arrows fix
- document zoom in file preview
- frontend build
2021-04-16 17:34:08 +02:00
Peter Papp
0910daa1a3 Move to home folder fix 2021-04-16 16:54:59 +02:00
Peter Papp
397b3228d0 User delete validation fix 2021-04-16 11:53:23 +02:00
Peter Papp
2a02716a53 FilePreview refactoring 2021-04-16 11:41:41 +02:00
Peter Papp
b105c9fc8f - pdf implementation
- file preview refactoring
2021-04-16 10:27:09 +02:00
Peter Papp
9105ce8bb1 SelectInput.vue added translation 2021-04-15 11:23:58 +02:00
Peter Papp
6056e97463 SelectInput.vue searching 2021-04-15 11:22:10 +02:00
Peter Papp
639f24fdfd - SearchBar.vue refactored 2021-04-15 10:21:35 +02:00
Peter Papp
110f7b60d6 - New mobile navigation experience 2021-04-15 09:28:06 +02:00
Peter Papp
a7ba0719a5 - Mobile navigation refactored 2021-04-14 17:13:36 +02:00
Peter Papp
213d6230ca - File Filter implemented 2021-04-14 16:49:14 +02:00
Peter Papp
eba8903792 - Mobile menu components refactoring
- Components name renaming
2021-04-14 11:17:29 +02:00
Peter Papp
16b7575fca - Textarea fix
- translation fix
2021-04-13 08:17:14 +02:00
Peter Papp
14efc4c29f log channel to daily in default 2021-04-12 10:02:30 +02:00
Peter Papp
da49a7b051 z-index fix in Language.vue 2021-04-12 06:54:47 +02:00
Peter Papp
469e0883d9 frontend build 2021-04-11 10:49:14 +02:00
Peter Papp
3e18dbd4f9 DisabledMimetypes.php validation rule fix 2021-04-11 10:46:07 +02:00
Peter Papp
1568eab905 Mobile language editor 2021-04-11 10:31:07 +02:00
Peter Papp
452da6c6b4 - disabled notification after backup
- fix incorrect password in sign in form
2021-04-10 09:06:05 +02:00
Peter Papp
d5e371f8d6 default DB_MYSQLDUMP_PATH value 2021-04-10 08:53:12 +02:00
Peter Papp
b6290a0cad auto-refresh after default language change 2021-04-10 08:47:21 +02:00
Peter Papp
afd2270e0e setup:prod script 2021-04-10 08:41:00 +02:00
Peter Papp
58ecc33986 updated README.md 2021-04-10 08:18:20 +02:00
Peter Papp
2598ba38db - auto database backup 2021-04-10 08:06:01 +02:00
Peter Papp
30ae2c0a54 - fixes 2021-04-07 07:48:07 +02:00
Peter Papp
87b3625b27 - frontend build 2021-04-06 18:08:12 +02:00
Peter Papp
bf9581173c - S3 storages compatibility with v2
- user profile fixes
2021-04-06 18:01:59 +02:00
Peter Papp
e40ddbec14 fixed upgrade_language_translations 2021-04-06 10:40:51 +02:00
Peter Papp
131ae8109f - flush cache after language upgrade
- Gateway fix
- extended language editor with textarea
2021-04-06 10:32:50 +02:00
Peter Papp
90c0466cd0 - fixed setup wizard 2021-04-06 10:31:34 +02:00
Peter Papp
f531ffce11 it_upgrade_default_language_translations test refactored 2021-04-06 10:01:34 +02:00
Peter Papp
13992deb41 - added function to upgrade language translations
- maintenance gate
2021-04-06 09:56:11 +02:00
Peter Papp
b2d133e5a3 Merge remote-tracking branch 'origin/v2'
# Conflicts:
#	config/content.php
#	config/vuefilemanager.php
#	public/mix-manifest.json
#	resources/js/views/Mobile/AdminMobileMenu.vue
#	resources/js/views/Shared/SharedPage.vue
2021-04-03 07:40:32 +02:00
Peter Papp
26085c475f - Language translation fixes 2021-04-01 11:50:40 +02:00
Peter Papp
7772ef6b40 Language editor refactoring part 4 (backend + frontend) 2021-04-01 10:40:48 +02:00
Peter Papp
5130082111 Language editor refactoring part 3 (backend + frontend) 2021-04-01 07:50:01 +02:00
Peter Papp
a8fa3694be helpers refactoring 2021-03-31 08:27:28 +02:00
Peter Papp
6ac6528243 Language editor refactoring part 2 (backend + frontend) 2021-03-28 14:06:16 +02:00
Peter Papp
ec51440c3a Language editor refactoring part 1 (nackend) 2021-03-27 18:53:41 +01:00
Peter Papp
cdb395c77f cleaning 2021-03-27 12:21:35 +01:00
Peter Papp
ee4a2205f6 Merge remote-tracking branch 'origin/version-1.8.3' into v2
# Conflicts:
#	app/FileManagerFolder.php
#	app/Http/Controllers/AppFunctionsController.php
#	app/Http/Controllers/Auth/AuthController.php
#	app/Http/Controllers/FileManager/BrowseController.php
#	app/Http/Controllers/General/SetupWizardController.php
#	app/Http/Controllers/General/UpgradeAppController.php
#	app/Http/Controllers/Sharing/FileSharingController.php
#	app/Http/helpers.php
#	app/Setting.php
#	composer.lock
#	public/mix-manifest.json
#	resources/js/App.vue
#	resources/js/components/Others/Forms/FormLabel.vue
#	resources/js/store/modules/app.js
#	resources/js/views/Admin.vue
#	resources/js/views/Mobile/AdminMobileMenu.vue
#	resources/js/views/Shared/SharedPage.vue
#	resources/views/index.blade.php
#	resources/views/vuefilemanager/crawler/og-view.blade.php
#	resources/views/vuefilemanager/invoice.blade.php
#	routes/api.php
#	routes/web.php
2021-03-27 12:12:42 +01:00
Peter Papp
0f357ace50 index.blade.php fixes 2021-03-27 11:47:09 +01:00
Peter Papp
4d5cd3d80f added og_image and touch_icon into admin appearance panel 2021-03-27 11:33:42 +01:00
Peter Papp
bb3f4d4bda custom color theme part 4 2021-03-27 10:56:23 +01:00
Milos Holba
9fef371099 add language setting for moobile devices, add upgrade a update app function 2021-03-26 16:20:19 +01:00
Peter Papp
9e330da7a6 - favicon fix
- checkout fix
- stripe prefered locales
- color theme
- stripe card info box in dev version
- upload fix
2021-03-26 16:05:37 +01:00
Peter Papp
254a00e18e - cancel/resume subscription fix
- upload into root folder fix
- custom color theme part 3
2021-03-25 15:49:04 +01:00
Peter Papp
ac6b2b09e1 - cancel/resume subscription fix
- upload into root folder fix
- custom color theme part 3
2021-03-25 10:46:23 +01:00
Peter Papp
a18ceb1b4f - user not found fix in SignIn.vue page 2021-03-24 11:59:12 +01:00
Peter Papp
f2c44c3cfe - custom route for PlanPricingTables.vue
- removed passport error in signin form
2021-03-24 11:43:03 +01:00
Peter Papp
ffe6de5b98 - signup form fix 2021-03-24 11:39:34 +01:00
Peter Papp
4a114ec096 - Zero capacity storage
- Set 0 storage capacity after creating order
2021-03-24 08:43:56 +01:00
Peter Papp
0e3c6e286e - extend setup:dev script
- Stripe taxes refactoring
- billing subscription fixes
2021-03-24 08:42:10 +01:00
Peter Papp
09d2032a70 - queue work command edit
- scheduler period changes
2021-03-24 08:37:57 +01:00
Milos Holba
4142f829be cahng laravel translation, move route for languages from api to web, fix contact formular 2021-03-23 21:00:25 +01:00
Peter Papp
6f7b34dd0a - removed client passport validation
- added UpdateUserPasswordRequest.php
2021-03-23 15:37:21 +01:00
Peter Papp
c6b3995cc3 - Added theme color into ButtonBase.vue 2021-03-23 15:35:12 +01:00
Peter Papp
19925e398f - refactored PricingResource
- get_tax_rates added into StripeService.php
2021-03-23 09:40:30 +01:00
Peter Papp
c722c50ec3 - added dollar icon into MobileActionButton 2021-03-23 09:37:22 +01:00
Peter Papp
4163c28e37 - Get plan from cache in StripeService.php 2021-03-23 09:34:19 +01:00
Peter Papp
80f27d7448 - user id cast to string
- include all migrations in migration process
2021-03-23 09:18:00 +01:00
Milos Holba
df5d5cb75f upgrade of __t function, add save default_language to cache 2021-03-22 20:27:47 +01:00
Milos Holba
5910bb1206 Merge remote-tracking branch 'origin/version-1.8.3' into version-1.8.3 2021-03-22 11:13:02 +01:00
Milos Holba
61635db3db make translation helper for laravel 2021-03-22 10:46:27 +01:00
Peter Papp
4999b23474 custom color theme part 2 2021-03-22 07:45:38 +01:00
Peter Papp
a90311593b - added not found page
- Fixed admin menu in regular license
- allow_homepage default setting in regular license
- frontend build
2021-03-21 11:16:36 +01:00
Peter Papp
cff7cd6b32 custom color theme part 1 2021-03-20 10:25:10 +01:00
Milos Holba
c8dedd44c4 add cache for languages, make function to laravel translate 2021-03-19 20:17:12 +01:00
Milos Holba
2e9112d110 add cache for languages, make function to laravel translate 2021-03-19 19:58:13 +01:00
Peter Papp
aa51484303 - refactored user_scope to author
- added author_id for future teams implementation
2021-03-19 11:27:58 +01:00
Peter Papp
19a75d2fb1 refactored SharedSingleFile 2021-03-19 10:23:31 +01:00
Peter Papp
f4b3f1f163 - public sharing refactored part 3 2021-03-19 10:13:48 +01:00
Peter Papp
ed8ab2978f - public sharing refactored part 2 2021-03-19 09:04:18 +01:00
Peter Papp
db9900fcfb - public sharing refactored part 1 2021-03-19 07:27:15 +01:00
Milos Holba
ba7d6be249 make string in language_strings for the regular license 2021-03-18 16:41:43 +01:00
Peter Papp
816c8c3e07 - protected share authentification backend 2021-03-18 10:06:27 +01:00
Peter Papp
c73e44ff01 - laravel query monitor 2021-03-18 07:09:43 +01:00
Peter Papp
fc18280842 - added not found exception for Model
- cleared dev console
- get share record refactored on backend
2021-03-17 12:24:15 +01:00
Peter Papp
1d52186f17 - shared pages refactored 2021-03-17 10:39:45 +01:00
Peter Papp
87e05d9521 - App container 2021-03-17 08:25:44 +01:00
Peter Papp
ce477fdaf1 - authentication fix
- demo helper
2021-03-17 07:34:22 +01:00
Milos Holba
617f715774 add load strings for i18n from database 2021-03-16 19:26:42 +01:00
Peter Papp
2c69553582 - route 401 redirection
- guest & user view consolidation
2021-03-16 15:53:34 +01:00
Peter Papp
f142919cd1 dispatch jobs after demo data was generated 2021-03-16 14:33:01 +01:00
Peter Papp
f0e9c80572 frontend function consolidation part 2 2021-03-16 11:53:19 +01:00
Peter Papp
adbe35e8b5 trash fixed 2021-03-16 10:30:36 +01:00
Peter Papp
f3783e6f98 demo content generation 2021-03-16 10:00:28 +01:00
Peter Papp
1bb59854ea frontend function consolidation part 1 2021-03-16 08:31:42 +01:00
Peter Papp
803cc089bd Admin & User account frontend consolidation 2021-03-15 16:56:26 +01:00
Peter Papp
ba902a30b3 Log in functionality 2021-03-15 09:23:53 +01:00
Peter Papp
6b67f861c3 - enhanced setup:dev script
- refactored shared token creation
2021-03-15 07:51:01 +01:00
Peter Papp
749bc4ae83 private share routes moved to share.php 2021-03-15 07:04:42 +01:00
Peter Papp
7e3bbe4008 get shared via route model binding refactoring 2021-03-15 06:59:39 +01:00
Peter Papp
cb272709a3 DemoService.php refactoring 2021-03-14 17:48:26 +01:00
Peter Papp
961a8900be Classes refactored 2021-03-14 17:31:58 +01:00
Peter Papp
732fc48aa4 get_items_under_shared_by_folder_id moved to HelperService.php 2021-03-14 17:20:30 +01:00
Peter Papp
07cc977684 divisive public and private browsing controller 2021-03-14 17:03:42 +01:00
Peter Papp
380a588b0a added SharedFileAccessContentController 2021-03-14 13:25:35 +01:00
Peter Papp
9297eae1d7 moved move_to_external_storage into HelperService.php 2021-03-14 13:11:21 +01:00
Peter Papp
419a1d8180 moved move_to_external_storage into HelperService.php 2021-03-14 13:05:53 +01:00
Peter Papp
9cc9111d63 moved check_user_storage_capacity into HelperService.php 2021-03-14 13:03:09 +01:00
Peter Papp
0364e73c60 Guardian and FileManagerService.php refactored 2021-03-14 12:54:34 +01:00
Peter Papp
bb469f2520 added delete_failed_files into SchedulerService.php 2021-03-14 12:42:25 +01:00
Peter Papp
d0bd866354 refactoring part 1 2021-03-14 12:23:14 +01:00
Peter Papp
c5e9d29362 added it_get_all_plans_for_index_page test 2021-03-14 11:36:07 +01:00
Peter Papp
71d0005193 added it_send_reset_link_to_email, it_reset_user_passwordtest 2021-03-14 11:26:35 +01:00
Peter Papp
95eb167622 added indexes to the database 2021-03-14 11:04:19 +01:00
Peter Papp
5778de20f2 added it_check_if_user_exist_and_return_name_with_avatar, it_check_non_existed_user_and_return_not_found test 2021-03-14 10:56:50 +01:00
Peter Papp
9c3c044623 index.blade.php refactored 2021-03-13 19:32:56 +01:00
Peter Papp
deaac3717c added it_get_og_page_for_folder, it_get_og_page_for_image, it_get_og_page_for_protected_file test 2021-03-13 19:16:47 +01:00
Milos Holba
353180491b remove language_id column from language_strings table 2021-03-12 23:33:46 +01:00
Peter Papp
b022cde9e0 added it_get_settings, it_try_get_secured_settings_via_public_api test 2021-03-12 17:17:53 +01:00
Peter Papp
b837cc1906 added it_get_legal_page test 2021-03-12 16:49:39 +01:00
Peter Papp
89a6c51672 added it_send_contact_form test 2021-03-12 16:45:02 +01:00
Peter Papp
bb2094016b Merge remote-tracking branch 'origin/v2' into v2 2021-03-12 16:34:40 +01:00
Peter Papp
3e8acd9b4b fixed namespaces 2021-03-12 16:28:37 +01:00
Peter Papp
db57bde4fc fixed file preview in single shared file 2021-03-12 14:59:47 +01:00
Peter Papp
8ef5444136 added get_settings_in_json helper 2021-03-12 14:35:12 +01:00
Peter Papp
af5181d4d7 - index method refactoret
- Added AppTest
2021-03-11 09:41:31 +01:00
Peter Papp
6075a1b7c8 added guest_get_file_detail test 2021-03-11 08:59:47 +01:00
Peter Papp
266f9d8a0a added guest_search_file, guest_try_search_non_shared_user_file test 2021-03-11 08:51:15 +01:00
Peter Papp
ed90173ec9 added guest_get_navigator_tree test 2021-03-10 17:22:40 +01:00
Peter Papp
ff4af2978d added guest_get_folder_content test 2021-03-10 17:13:49 +01:00
Peter Papp
5e37e10a0c added editor_move_file_to_another_folder, editor_move_folder_to_another_folder test 2021-03-10 16:45:07 +01:00
Peter Papp
cc526f8d95 added editor_upload_file_into_shared_folder test 2021-03-10 16:01:51 +01:00
Peter Papp
8de3e80c4f added it_rename_shared_folder test 2021-03-10 15:32:15 +01:00
Peter Papp
2c7cb67e7c added it_delete_multiple_files_in_shared_folder test 2021-03-10 15:27:35 +01:00
Peter Papp
9606d0e7db added it_create_new_folder_in_shared_folder test 2021-03-10 15:15:24 +01:00
Milos Holba
8be86183fa add set language as default, Fix console error in SharedPage 2021-03-10 12:28:50 +01:00
Peter Papp
1126a45524 added it_rename_shared_file test 2021-03-10 11:02:05 +01:00
Peter Papp
8a4ffd03c6 added shareEditor test 2021-03-10 10:38:41 +01:00
Peter Papp
8d85aad601 added it_zip_shared_multiple_files_and_download_it, it_try_zip_non_shared_file_with_shared_multiple_files_and_download_it test 2021-03-10 10:02:44 +01:00
Peter Papp
1045423692 added it_get_public_thumbnail test 2021-03-10 09:18:14 +01:00
Peter Papp
aecdf56304 added it_get_public_file_record_and_download_them, it_try_to_get_protected_file_record, it_get_shared_record, it_get_deleted_shared_record, it_get_shared_page, it_get_deleted_shared_page test 2021-03-10 08:41:21 +01:00
Peter Papp
e164d1021c added guest_try_to_get_private_user_folder test 2021-03-10 06:47:09 +01:00
Milos Holba
33fa77cd73 create Createlanguage popup, changes in LanguageController 2021-03-08 12:55:17 +01:00
Peter Papp
891ca7260b added it_get_private_user_image_thumbnail, guest_try_to_get_private_user_image_thumbnail, logged_user_try_to_get_another_private_user_image_thumbnail 2021-03-07 11:47:12 +01:00
Peter Papp
9f1174b547 file routes refactoring 2021-03-07 11:18:44 +01:00
Peter Papp
1f615c54af added it_get_private_user_file, guest_try_to_get_private_user_file, logged_user_try_to_get_another_private_user_file test 2021-03-07 10:46:51 +01:00
Peter Papp
6b909c2380 added it_get_public_user_avatar, it_get_public_system_image test 2021-03-07 10:07:06 +01:00
Peter Papp
5660fcd4dc added it_get_all_invoices_from_admin, it_get_single_user_invoice_page test 2021-03-07 09:50:04 +01:00
Peter Papp
da7aee2790 admin authentication in AdminTest.php 2021-03-07 09:16:30 +01:00
Peter Papp
dd4fab8e7c added it_get_all_plans_from_admin, it_get_single_plan_from_admin, it_create_single_plan_from_admin, it_delete_single_plan, it_update_single_plan_from_admin, it_get_subscribers_from_plan_from_admin test 2021-03-06 12:14:09 +01:00
Peter Papp
88540bd2a6 added it_store_stripe_plans_via_setup_wizard test 2021-03-06 11:32:18 +01:00
Peter Papp
355b016f22 added it_verify_purchase_code_successfully, it_verify_purchase_code_unsuccessfully, it_setup_database, it_store_stripe_credentials, it_store_stripe_billings, it_store_environment, it_store_app_settings, it_create_admin_account, it_try_to_create_admin_account_after_setup_wizard_success test 2021-03-06 10:51:03 +01:00
Peter Papp
485dddec68 added SetupWizardTest skelet 2021-03-05 19:56:00 +01:00
Peter Papp
4c947a0e4d added it_get_settings, it_flush_cache, it_set_stripe, it_set_email test 2021-03-05 19:34:51 +01:00
Peter Papp
842abcb6b1 added it_flush_cache test 2021-03-05 19:12:12 +01:00
Peter Papp
b87f8b68d4 added seed_default_settings into SetupWizardController.php 2021-03-05 14:12:31 +01:00
Peter Papp
ce08240355 added it_update_settings, it_get_page, it_update_settings_image test 2021-03-05 11:57:48 +01:00
Peter Papp
e514994b08 added it_get_all_pages, it_get_page, it_update_page test 2021-03-05 11:02:13 +01:00
Peter Papp
779b7fc8ba added it_delete_user_with_all_data test 2021-03-05 10:35:30 +01:00
Peter Papp
5844e66b7f added it_create_new_user_with_avatar test 2021-03-04 17:47:26 +01:00
Peter Papp
2782dc879b added it_change_user_role, it_change_user_storage_capacity test 2021-03-04 17:37:42 +01:00
Peter Papp
80f38d47ed added it_send_reset_password_for_user test 2021-03-04 17:13:52 +01:00
Peter Papp
350b3cb6b3 added it_get_non_existed_user_subscription, it_get_user_invoices_from_admin test 2021-03-04 17:02:48 +01:00
Peter Papp
b544aa875f added it_get_user_subscription_from_admin test 2021-03-04 16:57:27 +01:00
Peter Papp
9c7d7a336b added it_get_all_users, it_get_single_user, it_get_user_storage_detail test 2021-03-04 16:38:00 +01:00
Peter Papp
9b91fe3d59 added it_get_dashboard_data, it_get_new_users_for_dashboard test 2021-03-04 16:22:10 +01:00
Peter Papp
d4df26bf35 added it_get_user_invoices test 2021-03-04 14:15:07 +01:00
Peter Papp
7e4bd191d7 added it_get_user_subscription test 2021-03-04 13:47:00 +01:00
Peter Papp
0add1eaf7f added it_resume_subscription test 2021-03-04 13:03:13 +01:00
Peter Papp
69b72d24a9 added it_get_setup_intent, it_upgrade_plan, it_cancel_subscription test 2021-03-04 12:48:51 +01:00
Peter Papp
b1c15bb6a7 added it_get_user_data test 2021-03-03 09:39:56 +01:00
Peter Papp
b38f04533c added it_logout_user test 2021-03-03 08:51:17 +01:00
Peter Papp
cd9d1d91bd added it_update_user_settings, it_update_user_avatar test 2021-03-03 08:42:07 +01:00
Peter Papp
7f21755f5a added UserAccountTest 2021-03-02 17:24:13 +01:00
Peter Papp
f95b3acbd2 refactored create_directories 2021-03-02 17:13:01 +01:00
Peter Papp
0748f8face - added it_delete_expired_shared_links test 2021-03-02 17:10:32 +01:00
Peter Papp
617ba2a6a8 - added it_delete_zips_older_than_one_day test
- refactored scheduler tasks into SchedulerService.php
2021-03-02 17:05:57 +01:00
Peter Papp
4e098286a6 - added it_delete_zips_older_than_one_day test
- refactored scheduler tasks into SchedulerService.php
2021-03-02 17:05:49 +01:00
Milos Holba
1536af7a5b remove id from language_strings table 2021-03-02 16:58:38 +01:00
Peter Papp
33d6d1cd60 added it_zip_folder_with_content_within_and_download test 2021-03-02 16:43:32 +01:00
Milos Holba
63ba4d3a1d Merge branch 'language-translation' into version-1.8.3 2021-03-02 16:38:48 +01:00
Peter Papp
4ab716bf9c added it_zip_multiple_files_and_download_it test 2021-03-02 16:16:11 +01:00
Peter Papp
594a4acc94 added it_delete_folder_with_their_content_within_softly and it_delete_folder_with_their_content_within_hardly test 2021-03-02 15:42:04 +01:00
Peter Papp
42d243e2fe added it_restore_items_from_trash test 2021-03-02 13:19:23 +01:00
Peter Papp
9583c22b72 added it_dump_trash test 2021-03-01 20:50:48 +01:00
Peter Papp
b66d47bf2b added it_get_searched_file, it_get_searched_folder test 2021-03-01 20:33:24 +01:00
Peter Papp
bcba0fd057 added it_get_shared_items test 2021-03-01 17:39:24 +01:00
Peter Papp
1784ff84c8 added it_get_participant_uploads 2021-03-01 17:03:20 +01:00
Peter Papp
2007279a69 added it_get_trash_root 2021-03-01 16:59:57 +01:00
Peter Papp
d8b279479a added it_get_recent_files test 2021-03-01 16:33:51 +01:00
Peter Papp
bb2e349a31 extended it_get_folder_content test 2021-03-01 16:17:32 +01:00
Peter Papp
674290edfc added it_get_navigator_tree and it_get_folder_content 2021-02-28 18:21:23 +01:00
Peter Papp
486d8de378 web routes refactored 2021-02-28 16:50:28 +01:00
Peter Papp
b82f34ed4d added ShareTest test methods 2021-02-28 16:45:34 +01:00
Peter Papp
81dc7d7ed7 added it_delete_multiple_files_hardly 2021-02-27 15:18:33 +01:00
Peter Papp
a2d3bdd67b added it_upload_new_file 2021-02-27 14:46:19 +01:00
Peter Papp
fdef2de99d added it_upload_image_file_and_create_thumbnail 2021-02-27 14:40:44 +01:00
Peter Papp
f55472442f functionality for setting default folders for app installation 2021-02-27 11:49:01 +01:00
Peter Papp
3328fdebb0 added it_rename_file, it_move_file_to_another_folder, it_delete_multiple_files_softly 2021-02-27 11:17:04 +01:00
Peter Papp
97ade6c238 added it_remove_folder_from_favourites, it_delete_multiple_folder_hardly 2021-02-27 11:03:04 +01:00
Peter Papp
5225673163 added it_delete_multiple_folder_softly 2021-02-27 10:43:11 +01:00
Peter Papp
27675d7f38 - refactored move method
- refactored FavouriteController.php store method
- added some tests methods
2021-02-27 10:22:35 +01:00
Peter Papp
92962aac17 - emoji refactoring 2021-02-27 09:44:43 +01:00
Peter Papp
f38b265ba7 Merge remote-tracking branch 'origin/version-1.8.3' into v2
# Conflicts:
#	app/Http/Controllers/FileFunctions/EditItemsController.php
#	config/vuefilemanager.php
#	public/mix-manifest.json
2021-02-27 09:25:00 +01:00
Peter Papp
6736afaefb - added folder test methods 2021-02-27 09:22:23 +01:00
Peter Papp
dfb809acee - test skelet for share 2021-02-26 18:23:13 +01:00
Peter Papp
5227a5fb99 - test skelet for browsing items 2021-02-26 18:17:33 +01:00
Peter Papp
fe728479d0 - test skelet for folders and files 2021-02-26 18:12:28 +01:00
Peter Papp
b7e1be7518 - implement factories into models
- Model class refactored in relations
2021-02-26 17:57:21 +01:00
Peter Papp
1359b78d21 - added folder, file factories 2021-02-26 17:32:59 +01:00
Peter Papp
920ee19651 - added model events for generate uuid 2021-02-26 17:19:57 +01:00
Milos Holba
7dd4e65d77 add SetFolderIcon for CreateFolder on mobile device, change SetFolderIcon payload 2021-02-26 17:14:21 +01:00
Peter Papp
fd02fbfe08 - API routes refactoring part 3 2021-02-26 17:10:21 +01:00
Peter Papp
00e515e995 - API routes refactoring part 2 2021-02-26 17:03:00 +01:00
Peter Papp
55ba82442a - API routes refactoring
- setup:dev artisan command
2021-02-25 21:32:32 +01:00
Milos Holba
7a963cf5b3 fix: VueFileManager default title in mails, ShareCreate / ShareEdit opening via CopyInput 2021-02-25 18:11:20 +01:00
Peter Papp
2f332197e6 added UserFactory and UserTest.php 2021-02-25 17:35:51 +01:00
Peter Papp
ac38d35ae1 Migration refactoring 2021-02-25 17:16:09 +01:00
Peter Papp
af1a8e6333 Migration refactoring 2021-02-25 17:15:58 +01:00
Peter Papp
18518106ca Upgrading laravel from v7 to v8 2021-02-25 16:47:32 +01:00
Peter Papp
92e02d8b57 - fixed file download links when you are using different disk location in filesystems.disks.local.root 2021-02-25 15:54:18 +01:00
Peter Papp
b42d480c91 - uploading fix 2021-02-25 15:25:59 +01:00
Peter Papp
c8a9f18265 Merge remote-tracking branch 'origin/upload-fix'
# Conflicts:
#	public/mix-manifest.json
2021-02-25 15:23:09 +01:00
Peter Papp
56b7f30d47 - uploading fix 2021-02-25 15:22:16 +01:00
Milos Holba
725a34b7d0 maked separated ColorPicker component 2021-02-24 16:00:05 +01:00
Milos Holba
595bce60eb fix loading EmojiList from server just one time 2021-02-23 16:58:00 +01:00
Milos Holba
bf6cd34cf6 make separated EmojiPicker component, add Spinner to search emojis 2021-02-23 16:15:29 +01:00
Peter Papp
b8790a964b - uploading via files queue 2021-02-21 19:56:03 +01:00
Milos Holba
9a1a9ee206 add Language component 2021-02-21 12:09:24 +01:00
Peter Papp
05f850ab2c - ability to change folder color in demo version 2021-02-20 20:34:12 +01:00
Peter Papp
c2868c051d - ability to change emoji in demo version 2021-02-20 17:07:07 +01:00
Peter Papp
28b39a79e6 - frontend build 2021-02-20 16:30:12 +01:00
Peter Papp
2dbd9dd62d Merge remote-tracking branch 'origin/version-v1.8.1'
# Conflicts:
#	resources/js/components/FilesView/FileItemGrid.vue
#	resources/js/components/FilesView/FileItemList.vue
#	resources/js/components/Others/ThumbnailItem.vue
2021-02-20 15:30:44 +01:00
Peter Papp
9dbce7a73a - autofocus disabled on mobile devices
- tabwrapper icon fix
2021-02-20 14:48:59 +01:00
Peter Papp
8ac5c8fd38 - css refactoring to grid for emoji picker
- frontend build
2021-02-20 12:07:55 +01:00
Milos Holba
2a105877f3 add Zip & Download folder to mobile menu, fix thumbnailItem for images without thumbnail, change color of file icon in mobile menu dark mode 2021-02-16 00:07:05 +01:00
Milos Holba
28efba5773 fix open Processing popup for download files 2021-02-15 12:37:06 +01:00
Milos Holba
60f02622da add default class for Folder in FolderIcon 2021-02-15 12:32:46 +01:00
Milos Holba
7eee7deba5 fix create folder on mobile 2021-02-15 10:00:39 +01:00
Peter Papp
ba0b2bd3b9 apple emojis 2021-02-13 12:05:47 +01:00
Peter Papp
86090b5870 folder color picker 2021-02-13 10:30:54 +01:00
Peter Papp
39681bc48a emoji ios styling for list 2021-02-13 09:29:49 +01:00
Milos Holba
96e1bdd99f make folder icon component 2021-02-12 20:43:33 +01:00
Milos Holba
eebeee6948 scss changes in SetFolderIcon, add translation to sk/cn 2021-02-11 20:14:27 +01:00
Milos Holba
67cf7a6ced change names of routes 2021-02-11 17:11:59 +01:00
Milos Holba
7be02edead change base_path to public_path in get_emojis_list function 2021-02-11 16:44:16 +01:00
Milos Holba
d65c27091c change functionality of Emojis List to async load from backend 2021-02-10 19:45:59 +01:00
Milos Holba
6c3630085e test for iOS emojis 2021-02-09 20:42:48 +01:00
Milos Holba
f6dbb5e71e expansion functionality for the reset button in selected emoji input for possibility to set default icon 2021-02-09 19:20:21 +01:00
Milos Holba
29fce75d35 change language id to uuid 2021-02-09 16:22:06 +01:00
Peter Papp
a80e4364ae - allow share files to email for demo 2021-02-07 18:20:29 +01:00
Peter Papp
bfb3888555 Merge remote-tracking branch 'origin/version-v1.8.1'
# Conflicts:
#	config/vuefilemanager.php
#	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-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/dashboard.js
#	public/chunks/database.js
#	public/chunks/environment-setup.js
#	public/chunks/files.js
#	public/chunks/files~chunks/shared-files~chunks/shared-page.js
#	public/chunks/installation-disclaimer.js
#	public/chunks/invoices.js
#	public/chunks/landing-page.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/profile.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-page.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.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/views/FilePages/Files.vue
2021-02-07 18:05:56 +01:00
Peter Papp
5e408267ee - frontend build 2021-02-07 18:03:40 +01:00
Peter Papp
a4725df5f7 - added createFolder to SharedPage.vue
- queueable email
- frontend build
2021-02-07 17:28:00 +01:00
Peter Papp
dee562c56e - frontend build 2021-02-07 16:40:44 +01:00
Peter Papp
e1016502a1 Merge remote-tracking branch 'origin/version-v1.8.1' into version-v1.8.1
# Conflicts:
#	app/Http/Controllers/FileFunctions/ShareController.php
#	public/mix-manifest.json
2021-02-07 16:36:49 +01:00
Peter Papp
541924448b - Toggle for enable/disable landing page
- New app screenshots for landing page
- frontend build
- some ui fixes
2021-02-07 16:35:48 +01:00
Milos Holba
18b97866f2 MultiEmailInput first email dont need to be separated by comma or space, RenameItem comment ActionButton for more options 2021-02-07 13:26:42 +01:00
Milos Holba
6f2278b908 fix function shared_send_via_email in ShareController 2021-02-07 12:29:08 +01:00
Peter Papp
bdd8d63162 - Toggle for enable/disable landing page
- New app screenshots for laanding page
- frontend build
2021-02-07 12:18:56 +01:00
Peter Papp
8ca7881c5e frontend build 2021-02-07 11:21:51 +01:00
Peter Papp
8d04a94dbc - on-demand notification
- error message on failed after shared link was created
- Shared link email text edit
2021-02-07 11:19:21 +01:00
Peter Papp
d92bb50a03 upload progressbar UI 2021-02-07 09:19:28 +01:00
Milos Holba
44158c74e3 merge remote with local 2021-02-06 16:29:55 +01:00
Milos Holba
847bcec22f add emojis groups navigation, add X icon to select input for reset emoji 2021-02-06 16:12:21 +01:00
Peter Papp
e984ae6beb TabWrapper background change 2021-02-06 16:02:22 +01:00
Peter Papp
e2a52d27f5 Logging out progressbar 2021-02-06 14:18:53 +01:00
Peter Papp
9c92cffde3 Zip and Download title change 2021-02-06 13:57:34 +01:00
Peter Papp
ce20452f38 TabWrapper color change 2021-02-06 13:53:43 +01:00
Peter Papp
6c888c6bd3 Merge remote-tracking branch 'origin/version-v1.8.1' into version-v1.8.1
# Conflicts:
#	public/mix-manifest.json
2021-02-06 13:48:34 +01:00
Peter Papp
2b2d9a0764 - fixed more actions in public shared folder
- 'There is nothing' title changed in new folder
- Play video after click on full preview
- Expanded close cookie disclaimer area
- Show fileinfopanel as default
- Hidden file icons in DesktopToolbar.vue on ipad landscape
- Changed background color in context menu dark mode mobile
2021-02-06 13:48:22 +01:00
Milos Holba
ed2d008f4b stop uploading after failed uploadLimit validation on frontend 2021-02-06 11:15:09 +01:00
Milos Holba
9972f471c4 add Emoji component 2021-02-06 10:37:36 +01:00
Milos Holba
03ef16d90d make component for emojis 2021-02-05 18:13:22 +01:00
Milos Holba
4158d4f31e fix click to rename item in FileItemList/Grid 2021-02-02 18:26:01 +01:00
Milos Holba
e65acd8a4f make new emoji module in vuex, add funcionality for grouping emojis 2021-02-02 16:10:16 +01:00
Milos Holba
ba5e05f77a add tweomji transfer for single emojis 2021-02-01 19:43:30 +01:00
Peter Papp
82cf82e4b5 dashboard widget background changed 2021-02-01 17:02:47 +01:00
Peter Papp
f5e19e47f7 version changing 2021-02-01 16:56:45 +01:00
Peter Papp
43b1aa7f89 frontend build 2021-02-01 16:54:36 +01:00
Peter Papp
0e1ebdd809 Removed confirm dialog when user go back after login in 2021-02-01 16:51:44 +01:00
Peter Papp
6e3adcd459 Fixed streaming video/mp3 on safari browsers with using local disk 2021-02-01 16:37:40 +01:00
Milos Holba
9c147165e1 add to FileItemList/Grid function to unfocuse new foler name input, ThumbnaillItem folderIconHandle revision 2021-01-31 14:39:44 +01:00
Peter Papp
689b064756 - reset emails input after close popup 2021-01-30 15:31:48 +01:00
Peter Papp
6b32ae9795 - Box message fix part 2 2021-01-30 15:08:57 +01:00
Peter Papp
267556b39d - Prevent submit shared form
- Send shared link from FileInfoPanel.vue
2021-01-30 14:01:36 +01:00
Peter Papp
eb2e39cd32 Prevent submit shared form 2021-01-30 13:33:33 +01:00
Peter Papp
58ae75ecc9 MultiEmailInput 2021-01-30 11:52:38 +01:00
Peter Papp
a5dd0e0d30 Tab component reedit 2021-01-30 10:12:33 +01:00
Peter Papp
cec2450940 CopyInput.vue restyling 2021-01-30 09:31:25 +01:00
Milos Holba
fdd8f16384 solved error for get exif data 2021-01-28 11:21:23 +01:00
Milos Holba
2112fe879b add twemoji 2021-01-26 23:17:09 +01:00
Milos Holba
078d920c19 change icon for share , change color in text of Infobox 2021-01-21 20:49:32 +01:00
Milos Holba
98d1926ab3 add send shared link via email in edit sharing option 2021-01-20 18:54:12 +01:00
Milos Holba
2263cc9511 Make table wrapper and table options components 2021-01-19 18:47:53 +01:00
Milos Holba
9a736a2615 Create folder in contextMenu fix empty ul 2021-01-18 20:17:10 +01:00
Milos Holba
4b1e5fcb46 Create Folder - ContextMenu,add X icon for rename popup input, Dekstoptolbar icons,Recent uploads sorting,Windows scroller in nav sidebar,Change color of Delere in context menu 2021-01-18 20:00:26 +01:00
Peter Papp
a0c39bd955 - upgrade service to 1.8.1 from 1.8
- Landing page for Regular Licenses
- Legal pages for Regular Licenses
2021-01-17 16:21:49 +01:00
Peter Papp
973b301a46 Merge remote-tracking branch 'origin/version-v1.8.1' into version-v1.8.1 2021-01-17 13:30:27 +01:00
Peter Papp
e0f192777f - zip folder fix for sisters directories 2021-01-17 13:30:18 +01:00
Milos Holba
ce1bad57cd add change folder icon to rename item popup 2021-01-17 10:24:13 +01:00
Milos Holba
77b126b85a sned shared link via email add validation 2021-01-12 19:13:52 +01:00
Peter Papp
3adf57a6b1 front-end build 2021-01-12 18:34:55 +01:00
Milos Holba
cc72e4e3a2 fixes for mobiles/tablets FileFullPreview,FileInfoPanel after click to non media item,scroll for iPad, ThumbnailItem for media without thumbnail 2021-01-12 17:14:17 +01:00
Milos Holba
3285af3603 add to create share link a send share vie email option 2021-01-11 21:11:09 +01:00
Milos Holba
a8457cf261 first commit 2021-01-11 15:36:41 +01:00
Milos Holba
04990fcf7b add for backend send shared link via email 2021-01-06 17:33:15 +01:00
Milos Holba
ba28ac6184 Change timezone input to select in Settings.vue 2021-01-05 11:40:05 +01:00
Milos Holba
a100671cc0 timezone change int do decimal fix set_time_by_user_timezone function 2021-01-04 12:09:23 +01:00
Milos Holba
ded02fc15b user timezone v1 , add autofocus for CreateFolder,RenameItem popup 2021-01-03 18:00:28 +01:00
Milos Holba
64fd6a2265 first commit Multi restore in trash, focus on the new folder name 2020-12-29 11:39:37 +01:00
Peter Papp
c2a5d4bc74 - removed unwanted file 2020-12-23 18:00:02 +01:00
Peter Papp
fed95cbd64 - updated readme 2020-12-22 10:27:15 +01:00
Peter Papp
e60bbb369a - upgrade controller to v1.8 2020-12-21 20:50:56 +01:00
Peter Papp
7379d17a40 - zip file name fix 2020-12-21 19:00:54 +01:00
Peter Papp
26e0535407 - frontend build 2020-12-21 18:22:22 +01:00
Peter Papp
0f8a89bbad Merge remote-tracking branch 'origin/master'
# Conflicts:
#	public/chunks/app-others.js
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/components/FilesView/FileItemList.vue
#	resources/js/components/FilesView/FilePreview.vue
#	resources/js/helpers.js
#	resources/js/store/modules/fileFunctions.js
2020-12-21 18:20:10 +01:00
Peter Papp
2f89f6303a Merge branch 'upload-limit'
# Conflicts:
#	app/Http/Helpers/helpers.php
#	config/vuefilemanager.php
#	public/chunks/app-others.js
#	public/chunks/files~chunks/shared-files~chunks/shared-page~chunks/trash.js
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/components/FilesView/FileItemList.vue
#	resources/js/components/FilesView/FilePreview.vue
#	resources/js/helpers.js
#	resources/js/store/modules/fileFunctions.js
2020-12-21 18:19:37 +01:00
Peter Papp
4b3ca7e34b Merge remote-tracking branch 'origin/bulk-operations'
# Conflicts:
#	app/Http/Helpers/helpers.php
#	public/chunks/app-others.js
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/components/FilesView/FileItemList.vue
#	resources/js/components/FilesView/FilePreview.vue
#	resources/js/helpers.js
#	resources/js/store/modules/fileFunctions.js
2020-12-21 17:17:10 +01:00
Peter Papp
2c0cf43802 - frontend build
- merge upload limit
2020-12-21 17:15:12 +01:00
Peter Papp
d255b01c70 Merge branch 'upload-limit' into bulk-operations
# Conflicts:
#	app/Http/Helpers/helpers.php
#	config/vuefilemanager.php
#	public/chunks/app-others.js
#	public/chunks/files~chunks/shared-files~chunks/shared-page~chunks/trash.js
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/components/FilesView/FileItemList.vue
#	resources/js/components/FilesView/FilePreview.vue
#	resources/js/helpers.js
#	resources/js/store/modules/fileFunctions.js
2020-12-21 17:14:21 +01:00
Peter Papp
6a9edc49c0 Merge remote-tracking branch 'origin/bulk-operations'
# Conflicts:
#	app/Http/Helpers/helpers.php
#	config/vuefilemanager.php
#	public/chunks/app-others.js
#	public/chunks/files~chunks/shared-files~chunks/shared-page~chunks/trash.js
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/components/FilesView/FileItemList.vue
#	resources/js/components/FilesView/FilePreview.vue
#	resources/js/helpers.js
#	resources/js/store/modules/fileFunctions.js
2020-12-21 17:02:49 +01:00
Peter Papp
96faf2de0e - frontend build
- MobileActionButton enhancement
2020-12-21 17:00:41 +01:00
Peter Papp
5a2e6a5e53 - frontend build 2020-12-21 11:46:11 +01:00
Milos Holba
c509eeceb1 merge local with remote changes (Peter) 2020-12-21 11:31:50 +01:00
Milos Holba
299292a817 add actionButtons for mobile multiSelecting, refactoring sortingAndPreview icon 2020-12-21 11:23:18 +01:00
Peter Papp
b11bd0e521 - checkbox restyle in light mode 2020-12-21 11:05:12 +01:00
Peter Papp
8fb859b441 - checkbox restyle in dark mode 2020-12-21 10:57:07 +01:00
Peter Papp
28a5f58b80 - MobileAction buttons animation
- build
2020-12-21 10:47:06 +01:00
Peter Papp
7da4d1f64b - .multiselect-actions as position:fixed
- zipping popup when generate zip for multiple files download
2020-12-21 09:56:03 +01:00
Peter Papp
07086c7550 - turnOff delete in MobileActions.vue 2020-12-20 22:02:08 +01:00
Peter Papp
5246c47c86 - MobileActions.vue refactoring
- added select all / deselect all buttons to mobile multi select mode
2020-12-20 21:57:24 +01:00
Peter Papp
2975d1555d - frontend build 2020-12-20 19:22:35 +01:00
Milos Holba
bd946be0b0 merge local with remote 2020-12-20 16:53:32 +01:00
Milos Holba
e6ff90f6fc solved issues: FullFilePreview menu , MultiSelected move action ; refactoring contextMenu 2020-12-20 16:41:30 +01:00
Peter Papp
08dc813af9 - fixes 2020-12-19 17:04:52 +01:00
Peter Papp
9098634b99 - upload bar x margin fix 2020-12-19 16:31:14 +01:00
Milos Holba
00213824f1 brench merge 2020-12-19 15:18:58 +01:00
Milos Holba
65624326c7 solved issuis from Bulk Review v3,v4 2020-12-19 15:12:56 +01:00
Peter Papp
e92d9344b9 - App popup for creating folder in mobile version
- bug fixes
2020-12-19 13:47:14 +01:00
Peter Papp
55cf58fffd - local zip file 2020-12-19 11:50:48 +01:00
Peter Papp
a3c43af7ba - local zip file 2020-12-19 11:49:00 +01:00
Peter Papp
a10d394abb - download multiple files in public folder
- frontend build
2020-12-19 11:34:32 +01:00
Milos Holba
b16f22b0eb refactoring sorting and preview component 2020-12-17 12:25:08 +01:00
Milos Holba
5bc66d51be add close sortingAndPreview after click anywhere in application 2020-12-16 12:21:55 +01:00
Peter Papp
7b27fa70d8 - download multiple files in private folder
- sorting context menu changes
- download icon active only if files was selected
2020-12-15 18:05:08 +01:00
Peter Papp
372b3aa407 - frontend build 2020-12-14 18:53:06 +01:00
Peter Papp
bda293bc53 Merge remote-tracking branch 'origin/bulk-operations' into bulk-operations
# Conflicts:
#	public/mix-manifest.json
#	resources/js/components/FilesView/ContextMenu.vue
2020-12-13 17:52:24 +01:00
Peter Papp
11873d06ff - zip implementation for users 2020-12-13 17:49:44 +01:00
Milos Holba
89ea50b893 solved issues bulk review part.1 2020-12-13 16:33:28 +01:00
Peter Papp
874b4bb768 - multiple download test 2020-12-12 17:44:24 +01:00
Peter Papp
1e49f52abe - timeout changed in ContextMenu.vue 2020-12-12 10:44:13 +01:00
Peter Papp
94088e76ec - timeout changed in ContextMenu.vue 2020-12-12 10:38:25 +01:00
Peter Papp
c7abcce729 - code review
- frontend build
2020-12-12 10:31:22 +01:00
Milos Holba
e9d2f4bacc delete sorting icon 2020-12-11 18:26:57 +01:00
Milos Holba
7e7965f98e merge with sorting 2020-12-11 18:25:04 +01:00
Milos Holba
d823ae687b refactor getDataByLocation helper, fix moveItem popup from File info panel 2020-12-11 18:18:09 +01:00
Milos Holba
21a36c0965 add translation for preview and sorting, add sorting for moveItem tree and remove for favourites tree 2020-12-10 18:38:48 +01:00
Milos Holba
c3d162b991 add preview&Sorting menu for mobile version, refacoring sorting URI 2020-12-09 18:24:05 +01:00
Milos Holba
7e325c5101 add sorting for every getData and navigator, Favourites need to be fixed 2020-12-08 19:14:53 +01:00
Milos Holba
59ff07fb01 remove clear fileInfoDetail after load data , add clear fileInfoDetail after open another folder 2020-12-07 19:08:45 +01:00
Milos Holba
2ba92ed3b6 add aplhabet icon 2020-12-07 19:00:50 +01:00
Milos Holba
418c072414 optimalize UI for preview and sorting options 2020-12-07 18:57:40 +01:00
Milos Holba
397fe6b7e4 fixed record_upload for guest ,add clear fileInfoDetail after data change 2020-12-07 16:03:48 +01:00
Milos Holba
97d500028a grid and list view working 2020-12-07 14:23:29 +01:00
Milos Holba
527dfeef9f merge with bulk-operations 2020-12-07 11:32:43 +01:00
Milos Holba
1b3baab691 set timeout between multi download cycles 2020-12-05 18:17:45 +01:00
Milos Holba
5d512f7806 available create folder and upload files at multi selecting 2020-12-05 17:46:22 +01:00
Milos Holba
0da525f692 add the command key for selecting to FileItemGrid 2020-12-05 17:38:08 +01:00
Milos Holba
d076817c9e Merge branch 'bulk-operations' into sorting 2020-12-05 17:25:38 +01:00
Peter Papp
d2af7c1f5e version changed 2020-12-05 17:17:11 +01:00
Peter Papp
ef002f9186 frontend build 2020-12-05 17:15:27 +01:00
Peter Papp
f1006355c4 changed default sorting in navigation tree for move popup action 2020-12-05 17:09:44 +01:00
Milos Holba
ec6087a03c sorting first commit 2020-12-05 17:08:57 +01:00
Peter Papp
2e465f4d03 'Cancel Sharing' edit in language files 2020-12-05 16:56:17 +01:00
Peter Papp
08bf6654fc - Folder tree in navigator now has correct ordering with folder list in file view
- added translation to alert popup
- SCOUT_QUEUE default to true
2020-12-05 11:18:37 +01:00
Peter Papp
77e29852a5 SQLite indexer overload fix
- added jobs migration
- added queue:work to scheduler
- new setup in env.example
- frontend build
2020-12-05 10:22:50 +01:00
Milos Holba
6bc84d4b25 bulk-operations v0.3 fixed DragUI subtitle for single item , add handle for move item to the same parent 2020-12-04 15:47:32 +01:00
Milos Holba
d31e2ab98b bulk-operations v0.3 add multi shared cancel to contextMenu 2020-12-04 13:34:00 +01:00
Milos Holba
ee14c34671 bulk-operations fix desktopToolbar delete 2020-12-04 11:26:15 +01:00
Milos Holba
a8b290692e bulk-operations merge 2020-12-04 11:15:10 +01:00
Milos Holba
441f911560 bulk-operations v0.3 issues solved 2020-12-04 10:56:27 +01:00
Peter Papp
10090b474a - navigator in shared folder page fix
- fixed trash in MobileNavigation.vue
- MobileMultiSelectMenu.vue refactor
- frontend build
2020-12-03 20:19:21 +01:00
Milos Holba
aff2594ef2 bulk-operations fix drop of dragged item 2020-12-02 19:56:54 +01:00
Milos Holba
66aad7c488 merge 2020-12-02 17:09:35 +01:00
Milos Holba
896be9c9c9 bulk-operations change MultiSelect component 2020-12-02 17:06:35 +01:00
Peter Papp
8d1821e05d changed version 2020-12-01 17:55:20 +01:00
Peter Papp
b7014552d2 frontend build 2020-12-01 17:53:25 +01:00
Milos Holba
8561556f5c bulk-operations fixed moveItem popup Three, fixed multiSelect with Shift from bottom to top 2020-11-30 18:49:54 +01:00
Milos Holba
58f7479380 bulk-operations v0.1 add opcaity for draged items 2020-11-29 17:50:59 +01:00
Peter Papp
7b70c81d4d binding key delete 2020-11-29 09:55:58 +01:00
Peter Papp
1981f39f9e traffic fix
drag preview styling
2020-11-29 09:39:26 +01:00
Milos Holba
e86ea3e5c4 bulk-operations v0.1 disable rename if are multiple items selected , add Drag & Drop UI Ghost for share 2020-11-28 18:06:42 +01:00
Milos Holba
8e01b837a2 bulk-operations v0.1 add the Drag & Drop UI Ghost , styled scrollbar 2020-11-28 15:56:12 +01:00
Peter Papp
f33fe84350 traffic id fix 2020-11-28 14:46:59 +01:00
Milos Holba
dbbad817c7 bulk-operations multiSelect items UI v0.1 2020-11-26 12:28:59 +01:00
Milos Holba
0eb0939598 bulk-operations multiSelect items UI v0.1 2020-11-26 12:26:30 +01:00
Peter Papp
65f7855703 I killed that ghost beach! 2020-11-25 20:40:18 +01:00
Peter Papp
45d482d347 Merge remote-tracking branch 'origin/monitor' into bulk-operations
# Conflicts:
#	public/mix-manifest.json
2020-11-24 15:58:43 +01:00
Milos Holba
1654dc8678 bulk-operations draged item multiSelect UI 2020-11-24 11:19:40 +01:00
Peter Papp
cb417ea76d added basic traffic meter for upload/download 2020-11-23 18:29:23 +01:00
Milos Holba
17df4aea35 bulk-operations add the command key for selecting the items 2020-11-22 19:09:10 +01:00
Milos Holba
714429d8f4 bulk-operations merge with the improvements branch 2020-11-22 16:39:58 +01:00
Milos Holba
0df03f1d32 bulk-operations make new MobileMultiSelectMenu component, add multi dwonload 2020-11-22 16:21:51 +01:00
Peter Papp
fefc10afb8 Prevent browser 'Go Back' when you undesirably trying to go to previous page after sign in to your account 2020-11-22 10:30:06 +01:00
Peter Papp
1658627069 updated language files 2020-11-22 09:44:50 +01:00
Peter Papp
16ab540298 Ability to cancel uploading progress via x button 2020-11-22 09:42:44 +01:00
Peter Papp
4e5afa4747 Ability to remove uploaded logo and get back to text logo 2020-11-22 08:56:53 +01:00
Peter Papp
d76ff07bf4 Ability to collapse navigator or favourites widget in File page 2020-11-21 19:56:51 +01:00
Peter Papp
b38333bb64 Trash moved to file page 2020-11-21 18:02:46 +01:00
Peter Papp
f863537190 Integrated rename popup 2020-11-21 17:14:56 +01:00
Peter Papp
a72a672aaf Added navigator to shared page with folders when you have multiple folders within for better user experience
Title name of favourite folder overflowed sidebar when you have long title
Share button in image preview appear when you are in shared public folder
2020-11-21 10:33:27 +01:00
Milos Holba
a3dd817e7a bulk-operations v0.1 adding Drag & Drop for moving items to navigations folders, add folders to favourites 2020-11-20 17:54:39 +01:00
Milos Holba
9d9e07d0fa bulk-operations v0.1 mobileSeleting finished, change FileFullPreview code 2020-11-16 17:57:43 +01:00
Peter Papp
30783d0e5d frontend build 2020-11-16 17:19:59 +01:00
Peter Papp
3a296f0f9c Merge remote-tracking branch 'origin/upload-limit' into upload-limit 2020-11-16 17:17:46 +01:00
Peter Papp
c0d5a771a5 upload-limit branch review 2020-11-16 17:16:38 +01:00
Milos Holba
8fc7272e38 upload-limit v0.3 solved the multiple DB querys,uploadLimit in config 2020-11-16 17:16:38 +01:00
Milos Holba
8b8dc34ba6 upload-limit v0.2 solved uploadLimitFormate issues , add helper for format_megabytes 2020-11-16 17:16:38 +01:00
Milos Holba
966145d384 upload-limit v0.2 2020-11-16 17:16:38 +01:00
Milos Holba
2b4060cb7b upload-limit v0.1 2020-11-16 17:16:38 +01:00
Peter Papp
9455a361dc upload-limit branch review 2020-11-16 17:15:10 +01:00
Milos Holba
26132e23a3 bulk-operations v0.1 ContextMenu Add selecting for mobile version 2020-11-15 20:24:12 +01:00
Milos Holba
5acaadeaae bulk-version v0.1 contextMenu Mobile version selecting 2020-11-15 19:59:12 +01:00
Milos Holba
324f4b1ffa bulk-operations v0.1 setup bulk delete,move items and FileInfoPanel 2020-11-13 19:10:36 +01:00
Milos Holba
0c02952f7a bulk-operations v0.1 add selecting to FileItem List and Grid 2020-11-13 19:05:47 +01:00
Milos Holba
f76a4b37e4 bulk-operations v0.1 2020-11-13 19:03:13 +01:00
Milos Holba
f33f93006e bulk-operations v0.1 user_move, guest_move BE 2020-11-13 19:02:27 +01:00
Milos Holba
382756a6f0 rebase 2020-11-13 19:02:08 +01:00
Milos Holba
559bee6ca2 bulk-operations v0.1 setup bulk delete,move items and FileInfoPanel 2020-11-13 17:56:45 +01:00
Milos Holba
190fc651ae upload-limit v0.3 solved the multiple DB querys,uploadLimit in config 2020-11-12 17:46:23 +01:00
Peter Papp
1c62da4e7c fixed plan description validation in payment request 2020-11-12 17:16:37 +01:00
Milos Holba
8a9d2d7f9a bulk-operations add select for FileItemgrid 2020-11-12 17:12:09 +01:00
Peter Papp
ae3be12934 fixed plan description validation in payment request 2020-11-12 09:46:38 +01:00
Milos Holba
4683e0d084 bulk-operations select items v0.1 2020-11-11 18:03:46 +01:00
Milos Holba
c55d3f5350 upload-limit v0.2 solved uploadLimitFormate issues , add helper for format_megabytes 2020-11-07 15:19:03 +01:00
Milos Holba
7273d60154 upload-limit v0.2 2020-11-06 12:19:31 +01:00
Milos Holba
587daa5ffe upload-limit v0.1 2020-11-04 12:48:15 +01:00
Milos Holba
064e635d35 bulk-operations v0.1 user_move, guest_move BE 2020-11-03 15:36:08 +01:00
Milos Holba
06db522545 bulk-operations v0.1 user_delete,guest_delete BE 2020-11-01 19:52:33 +01:00
Peter Papp
e5335c2472 Merge remote-tracking branch 'origin/exifBlacklist' into exifBlacklist
# Conflicts:
#	public/mix-manifest.json
#	resources/js/helpers.js
#	resources/js/i18n/lang/cn.json
#	resources/js/i18n/lang/en.json
#	resources/js/i18n/lang/sk.json
#	resources/js/store/modules/fileFunctions.js
#	resources/js/views/Admin/AppSettings/AppSettingsTabs/Others.vue
2020-10-24 10:40:59 +02:00
Peter Papp
a2ec066c6d added metadata to UpgradeAppController.php
updated readme with upgrading step to 1.7.11
Frontend build
2020-10-24 10:39:39 +02:00
Miloš Holba
15d4ffc349 Add to metadata Longitude and Latitude 2020-10-24 09:44:23 +02:00
Peter Papp
9af9e45b8a night mode for ImageMetaData.vue 2020-10-24 09:44:23 +02:00
Peter Papp
f30dd38b96 migration column in file_manager_files renamed from meta_data to metadata
context menu feractoring
Editor.php typo changes
FileInfoPanel.vue small changes when to show metadata info
Added new exif information and reordering existing in ImageMetaData.vue
Added new translation strings to i18n files
2020-10-24 09:44:23 +02:00
Miloš Holba
d5f3599b9e v0.1 Add enable empty input in uploadText method 2020-10-24 09:44:23 +02:00
Miloš Holba
de62ab535c v0.1 Fix exif data function just for jpeg and Fix config in index.blade for mimetype_blacklist 2020-10-24 09:44:18 +02:00
Miloš Holba
8b8562916b v0.1 exifBlacklist 2020-10-24 09:44:05 +02:00
Miloš Holba
0d7b920cbe v0.1 add check mimetype if mimetype of file is undefined 2020-10-24 09:44:04 +02:00
Miloš Holba
f3254a380f v0.1 exif Blacklist add frontend validation 2020-10-24 09:44:02 +02:00
Miloš Holba
0e12029efc v0.1 Blacklist and Exif data 2020-10-24 09:43:58 +02:00
Miloš Holba
fd6aa5c6b2 Lazy loading (#41)
* lazy-loading and solved bugs

* lazy-loading for pull request on master

* Update vuefilemanager.php

Co-authored-by: Peter Papp <peterpapp@makingcg.com>
2020-10-24 09:40:05 +02:00
Miloš Holba
5be9db83f7 version change to v1.7.11 2020-10-23 16:14:34 +02:00
Peter Papp
12d6b0bf57 scheduler changed from hourly to every minute 2020-10-13 17:09:05 +02:00
nourisk
961462fe54 Update package.json (#32)
The "vue" and "vue-template[..]" versions not being the same, this has the effect of breaking the "npm run prod" command with error "version missmatch".
For people who have already installed it, just change the version then "npm install" and that should solve the problem.
2020-10-07 08:19:39 +02:00
nourisk
f0e0103d81 Update router.js (#31)
Capital i missing
2020-10-06 17:03:26 +02:00
Miloš Holba
755523e07b Add to metadata Longitude and Latitude 2020-09-25 09:31:31 +02:00
Peter Papp
c4ace0697b version change to v1.7.10.3 2020-09-20 12:09:07 +02:00
Peter Papp
69489c4ee2 - fixed simultaneously action with show and download file on doubleclick
- Changed download name for Backblaze
- Price plan can be defined in 12 digit number
2020-09-20 12:08:29 +02:00
Peter Papp
e05d7468b5 night mode for ImageMetaData.vue 2020-09-20 11:23:50 +02:00
Peter Papp
1a6a91335e migration column in file_manager_files renamed from meta_data to metadata
context menu feractoring
Editor.php typo changes
FileInfoPanel.vue small changes when to show metadata info
Added new exif information and reordering existing in ImageMetaData.vue
Added new translation strings to i18n files
2020-09-20 11:17:34 +02:00
Miloš Holba
80de069c7b v0.1 Add enable empty input in uploadText method 2020-09-15 13:20:39 +02:00
Miloš Holba
2de8bbe548 v0.1 Fix exif data function just for jpeg and Fix config in index.blade for mimetype_blacklist 2020-09-15 10:33:39 +02:00
Peter Papp
7ba2a3bec1 fixed backblaze broken download link when filename contain space (Content Disposition header wasn't read properly with space) 2020-09-14 09:53:38 +02:00
Miloš Holba
89fa2fce23 v0.1 exifBlacklist 2020-09-12 11:15:32 +02:00
Miloš Holba
84b47416d6 v0.1 add check mimetype if mimetype of file is undefined 2020-09-06 20:29:16 +02:00
Miloš Holba
55c72cddba v0.1 exif Blacklist add frontend validation 2020-09-05 18:35:27 +02:00
Miloš Holba
6effd4a7d9 v0.1 Blacklist and Exif data 2020-09-05 14:35:51 +02:00
Peter Papp
95f6695d00 Fixed when default value incorrectly showing in switches in app settings 2020-09-01 07:41:05 +02:00
Peter Papp
fde7f0f73b Fixed when default value incorrectly showing in switches in app settings 2020-09-01 07:10:56 +02:00
Peter Papp
dd1bffec09 typo error 2020-08-31 08:38:40 +02:00
Peter Papp
83a951b3af cache bursting support in webpack.mix.js 2020-08-31 08:22:51 +02:00
Peter Papp
6762ed25dc frontend build 2020-08-30 15:33:52 +02:00
Peter Papp
6ba869234e FileFullPreview functionality in file grid view 2020-08-30 15:33:20 +02:00
Peter Papp
2c04376a61 v1.7.10 2020-08-30 11:18:28 +02:00
Peter Papp
f180f1fff8 expand tap area for FilePreviewActions.vue arrows 2020-08-30 11:15:51 +02:00
Peter Papp
ab65ca7a13 hide subscription, payment cards and invoices in profile menu when is 'Allow subscription payment' option disabled
frontend build
2020-08-30 11:05:08 +02:00
Peter Papp
8895b5062a small design improves 2020-08-30 09:01:00 +02:00
Peter Papp
2f4aafb1b3 frontend build 2020-08-28 16:17:53 +02:00
Peter Papp
be08c8487a Merge remote-tracking branch 'origin/master' into filepreview
# Conflicts:
#	.env.example
#	package-lock.json
#	package.json
#	public/js/main.js
#	public/mix-manifest.json
#	resources/js/App.vue
#	resources/js/helpers.js
#	resources/js/i18n/lang/en.json
#	resources/js/i18n/lang/sk.json
#	resources/js/store/modules/fileFunctions.js
#	resources/js/views/Shared/SharedPage.vue
2020-08-28 16:14:28 +02:00
Peter Papp
0d5df91d2d frontend build 2020-08-27 14:48:48 +02:00
Peter Papp
72e4067beb logo fix in shared page
Renamed option title in share popup
2020-08-27 14:46:07 +02:00
Peter Papp
ba4f888826 Updated README.md and dark mode logo in Dashboard.vue page 2020-08-27 08:25:08 +02:00
Miloš Holba
82b43eb996 FilePreview solved v0.3 issues 2020-08-26 22:37:33 +02:00
Peter Papp
777132ec40 dark mode expiration buttons fix 2020-08-26 18:30:10 +02:00
Peter Papp
7f6f60227a Ability to set expiration for shared link
If user is logged in, after visit SignIn page will be redirected to files page
2020-08-26 08:17:49 +02:00
Peter Papp
ab6ff5dbfd force migration
added maintenance mode
2020-08-26 07:51:16 +02:00
Peter Papp
0d272bc9b7 version change 2020-08-26 07:30:48 +02:00
Peter Papp
2b08d7801b Shared link expiration backend
Redirect from sign in page when user is logged
Updated README.md
2020-08-26 07:29:28 +02:00
Peter Papp
cec4ff6cda shared link title fix 2020-08-25 15:33:16 +02:00
Peter Papp
6f300ba1d5 Link expiration frontend 2020-08-25 15:25:18 +02:00
Peter Papp
86813629ed updated readme 2020-08-25 12:53:46 +02:00
Peter Papp
73a728e606 change vuefilemanager version 2020-08-25 12:37:09 +02:00
Peter Papp
af1228e363 reading metadata in shared link RC 2020-08-25 12:36:21 +02:00
Peter Papp
f3a2758bcc reading metadata in shared link v0.1 2020-08-25 12:04:13 +02:00
Peter Papp
6f9f2f2d34 reading metadata in shared link 2020-08-25 11:03:53 +02:00
Peter Papp
9f4c21a1b1 UserSubscription page fix
PaymentMethods page fix
2020-08-24 09:30:38 +02:00
Miloš Holba
aac0aa755f fix arrow function when is just one file in MediaPreview 2020-08-22 17:55:03 +02:00
Miloš Holba
4be77c07ac remove addEventListener change the video sizing wrapper 2020-08-22 14:18:57 +02:00
Miloš Holba
9372906a3e open to click at audio for mobile 2020-08-22 12:19:23 +02:00
Miloš Holba
e12e521622 add audio mimetypes : mp4, flac 2020-08-21 17:32:36 +02:00
Miloš Holba
0082c3a6a8 change arrows position 2020-08-20 20:31:47 +02:00
Miloš Holba
f79973e922 Fix issues from FilePreview v0.2 2020-08-20 18:50:07 +02:00
Miloš Holba
59ca45e9b1 update filePreview ContextMenu 2020-08-18 19:22:54 +02:00
Miloš Holba
bb22ec1e88 key binds fix 2020-08-17 20:10:30 +02:00
Miloš Holba
ba315014fa split code to components, add arrow functions 2020-08-15 17:41:46 +02:00
Miloš Holba
8387f56048 Move item from gallery fix 2020-08-10 10:30:54 +02:00
Miloš Holba
68acf5f986 Add Gallery 2020-08-08 21:53:43 +02:00
Miloš Holba
785dade6b2 Add Gallery 2020-08-08 21:46:56 +02:00
1214 changed files with 80306 additions and 67456 deletions

View File

@@ -1,14 +1,16 @@
APP_NAME=VueFileManager
APP_ENV=production
APP_KEY=base64:sB1YuKsbWv7MdWugb9ZsYBqv2QZJ+QOuHZHEddOsUuo=
APP_ENV=local
APP_KEY=base64:sC1YuKsbWv7MdWugb9ZsYBqv2QZJ+QOuHZHEddOsAao=
APP_DEBUG=true
APP_URL=http://localhost
APP_DEMO=false
LOG_CHANNEL=stack
LOG_CHANNEL=daily
SCOUT_DRIVER=tntsearch
FILESYSTEM_DRIVER=
CHUNK_SIZE=128
SCOUT_QUEUE=true
FILESYSTEM_DISK=local
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
@@ -17,9 +19,11 @@ DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
DB_MYSQLDUMP_PATH=
BROADCAST_DRIVER=null
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_LIFETIME=120
@@ -27,46 +31,76 @@ REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=
MAIL_DRIVER=log
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_USERNAME=example@domain.com
MAIL_PASSWORD=
MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS="${MAIL_USERNAME}"
MAIL_FROM_NAME="${MAIL_USERNAME}"
POSTMARK_TOKEN=
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MAILGUN_ENDPOINT=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
AWS_SESSION_TOKEN=
DO_SPACES_KEY=
DO_SPACES_SECRET=
DO_SPACES_ENDPOINT=
DO_SPACES_REGION=
DO_SPACES_BUCKET=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_DEFAULT_REGION=
S3_BUCKET=
S3_URL=
WASABI_KEY=
WASABI_SECRET=
WASABI_ENDPOINT=
WASABI_REGION=
WASABI_BUCKET=
BACKBLAZE_KEY=
BACKBLAZE_SECRET=
BACKBLAZE_ENDPOINT=
BACKBLAZE_REGION=
BACKBLAZE_BUCKET=
PASSPORT_CLIENT_ID=
PASSPORT_CLIENT_SECRET=
APP_DEPLOY_SECRET=
CASHIER_LOGGER=stack
CASHIER_CURRENCY=
STRIPE_KEY=
STRIPE_SECRET=
STRIPE_SECRET_KEY=
STRIPE_PUBLIC_KEY=
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=false
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=
PUSHER_APP_TLS=true
PUSHER_APP_ALLOWED_ORIGIN=
IS_ADMIN_VUEFILEMANAGER_BAR=true
IS_SETUP_WIZARD_DEMO=false
IS_SETUP_WIZARD_DEBUG=false
FTP_HOST=
FTP_USERNAME=
FTP_PASSWORD=
AZURE_STORAGE_NAME=
AZURE_STORAGE_KEY=
AZURE_STORAGE_CONTAINER=
AZURE_STORAGE_URL=

42
.env.testing Normal file
View File

@@ -0,0 +1,42 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:YrsSyfNE+I3JPF+zZZTddgxb5YZN6xggPFn6dlpkQlI=
APP_DEBUG=true
APP_URL=http://localhost
APP_DEMO=false
LOG_CHANNEL=stack
DB_CONNECTION=sqlite
DB_HOST=null
DB_PORT=null
DB_DATABASE=database/test.sqlite
DB_USERNAME=null
DB_PASSWORD=null
FILESYSTEM_DISK=local
BROADCAST_DRIVER=null
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
SCOUT_DRIVER=tntsearch
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
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=
SANCTUM_STATEFUL_DOMAINS=localhost,127.0.0.1,127.0.0.1:8000,::1

View File

@@ -0,0 +1,29 @@
name: Code Style Fix
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
jobs:
php-cs-fixer:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
- name: Run PHP CS Fixer
uses: docker://oskarstark/php-cs-fixer-ga
with:
args: --config=.php-cs-fixer.dist.php --allow-risky=yes
- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Fix backend code styling

35
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,35 @@
name: Frontend Build
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm install
- run: npm run prod
- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Application Build

43
.github/workflows/unit-testing.yml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Unit Testing
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest]
php: [8.0]
stability: [prefer-stable]
name: P${{ matrix.php }} - ${{ matrix.stability }} - ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: ctype, json, exif, dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo
coverage: none
- name: Setup problem matchers
run: |
echo "::add-matcher::${{ runner.tool_cache }}/php.json"
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
- name: Install dependencies
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction
- name: Run tests
run: vendor/bin/phpunit

5
.gitignore vendored
View File

@@ -9,10 +9,15 @@
.idea
.env
.env.backup
.env.testing
.php-cs-fixer.cache
.phpunit.result.cache
.phpstorm.meta.php
.vscode/
_ide_helper.php
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
prettier.json
/public/temp

80
.php-cs-fixer.dist.php Normal file
View File

@@ -0,0 +1,80 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in([
__DIR__ . '/src',
__DIR__ . '/routes',
__DIR__ . '/config',
__DIR__ . '/tests',
])
->name('*.php')
->notName('*.blade.php')
->ignoreDotFiles(true)
->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' => [
'syntax' => 'short'
],
'ordered_imports' => [
'sort_algorithm' => 'length'
],
'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' => [
'on_multiline' => 'ensure_fully_multiline',
'keep_multiple_spaces_after_comma' => true,
],
'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' => [
'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,
])
->setFinder($finder);

1
.php_cs.cache Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

5
.prettierrc.yaml Normal file
View File

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

419
README.md
View File

@@ -1,63 +1,44 @@
![logo](https://vuefilemanager.com/assets/images/vuefilemanager-horizontal-logo.svg)
# Private Cloud Storage Build on Laravel & Vue.js
## Supporting VueFileManager
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)
- [One-time donation via PayPal](https://www.paypal.me/peterpapp)
- [Become a backer or sponsor on Patreon](https://www.patreon.com/vuefilemanager)
- [Purchase Licence on CodeCanyon](https://codecanyon.net/item/vue-file-manager-with-laravel-backend/25815986)
# Private Cloud Storage Build by Laravel & Vue.js
## Contents
- [Installation](#installation)
- [Server Requirements](#server-requirements)
- [Installation](#installation)
- [PHP Configuration](#php-configuration)
- [Chunk Upload](#chunk-upload)
- [Nginx Configuration](#nginx-configuration)
- [Apache Configuration](#apache-configuration)
- [Recover Failed Installation](#installation-failed)
- [Update Guide](#update-guide)
- [Instructions](#instructions)
- [Update from 1.7.x to 1.7.7](#update-from-17x-to-177)
- [Update from 1.6.x to 1.7](#update-from-16x-to-17)
- [Payments](#payments)
- [Get your active plans](#get-your-active-plans)
- [Manage Failed Payments](#manage-failed-payments)
- [Tax Rates](#tax-rates)
- [Server Requirements](#server-requirements)
- [Installation](#installation)
- [Updating Application](#updating-application)
- [Nginx Configuration](#nginx-configuration)
- [Apache Configuration](#apache-configuration)
- [Migrating to Another Domain](#migrating-to-another-domain)
- [Developers](#developers)
- [Running development environment on your localhost](#running-development-environment-on-your-localhost)
- [Supported Storages](#supported-storages)
- [How to Create New Language](#how-to-create-new-language)
- [Running Environment On Your Localhost](#running-environment-on-your-localhost)
- [Express Installation](#express-installation)
- [Express Installation with Demo Data](#express-installation-with-demo-data)
- [Sanctum Stateful Domains](#sanctum-stateful-domains)
- [Running your Local Server](#running-your-local-server)
- [Building Your App for Production](#building-your-app-for-production)
- [Others](#others)
- [Changelog](#changelog)
- [GitHub Repository](#github-repository)
- [Support](#support)
- [Security Vulnerabilities](#security-vulnerabilities)
- [Support](#support)
- [Security Vulnerabilities](#security-vulnerabilities)
# Installation
## Server Requirements
**For running app make sure you have:**
**For running app make sure you have installed:**
- PHP >= 7.2.5 version
- PHP >= 8.0.2 version (8.1+ recommended)
- MySQL 5.6+
- Nginx or Apache
- Nginx or Apache (Nginx recommended)
**These PHP Extensions are require:**
**These PHP Extensions are required:**
- Intl
- GD
- BCMath
- PDO
- SQLite
- PDO_MYSQL
- SQLite3
- Ctype
- Fileinfo
- JSON
@@ -69,60 +50,68 @@ But, it can't be done without you, development is more and more complicated and
## Installation
#### 1. Upload files on your server
Copy project files to web root folder of your domain. It's mostly located in `html`, `www` or `public_html` folder name.
- [How to install VPS with Debian 10](https://medium.com/vuefilemanager/how-to-set-up-vuefilemanager-laravel-application-on-vps-with-debian-10-64676a3ff4d7)
- [How to Set Up AWS S3](https://medium.com/vuefilemanager/how-to-set-up-vuefilemanager-with-aws-s3-as-an-external-storage-a2c525aec698)
- [How to Set Up Digital Ocean Spaces](https://medium.com/vuefilemanager/how-to-set-up-vuefilemanager-with-digital-ocean-spaces-as-a-external-storage-6cccf590c23d)
#### 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.
### 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.
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.
### 2. Configure your Document Root
Configure your domain document root to the point of the files you previously uploaded directly into `/public` folder. So, if you uploaded files into `/public_html` folder, your document root must be set as `/public_html/public`. It should [look like this](https://i.ibb.co/SfLdmCQ/Screenshot-2022-04-06-at-08-53-29.png)
![Domain Root](https://vuefilemanager.com/assets/images/domain-root.jpg)
Don't forget to enable Force HTTPS Redirect.
#### 3. Check your .env file
Make sure `.env` file was uploaded. This type of file can be hidden in default.
### 3. Set write permissions
Set `755` permission (CHMOD) to these files and folders directory within all children subdirectories:
#### 3.1 When you install from GitHub
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.
```
composer install
```
#### 4. Set write permissions
Set `755` permission (CHMOD) to these file and folders directory within all children subdirectories:
- /bootstrap/cache
- /bootstrap
- /storage
- /.env
#### 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.
### 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.
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.
### 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.
#### 6. Follow setup wizard steps
### 6. Follow setup wizard steps
That was the hardest part of installation proces. Please follow instructions in every step of Setup Wizard to successfully install VueFileManager.
That was the hardest part of installation process. Please follow instructions in every step of Setup Wizard to successfully install VueFileManager.
## 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.
### 7. Set up Cron
#### If you are running VueFileManager on shared web hosting (CPanel, Plesk etc.)
1. Create new cron job
2. Set execution cycle every minute
3. Search the absolute directory path where you uploaded VueFileManager files (like `/www/project_files`). The path must start with `/`.
4. Copy the command below, paste it to the command text area and replace in command string `replace_by_your_path` exactly with your path you found in step 3.
5. It should [look like this](https://i.ibb.co/SmR585j/Screenshot-2022-03-31-at-09-30-36.png) with your pasted project path.
```
memory_limit = 512M
upload_max_filesize = 128M
post_max_size = 128M
max_file_uploads = 50
max_execution_time = 3600
php replace_by_your_path/artisan schedule:run >> /dev/null 2>&1
```
6. If you have multiple php versions installed on your server, you should specify php path to the latest php version (8+). So, you should edit `php` in command above and replace it by path. For Example:
```
/usr/bin/php8.1/php replace_by_your_path/artisan schedule:run >> /dev/null 2>&1
```
## Chunk & Multipart Upload
VueFileManager in default supporting chunk upload. Default chunk upload size is `128MB`. If you wish change this default value, go to `/config/vuefilemanager.php` and change `chunk_size` attribute.
#### If you are running VueFileManager on linux server
1. Search the absolute directory path where you uploaded VueFileManager files (like `/www/project_files`). The path must start with `/`.
2. Copy the command below, paste it to your cron list and replace in command string `/www/project_files` exactly with your path you found in step 1.
```
* * * * * cd /www/project_files && php artisan schedule:run >> /dev/null 2>&1
```
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.
### 8. CORS Configuration (When you Set External S3 Storage)
In your s3 bucket settings you should have option to set up your CORS (Cross-Origin Resource Sharing). It's basically adding your app url to the list of allowed CORS. This step is required for reading pdf documents from s3 in your VueFileManager app without loading issues.
# Updating Application
1. Replace all files where the app is located except `/storage` folder and `.env` file.
2. Clear the application cache (Admin / Settings / Application).
3. In 5 minutes the app update stuff automatically on the background if needed.
## Nginx Configuration
If you running VueFileManager undex Nginx, don't forget set this value in your `nginx.conf` file:
If you running VueFileManager under Nginx, don't forget set this value in your `nginx.conf` file:
```
http {
client_max_body_size 1024M;
@@ -182,92 +171,176 @@ Make sure you have enabled mod_rewrite. There is an example config for running V
</VirtualHost>
```
## Installation Failed
## Migrating to Another Domain
If you move your VueFileManager application into another domain or subdomain, you have to manually change values in your `.env` file.
1. Open your `/.env` file.
2. Find `APP_URL` variable and write your new domain location. Don't forget start with defining `https://` protocol.
3. Find `SANCTUM_STATEFUL_DOMAINS` variable and write your new domain location without http protocol.
4. Remove your cached config file which is located `/bootstrap/cache/config.php`.
What to do when installation fail and you can't continue, at first, try to fix issue why installation fail. Probably missing PHP extension or permissions wasn't set correctly.
# Broadcasting
### About Broadcasting
Broadcasting is responsible for real time app experience. If broadcasting is set, you will be able to get just in time updates in your app.
At worst scenarios, to reset Setup Wizard, delete all tables in your previously created database, delete content of `/storage/framework/cache`. Then replace content in your `.env` file from `.env.example` file.
For example, remote upload works on the background, while the files are downloading and showing in your view immediately after they are ready without refreshing the app. Or, you will get immediately notifications about new events like team invitations, file requests and many more.
After these steps, installation will be reseted.
More real time features will be implemented in incoming updates.
## Update Guide
VueFileManager support 2 types of connections:
1. [Pusher](https://pusher.com/) - Suitable for all users and all hosting platforms
2. VueFileManager Broadcast Server - Free of charge, suitable for experienced users, limited for VPS servers
### Instructions
`Don't forget create backup of your database and storage before make any changes in your production application.`
## Install Broadcast Server
We strongly recommend only for experienced users to set up and running VueFileManager broadcast server. For others, we recommend to use Pusher service to easy set up and host broadcasting service.
`If you serve your files in local storage driver pay attention and don't delete your /storage folder`
### Server Requirements
**For running app make sure you have:**
Follow this steps:
- VPS server with SSH access
- PHP >= 8.0.2 version (8.1+ recommended)
- Nginx
- Supervisor
- Certbot
- Make a backup of the .env config file located on your server.
- Upload and replace all the files on your server with what's inside the app folder.
- Restore your `.env` config file on your server.
## Update from 1.7.x to 1.7.7
If you are upgrading app to 1.7.7 from 1.7.x, make sure you have copied new /vendor folder or if you are using terminal or git, run `composer update` command to update your vendors.
## Update from 1.6.x to 1.7
For those, who purchase extended licence, place these lines at the end of your `/.env` file:
### Installation
We assume you have installed and running properly your VPS server.
### Websocket Server Set Up
Upload VueFileManager into your server, for example path directory `/var/www/sockets` would be great. Next connect to your server with ssh and change your terminal directory into VueFileManager:
```
CASHIER_LOGGER=stack
CASHIER_CURRENCY=
STRIPE_KEY=
STRIPE_SECRET=
STRIPE_WEBHOOK_SECRET=
CASHIER_PAYMENT_NOTIFICATION=App\Notifications\ConfirmPayment
cd /var/www/sockets
```
Then go to https://your-domain.com/upgrade and follow the setup wizard instructions.
# 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`.
## Get your active plans
Would you like to get your subscription plans for your custom front-end page? Create GET request and get all your active plans:
Run installation command for websocket server. You will be prompted to type host of which you want to allow incoming requests.
```
GET /api/public/pricing
php artisan websockets:install
```
### Domain & Nginx Set Up
Create subdomain for your socket host, for example `socket.vuefilemanager.com` and direct this subdomain to your vps where socket server will be running.
## 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).
Then, create nginx config for your subdomain:
```
nano /etc/nginx/sites-available/socket.conf
```
And paste the template below, just replace subdomain with yours:
```
server {
listen 80;
server_name socket.vuefilemanager.com;
## 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.
location / {
proxy_pass http://127.0.0.1:6001;
proxy_read_timeout 60;
proxy_connect_timeout 60;
proxy_redirect off;
Just log in to your stripe dashboard, and you will find taxes under `Dashboard / Products / Tax Rates`.
# Allow the use of websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
```
Enable your created config by this command:
```
ln -s /etc/nginx/sites-available/socket.conf /etc/nginx/sites-enabled/
```
Restart your nginx:
```
systemctl restart nginx
```
In the last step, install ssl certificate for your previously created subdomain with certbot:
```
certbot --nginx
```
### Supervisor Configuration
We need supervisor to manage running your websocket server on the background.
In `/etc/supervisor/conf.d` (Debian/Ubuntu) or `/etc/supervisord.d/` (Red Hat/CentOS) create a file `websockets.conf`.
Just edit php path, project path and user when they are different for your vps:
```
[program:websockets]
command=/usr/bin/php /var/www/socket/artisan websockets:serve
numprocs=1
autostart=true
autorestart=true
user=www-data
```
Run command below to start your websocket server:
```
supervisorctl start websockets
```
Run command below to stop your websocket server:
```
supervisorctl stop websockets
```
When you update code or server for some reason, you must also update running supervisor:
```
supervisorctl reload
```
### VueFileManager Set Up
Log in to your VueFileManager admin account and go to `Admin / Settings / Environment`.
Find Broadcasting form and select `VueFileManager` as broadcasting driver. Set your hostname and save the form.
That's all, you are running your own Broadcast server.
# Subscription Configuration
## Configuring Production/Testing Environment
To set up your subscription, please follow these steps below.
1. If you didn't set up your subscription type in Setup Wizard, go to the `Admin / Settings / Application` and find subscription widget. Next set value as `Fixed`.
2. Go to the `Admin / Billings` and fill the inputs with your billing information.
3. Go to the `Admin / Payments` and turn on the switch `Allow Subscription Payments`.
4. Set up credentials for all payment gateway you want. If you set production mode, make sure you fill your credentials with production keys, and vice versa. If needed, don't forget to turn on `live mode` for PayPal.
5. Set up your webhooks, you can find your webhook url in payment gateway widget.
6. Go to the `Admin / Plans` and create your first plan. Make sure all payment gateways support the currency you want, especially for Paystack, it supports only `GHS, NGN, USD and ZAR`.
## Upgrading From Testing Environment to the Production Mode
1. Go to the `Admin / Payments` and set up credentials for all payment gateway you want with production keys type. Don't forget to turn on `live mode` for PayPal.
2. Go to the `Admin / Plans` and delete all your previously created plans. They will be archived.
3. Create new production plans you want offer.
# Developers
## Running development environment on your localhost
## Running Environment On Your Localhost
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.
**For running development environment make sure you have:**
- Node >= 14
- NPM >= 6
### Express Installation
If you would like to have express installation without Setup Wizard process, please update your database credentials in .env file
```
composer install
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```
Next, run this command below. Admin account will be created with credentials `howdy@hi5ve.digital` and password `vuefilemanager`.
```
php artisan setup:prod
```
Set your `APP_ENV` to local mode, in default, it's in production mode.
### Express Installation with Demo Data
If you would like to generate demo content, run this command below. Admin account will be created with credentials `howdy@hi5ve.digital` and password `vuefilemanager`.
```
APP_ENV=local
php artisan setup:dev
```
Also, to debug application, set `APP_DEBUG` on true:
```
APP_DEBUG=true
```
### Sanctum Stateful Domains
After installation, please make sure your current host/domain where you are running app is included in your `.env` file in `SANCTUM_STATEFUL_DOMAINS` variable.
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.
### Running your Local Server
To start server on your localhost, run command below.
```
php artisan serve
```
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:
For developing Vue front-end, you have to install npm modules by this command:
```
npm install
```
@@ -277,87 +350,25 @@ To compiles and hot-reloads for front-end development. Then run this command:
npm run hot
```
### Building Your App for Production
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.
## How to Create New Language
VueFileManager front-end support i18n standard for localization. This mean, you can translate app to any language
### How to create translation for Vue Front-End
Go to `/resources/js/i18n/lang` And make copy of `en.json` and rename it to your local name (eg: Slovak language has 'sk' shortcut, it means `sk.json`). If you have created your copy, then feel free to translate this file.
Open `/resources/js/i18n/index.js` import your new language and assign it to languages object:
```
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import en from './lang/en.json'
import sk from './lang/sk.json'
Vue.use(VueI18n);
const i18n = new VueI18n({
locale: config.locale,
messages: Object.assign({
en,
sk
}),
});
export default i18n;
```
After this, you have to compile language to your application code via this command in your terminal:
```
npm run prod
```
### How to Create Translation for Laravel Back-End
Go to `/resources/lang/` And make copy of `en` folder and rename it to your local name (eg: Slovak language has 'sk' shortcut, it means `sk`). If you have created your copy, then feel free to translate this file.
### Set locale
To set your locale in app, go to `/config/app.php` and set your locale string in `locale` option:
```
'locale' => 'YOUR_LOCALE',
```
**Small hint:** We use for translating localizations this awesome software, [check it](https://www.codeandweb.com/babeledit).
# 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:
- [CodeCanyon support message](https://codecanyon.net/item/vue-file-manager-with-laravel-backend/25815986/support)
- [GitHub repository](https://vuefilemanager.com/github-access)
## 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!
- [Buy me a Coffee](https://www.buymeacoffee.com/pepe)
- [Become a Patreon](https://www.patreon.com/vuefilemanager)
- [One-time donation via PayPal](https://www.paypal.me/peterpapp)
## Security Vulnerabilities

File diff suppressed because it is too large Load Diff

View File

@@ -1,66 +0,0 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
class Deploy extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'deploy:production';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Automatic deployment for production';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// Start deployment
$this->info('Running auto deployment');
$this->call('down');
// Exec commands
exec('git pull origin ' . config('app.deploy_branch'));
//exec('composer update --no-interaction --prefer-dist');
$this->migrateDatabase();
// Stop deployment
$this->call('up');
$this->info('Everything is done, congratulations! 🥳🥳🥳');
Log::info('Application was updated!');
}
/**
* Migrate database
*/
public function migrateDatabase()
{
$this->call('migrate', [
'--force' => true,
]);
}
}

View File

@@ -1,46 +0,0 @@
<?php
namespace App\Console;
use App\Console\Commands\Deploy;
use App\Console\Commands\SetupDevEnvironment;
use App\Console\Commands\SetupProductionEnvironment;
use App\Console\Commands\UpgradeApp;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
Deploy::class,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')
// ->hourly();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}

View File

@@ -1,220 +0,0 @@
<?php
namespace App;
use ByteUnits\Metric;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Laravel\Scout\Searchable;
use TeamTNT\TNTSearch\Indexer\TNTIndexer;
use \Illuminate\Database\Eloquent\SoftDeletes;
/**
* App\FileManagerFile
*
* @property int $id
* @property int|null $user_id
* @property int $unique_id
* @property int $folder_id
* @property string $thumbnail
* @property string|null $name
* @property string|null $basename
* @property string|null $mimetype
* @property string $filesize
* @property string|null $type
* @property string $user_scope
* @property string $deleted_at
* @property string $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \App\FileManagerFolder|null $folder
* @property-read string $file_url
* @property-read \App\FileManagerFolder $parent
* @property-read \App\Share|null $shared
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile newQuery()
* @method static \Illuminate\Database\Query\Builder|\App\FileManagerFile onlyTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile query()
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereBasename($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereDeletedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereFilesize($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereFolderId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereMimetype($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereThumbnail($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereUniqueId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFile whereUserScope($value)
* @method static \Illuminate\Database\Query\Builder|\App\FileManagerFile withTrashed()
* @method static \Illuminate\Database\Query\Builder|\App\FileManagerFile withoutTrashed()
* @mixin \Eloquent
*/
class FileManagerFile extends Model
{
use Searchable, SoftDeletes;
public $public_access = null;
protected $guarded = [
'id'
];
protected $appends = [
'file_url'
];
/**
* Set routes with public access
*
* @param $token
*/
public function setPublicUrl($token)
{
$this->public_access = $token;
}
/**
* Format created at date
*
* @return string
*/
public function getCreatedAtAttribute()
{
return format_date($this->attributes['created_at'], __('vuefilemanager.time'));
}
/**
* Form\a\t created at date reformat
*
* @return string
*/
public function getDeletedAtAttribute()
{
if (!$this->attributes['deleted_at']) return null;
return format_date($this->attributes['deleted_at'], __('vuefilemanager.time'));
}
/**
* Format fileSize
*
* @return string
*/
public function getFilesizeAttribute()
{
return Metric::bytes($this->attributes['filesize'])->format();
}
/**
* Format thumbnail url
*
* @return string
*/
public function getThumbnailAttribute()
{
// Get thumbnail from external storage
if ($this->attributes['thumbnail'] && is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) {
return Storage::temporaryUrl('file-manager/' . $this->attributes['thumbnail'], now()->addHour());
}
// Get thumbnail from local storage
if ($this->attributes['thumbnail']) {
// Thumbnail route
$route = route('thumbnail', ['name' => $this->attributes['thumbnail']]);
if ($this->public_access) {
return $route . '/public/' . $this->public_access;
}
return $route;
}
return null;
}
/**
* Format file url
*
* @return string
*/
public function getFileUrlAttribute()
{
// Get file from external storage
if (is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) {
$file_pretty_name = get_pretty_name($this->attributes['basename'], $this->attributes['name'], $this->attributes['mimetype']);
$header = [
"ResponseAcceptRanges" => "bytes",
"ResponseContentType" => $this->attributes['mimetype'],
"ResponseContentLength" => $this->attributes['filesize'],
"ResponseContentRange" => "bytes 0-600/" . $this->attributes['filesize'],
'ResponseContentDisposition' => 'attachment; filename=' . $file_pretty_name,
];
return Storage::temporaryUrl('file-manager/' . $this->attributes['basename'], now()->addDay(), $header);
}
// Get thumbnail from local storage
$route = route('file', ['name' => $this->attributes['basename']]);
if ($this->public_access) {
return $route . '/public/' . $this->public_access;
}
return $route;
}
/**
* Index file
*
* @return array
*/
public function toSearchableArray()
{
$array = $this->toArray();
$name = Str::slug($array['name'], ' ');
return [
'id' => $this->id,
'name' => $name,
'nameNgrams' => utf8_encode((new TNTIndexer)->buildTrigrams(implode(', ', [$name]))),
];
}
/**
* Get parent
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function parent()
{
return $this->belongsTo('App\FileManagerFolder', 'folder_id', 'unique_id');
}
/**
* Get folder
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function folder()
{
return $this->hasOne('App\FileManagerFolder', 'unique_id', 'folder_id');
}
/**
* Get sharing attributes
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function shared()
{
return $this->hasOne('App\Share', 'item_id', 'unique_id');
}
}

View File

@@ -1,263 +0,0 @@
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Laravel\Scout\Searchable;
use RecursiveArrayIterator;
use RecursiveIteratorIterator;
use TeamTNT\TNTSearch\Indexer\TNTIndexer;
use \Illuminate\Database\Eloquent\SoftDeletes;
/**
* App\FileManagerFolder
*
* @property int $id
* @property int|null $user_id
* @property int $unique_id
* @property int $parent_id
* @property string|null $name
* @property string|null $type
* @property string $user_scope
* @property string $deleted_at
* @property string $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFolder[] $children
* @property-read int|null $children_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFile[] $files
* @property-read int|null $files_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFolder[] $folders
* @property-read int|null $folders_count
* @property-read int $items
* @property-read int $trashed_items
* @property-read \App\FileManagerFolder $parent
* @property-read \App\Share|null $shared
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFolder[] $trashed_children
* @property-read int|null $trashed_children_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFile[] $trashed_files
* @property-read int|null $trashed_files_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFolder[] $trashed_folders
* @property-read int|null $trashed_folders_count
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder newQuery()
* @method static \Illuminate\Database\Query\Builder|\App\FileManagerFolder onlyTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder query()
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereDeletedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereParentId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereUniqueId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\FileManagerFolder whereUserScope($value)
* @method static \Illuminate\Database\Query\Builder|\App\FileManagerFolder withTrashed()
* @method static \Illuminate\Database\Query\Builder|\App\FileManagerFolder withoutTrashed()
* @mixin \Eloquent
*/
class FileManagerFolder extends Model
{
use Searchable, SoftDeletes;
protected $guarded = [
'id'
];
protected $appends = [
'items', 'trashed_items'
];
/**
* Index folder
*
* @return array
*/
public function toSearchableArray()
{
$array = $this->toArray();
$name = Str::slug($array['name'], ' ');
return [
'id' => $this->id,
'name' => $name,
'nameNgrams' => utf8_encode((new TNTIndexer)->buildTrigrams(implode(', ', [$name]))),
];
}
/**
* Counts how many folder have items
*
* @return int
*/
public function getItemsAttribute()
{
$folders = $this->folders()->count();
$files = $this->files()->count();
return $folders + $files;
}
/**
* Counts how many folder have items
*
* @return int
*/
public function getTrashedItemsAttribute()
{
$folders = $this->trashed_folders()->count();
$files = $this->trashed_files()->count();
return $folders + $files;
}
/**
* Format created at date reformat
*
* @return string
*/
public function getCreatedAtAttribute()
{
return format_date($this->attributes['created_at'], __('vuefilemanager.time'));
}
/**
* Format created at date reformat
*
* @return string
*/
public function getDeletedAtAttribute()
{
if (! $this->attributes['deleted_at']) return null;
return format_date($this->attributes['deleted_at'], __('vuefilemanager.time'));
}
/**
* Get parent
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function parent()
{
return $this->belongsTo('App\FileManagerFolder', 'parent_id', 'unique_id');
}
public function folderIds()
{
return $this->children()->with('folderIds')->select(['unique_id', 'parent_id']);
}
/**
* Get all files
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function files()
{
return $this->hasMany('App\FileManagerFile', 'folder_id', 'unique_id');
}
/**
* Get all trashed files
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function trashed_files()
{
return $this->hasMany('App\FileManagerFile', 'folder_id', 'unique_id')->withTrashed();
}
/**
* Get all folders
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function folders()
{
return $this->children()->with('folders');
}
/**
* Get all trashed folders
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function trashed_folders()
{
return $this->children()->with('trashed_folders')->withTrashed()->select(['parent_id', 'unique_id', 'name']);
}
/**
* Get childrens
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function children()
{
return $this->hasMany('App\FileManagerFolder', 'parent_id', 'unique_id');
}
/**
* Get trashed childrens
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function trashed_children()
{
return $this->hasMany('App\FileManagerFolder', 'parent_id', 'unique_id')->withTrashed();
}
/**
* Get sharing attributes
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function shared()
{
return $this->hasOne('App\Share', 'item_id', 'unique_id');
}
// Delete all folder childrens
public static function boot()
{
parent::boot();
static::deleting(function ($item) {
if ( $item->isForceDeleting() ) {
$item->trashed_children()->each(function($folder) {
$folder->forceDelete();
});
} else {
$item->children()->each(function($folder) {
$folder->delete();
});
$item->files()->each(function($file) {
$file->delete();
});
}
});
static::restoring(function ($item) {
// Restore children folders
$item->trashed_children()->each(function($folder) {
$folder->restore();
});
// Restore children files
$item->trashed_files()->each(function($files) {
$files->restore();
});
});
}
}

View File

@@ -1,66 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\FileManagerFile;
use App\Http\Controllers\Controller;
use App\Http\Resources\UsersCollection;
use App\Services\StripeService;
use App\Setting;
use App\User;
use ByteUnits\Metric;
use Illuminate\Http\Request;
use Laravel\Cashier\Subscription;
class DashboardController extends Controller
{
/**
* DashboardController constructor.
*/
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Get data for dashboard
*
* @return array
*/
public function index()
{
// Get total users
$total_users = User::all()->count();
// Get total used space
$total_used_space = FileManagerFile::all()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get total premium users
$total_premium_users = Subscription::where('stripe_status', 'active')->get()->count();
// Get License
$license = Setting::where('name', 'license')->first();
return [
'license' => $license ? $license->value : null,
'app_version' => config('vuefilemanager.version'),
'total_users' => $total_users,
'total_used_space' => Metric::bytes($total_used_space)->format(),
'total_premium_users' => $total_premium_users,
];
}
/**
* Get the newest users
*
* @return UsersCollection
*/
public function new_registrations()
{
return new UsersCollection(
User::sortable(['created_at' => 'desc'])->paginate(10)
);
}
}

View File

@@ -1,52 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Resources\InvoiceAdminCollection;
use App\Http\Resources\InvoiceResource;
use App\Invoice;
use App\Services\StripeService;
use App\Setting;
use Illuminate\Http\Request;
class InvoiceController extends Controller
{
/**
* PlanController constructor.
*/
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 $token
*
* @param $customer
* @param $token
* @return InvoiceResource
*/
public function show($customer, $token)
{
$settings = json_decode(Setting::all()->pluck('value', 'name')->toJson());
$invoice = $this->stripe->getUserInvoice($customer, $token);
return view('vuefilemanager.invoice')
->with('settings', $settings)
->with('invoice', $invoice);
}
}

View File

@@ -1,61 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Resources\PageCollection;
use App\Http\Resources\PageResource;
use App\Http\Tools\Demo;
use App\Page;
use Illuminate\Http\Request;
class PagesController extends Controller
{
/**
* Get all pages
*
* @return PageCollection
*/
public function index()
{
return new PageCollection(
Page::sortable()->paginate(10)
);
}
/**
* Get page resource
*
* @param $slug
* @return PageResource
*/
public function show($slug)
{
return new PageResource(
Page::where('slug', $slug)->first()
);
}
/**
* Update page content
*
* @param Request $request
* @param $slug
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function update(Request $request, $slug)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
// Get page
$page = Page::where('slug', $slug)->first();
// Update page
$page->update(make_single_input($request));
return response('Done', 204);
}
}

View File

@@ -1,159 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Resources\PlanCollection;
use App\Http\Resources\PlanResource;
use App\Http\Resources\UserResource;
use App\Http\Resources\UsersCollection;
use App\Http\Tools\Demo;
use App\Plan;
use App\Services\StripeService;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Laravel\Cashier\Subscription;
use Rinvex\Subscriptions\Models\PlanFeature;
class PlanController extends Controller
{
/**
* PlanController constructor.
*/
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Get all plans
*
* @return PlanCollection
*/
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 new PlanCollection($plans);
}
/**
* Get plan record
*
* @param $id
* @return PlanResource
*/
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 new PlanResource($plan);
}
/**
* Create new plan
*
* @param Request $request
* @return PlanResource
*/
public function store(Request $request)
{
// Check if is demo
if (env('APP_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 $plan;
}
/**
* Update plan attribute
*
* @param Request $request
* @param $id
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
// Update plan
$this->stripe->updatePlan($request, $id);
// Clear cached plans
cache_forget_many(['plans', 'pricing', 'plan-' . $id]);
return response('Saved!', 204);
}
/**
* Delete plan
*
* @param $id
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function delete($id)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
// 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::where('stripe_plan', $id)->pluck('user_id');
return new UsersCollection(
User::sortable()->findMany($subscribers)
);
}
}

View File

@@ -1,274 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\FileManagerFile;
use App\FileManagerFolder;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ChangeRoleRequest;
use App\Http\Requests\Admin\ChangeStorageCapacityRequest;
use App\Http\Requests\Admin\CreateUserByAdmin;
use App\Http\Requests\Admin\DeleteUserRequest;
use App\Http\Resources\InvoiceCollection;
use App\Http\Resources\UsersCollection;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserStorageResource;
use App\Http\Resources\UserSubscription;
use App\Http\Tools\Demo;
use App\Services\StripeService;
use App\Share;
use App\User;
use App\UserSettings;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Storage;
class UserController extends Controller
{
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Get user details
*
* @param $id
* @return UserResource
*/
public function details($id)
{
return new UserResource(
User::findOrFail($id)
);
}
/**
* Get user storage details
*
* @param $id
* @return UserStorageResource
*/
public function storage($id)
{
return new UserStorageResource(
User::findOrFail($id)
);
}
/**
* Get user storage details
*
* @return InvoiceCollection
*/
public function invoices($id)
{
$user = User::find($id);
return new InvoiceCollection(
$this->stripe->getUserInvoices($user)
);
}
/**
* Get user subscription details
*
* @param $id
* @return UserSubscription
*/
public function subscription($id)
{
$user = User::find($id);
if (! $user->stripeId()) {
return response('User is not stripe customer', 404);
}
return new UserSubscription(
User::find($id)
);
}
/**
* Get all users
*
* @return UsersCollection
*/
public function users()
{
return new UsersCollection(
User::sortable()->paginate('20')
);
}
/**
* Change user role
*
* @param ChangeRoleRequest $request
* @param $id
* @return UserResource
*/
public function change_role(ChangeRoleRequest $request, $id)
{
$user = User::findOrFail($id);
// Demo preview
if (env('APP_DEMO') && $id == 1) {
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 $id
* @return UserStorageResource
*/
public function change_storage_capacity(ChangeStorageCapacityRequest $request, $id)
{
$user = User::findOrFail($id);
$user->settings()->update($request->input('attributes'));
return new UserStorageResource($user);
}
/**
* Send user password reset link
*
* @param $id
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function send_password_reset_email($id)
{
$user = User::findOrFail($id);
// Demo preview
if (env('APP_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
*/
public function create_user(CreateUserByAdmin $request)
{
// Store avatar
if ($request->hasFile('avatar')) {
$avatar = store_avatar($request->file('avatar'), 'avatars');
}
// Create user
$user = User::forceCreate([
'avatar' => $request->hasFile('avatar') ? $avatar : null,
'name' => $request->name,
'role' => $request->role,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
// Create settings
UserSettings::forceCreate([
'user_id' => $user->id,
'storage_capacity' => $request->storage_capacity,
]);
return new UserResource($user);
}
/**
* Delete user with all user data
*
* @param DeleteUserRequest $request
* @param $id
* @return ResponseFactory|\Illuminate\Http\Response
* @throws \Exception
*/
public function delete_user(DeleteUserRequest $request, $id)
{
$user = User::findOrFail($id);
if ($user->subscribed('main')) {
abort(202, 'You can\'t delete this account while user have active subscription.');
}
// Demo preview
if (env('APP_DEMO')) {
return response('Done!', 204);
}
// Check for self deleted account
if ($user->id === Auth::id()) {
abort(406, 'You can\'t delete your account');
}
// Validate user name
if ($user->name !== $request->input('data.name')) abort(403);
$shares = Share::where('user_id', $user->id)->get();
$files = FileManagerFile::withTrashed()
->where('user_id', $user->id)
->get();
$folders = FileManagerFolder::withTrashed()
->where('user_id', $user->id)
->get();
// Remove all files and thumbnails
$files->each(function ($file) {
// Delete file
Storage::delete('/file-manager/' . $file->basename);
// Delete thumbnail if exist
if (!is_null($file->thumbnail)) {
Storage::delete('/file-manager/' . $file->getRawOriginal('thumbnail'));
}
// Delete file permanently
$file->forceDelete();
});
// Remove avatar
if ($user->avatar) {
Storage::delete('/avatars/' . $user->avatar);
}
// Remove folders & shares
$folders->each->forceDelete();
$shares->each->forceDelete();
// Remove favourites
$user->settings->delete();
$user->favourite_folders()->sync([]);
// Delete user
$user->delete();
return response('Done!', 204);
}
}

View File

@@ -1,183 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Content;
use App\Http\Requests\PublicPages\SendMessageRequest;
use App\Http\Resources\PageResource;
use App\Http\Tools\Demo;
use App\Mail\SendSupportForm;
use App\Page;
use App\Setting;
use Artisan;
use Doctrine\DBAL\Driver\PDOException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Schema;
class AppFunctionsController extends Controller
{
/**
* List of allowed settings to get from public request
*
* @var array
*/
private $whitelist = [
'footer_content',
'get_started_description',
'get_started_title',
'pricing_description',
'pricing_title',
'feature_description_3',
'feature_title_3',
'feature_description_2',
'feature_title_2',
'feature_description_1',
'feature_title_1',
'features_description',
'features_title',
'header_description',
'header_title',
'section_get_started',
'section_pricing_content',
'section_feature_boxes',
'section_features',
];
/**
* Show index page
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
try {
// Try to connect to database
\DB::getPdo();
// Check settings table
$settings_table = Schema::hasTable('settings');
$users_table = Schema::hasTable('users');
// If settings table don't exist, then run migrations
if ($users_table && !$settings_table) {
Artisan::call('migrate', [
'--force' => true
]);
}
// Get settings
$upgraded = Setting::where('name', 'latest_upgrade')->first();
// Get connection string
if ($upgraded && $upgraded->value !== '1.7') {
$connection = 'quiet-update';
} else if (!$upgraded) {
$connection = 'quiet-update';
} else {
$connection = $this->get_setup_status();
}
// Get all settings
$settings = Setting::all();
// Get legal pages
$legal = Page::whereIn('slug', ['terms-of-service', 'privacy-policy', 'cookie-policy'])
->get(['visibility', 'title', 'slug']);
} catch (PDOException $e) {
$connection = 'setup-database';
$settings = null;
}
return view("index")
->with('settings', $settings ? json_decode($settings->pluck('value', 'name')->toJson()) : null)
->with('legal', isset($legal) ? $legal : null)
->with('installation', $connection);
}
/**
* Check if setup wizard was passed
*
* @return string
*/
private function get_setup_status(): string
{
$setup_success = get_setting('setup_wizard_success');
$connection = boolval($setup_success) ? 'setup-done' : 'setup-disclaimer';
return $connection;
}
/**
* Send contact message from pages
*
* @param SendMessageRequest $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function contact_form(SendMessageRequest $request)
{
// Get receiver email
$receiver = Setting::where('name', 'contact_email')->first();
// Send message
Mail::to($receiver->value)->send(new SendSupportForm($request->all()));
return response('Done', 200);
}
/**
* Get single page content
*
* @param $slug
* @return PageResource
*/
public function get_page($slug)
{
return new PageResource(
Page::where('slug', $slug)->first()
);
}
/**
* Get selected settings from public route
*
* @param Request $request
* @return mixed
*/
public function get_settings(Request $request)
{
$column = $request->get('column');
if (strpos($column, '|') !== false) {
$columns = collect(explode('|', $column));
$columns->each(function ($column) {
if (!in_array($column, $this->whitelist)) abort(401);
});
return Setting::whereIn('name', $columns)->pluck('value', 'name');
}
if (!in_array($column, $this->whitelist)) abort(401);
return Setting::where('name', $column)->pluck('value', 'name');
}
/**
* Clear application cache
*/
public function flush_cache()
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('config:cache');
}
}

View File

@@ -1,147 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Requests\Auth\CheckAccountRequest;
use App\Setting;
use App\User;
use App\UserSettings;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Route;
class AuthController extends Controller
{
/**
* Check if user account exist
*
* @param Request $request
* @return mixed
*/
public function check_account(CheckAccountRequest $request)
{
// Get User
$user = User::where('email', $request->input('email'))->select(['name', 'avatar'])->first();
// Return user info
if ($user) return [
'name' => $user->name,
'avatar' => $user->avatar,
];
// Abort with 404, user not found
return abort('404', __('vuefilemanager.user_not_fount'));
}
/**
* Login user
*
* @param Request $request
* @return mixed
*/
public function login(Request $request)
{
$response = Route::dispatch(self::make_login_request($request));
if ($response->isSuccessful()) {
$data = json_decode($response->content(), true);
return response('Login Successfull!', 200)->cookie('access_token', $data['access_token'], 43200);
}
return $response;
}
/**
* Register user
*
* @param Request $request
* @return mixed
*/
public function register(Request $request)
{
$settings = Setting::whereIn('name', ['storage_default', 'registration'])->pluck('value', 'name');
// Check if account registration is enabled
if (! intval($settings['registration'])) abort(401);
// Validate request
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:6', 'confirmed'],
]);
// Create user
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
// Create settings
UserSettings::forceCreate([
'user_id' => $user->id,
'storage_capacity' => $settings['storage_default'],
]);
$response = Route::dispatch(self::make_login_request($request));
if ($response->isSuccessful()) {
$data = json_decode($response->content(), true);
return response('Register Successfull!', 200)->cookie('access_token', $data['access_token'], 43200);
}
return $response;
}
/**
* Logout user entity
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
{
// Demo preview
if (is_demo(Auth::id())) {
return response('Logout successfull', 204)
->cookie('access_token', '', -1);
}
// Get user tokens and remove it
auth()->user()->tokens()->each(function ($token) {
// Remove tokens
$token->delete();
});
return response('Logout successful', 204)
->cookie('access_token', '', -1);
}
/**
* Make login request for get access token
*
* @param Request $request
* @return Request
*/
private static function make_login_request($request)
{
$request->request->add([
'grant_type' => 'password',
'client_id' => config('services.passport.client_id'),
'client_secret' => config('services.passport.client_secret'),
'username' => $request->email,
'password' => $request->password,
'scope' => 'master',
]);
return Request::create(url('/oauth/token'), 'POST', $request->all());
}
}

View File

@@ -1,73 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}

View File

@@ -1,44 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Artisan;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\UnauthorizedException;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class DeployController extends Controller
{
/**
* Get web hook payload and verify request
*
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function github(Request $request) {
if (($signature = $request->headers->get('X-Hub-Signature')) == null) {
throw new BadRequestHttpException('Header not set');
}
$signature_parts = explode('=', $signature);
if (count($signature_parts) != 2) {
throw new BadRequestHttpException('signature has invalid format');
}
$known_signature = hash_hmac('sha1', $request->getContent(), config('app.deploy_secret'));
if (! hash_equals($known_signature, $signature_parts[1])) {
throw new UnauthorizedException('Could not verify request signature ' . $signature_parts[1]);
}
// Run deploying
Artisan::call('deploy:production');
Log::info('The GitHub webhook was accepted');
return response('The GitHub webhook was accepted', 202);
}
}

View File

@@ -1,235 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\FileManagerFolder;
use App\Http\Tools\Guardian;
use App\Share;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Http\Request;
use App\FileManagerFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Response;
class FileAccessController extends Controller
{
/**
* Get avatar
*
* @param $basename
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_avatar($basename)
{
// Get file path
$path = '/avatars/' . $basename;
// Check if file exist
if (!Storage::exists($path)) abort(404);
// Return avatar
return Storage::download($path, $basename);
}
/**
* Get system image
*
* @param $basename
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_system_image($basename)
{
// Get file path
$path = '/system/' . $basename;
// Check if file exist
if (!Storage::exists($path)) abort(404);
// Return avatar
return Storage::download($path, $basename);
}
/**
* Get file
*
* @param Request $request
* @param $filename
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_file(Request $request, $filename)
{
// Get user id
$user_id = Auth::id();
// Get file record
$file = FileManagerFile::withTrashed()
->where('user_id', $user_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);
}
return $this->download_file($file);
}
/**
* Get file public
*
* @param $filename
* @param $token
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_file_public($filename, $token)
{
// Get sharing record
$shared = get_shared($token);
// Abort if shared is protected
if ((int) $shared->protected) {
abort(403, "Sorry, you don't have permission");
}
// Get file record
$file = FileManagerFile::where('user_id', $shared->user_id)
->where('basename', $filename)
->firstOrFail();
// Check file access
$this->check_file_access($shared, $file);
return $this->download_file($file);
}
/**
* 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 = FileManagerFile::withTrashed()
->where('user_id', $request->user()->id)
->where('thumbnail', $filename)
->firstOrFail();
// Check user permission
if (!$request->user()->tokenCan('master')) {
$this->check_file_access($request, $file);
}
return $this->thumbnail_file($file);
}
/**
* Get public image thumbnail
*
* @param $filename
* @param $token
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function get_thumbnail_public($filename, $token)
{
// Get sharing record
$shared = get_shared($token);
// Abort if thumbnail is protected
if ((int) $shared->protected) {
abort(403, "Sorry, you don't have permission");
}
// Get file record
$file = FileManagerFile::where('user_id', $shared->user_id)
->where('thumbnail', $filename)
->firstOrFail();
// Check file access
$this->check_file_access($shared, $file);
return $this->thumbnail_file($file);
}
/**
* Check user file access
*
* @param $shared
* @param $file
*/
protected function check_file_access($shared, $file): void
{
// Check by parent folder permission
if ($shared->type === 'folder') {
Guardian::check_item_access($file->folder_id, $shared);
}
// Check by single file permission
if ($shared->type === 'file') {
if ($shared->item_id !== $file->unique_id) abort(403);
}
}
/**
* Call and download file
*
* @param $file
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
private function download_file($file)
{
$file_pretty_name = get_pretty_name($file->basename, $file->name, $file->mimetype);
// Get file path
$path = '/file-manager/' . $file->basename;
// Check if file exist
if (!Storage::exists($path)) abort(404);
$header = [
"Content-Type" => Storage::mimeType($path),
"Content-Length" => Storage::size($path),
"Accept-Ranges" => "bytes",
"Content-Range" => "bytes 0-600/" . Storage::size($path),
];
// Get file
return Storage::download($path, $file_pretty_name, $header);
}
/**
* @param $file
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
private function thumbnail_file($file)
{
// Get file path
$path = '/file-manager/' . $file->getRawOriginal('thumbnail');
// Check if file exist
if (!Storage::exists($path)) abort(404);
// Return image thumbnail
return Storage::download($path, $file->getRawOriginal('thumbnail'));
}
}

View File

@@ -1,225 +0,0 @@
<?php
namespace App\Http\Controllers\FileBrowser;
use App\Http\Requests\FileBrowser\SearchRequest;
use App\User;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Collection;
use Illuminate\Http\Request;
use App\FileManagerFolder;
use App\FileManagerFile;
use App\Share;
class BrowseController extends Controller
{
/**
* Get trashed files
*
* @return Collection
*/
public function trash()
{
// Get user id
$user_id = Auth::id();
// Get folders and files
$folders_trashed = FileManagerFolder::onlyTrashed()
->with(['trashed_folders', 'parent'])
->where('user_id', $user_id)
->get(['parent_id', 'unique_id', 'name']);
$folders = FileManagerFolder::onlyTrashed()
->with(['parent'])
->where('user_id', $user_id)
->whereIn('unique_id', filter_folders_ids($folders_trashed))
->get();
// Get files trashed
$files_trashed = FileManagerFile::onlyTrashed()
->with(['parent'])
->where('user_id', $user_id)
->whereNotIn('folder_id', array_values(array_unique(recursiveFind($folders_trashed->toArray(), 'unique_id'))))
->get();
// Collect folders and files to single array
return collect([$folders, $files_trashed])->collapse();
}
/**
* Get user shared items
*
* @return Collection
*/
public function shared()
{
// Get user
$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 = FileManagerFolder::with(['parent', 'shared:token,id,item_id,permission,protected'])
->where('user_id', $user_id)
->whereIn('unique_id', $folder_ids)
->get();
$files = FileManagerFile::with(['parent', 'shared:token,id,item_id,permission,protected'])
->where('user_id', $user_id)
->whereIn('unique_id', $file_ids)
->get();
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
/**
* Get latest user uploads
*
* @return mixed
*/
public function latest() {
// Get User
$user = User::with(['latest_uploads'])
->where('id', Auth::id())
->first();
return $user->latest_uploads->makeHidden(['user_id', 'basename']);
}
/**
* Get participant uploads
*
* @return mixed
*/
public function participant_uploads() {
// Get User
$uploads = FileManagerFile::with(['parent'])->where('user_id', Auth::id())
->whereUserScope('editor')->orderBy('created_at', 'DESC')->get();
return $uploads;
}
/**
* Get directory with files
*
* @param Request $request
* @param $unique_id
* @return Collection
*/
public function folder(Request $request, $unique_id)
{
// Get user
$user_id = Auth::id();
// Get folder trash items
if ($request->query('trash')) {
// Get folders and files
$folders = FileManagerFolder::onlyTrashed()
->with('parent')
->where('user_id', $user_id)
->where('parent_id', $unique_id)
->get();
$files = FileManagerFile::onlyTrashed()
->with('parent')
->where('user_id', $user_id)
->where('folder_id', $unique_id)
->get();
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
// Get folders and files
$folders = FileManagerFolder::with(['parent', 'shared:token,id,item_id,permission,protected'])
->where('user_id', $user_id)
->where('parent_id', $unique_id)
->orderBy('created_at', 'DESC')
->get();
$files = FileManagerFile::with(['parent', 'shared:token,id,item_id,permission,protected'])
->where('user_id', $user_id)
->where('folder_id', $unique_id)
->orderBy('created_at', 'DESC')
->get();
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
/**
* Get user folder tree
*
* @return array
*/
public function navigation_tree() {
$folders = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
->where('parent_id', 0)
->where('user_id', Auth::id())
->get(['id', 'parent_id', 'unique_id', 'name']);
return [
[
'unique_id' => 0,
'name' => __('vuefilemanager.home'),
'location' => 'base',
'folders' => $folders,
]
];
}
/**
* Search files
*
* @param Request $request
* @return \Illuminate\Database\Eloquent\Collection
*/
public function search(SearchRequest $request)
{
// Get user
$user_id = Auth::id();
// Search files id db
$searched_files = FileManagerFile::search($request->input('query'))
->where('user_id', $user_id)
->get();
$searched_folders = FileManagerFolder::search($request->input('query'))
->where('user_id', $user_id)
->get();
// Collect folders and files to single array
return collect([$searched_folders, $searched_files])->collapse();
}
/**
* Get file record
*
* @param $unique_id
* @return mixed
*/
public function file_detail($unique_id)
{
// Get user id
$user_id = Auth::id();
return FileManagerFile::with(['shared:token,id,item_id,permission,protected'])
->where('user_id', $user_id)
->where('unique_id', $unique_id)
->firstOrFail();
}
}

View File

@@ -1,385 +0,0 @@
<?php
namespace App\Http\Controllers\FileFunctions;
use App\Http\Requests\FileFunctions\CreateFolderRequest;
use App\Http\Requests\FileFunctions\DeleteItemRequest;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\Http\Requests\FileFunctions\MoveItemRequest;
use App\Http\Requests\FileFunctions\UploadRequest;
use App\Http\Tools\Demo;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Tools\Guardian;
use App\Http\Tools\Editor;
use App\FileManagerFile;
use Exception;
class EditItemsController extends Controller
{
/**
* Create new folder for authenticated master|editor user
*
* @param CreateFolderRequest $request
* @return array
* @throws Exception
*/
public function user_create_folder(CreateFolderRequest $request)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::create_folder($request);
}
// Check permission to create folder for authenticated editor
if ($request->user()->tokenCan('editor')) {
// check if shared_token cookie exist
if (!$request->hasCookie('shared_token')) abort('401');
// Get shared token
$shared = get_shared($request->cookie('shared_token'));
// Check access to requested directory
Guardian::check_item_access($request->parent_id, $shared);
}
// Create new folder
return Editor::create_folder($request);
}
/**
* Create new folder for guest user with edit permission
*
* @param CreateFolderRequest $request
* @param $token
* @return array
* @throws Exception
*/
public function guest_create_folder(CreateFolderRequest $request, $token)
{
// Get shared record
$shared = get_shared($token);
if (is_demo($shared->user_id)) {
return Demo::create_folder($request);
}
// Check shared permission
if (!is_editor($shared)) abort(403);
// Check access to requested directory
Guardian::check_item_access($request->parent_id, $shared);
// Create folder
return Editor::create_folder($request, $shared);
}
/**
* Rename item for authenticated master|editor user
*
* @param RenameItemRequest $request
* @param $unique_id
* @return mixed
* @throws Exception
*/
public function user_rename_item(RenameItemRequest $request, $unique_id)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::rename_item($request, $unique_id);
}
// Check permission to rename item for authenticated editor
if ($request->user()->tokenCan('editor')) {
// check if shared_token cookie exist
if (!$request->hasCookie('shared_token')) abort('401');
// Get shared token
$shared = get_shared($request->cookie('shared_token'));
// Get file|folder item
$item = get_item($request->type, $unique_id, Auth::id());
// Check access to requested directory
if ($request->type === 'folder') {
Guardian::check_item_access($item->unique_id, $shared);
} else {
Guardian::check_item_access($item->folder_id, $shared);
}
}
// Rename Item
return Editor::rename_item($request, $unique_id);
}
/**
* Rename item for guest user with edit permission
*
* @param RenameItemRequest $request
* @param $unique_id
* @param $token
* @return mixed
* @throws Exception
*/
public function guest_rename_item(RenameItemRequest $request, $unique_id, $token)
{
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo($shared->user_id)) {
return Demo::rename_item($request, $unique_id);
}
// Check shared permission
if (!is_editor($shared)) abort(403);
// Get file|folder item
$item = get_item($request->type, $unique_id, $shared->user_id);
// Check access to requested item
if ($request->type === 'folder') {
Guardian::check_item_access($item->unique_id, $shared);
} else {
Guardian::check_item_access($item->folder_id, $shared);
}
// Rename item
$item = Editor::rename_item($request, $unique_id, $shared);
// Set public url
if ($item->type !== 'folder') {
$item->setPublicUrl($token);
}
return $item;
}
/**
* Delete item for authenticated master|editor user
*
* @param DeleteItemRequest $request
* @param $unique_id
* @return ResponseFactory|\Illuminate\Http\Response
* @throws Exception
*/
public function user_delete_item(DeleteItemRequest $request, $unique_id)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::response_204();
}
// Check permission to delete item for authenticated editor
if ($request->user()->tokenCan('editor')) {
// Prevent force delete for non-master users
if ($request->input('data.force_delete')) abort('401');
// check if shared_token cookie exist
if (!$request->hasCookie('shared_token')) abort('401');
// Get shared token
$shared = get_shared($request->cookie('shared_token'));
// Get file|folder item
$item = get_item($request->input('data.type'), $unique_id, Auth::id());
// Check access to requested directory
if ($request->input('data.type') === 'folder') {
Guardian::check_item_access($item->unique_id, $shared);
} else {
Guardian::check_item_access($item->folder_id, $shared);
}
}
// Delete item
Editor::delete_item($request, $unique_id);
// Return response
return response(null, 204);
}
/**
* Delete item for guest user with edit permission
*
* @param DeleteItemRequest $request
* @param $unique_id
* @param $token
* @return ResponseFactory|\Illuminate\Http\Response
* @throws Exception
*/
public function guest_delete_item(DeleteItemRequest $request, $unique_id, $token)
{
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo($shared->user_id)) {
return Demo::response_204();
}
// Check shared permission
if (!is_editor($shared)) abort(403);
// Get file|folder item
$item = get_item($request->input('data.type'), $unique_id, $shared->user_id);
// Check access to requested item
if ($request->input('data.type') === 'folder') {
Guardian::check_item_access($item->unique_id, $shared);
} else {
Guardian::check_item_access($item->folder_id, $shared);
}
// Delete item
Editor::delete_item($request, $unique_id, $shared);
// Return response
return response(null, 204);
}
/**
* Upload file for authenticated master|editor user
*
* @param UploadRequest $request
* @return FileManagerFile|Model
* @throws Exception
*/
public function user_upload(UploadRequest $request)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::upload($request);
}
// Check permission to upload for authenticated editor
if ($request->user()->tokenCan('editor')) {
// check if shared_token cookie exist
if (!$request->hasCookie('shared_token')) abort('401');
// Get shared token
$shared = get_shared($request->cookie('shared_token'));
// Check access to requested directory
Guardian::check_item_access($request->parent_id, $shared);
}
// Return new uploaded file
return Editor::upload($request);
}
/**
* Delete file for guest user with edit permission
*
* @param UploadRequest $request
* @param $token
* @return FileManagerFile|Model
* @throws Exception
*/
public function guest_upload(UploadRequest $request, $token)
{
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo($shared->user_id)) {
return Demo::upload($request);
}
// Check shared permission
if (!is_editor($shared)) abort(403);
// Check access to requested directory
Guardian::check_item_access($request->parent_id, $shared);
// Return new uploaded file
$new_file = Editor::upload($request, $shared);
// Set public access url
$new_file->setPublicUrl($token);
return $new_file;
}
/**
* Move item for authenticated master|editor user
*
* @param MoveItemRequest $request
* @param $unique_id
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function user_move(MoveItemRequest $request, $unique_id)
{
// Demo preview
if (is_demo(Auth::id())) {
return Demo::response_204();
}
// Check permission to upload for authenticated editor
if ($request->user()->tokenCan('editor')) {
// check if shared_token cookie exist
if (!$request->hasCookie('shared_token')) abort('401');
// Get shared token
$shared = get_shared($request->cookie('shared_token'));
// Check access to requested directory
Guardian::check_item_access($request->to_unique_id, $shared);
}
// Move item
Editor::move($request, $unique_id);
return response('Done!', 204);
}
/**
* Move item for guest user with edit permission
*
* @param MoveItemRequest $request
* @param $unique_id
* @param $token
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function guest_move(MoveItemRequest $request, $unique_id, $token)
{
// Get shared record
$shared = get_shared($token);
// Demo preview
if (is_demo(Auth::id())) {
return Demo::response_204();
}
// Check shared permission
if (!is_editor($shared)) abort(403);
$moving_unique_id = $unique_id;
if ($request->from_type !== 'folder') {
$file = FileManagerFile::where('unique_id', $unique_id)
->where('user_id', $shared->user_id)
->firstOrFail();
$moving_unique_id = $file->folder_id;
}
// Check access to requested item
Guardian::check_item_access([
$request->to_unique_id, $moving_unique_id
], $shared);
// Move item
Editor::move($request, $unique_id, $shared);
return response('Done!', 204);
}
}

View File

@@ -1,69 +0,0 @@
<?php
namespace App\Http\Controllers\FileFunctions;
use App\FileManagerFolder;
use App\Http\Tools\Demo;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
class FavouriteController extends Controller
{
/**
* Add folder to user favourites
*
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function store(Request $request)
{
// Validate request
$validator = Validator::make($request->all(), [
'unique_id' => 'required|integer',
]);
// Return error
if ($validator->fails()) abort(400, 'Bad input');
// Get user & folder
$user = Auth::user();
$folder = FileManagerFolder::where('unique_id', $request->unique_id)->first();
if (is_demo($user->id)) {
return Demo::favourites($user);
}
// Check ownership
if ($folder->user_id !== $user->id) abort(403);
// Add folder to user favourites
$user->favourite_folders()->syncWithoutDetaching($request->unique_id);
// Return updated favourites
return $user->favourite_folders;
}
/**
* Remove folder from user favourites
*
* @param $unique_id
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function destroy($unique_id)
{
// Get user
$user = Auth::user();
if (is_demo($user->id)) {
return Demo::favourites($user);
}
// Remove folder from user favourites
$user->favourite_folders()->detach($unique_id);
// Return updated favourites
return $user->favourite_folders;
}
}

View File

@@ -1,107 +0,0 @@
<?php
namespace App\Http\Controllers\FileFunctions;
use App\Http\Requests\Share\CreateShareRequest;
use App\Http\Requests\Share\UpdateShareRequest;
use App\Http\Resources\ShareResource;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use App\Share;
class ShareController extends Controller
{
/**
* Get shared record
*
* @return ShareResource
*/
public function show($token)
{
// Get record
$shared = Share::where(DB::raw('BINARY `token`'), $token)
->firstOrFail();
return new ShareResource($shared);
}
/**
* Generate file share link
*
* @param CreateShareRequest $request
* @return ShareResource
*/
public function store(CreateShareRequest $request)
{
do {
// Generate unique token
$token = Str::random(16);
} while (Share::where(DB::raw('BINARY `token`'), $token)->exists());
// Create shared options
$options = [
'password' => $request->has('password') ? Hash::make($request->password) : null,
'type' => $request->type === 'folder' ? 'folder' : 'file',
'protected' => $request->isPassword,
'permission' => $request->permission,
'item_id' => $request->unique_id,
'user_id' => Auth::id(),
'token' => $token,
];
// Return created shared record
return new ShareResource(Share::create($options));
}
/**
* 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,
'protected' => $request->protected,
'password' => $request->password ? Hash::make($request->password) : $shared->password,
]);
// Return shared record
return new ShareResource($shared);
}
/**
* Delete sharing item
*
* @param $token
* @return ResponseFactory|\Illuminate\Http\Response
* @throws \Exception
*/
public function destroy($token)
{
// Get sharing record
$shared = Share::where('token', $token)
->where('user_id', Auth::id())
->firstOrFail();
// Delete shared record
$shared->delete();
// Done
return response('Done!', 204);
}
}

View File

@@ -1,115 +0,0 @@
<?php
namespace App\Http\Controllers\FileFunctions;
use App\Http\Tools\Demo;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\FileManagerFolder;
use App\FileManagerFile;
class TrashController extends Controller
{
/**
* Empty user trash
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function clear()
{
// Get user id
$user_id = Auth::id();
if (is_demo($user_id)) {
return Demo::response_204();
}
// Get files and folders
$folders = FileManagerFolder::onlyTrashed()->where('user_id', $user_id)->get();
$files = FileManagerFile::onlyTrashed()->where('user_id', $user_id)->get();
// Force delete folder
$folders->each->forceDelete();
// Force delete files
foreach ($files as $file) {
// Delete file
Storage::delete('/file-manager/' . $file->basename);
// Delete thumbnail if exist
if ($file->thumbnail) Storage::delete('/file-manager/' . $file->getRawOriginal('thumbnail'));
// Delete file permanently
$file->forceDelete();
}
// Return response
return response('Done!', 204);
}
/**
* Restore item from trash
*
* @param Request $request
* @param $unique_id
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function restore(Request $request, $unique_id)
{
// Validate request
$validator = Validator::make($request->all(), [
'type' => 'required|string',
'to_home' => 'boolean',
]);
// Return error
if ($validator->fails()) abort(400, 'Bad input');
// Get user id
$user_id = Auth::id();
if (is_demo($user_id)) {
return Demo::response_204();
}
// Get folder
if ($request->type === 'folder') {
// Get folder
$item = FileManagerFolder::onlyTrashed()
->where('user_id', $user_id)
->where('unique_id', $unique_id)
->first();
// Restore item to home directory
if ($request->has('to_home') && $request->to_home) {
$item->parent_id = 0;
$item->save();
}
} else {
// Get item
$item = FileManagerFile::onlyTrashed()
->where('user_id', $user_id)
->where('unique_id', $unique_id)
->first();
// Restore item to home directory
if ($request->has('to_home') && $request->to_home) {
$item->folder_id = 0;
$item->save();
}
}
// Restore Item
$item->restore();
// Return response
return response('Done!', 204);
}
}

View File

@@ -1,48 +0,0 @@
<?php
namespace App\Http\Controllers\General;
use App\Http\Controllers\Controller;
use App\Http\Resources\PricingCollection;
use App\Services\StripeService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class PricingController extends Controller
{
/**
* PlanController constructor.
*/
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Get all active plans
*
* @return PricingCollection
*/
public function index()
{
if (Cache::has('pricing')) {
// Get pricing from cache
$pricing = Cache::get('pricing');
} else {
// Store pricing to 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();
}
}

View File

@@ -1,578 +0,0 @@
<?php
namespace App\Http\Controllers\General;
use App\Http\Controllers\Controller;
use App\Http\Requests\SetupWizard\CreateAdminRequest;
use App\Http\Requests\SetupWizard\StoreAppSetupRequest;
use App\Http\Requests\SetupWizard\StoreDatabaseCredentialsRequest;
use App\Http\Requests\SetupWizard\StoreEnvironmentSetupRequest;
use App\Http\Requests\SetupWizard\StoreStripeBillingRequest;
use App\Http\Requests\SetupWizard\StoreStripeCredentialsRequest;
use App\Http\Requests\SetupWizard\StoreStripePlansRequest;
use App\Page;
use App\Services\StripeService;
use App\Setting;
use App\User;
use App\UserSettings;
use Artisan;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use Doctrine\DBAL\Driver\PDOException;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
use Schema;
use Stripe;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SetupWizardController extends Controller
{
/**
* Inject Stripe Service
*/
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Verify Envato purchase code
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response|mixed
*/
public function verify_purchase_code(Request $request)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Verify purchase code
$response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode);
if ($response->successful()) {
return $response;
}
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)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
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());
}
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,
]);
// Clear cache
Artisan::call('config:cache');
// Set up application
$this->set_up_application();
// Store setup wizard progress
Setting::create([
'name' => 'setup_wizard_database',
'value' => 1,
]);
return response('Done', 200);
}
/**
* Store and test stripe credentials
*
* @param StoreStripeCredentialsRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function store_stripe_credentials(StoreStripeCredentialsRequest $request)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Create stripe instance
$stripe = Stripe::make($request->secret, '2020-03-02');
// Try to get stripe account details
try {
$stripe->account()->details();
} catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage());
}
// Get options
$settings = collect([
[
'name' => 'stripe_currency',
'value' => $request->currency,
],
[
'name' => 'payments_configured',
'value' => 1,
],
[
'name' => 'payments_active',
'value' => 1,
],
]);
// Store options
$settings->each(function ($col) {
Setting::updateOrCreate(['name' => $col['name']], $col);
});
// 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', 200);
}
/**
* Store Stripe billings
*
* @param StoreStripeBillingRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function store_stripe_billings(StoreStripeBillingRequest $request)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Get options
$settings = 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,
],
]);
// Store options
$settings->each(function ($col) {
Setting::updateOrCreate(['name' => $col['name']], $col);
});
// Clear cache
Artisan::call('config:cache');
return response('Done', 200);
}
/**
* Create Stripe subscription plan
*
* @param StoreStripePlansRequest $request
*/
public function store_stripe_plans(StoreStripePlansRequest $request)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
foreach ($request->input('plans') as $plan) {
$this->stripe->createPlan($plan);
}
}
/**
* Store environment setup
*
* @param StoreEnvironmentSetupRequest $request
* @return string
*/
public function store_environment_setup(StoreEnvironmentSetupRequest $request)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
$storage_driver = $request->input('storage.driver');
if ($storage_driver === 'local') {
setEnvironmentValue([
'FILESYSTEM_DRIVER' => 'local',
]);
}
if ($storage_driver === 's3') {
setEnvironmentValue([
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'AWS_ACCESS_KEY_ID' => $request->input('storage.key'),
'AWS_SECRET_ACCESS_KEY' => $request->input('storage.secret'),
'AWS_DEFAULT_REGION' => $request->input('storage.region'),
'AWS_BUCKET' => $request->input('storage.bucket'),
]);
}
if ($storage_driver === 'spaces') {
setEnvironmentValue([
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'DO_SPACES_KEY' => $request->input('storage.key'),
'DO_SPACES_SECRET' => $request->input('storage.secret'),
'DO_SPACES_ENDPOINT' => $request->input('storage.endpoint'),
'DO_SPACES_REGION' => $request->input('storage.region'),
'DO_SPACES_BUCKET' => $request->input('storage.bucket'),
]);
}
if ($storage_driver === 'wasabi') {
setEnvironmentValue([
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'WASABI_KEY' => $request->input('storage.key'),
'WASABI_SECRET' => $request->input('storage.secret'),
'WASABI_ENDPOINT' => $request->input('storage.endpoint'),
'WASABI_REGION' => $request->input('storage.region'),
'WASABI_BUCKET' => $request->input('storage.bucket'),
]);
}
if ($storage_driver === 'backblaze') {
setEnvironmentValue([
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'BACKBLAZE_KEY' => $request->input('storage.key'),
'BACKBLAZE_SECRET' => $request->input('storage.secret'),
'BACKBLAZE_ENDPOINT' => $request->input('storage.endpoint'),
'BACKBLAZE_REGION' => $request->input('storage.region'),
'BACKBLAZE_BUCKET' => $request->input('storage.bucket'),
]);
}
setEnvironmentValue([
'MAIL_DRIVER' => $request->input('mail.driver'),
'MAIL_HOST' => $request->input('mail.host'),
'MAIL_PORT' => $request->input('mail.port'),
'MAIL_USERNAME' => $request->input('mail.username'),
'MAIL_PASSWORD' => $request->input('mail.password'),
'MAIL_ENCRYPTION' => $request->input('mail.encryption'),
]);
// Clear cache
Artisan::call('config:cache');
return response('Done', 200);
}
/**
* Store app settings
* @param StoreAppSetupRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function store_app_settings(StoreAppSetupRequest $request)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Store Logo
if ($request->hasFile('logo')) {
$logo = store_system_image($request->file('logo'), 'system');
}
// Store Logo horizontal
if ($request->hasFile('logo_horizontal')) {
$logo_horizontal = store_system_image($request->file('logo_horizontal'), 'system');
}
// Store favicon
if ($request->hasFile('favicon')) {
$favicon = store_system_image($request->file('favicon'), 'system');
}
// Get options
$settings = collect([
[
'name' => 'app_title',
'value' => $request->title,
],
[
'name' => 'app_description',
'value' => $request->description,
],
[
'name' => 'app_logo',
'value' => $request->hasFile('logo') ? $logo : null,
],
[
'name' => 'app_logo_horizontal',
'value' => $request->hasFile('logo_horizontal') ? $logo_horizontal : null,
],
[
'name' => 'app_favicon',
'value' => $request->hasFile('favicon') ? $favicon : null,
],
[
'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 ? $request->defaultStorage : 5,
],
]);
// Store options
$settings->each(function ($col) {
Setting::updateOrCreate(['name' => $col['name']], $col);
});
setEnvironmentValue([
'APP_NAME' => Str::camel($request->title),
]);
return response('Done', 200);
}
/**
* Create and login admin account
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response
*/
public function create_admin_account(Request $request)
{
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Validate request
$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',
]);
// Store avatar
if ($request->hasFile('avatar')) {
$avatar = store_avatar($request->file('avatar'), 'avatars');
}
// Create user
$user = User::forceCreate([
'avatar' => $request->hasFile('avatar') ? $avatar : null,
'name' => $request->name,
'role' => 'admin',
'email' => $request->email,
'password' => Hash::make($request->password),
]);
// Get default storage capacity
$storage_capacity = Setting::where('name', 'storage_default')->first();
// Create settings
UserSettings::forceCreate([
'user_id' => $user->id,
'storage_capacity' => $storage_capacity->value,
]);
// Store setup wizard progress
Setting::updateOrCreate([
'name' => 'setup_wizard_success',
'value' => 1,
]);
// Store License
Setting::updateOrCreate([
'name' => 'license',
'value' => $request->license,
]);
// Store Purchase Code
Setting::updateOrCreate([
'name' => 'purchase_code',
'value' => $request->purchase_code,
]);
// Create legal pages and index content
if ($request->license === 'Extended') {
$pages = collect(config('content.pages'));
$content = collect(config('content.content'));
$content->each(function ($content) {
Setting::updateOrCreate($content);
});
$pages->each(function ($page) {
Page::updateOrCreate($page);
});
}
// Retrieve access token
$response = Route::dispatch(self::make_login_request($request));
// Send access token to user if request is successful
if ($response->isSuccessful()) {
$data = json_decode($response->content(), true);
return response('Admin was created', 200)->cookie('access_token', $data['access_token'], 43200);
}
return $response;
}
/**
* Migrate database and generate necessary things
*/
private function set_up_application()
{
// Generate app key
Artisan::call('key:generate', [
'--force' => true
]);
// Migrate database
Artisan::call('migrate:fresh', [
'--force' => true
]);
// Create Passport Keys
Artisan::call('passport:keys', [
'--force' => true
]);
// Create Password grant client
Artisan::call('passport:client', [
'--password' => true,
'--name' => 'vuefilemanager',
]);
// Create Personal access client
Artisan::call('passport:client', [
'--personal' => true,
'--name' => 'shared',
]);
// Get generated client
$client = \DB::table('oauth_clients')->where('name', '=', 'vuefilemanager')->first();
// Set passport client to .env
setEnvironmentValue([
'PASSPORT_CLIENT_ID' => $client->id,
'PASSPORT_CLIENT_SECRET' => $client->secret,
]);
}
/**
* Make login request for get access token
*
* @param Request $request
* @return Request
*/
private static function make_login_request($request)
{
$request->request->add([
'grant_type' => 'password',
'client_id' => config('services.passport.client_id'),
'client_secret' => config('services.passport.client_secret'),
'username' => $request->email,
'password' => $request->password,
'scope' => 'master',
]);
return Request::create(url('/oauth/token'), 'POST', $request->all());
}
/**
* Get setup wizard status
*
* @return |null
*/
private function get_setup_status()
{
try {
// Check database connections
DB::getPdo();
// Get setup_wizard status
return Schema::hasTable('settings') ? Setting::where('name', 'setup_wizard_success')->first() : false;
} catch (PDOException $e) {
return false;
}
}
}

View File

@@ -1,126 +0,0 @@
<?php
namespace App\Http\Controllers\General;
use App\Http\Controllers\Controller;
use App\Page;
use App\Setting;
use Artisan;
use Illuminate\Http\Request;
class UpgradeAppController extends Controller
{
/**
* Upgrade account from 1.6 to 1.7
*
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function upgrade(Request $request)
{
$upgraded = Setting::where('name', 'latest_upgrade')->first();
if ($upgraded && $upgraded->value === '1.7') abort(401);
// Create legal pages and index content
if ($request->license === 'Extended') {
$pages = collect(config('content.pages'));
$content = collect(config('content.content'));
$content->each(function ($content) {
Setting::updateOrCreate($content);
});
$pages->each(function ($page) {
Page::updateOrCreate($page);
});
}
// Store Logo
if ($request->hasFile('logo')) {
$logo = store_system_image($request->file('logo'), 'system');
}
// Store Logo horizontal
if ($request->hasFile('logo_horizontal')) {
$logo_horizontal = store_system_image($request->file('logo_horizontal'), 'system');
}
// Store favicon
if ($request->hasFile('favicon')) {
$favicon = store_system_image($request->file('favicon'), 'system');
}
// Get options
$settings = collect([
[
'name' => 'setup_wizard_database',
'value' => 1,
],
[
'name' => 'setup_wizard_success',
'value' => 1,
],
[
'name' => 'license',
'value' => $request->license,
],
[
'name' => 'purchase_code',
'value' => $request->purchase_code,
],
[
'name' => 'app_title',
'value' => $request->title,
],
[
'name' => 'app_description',
'value' => $request->description,
],
[
'name' => 'app_logo',
'value' => $request->hasFile('logo') ? $logo : null,
],
[
'name' => 'app_logo_horizontal',
'value' => $request->hasFile('logo_horizontal') ? $logo_horizontal : null,
],
[
'name' => 'app_favicon',
'value' => $request->hasFile('favicon') ? $favicon : null,
],
[
'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 ? $request->defaultStorage : 5,
],
[
'name' => 'latest_upgrade',
'value' => '1.7',
],
]);
// Store options
$settings->each(function ($col) {
Setting::updateOrCreate(['name' => $col['name']], $col);
});
return response('Done', 200);
}
}

View File

@@ -1,156 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Tools\Demo;
use App\Setting;
use Artisan;
use Stripe;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SettingController extends Controller
{
/**
* Get table content
*
* @param Request $request
* @return mixed
*/
public function show(Request $request)
{
$column = $request->get('column');
if (strpos($column, '|') !== false) {
$columns = explode('|', $column);
return Setting::whereIn('name', $columns)->pluck('value', 'name');
}
return Setting::where('name', $column)->pluck('value', 'name');
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
// Store image if exist
if ($request->hasFile($request->name)) {
// Store image
$image_path = store_system_image($request->file($request->name), 'system');
// Find and update image path
Setting::updateOrCreate(['name' => $request->name], [
'value' => $image_path
]);
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)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
setEnvironmentValue([
'MAIL_DRIVER' => $request->input('driver'),
'MAIL_HOST' => $request->input('host'),
'MAIL_PORT' => $request->input('port'),
'MAIL_USERNAME' => $request->input('username'),
'MAIL_PASSWORD' => $request->input('password'),
'MAIL_ENCRYPTION' => $request->input('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)
{
// Get stripe status
$is_stripe = get_setting('payments_configured');
// Check setup status
if ($is_stripe) abort(401, 'Gone');
// Create stripe instance
$stripe = Stripe::make($request->secret, '2020-03-02');
// Try to get stripe account details
try {
$stripe->account()->details();
} catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage());
}
// Get options
$settings = collect([
[
'name' => 'stripe_currency',
'value' => $request->currency,
],
[
'name' => 'payments_configured',
'value' => 1,
],
[
'name' => 'payments_active',
'value' => 1,
],
]);
// Store options
$settings->each(function ($col) {
Setting::updateOrCreate(['name' => $col['name']], $col);
});
// 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');
}
}

View File

@@ -1,410 +0,0 @@
<?php
namespace App\Http\Controllers\Sharing;
use App\Http\Controllers\Controller;
use App\Http\Requests\Share\AuthenticateShareRequest;
use App\Http\Resources\ShareResource;
use App\Http\Tools\Guardian;
use App\Setting;
use http\Env\Response;
use Illuminate\Contracts\View\Factory;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Collection;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\FileManagerFolder;
use App\FileManagerFile;
use App\User;
use App\Share;
use Illuminate\Support\Facades\Storage;
class FileSharingController extends Controller
{
/**
* Show page index and delete access_token & shared_token cookie
*
* @return Factory|\Illuminate\View\View
*/
public function index($token)
{
// Get shared token
$shared = Share::where(\DB::raw('BINARY `token`'), $token)
->first();
if (! $shared) {
return view("index");
}
// Delete old access_token if exist
Cookie::queue('shared_access_token', '', -1);
// Set cookies
if ((int) $shared->protected) {
// Set shared token
Cookie::queue('shared_token', $token, 43200);
}
// Check if shared is image file and then show it
if ($shared->type === 'file' && ! (int) $shared->protected) {
$image = FileManagerFile::where('user_id', $shared->user_id)
->where('type', 'image')
->where('unique_id', $shared->item_id)
->first();
if ($image) {
return $this->show_image($image);
}
}
// Get all settings
$settings = Setting::all();
// Return page index
return view("index")
->with('settings', $settings ? json_decode($settings->pluck('value', 'name')->toJson()) : null);
}
/**
* Get image from storage and show it
*
* @param $file
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
private function show_image($file)
{
// Format pretty filename
$file_pretty_name = $file->name . '.' . $file->mimetype;
// Get file path
$path = '/file-manager/' . $file->basename;
// Check if file exist
if (!Storage::exists($path)) abort(404);
$header = [
"Content-Type" => Storage::mimeType($path),
"Content-Length" => Storage::size($path),
"Accept-Ranges" => "bytes",
"Content-Range" => "bytes 0-600/" . Storage::size($path),
];
// Get file
return Storage::response($path, $file_pretty_name, $header);
}
/**
* Check Password for protected item
*
* @param AuthenticateShareRequest $request
* @param $token
* @return array
*/
public function authenticate(AuthenticateShareRequest $request, $token)
{
// Get sharing record
$shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail();
// Check password
if (!Hash::check($request->password, $shared->password)) {
abort(401, __('vuefilemanager.incorrect_password'));
}
// Get owner of shared content
$user = User::find($shared->user_id);
// Define scope
$scope = !is_null($shared->permission) ? $shared->permission : 'visitor';
// Generate token for visitor/editor
$access_token = $user->createToken('shared_access_token', [$scope])->accessToken;
// Return authorize token with shared options
return response(new ShareResource($shared), 200)
->cookie('shared_token', $shared->token, 43200)
->cookie('shared_access_token', $access_token, 43200);
}
/**
* Browse private folders
*
* @param Request $request
* @param $unique_id
* @return Collection
*/
public function get_private_folders(Request $request, $unique_id)
{
// Get sharing record
$shared = Share::where('token', $request->cookie('shared_token'))->firstOrFail();
// Check if user can get directory
Guardian::check_item_access($unique_id, $shared);
// Get files and folders
list($folders, $files) = $this->get_items($unique_id, $shared);
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
/**
* Browse public folders
*
* @param $unique_id
* @return Collection
*/
public function get_public_folders($unique_id, $token)
{
// Get sharing record
$shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail();
// Abort if folder is protected
if ((int) $shared->protected) {
abort(403, "Sorry, you don't have permission");
}
// Check if user can get directory
Guardian::check_item_access($unique_id, $shared);
// Get files and folders
list($folders, $files) = $this->get_items($unique_id, $shared);
// Set thumbnail links for public files
$files->map(function ($item) use ($token) {
$item->setPublicUrl($token);
});
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
/**
* Get shared public file record
*
* @param $token
* @return mixed
*/
public function file_public($token)
{
// Get sharing record
$shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail();
// Abort if file is protected
if ((int) $shared->protected) {
abort(403, "Sorry, you don't have permission");
}
// Get file
$file = FileManagerFile::where('user_id', $shared->user_id)
->where('unique_id', $shared->item_id)
->firstOrFail(['name', 'basename', 'thumbnail', 'type', 'filesize', 'mimetype']);
// Set urls
$file->setPublicUrl($token);
// Return record
return $file;
}
/**
* Get shared private file record
*
* @param $token
* @return mixed
*/
public function file_private(Request $request)
{
// Get sharing record
$shared = Share::where('token', $request->cookie('shared_token'))->firstOrFail();
// Return record
return FileManagerFile::where('user_id', $shared->user_id)
->where('unique_id', $shared->item_id)
->firstOrFail(['name', 'basename', 'thumbnail', 'type', 'filesize', 'mimetype']);
}
/**
* Get navigation tree
*
* @param Request $request
* @return array
*/
public function get_private_navigation_tree(Request $request)
{
// Get sharing record
$shared = get_shared($request->cookie('shared_token'));
// Check if user can get directory
Guardian::check_item_access($shared->item_id, $shared);
// Get folders
$folders = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
->where('parent_id', $shared->item_id)
->where('user_id', $shared->user_id)
->get(['id', 'parent_id', 'unique_id', 'name']);
// Return folder tree
return [
[
'unique_id' => $shared->item_id,
'name' => __('vuefilemanager.home'),
'location' => 'public',
'folders' => $folders,
]
];
}
/**
* Get navigation tree
*
* @return array
*/
public function get_public_navigation_tree($token)
{
// Get sharing record
$shared = Share::where('token', $token)->firstOrFail();
// Check if user can get directory
Guardian::check_item_access($shared->item_id, $shared);
// Get folders
$folders = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
->where('parent_id', $shared->item_id)
->where('user_id', $shared->user_id)
->get(['id', 'parent_id', 'unique_id', 'name']);
// Return folder tree
return [
[
'unique_id' => $shared->item_id,
'name' => __('vuefilemanager.home'),
'location' => 'public',
'folders' => $folders,
]
];
}
/**
* Search private files
*
* @param Request $request
* @param $token
* @return Collection
*/
public function search_private(Request $request)
{
// Get shared
$shared = get_shared($request->cookie('shared_token'));
// Search files id db
$searched_files = FileManagerFile::search($request->input('query'))
->where('user_id', $shared->user_id)
->get();
$searched_folders = FileManagerFolder::search($request->input('query'))
->where('user_id', $shared->user_id)
->get();
// Get all children content
$foldersIds = FileManagerFolder::with('folders:id,parent_id,unique_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 to only accessible files
$files = $searched_files->filter(function ($file) use ($accessible_folder_ids) {
return in_array($file->folder_id, $accessible_folder_ids);
});
// Filter folders to only accessible folders
$folders = $searched_folders->filter(function ($folder) use ($accessible_folder_ids) {
return in_array($folder->unique_id, $accessible_folder_ids);
});
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
/**
* Search public files
*
* @param Request $request
* @param $token
* @return Collection
*/
public function search_public(Request $request, $token)
{
// Get shared
$shared = get_shared($token);
// Abort if folder is protected
if ((int) $shared->protected) {
abort(403, "Sorry, you don't have permission");
}
// Search files id db
$searched_files = FileManagerFile::search($request->input('query'))
->where('user_id', $shared->user_id)
->get();
$searched_folders = FileManagerFolder::search($request->input('query'))
->where('user_id', $shared->user_id)
->get();
// Get all children content
$foldersIds = FileManagerFolder::with('folders:id,parent_id,unique_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, $token) {
// Set public urls
$file->setPublicUrl($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->unique_id, $accessible_folder_ids);
});
// Collect folders and files to single array
return collect([$folders, $files])->collapse();
}
/**
* Get folders and files
*
* @param $unique_id
* @param $shared
* @return array
*/
private function get_items($unique_id, $shared): array
{
$folders = FileManagerFolder::where('user_id', $shared->user_id)
->where('parent_id', $unique_id)
->get();
$files = FileManagerFile::where('user_id', $shared->user_id)
->where('folder_id', $unique_id)
->get();
return [$folders, $files];
}
}

View File

@@ -1,151 +0,0 @@
<?php
namespace App\Http\Controllers\User;
use App\FileManagerFile;
use App\FileManagerFolder;
use App\Http\Resources\InvoiceCollection;
use App\Http\Resources\StorageDetailResource;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserStorageResource;
use App\Http\Tools\Demo;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
use ByteUnits\Metric;
use App\User;
class AccountController extends Controller
{
/**
* 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 profile
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function update_profile(Request $request)
{
// Validate request
$validator = Validator::make($request->all(), [
'avatar' => 'file',
'name' => 'string',
'value' => 'string',
]);
// Return error
if ($validator->fails()) abort(400, 'Bad input');
// Get user
$user = Auth::user();
// Check if is demo
if (is_demo($user->id)) {
return Demo::response_204();
}
// Update data
if ($request->hasFile('avatar')) {
// Update avatar
$avatar = store_avatar($request->file('avatar'), 'avatars');
// Update data
$user->update(['avatar' => $avatar]);
} else {
// Update text data
$user->update(make_single_input($request));
}
return response('Saved!', 204);
}
/**
* Update user settings relationship
*
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function update_user_settings(Request $request)
{
// TODO: validation
// Get user
$user = Auth::user();
// Check if is demo
if (is_demo($user->id)) {
return Demo::response_204();
}
// Update text data
$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(Request $request)
{
// Validate request
$request->validate([
'password' => ['required', 'string', 'min:6', 'confirmed'],
]);
// Get user
$user = Auth::user();
if (is_demo($user->id)) {
return Demo::response_204();
}
// Change and store new password
$user->password = Hash::make($request->input('password'));
$user->save();
return response('Changed!', 204);
}
}

View File

@@ -1,172 +0,0 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\Payments\RegisterNewPaymentMethodRequest;
use App\Http\Resources\PaymentCardCollection;
use App\Http\Resources\PaymentCardResource;
use App\Http\Resources\PaymentDefaultCardResource;
use App\Http\Tools\Demo;
use App\Services\StripeService;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Laravel\Cashier\PaymentMethod;
class PaymentMethodsController extends Controller
{
/**
* PaymentMethodsController constructor.
*/
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* 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
if (is_demo($user->id)) {
return Demo::response_204();
}
// 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
if (is_demo($user->id)) {
return Demo::response_204();
}
// 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

@@ -1,154 +0,0 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\Subscription\StoreUpgradeAccountRequest;
use App\Http\Resources\UserSubscription;
use App\Http\Tools\Demo;
use App\Invoice;
use App\Services\StripeService;
use Auth;
use Cartalyst\Stripe\Exception\CardErrorException;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Laravel\Cashier\Exceptions\IncompletePayment;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SubscriptionController extends Controller
{
private $stripe;
/**
* SubscriptionController constructor.
* @param $payment
*/
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* Generate setup intent
*
* @return \Stripe\SetupIntent
*/
public function stripe_setup_intent()
{
$user = Auth::user();
return $this->stripe->getSetupIntent($user);
}
/**
* Get user subscription detail
*
* @return array
*/
public function show()
{
$user = Auth::user();
if (! $user->subscription('main')) {
return abort(204, 'User don\'t have any subscription');
}
$slug_user_subscription = 'subscription-user-' . $user->id;
if (Cache::has($slug_user_subscription)) {
return Cache::get($slug_user_subscription);
}
return Cache::rememberForever($slug_user_subscription, function () {
return new UserSubscription(
Auth::user()
);
});
}
/**
* Upgrade account to subscription
*
* @param StoreUpgradeAccountRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function upgrade(StoreUpgradeAccountRequest $request)
{
// Get user
$user = Auth::user();
// Check if is demo
if (is_demo($user->id)) {
return 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|\Illuminate\Http\Response
*/
public function cancel()
{
$user = Auth::user();
// Check if is demo
if (is_demo($user->id)) {
return 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|\Illuminate\Http\Response
*/
public function resume()
{
$user = Auth::user();
// Check if is demo
if (is_demo($user->id)) {
return Demo::response_204();
}
// Resume subscription
$user->subscription('main')->resume();
// Forget user subscription
Cache::forget('subscription-user-' . $user->id);
return response('Done!', 204);
}
}

View File

@@ -1,68 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Services\StripeService;
use App\Setting;
use App\User;
use Illuminate\Http\Request;
use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;
class WebhookController extends CashierController
{
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
}
/**
* 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::where('stripe_id', $payload['data']['object']['customer'])->firstOrFail();
// Get default storage capacity
$default_storage = Setting::where('name', 'storage_default')->first();
// Update storage capacity
$user->settings()->update(['storage_capacity' => $default_storage->value]);
return $this->successMethod();
}
/**
* Handle Invoice Payment Succeeded
*
* @param $payload
* @return \Symfony\Component\HttpFoundation\Response
*/
public function handleInvoicePaymentSucceeded($payload)
{
// Get user
$user = User::where('stripe_id', $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

@@ -1,531 +0,0 @@
<?php
use App\FileManagerFile;
use App\FileManagerFolder;
use App\Setting;
use App\Share;
use ByteUnits\Metric;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image;
/**
* Obfuscate email
*
* @param $email
* @return string
*/
function obfuscate_email($email)
{
$em = explode("@", $email);
$name = implode('@', array_slice($em, 0, count($em) - 1));
$len = floor(strlen($name) / 2);
return substr($name, 0, $len) . str_repeat('*', $len) . "@" . end($em);
}
/**
* Get single value from settings table
*
* @param $setting
* @return |null
*/
function get_setting($setting)
{
$row = Setting::where('name', $setting)->first();
return $row ? $row->value : null;
}
/**
* Create paragraph from text
*
* @param $str
* @return mixed|null|string|string[]
*/
function add_paragraphs($str)
{
// Trim whitespace
if (($str = trim($str)) === '') return '';
// Standardize newlines
$str = str_replace(array("\r\n", "\r"), "\n", $str);
// Trim whitespace on each line
$str = preg_replace('~^[ \t]+~m', '', $str);
$str = preg_replace('~[ \t]+$~m', '', $str);
// The following regexes only need to be executed if the string contains html
if ($html_found = (strpos($str, '<') !== FALSE)) {
// Elements that should not be surrounded by p tags
$no_p = '(?:p|div|article|header|aside|hgroup|canvas|output|progress|section|figcaption|audio|video|nav|figure|footer|video|details|main|menu|summary|h[1-6r]|ul|ol|li|blockquote|d[dlt]|pre|t[dhr]|t(?:able|body|foot|head)|c(?:aption|olgroup)|form|s(?:elect|tyle)|a(?:ddress|rea)|ma(?:p|th))';
// Put at least two linebreaks before and after $no_p elements
$str = preg_replace('~^<' . $no_p . '[^>]*+>~im', "\n$0", $str);
$str = preg_replace('~</' . $no_p . '\s*+>$~im', "$0\n", $str);
}
// Do the <p> magic!
$str = '<p>' . trim($str) . '</p>';
$str = preg_replace('~\n{2,}~', "</p>\n\n<p>", $str);
// The following regexes only need to be executed if the string contains html
if ($html_found !== FALSE) {
// Remove p tags around $no_p elements
$str = preg_replace('~<p>(?=</?' . $no_p . '[^>]*+>)~i', '', $str);
$str = preg_replace('~(</?' . $no_p . '[^>]*+>)</p>~i', '$1', $str);
}
// Convert single linebreaks to <br />
$str = preg_replace('~(?<!\n)\n(?!\n)~', "<br>\n", $str);
return $str;
}
/**
* Set environment value
*
* @param $key
* @param $value
* @return bool
*/
function setEnvironmentValue(array $values)
{
$envFile = app()->environmentFilePath();
$str = file_get_contents($envFile);
if (count($values) > 0) {
foreach ($values as $envKey => $envValue) {
$str .= "\n"; // In case the searched variable is in the last line without \n
$keyPosition = strpos($str, "{$envKey}=");
$endOfLinePosition = strpos($str, "\n", $keyPosition);
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
// If key does not exist, add it
$str = str_replace($oldLine, "{$envKey}={$envValue}", $str);
}
}
$str = substr($str, 0, -1);
if (!file_put_contents($envFile, $str)) return false;
return true;
}
/**
* Get invoice number
*
* @return string
*/
function get_invoice_number()
{
$invoices = \App\Invoice::all();
if ($invoices->isEmpty()) {
return Carbon::now()->year . '001';
} else {
return (int)$invoices->last()->order + 1;
}
}
/**
* Forget many cache keys at once
* @param $cache
*/
function cache_forget_many($cache)
{
foreach ($cache as $item) {
\Illuminate\Support\Facades\Cache::forget($item);
}
}
/**
* Get app version from config
*
* @return \Illuminate\Config\Repository|mixed
*/
function get_storage()
{
return env('FILESYSTEM_DRIVER');
}
/**
* Check if is running AWS s3 as storage
*
* @return bool
*/
function is_storage_driver($driver)
{
if (is_array($driver)) {
return in_array(config('filesystems.default'), $driver);
}
return config('filesystems.default') === $driver;
}
/**
* Get app version from config
*
* @return \Illuminate\Config\Repository|mixed
*/
function get_version()
{
return config('vuefilemanager.version');
}
/**
* Check if is demo
*
* @return mixed
*/
function is_demo($user_id)
{
return env('APP_DEMO', false) && $user_id === 1;
}
/**
* Get folder or file item
*
* @param $type
* @param $unique_id
* @param $user_id
* @return \Illuminate\Database\Eloquent\Builder|Model
*/
function get_item($type, $unique_id, $user_id)
{
if ($type === 'folder') {
// Return folder item
return FileManagerFolder::where('unique_id', $unique_id)
->where('user_id', $user_id)
->firstOrFail();
}
// Return file item
return FileManagerFile::where('unique_id', $unique_id)
->where('user_id', $user_id)
->firstOrFail();
}
/**
* Get shared token
*
* @param $token
* @return \Illuminate\Database\Eloquent\Builder|Model
*/
function get_shared($token)
{
return Share::where(DB::raw('BINARY `token`'), $token)
->firstOrFail();
}
/**
* Check if shared permission is editor
*
* @param $shared
* @return bool
*/
function is_editor($shared)
{
return $shared->permission === 'editor';
}
/**
* Get unique id
*
* @return int
*/
function get_unique_id(): int
{
// Get files and folders
$folders = FileManagerFolder::withTrashed()->get();
$files = FileManagerFile::withTrashed()->get();
// Get last ids
$folders_unique = $folders->isEmpty() ? 0 : $folders->last()->unique_id;
$files_unique = $files->isEmpty() ? 0 : $files->last()->unique_id;
// Count new unique id
$unique_id = $folders_unique > $files_unique ? $folders_unique + 1 : $files_unique + 1;
return $unique_id;
}
/**
* Store user avatar to storage
*
* @param $image
* @param $path
* @return string
*/
function store_avatar($image, $path)
{
// Get directory
$path = check_directory($path);
// Store avatar
$image_path = Str::random(8) . '-' . $image->getClientOriginalName();
// Create intervention image
$img = Image::make($image->getRealPath());
// Generate thumbnail
$img->fit('150', '150')->stream();
// Store thumbnail to disk
Storage::put($path . '/' . $image_path, $img);
// Return path to image
return $path . '/' . $image_path;
}
/**
* Store system image
*
* @param $image
* @param $path
* @return string
*/
function store_system_image($image, $path)
{
// Get directory
$path = check_directory($path);
// Store avatar
$image_path = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName());
// Store image to disk
Storage::putFileAs($path, $image, $image_path);
// Return path to image
return $path . '/' . $image_path;
}
/**
* Check if directory exist, if no, then create it
*
* @param $directory
* @return mixed
*/
function check_directory($directory)
{
if (!Storage::exists($directory)) {
Storage::makeDirectory($directory);
}
return $directory;
}
/**
* Make input from request
*
* @param $request
* @return array
*/
function make_single_input($request)
{
// Create container
$data = [];
// Add data to array
$data[$request->name] = $request->value;
// Return input
return $data;
}
/**
* Format integer to gigabytes
*
* @param $gigabytes
* @return string
*/
function format_gigabytes($gigabytes)
{
if ($gigabytes >= 1000) {
return Metric::gigabytes($gigabytes)->format('Tb/');
} else {
return Metric::gigabytes($gigabytes)->format('GB/');
}
}
/**
* Convert megabytes to bytes
*
* @param $megabytes
* @return int|string
*/
function format_bytes($megabytes)
{
return Metric::megabytes($megabytes)->numberOfBytes();
}
/**
* Get storage usage in percent
*
* @param $used
* @param $capacity
* @return string
*/
function get_storage_fill_percentage($used, $capacity)
{
// Format gigabytes to bytes
$total = intval(Metric::gigabytes($capacity)->numberOfBytes());
// Count progress
$progress = ($used * 100) / $total;
// Return in 2 decimal
return number_format((float)$progress, 2, '.', '');
}
/**
* Get user capacity fill by percentage
*
* @return string
*/
function user_storage_percentage($id, $additionals = null)
{
$user = \App\User::findOrFail($id);
$used = $user->used_capacity;
if ($additionals) {
$used = $user->used_capacity + $additionals;
}
return get_storage_fill_percentage($used, $user->settings->storage_capacity);
}
/**
* Find all key values in recursive array
*
* @param array $array
* @param $needle
* @return array
*/
function recursiveFind(array $array, $needle)
{
$iterator = new RecursiveArrayIterator($array);
$recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
$aHitList = array();
foreach ($recursive as $key => $value) {
if ($key === $needle) {
array_push($aHitList, $value);
}
}
return $aHitList;
}
/**
* Get values which appears only once in array
* @param $arr
* @return array
*/
function appeared_once($arr)
{
$array_count_values = array_count_values($arr);
$single_time_comming_values_array = [];
foreach ($array_count_values as $key => $val) {
if ($val == 1) {
$single_time_comming_values_array[] = $key;
}
}
return $single_time_comming_values_array;
}
/**
* @param $folders
* @return array
*/
function filter_folders_ids($folders, $by_column = 'unique_id')
{
$folder_unique_ids = recursiveFind($folders->toArray(), $by_column);
return appeared_once($folder_unique_ids);
}
/**
* Format localized date
*
* @param $date
* @param string $format
* @return string
*/
function format_date($date, $format = '%d. %B. %Y, %H:%M')
{
$start = Carbon::parse($date);
return $start->formatLocalized($format);
}
/**
* Get file type from mimetype
*
* @param $file
* @return string
*/
function get_file_type($file_mimetype)
{
// Get mimetype from file
$mimetype = explode('/', $file_mimetype);
switch ($mimetype[0]) {
case 'image':
return 'image';
break;
case 'video':
return 'video';
break;
case 'audio':
return 'audio';
break;
default:
return 'file';
}
}
/**
* Get file type from mimetype
*
* @param $mimetype
* @return mixed
*/
function get_file_type_from_mimetype($mimetype)
{
return explode('/', $mimetype)[1];
}
/**
* Format pretty name file
*
* @param $basename
* @param $name
* @param $mimetype
* @return string
*/
function get_pretty_name($basename, $name, $mimetype)
{
$file_extension = substr(strrchr($basename, '.'), 1);
if (strpos($name, $file_extension) !== false) {
return $name;
}
if ($file_extension) {
return $name . '.' . $file_extension;
}
return $name . '.' . $mimetype;
}

View File

@@ -1,23 +0,0 @@
<?php
/**
* Check if current user subscribed plan is highest
*
* @param $id
* @param $subscribed_capacity
* @return int
*/
function is_highest_plan($plan)
{
$plans = app('rinvex.subscriptions.plan')->all();
$unsubscribed = $plans->filter(function ($item) use ($plan) {
return $item->id !== $plan->id;
});
$capacities = $unsubscribed->map(function ($item) {
return $item->features->first()->value;
});
return max(Arr::flatten($capacities)) < $plan->features->first()->value ? 1 : 0;
}

View File

@@ -1,95 +0,0 @@
<?php
namespace App\Http;
use App\Http\Middleware\AdminCheck;
use App\Http\Middleware\CookieAuth;
use App\Http\Middleware\LastCheck;
use App\Http\Middleware\SharedAuth;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
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\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\Fruitcake\Cors\HandleCors::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' => [
\App\Http\Middleware\EncryptCookies::class,
//'throttle:60,1',
\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.master' => CookieAuth::class,
'auth.shared' => SharedAuth::class,
'auth.admin' => AdminCheck::class,
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::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,
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
];
/**
* The priority-sorted list of middleware.
*
* This forces non-global middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
CookieAuth::class,
SharedAuth::class,
\App\Http\Middleware\Authenticate::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
}

View File

@@ -1,40 +0,0 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SendSupportForm extends Mailable
{
use Queueable, SerializesModels;
private $request;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($request)
{
$this->request = $request;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$from = config('mail.from')['address'];
return $this->from($from)
->replyTo($this->request['email'])
->subject('New Contact Message from ' . $this->request['email'])
->view('mails.contact-message')
->with('request', $this->request);
}
}

View File

@@ -1,30 +0,0 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class CookieAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->bearerToken()) {
if ($request->hasCookie('access_token')) {
$access_token = $request->cookie('access_token');
$request->headers->add(['Authorization' => 'Bearer ' . $access_token]);
}
}
return $next($request);
}
}

View File

@@ -1,27 +0,0 @@
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
return $next($request);
}
}

View File

@@ -1,29 +0,0 @@
<?php
namespace App\Http\Middleware;
use Closure;
class SharedAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->bearerToken()) {
if ($request->hasCookie('shared_access_token')) {
$shared_access_token = $request->cookie('shared_access_token');
$request->headers->add(['Authorization' => 'Bearer ' . $shared_access_token]);
}
}
return $next($request);
}
}

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Middleware;
use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;
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,68 +0,0 @@
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Laravel\Cashier\Payment;
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,37 +0,0 @@
<?php
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;
class StoreStripeBillingRequest 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 [
'billing_phone_number' => 'sometimes|nullable|string',
'billing_postal_code' => 'required|string',
'billing_vat_number' => 'required|string',
'billing_address' => 'required|string',
'billing_country' => 'required|string',
'billing_state' => 'required|string',
'billing_city' => 'required|string',
'billing_name' => 'required|string',
];
}
}

View File

@@ -1,33 +0,0 @@
<?php
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;
class StoreStripeCredentialsRequest 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 [
'currency' => 'required|string',
'webhookSecret' => 'required|string',
'secret' => 'required|string',
'key' => 'required|string',
];
}
}

View File

@@ -1,35 +0,0 @@
<?php
namespace App\Http\Requests\SetupWizard;
use Illuminate\Foundation\Http\FormRequest;
class StoreStripePlansRequest 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 [
'plans' => 'required|array',
'plans.*.type' => 'required|string',
'plans.*.attributes.name' => 'required|string',
'plans.*.attributes.price' => 'required|string',
'plans.*.attributes.description' => 'sometimes|nullable|string',
'plans.*.attributes.capacity' => 'required|digits_between:1,9',
];
}
}

View File

@@ -1,56 +0,0 @@
<?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' => 'required|string',
'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,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class GatewayCollection extends ResourceCollection
{
public $collects = GatewayResource::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

@@ -1,36 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class GatewayResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => (string)$this->id,
'type' => 'gateways',
'attributes' => [
'status' => $this->status,
'sandbox' => $this->sandbox,
'name' => $this->name,
'slug' => $this->slug,
'logo' => $this->logo,
'client_id' => $this->client_id,
'secret' => $this->secret,
'webhook' => $this->webhook,
'payment_processed' => $this->payment_processed,
'optional' => $this->optional,
]
]
];
}
}

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class InvoiceAdminCollection extends ResourceCollection
{
public $collects = InvoiceAdminResource::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

@@ -1,65 +0,0 @@
<?php
namespace App\Http\Resources;
use App\User;
use Illuminate\Http\Resources\Json\JsonResource;
use Laravel\Cashier\Cashier;
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 ? $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' => (string)$user->id,
'type' => 'user',
'attributes' => [
'name' => $user->name,
'avatar' => $user->avatar,
]
]
]
]
];
}),
];
}
}

View File

@@ -1,80 +0,0 @@
<?php
namespace App\Http\Resources;
use App\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::where('stripe_id', $this->customer)->first();
$invoice_items = [];
$invoice_subscriptions = [];
// Format bag
foreach ($this->invoiceItems() as $item) {
array_push($invoice_items, [
'amount' => $item->total(),
'description' => $item->description,
'currency' => $item->currency,
'type' => $item->type,
]);
}
// Format bag
foreach ($this->subscriptions() as $item) {
array_push($invoice_subscriptions, [
'amount' => $item->total(),
'description' => $item->description,
'currency' => $item->currency,
'type' => $item->type,
]);
}
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 ? $user->id : null,
'client' => [
'billing_address' => $this->customer_address,
'billing_name' => $this->customer_name,
'billing_phone_number' => $this->customer_phone,
],
'seller' => null,
'invoice_items' => $invoice_items,
'invoice_subscriptions' => $invoice_subscriptions,
]
],
$this->mergeWhen($user, [
'relationships' => [
'user' => [
'data' => [
'id' => (string)$user->id,
'type' => 'user',
'attributes' => [
'name' => $user->name,
'avatar' => $user->avatar,
]
]
]
]
]),
];
}
}

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PageCollection extends ResourceCollection
{
public $collects = PageResource::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

@@ -1,31 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class PageResource 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' => 'pages',
'attributes' => [
'visibility' => $this->visibility,
'title' => $this->title,
'slug' => $this->slug,
'content' => $this->content,
'content_formatted' => add_paragraphs($this->content),
]
],
];
}
}

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PaymentCardCollection extends ResourceCollection
{
public $collects = PaymentCardResource::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

@@ -1,35 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class PaymentCardResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => (string)$this['id'],
'type' => 'payment_method',
'attributes' => [
'provider' => 'stripe',
'card_id' => $this['id'],
'brand' => strtolower($this['card']['brand']),
'last4' => $this['card']['last4'],
'exp_month' => $this['card']['exp_month'],
'exp_year' => $this['card']['exp_year'],
'created_at' => format_date($this['created_at'], '%d. %B. %Y'),
'status' => 'active',
'default' => 0,
]
]
];
}
}

View File

@@ -1,35 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class PaymentDefaultCardResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => (string)$this['id'],
'type' => 'payment_method',
'attributes' => [
'provider' => 'stripe',
'card_id' => $this['id'],
'brand' => isset($this['brand']) ? strtolower($this['brand']) : strtolower($this['card']['brand']),
'last4' => isset($this['last4']) ? $this['last4'] : $this['card']['last4'],
'exp_month' => isset($this['exp_month']) ? $this['exp_month'] : $this['card']['exp_month'],
'exp_year' => isset($this['exp_year']) ? $this['exp_year'] : $this['card']['exp_year'],
'created_at' => format_date($this['created_at'], '%d. %B. %Y'),
'status' => 'active',
'default' => 0,
]
]
];
}
}

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PlanCollection extends ResourceCollection
{
public $collects = PlanResource::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

@@ -1,41 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use Laravel\Cashier\Cashier;
use Laravel\Cashier\Subscription;
class PlanResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
// Get subscribers
$subscriber_count = Subscription::where('stripe_plan', $this['plan']['id'])->where('stripe_status', 'active')->get();
return [
'data' => [
'id' => $this['plan']['id'],
'type' => 'plans',
'attributes' => [
'subscribers' => $subscriber_count->count(),
'status' => $this['plan']['active'] ? 1 : 0,
'name' => $this['product']['name'],
'description' => $this['product']['description'],
'price' => $this['plan']['amount'],
'price_formatted' => Cashier::formatAmount($this['plan']['amount']),
'capacity_formatted' => format_gigabytes($this['product']['metadata']['capacity']),
'capacity' => (int) $this['product']['metadata']['capacity'],
'created_at_formatted' => format_date($this['plan']['created']),
'created_at' => $this['plan']['created'],
]
]
];
}
}

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PricingCollection extends ResourceCollection
{
public $collects = PricingResource::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

@@ -1,68 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use Laravel\Cashier\Cashier;
class PricingResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => $this['plan']['id'],
'type' => 'plans',
'attributes' => [
'name' => $this['product']['name'],
'description' => $this['product']['description'],
'price' => Cashier::formatAmount($this['plan']['amount']),
'capacity_formatted' => format_gigabytes($this['product']['metadata']['capacity']),
'capacity' => (int)$this['product']['metadata']['capacity'],
'currency' => config('cashier.currency'),
'tax_rates' => $this->get_tax_rates(),
]
]
];
}
/**
* Get plan tax rates
*
* @return array
*/
private function get_tax_rates(): array
{
$stripe = resolve('App\Services\StripeService');
$rates_puplic = [];
// Get tax rates
$rates = $stripe->getTaxRates();
foreach ($rates as $rate) {
// Continue when is not active
if (!$rate['active']) continue;
// Calculate tax
$tax = $this['plan']['amount'] * ($rate['percentage'] / 100);
array_push($rates_puplic, [
'id' => $rate['id'],
'active' => $rate['active'],
'jurisdiction' => $rate['jurisdiction'],
'percentage' => $rate['percentage'],
'plan_price_formatted' => Cashier::formatAmount(round($this['plan']['amount'] + $tax)),
]);
}
return $rates_puplic;
}
}

View File

@@ -1,83 +0,0 @@
<?php
namespace App\Http\Resources;
use App\Services\StripeService;
use App\User;
use Cartalyst\Stripe\Api\PaymentMethods;
use Faker\Factory;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => (string)$this->id,
'type' => 'user',
'attributes' => [
'storage_capacity' => $this->settings->storage_capacity,
'subscription' => $this->subscribed('main'),
'incomplete_payment' => $this->hasIncompletePayment('main') ? route('cashier.payment', $this->subscription('main')->latestPayment()->id) : null,
'stripe_customer' => is_null($this->stripe_id) ? false : true,
'name' => $this->name,
'email' => env('APP_DEMO') ? obfuscate_email($this->email) : $this->email,
'avatar' => $this->avatar,
'role' => $this->role,
'created_at_formatted' => format_date($this->created_at, '%d. %B. %Y'),
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
]
],
'relationships' => [
'settings' => [
'data' => [
'id' => (string)$this->settings->id,
'type' => 'settings',
'attributes' => [
'billing_name' => $this->settings->billing_name,
'billing_address' => $this->settings->billing_address,
'billing_state' => $this->settings->billing_state,
'billing_city' => $this->settings->billing_city,
'billing_postal_code' => $this->settings->billing_postal_code,
'billing_country' => $this->settings->billing_country,
'billing_phone_number' => $this->settings->billing_phone_number,
]
]
],
'storage' => [
'data' => [
'id' => '1',
'type' => 'storage',
'attributes' => $this->storage
]
],
'favourites' => [
'data' => [
'id' => '1',
'type' => 'folders_favourite',
'attributes' => [
'folders' => $this->favourite_folders->makeHidden(['pivot'])
],
],
],
'tree' => [
'data' => [
'id' => '1',
'type' => 'folders_tree',
'attributes' => [
'folders' => $this->folder_tree
],
],
]
]
];
}
}

View File

@@ -1,89 +0,0 @@
<?php
namespace App\Http\Resources;
use App\FileManagerFile;
use ByteUnits\Metric;
use Illuminate\Http\Resources\Json\JsonResource;
class UserStorageResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$document_mimetypes = [
'pdf', 'numbers', 'xlsx', 'xls', 'txt', 'md', 'rtf', 'pptx', 'ppt', 'odt', 'ods', 'odp', 'epub', 'docx', 'doc', 'csv', 'pages'
];
// Get all images
$images = FileManagerFile::where('user_id', $this->id)
->where('type', 'image')->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all audios
$audios = FileManagerFile::where('user_id', $this->id)
->where('type', 'audio')->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all videos
$videos = FileManagerFile::where('user_id', $this->id)
->where('type', 'video')->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all documents
$documents = FileManagerFile::where('user_id', $this->id)
->whereIn('mimetype', $document_mimetypes)->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all other files
$others = FileManagerFile::where('user_id', $this->id)
->whereNotIn('mimetype', $document_mimetypes)
->whereNotIn('type', ['audio', 'video', 'image'])
->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
return [
'data' => [
'id' => (string)$this->id,
'type' => 'storage',
'attributes' => [
'used' => Metric::bytes($this->used_capacity)->format(),
'capacity' => format_gigabytes($this->settings->storage_capacity),
'percentage' => (float)get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity),
],
'meta' => [
'images' => [
'used' => Metric::bytes($images)->format(),
'percentage' => (float)get_storage_fill_percentage($images, $this->settings->storage_capacity),
],
'audios' => [
'used' => Metric::bytes($audios)->format(),
'percentage' => (float)get_storage_fill_percentage($audios, $this->settings->storage_capacity),
],
'videos' => [
'used' => Metric::bytes($videos)->format(),
'percentage' => (float)get_storage_fill_percentage($videos, $this->settings->storage_capacity),
],
'documents' => [
'used' => Metric::bytes($documents)->format(),
'percentage' => (float)get_storage_fill_percentage($documents, $this->settings->storage_capacity),
],
'others' => [
'used' => Metric::bytes($others)->format(),
'percentage' => (float)get_storage_fill_percentage($others, $this->settings->storage_capacity),
],
]
]
];
}
}

View File

@@ -1,48 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserSubscription extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$stripe = resolve('App\Services\StripeService');
$active_subscription = $this->subscription('main')->asStripeSubscription();
// Get subscription details
$subscription = $stripe->getPlan($this->subscription('main')->stripe_plan);
// Retrieve the timestamp from Stripe
$current_period_end = $active_subscription["current_period_end"];
$current_period_start = $active_subscription["current_period_start"];
$canceled_at = $active_subscription["canceled_at"];
return [
'data' => [
'id' => $subscription['plan']['id'],
'type' => 'subscription',
'attributes' => [
'incomplete' => $this->subscription('main')->incomplete(),
'active' => $this->subscription('main')->active(),
'canceled' => $this->subscription('main')->cancelled(),
'name' => $subscription['product']['name'],
'capacity' => (int)$subscription['product']['metadata']['capacity'],
'capacity_formatted' => format_gigabytes($subscription['product']['metadata']['capacity']),
'slug' => $subscription['plan']['id'],
'canceled_at' => format_date($canceled_at, '%d. %B. %Y'),
'created_at' => format_date($current_period_start, '%d. %B. %Y'),
'ends_at' => format_date($current_period_end, '%d. %B. %Y'),
]
]
];
}
}

View File

@@ -1,143 +0,0 @@
<?php
namespace App\Http\Tools;
use App;
use App\Share;
use App\FileManagerFile;
use App\FileManagerFolder;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\User;
use ByteUnits\Metric;
use Carbon\Carbon;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image;
class Demo
{
/**
* Create new directory
*
* @param $request
* @return array
* @throws \Exception
*/
public static function create_folder($request)
{
// Get variables
$user_scope = $request->user() ? $request->user()->token()->scopes[0] : 'editor';
$name = $request->has('name') ? $request->input('name') : 'New Folder';
return [
'user_id' => 1,
'id' => random_int(1000, 9999),
'parent_id' => random_int(1000, 9999),
'name' => $name,
'type' => 'folder',
'unique_id' => random_int(1000, 9999),
'user_scope' => $user_scope,
'items' => '0',
'updated_at' => Carbon::now()->format('j M Y \a\t H:i'),
'created_at' => Carbon::now()->format('j M Y \a\t H:i'),
];
}
/**
* Rename item name
*
* @param RenameItemRequest $request
* @param $unique_id
* @return mixed
*/
public static function rename_item($request, $unique_id)
{
// Get item
if ($request->type === 'folder') {
$item = FileManagerFolder::where('unique_id', $unique_id)
->where('user_id', 1)
->first();
} else {
$item = FileManagerFile::where('unique_id', $unique_id)
->where('user_id', 1)
->first();
}
if ($item) {
$item->name = $request->name;
return $item;
} else {
return [
'unique_id' => $request->unique_id,
'name' => $request->name,
'type' => $request->type,
];
}
}
/**
* Upload file
*
* @param $request
* @return array
* @throws \Exception
*/
public static function upload($request)
{
// Get user data
$user_scope = $request->user() ? $request->user()->token()->scopes[0] : 'editor';
// File
$file = $request->file('file');
$filename = Str::random() . '-' . str_replace(' ', '', $file->getClientOriginalName());
$thumbnail = null;
$filesize = $file->getSize();
$filetype = get_file_type($file->getMimeType());
return [
'id' => random_int(1000, 9999),
'unique_id' => random_int(1000, 9999),
'folder_id' => $request->parent_id,
'thumbnail' => 'data:' . $request->file('file')->getMimeType() . ';base64, ' . base64_encode(file_get_contents($request->file('file'))),
'name' => $file->getClientOriginalName(),
'basename' => $filename,
'mimetype' => $file->getClientOriginalExtension(),
'filesize' => Metric::bytes($filesize)->format(),
'type' => $filetype,
'file_url' => 'https://vuefilemanager.hi5ve.digital/assets/vue-file-manager-preview.jpg',
'user_scope' => $user_scope,
'created_at' => Carbon::now()->format('j M Y \a\t H:i'),
'updated_at' => Carbon::now()->format('j M Y \a\t H:i'),
];
}
/**
* Return 204 status
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public static function response_204() {
return response('Done!', 204);
}
/**
* Return 204 status
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public static function favourites($user) {
return $user->favourite_folders->makeHidden(['pivot']);
}
}

View File

@@ -1,487 +0,0 @@
<?php
namespace App\Http\Tools;
use App;
use App\Share;
use App\FileManagerFile;
use App\FileManagerFolder;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\User;
use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image;
use Symfony\Component\HttpKernel\Exception\HttpException;
class Editor
{
/**
* Create new directory
*
* @param $request
* @param null $shared
* @return FileManagerFolder|\Illuminate\Database\Eloquent\Model
*/
public static function create_folder($request, $shared = null)
{
// Get variables
$user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor';
$name = $request->has('name') ? $request->input('name') : 'New Folder';
$user_id = is_null($shared) ? Auth::id() : $shared->user_id;
$unique_id = get_unique_id();
// Create folder
$folder = FileManagerFolder::create([
'parent_id' => $request->parent_id,
'unique_id' => $unique_id,
'user_scope' => $user_scope,
'user_id' => $user_id,
'type' => 'folder',
'name' => $name,
]);
// Return new folder
return $folder;
}
/**
* Rename item name
*
* @param RenameItemRequest $request
* @param $unique_id
* @param null $shared
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
* @throws \Exception
*/
public static function rename_item($request, $unique_id, $shared = null)
{
// Get user id
$user_id = is_null($shared) ? Auth::id() : $shared->user_id;
// Get item
$item = get_item($request->type, $unique_id, $user_id);
// Rename item
$item->update([
'name' => $request->name
]);
// Return updated item
return $item;
}
/**
* Delete file or folder
*
* @param $request
* @param $unique_id
* @param null $shared
* @throws \Exception
*/
public static function delete_item($request, $unique_id, $shared = null)
{
// Get user id
$user = is_null($shared) ? Auth::user() : User::findOrFail($shared->user_id);
// Delete folder
if ($request->input('data.type') === 'folder') {
// Get folder
$folder = FileManagerFolder::withTrashed()
->with(['folders'])
->where('user_id', $user->id)
->where('unique_id', $unique_id)
->first();
// Get folder shared record
$shared = Share::where('user_id', $user->id)
->where('type', '=', 'folder')
->where('item_id', $unique_id)
->first();
// Delete folder shared record
if ($shared) {
$shared->delete();
}
// Force delete children files
if ($request->input('data.force_delete')) {
// Get children folder ids
$child_folders = filter_folders_ids($folder->trashed_folders, 'unique_id');
// Get children files
$files = FileManagerFile::onlyTrashed()
->where('user_id', $user->id)
->whereIn('folder_id', Arr::flatten([$unique_id, $child_folders]))
->get();
// Remove all children files
foreach ($files as $file) {
// Delete file
Storage::delete('/file-manager/' . $file->basename);
// Delete thumbnail if exist
if (!is_null($file->thumbnail)) Storage::delete('/file-manager/' . $file->getRawOriginal('thumbnail'));
// Delete file permanently
$file->forceDelete();
}
// Delete folder record
$folder->forceDelete();
}
// Soft delete items
if (!$request->input('data.force_delete')) {
// Remove folder from user favourites
$user->favourite_folders()->detach($unique_id);
// Soft delete folder record
$folder->delete();
}
}
// Delete item
if ($request->input('data.type') !== 'folder') {
// Get file
$file = FileManagerFile::withTrashed()
->where('user_id', $user->id)
->where('unique_id', $unique_id)
->first();
// Get folder shared record
$shared = Share::where('user_id', $user->id)
->where('type', '=', 'file')
->where('item_id', $unique_id)
->first();
// Delete file shared record
if ($shared) {
$shared->delete();
}
// Force delete file
if ($request->input('data.force_delete')) {
// Delete file
Storage::delete('/file-manager/' . $file->basename);
// Delete thumbnail if exist
if ($file->thumbnail) Storage::delete('/file-manager/' . $file->getRawOriginal('thumbnail'));
// Delete file permanently
$file->forceDelete();
}
// Soft delete file
if (!$request->input('data.force_delete')) {
// Soft delete file
$file->delete();
}
}
}
/**
* Move folder or file to new location
*
* @param $request
* @param $unique_id
* @param null $shared
*/
public static function move($request, $unique_id, $shared = null)
{
// Get user id
$user_id = is_null($shared) ? Auth::id() : $shared->user_id;
if ($request->from_type === 'folder') {
// Move folder
$item = FileManagerFolder::where('user_id', $user_id)
->where('unique_id', $unique_id)
->firstOrFail();
$item->update([
'parent_id' => $request->to_unique_id
]);
} else {
// Move file under new folder
$item = FileManagerFile::where('user_id', $user_id)
->where('unique_id', $unique_id)
->firstOrFail();
$item->update([
'folder_id' => $request->to_unique_id
]);
}
}
/**
* Upload file
*
* @param $request
* @param null $shared
* @return FileManagerFile|\Illuminate\Database\Eloquent\Model
* @throws \Exception
*/
public static function upload($request, $shared = null)
{
// Get parent_id from request
$file = $request->file('file');
// Check or create directories
self::check_directories(['chunks', 'file-manager']);
// File name
$user_file_name = basename('chunks/' . substr($file->getClientOriginalName(), 17), '.part');
$disk_file_name = basename('chunks/' . $file->getClientOriginalName(), '.part');
$temp_filename = $file->getClientOriginalName();
// Generate file
File::append(config('filesystems.disks.local.root') . '/chunks/' . $temp_filename, $file->get());
// If last then process file
if ($request->boolean('is_last')) {
$disk_local = Storage::disk('local');
$unique_id = get_unique_id();
// Get user data
$user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor';
$user_id = is_null($shared) ? Auth::id() : $shared->user_id;
// File Info
$file_size = $disk_local->size('chunks/' . $temp_filename);
$file_mimetype = $disk_local->mimeType('chunks/' . $temp_filename);
// Check if user has enough space to upload file
self::check_user_storage_capacity($user_id, $file_size, $temp_filename);
// Create thumbnail
$thumbnail = self::get_image_thumbnail('chunks/' . $temp_filename, $disk_file_name);
// Move finished file from chunk to file-manager directory
$disk_local->move('chunks/' . $temp_filename, 'file-manager/' . $disk_file_name);
// Move files to external storage
if (!is_storage_driver(['local'])) {
// Clear failed uploads if exists
self::clear_failed_files();
// Move file to external storage service
self::move_to_external_storage($disk_file_name, $thumbnail);
}
// Store file
$options = [
'mimetype' => get_file_type_from_mimetype($file_mimetype),
'type' => get_file_type($file_mimetype),
'folder_id' => $request->parent_id,
'name' => $user_file_name,
'unique_id' => $unique_id,
'basename' => $disk_file_name,
'user_scope' => $user_scope,
'thumbnail' => $thumbnail,
'filesize' => $file_size,
'user_id' => $user_id,
];
// Return new file
return FileManagerFile::create($options);
}
}
/**
* Clear failed files
*/
private static function clear_failed_files()
{
$local_disk = Storage::disk('local');
// Get all files from storage
$files = collect([
$local_disk->allFiles('file-manager'),
$local_disk->allFiles('chunks')
])->collapse();
$files->each(function ($file) use ($local_disk) {
// Get the file's last modification time.
$last_modified = $local_disk->lastModified($file);
// Get diffInHours
$diff = Carbon::parse($last_modified)->diffInHours(Carbon::now());
// Delete if file is in local storage more than 24 hours
if ($diff > 24) {
Log::info('Failed file or chunk ' . $file . ' deleted.');
// Delete file from local storage
$local_disk->delete($file);
}
});
}
/**
* Move file to external storage if is set
*
* @param string $filename
* @param string|null $thumbnail
*/
private static function move_to_external_storage(string $filename, ?string $thumbnail): void
{
$disk_local = Storage::disk('local');
foreach ([$filename, $thumbnail] as $file) {
// Check if file exist
if (!$file) continue;
// Get file size
$filesize = $disk_local->size('file-manager/' . $file);
// If file is bigger than 5.2MB then run multipart upload
if ($filesize > 5242880) {
// Get driver
$driver = \Storage::getDriver();
// Get adapter
$adapter = $driver->getAdapter();
// Get client
$client = $adapter->getClient();
// Prepare the upload parameters.
$uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . '/file-manager/' . $file, [
'bucket' => $adapter->getBucket(),
'key' => 'file-manager/' . $file
]);
try {
// Upload content
$uploader->upload();
} catch (MultipartUploadException $e) {
// Write error log
Log::error($e->getMessage());
// Delete file after error
$disk_local->delete('file-manager/' . $file);
throw new HttpException(409, $e->getMessage());
}
} else {
// Stream file object to s3
Storage::putFileAs('file-manager', config('filesystems.disks.local.root') . '/file-manager/' . $file, $file, 'private');
}
// Delete file after upload
$disk_local->delete('file-manager/' . $file);
}
}
/**
* Check if directories 'chunks' and 'file-manager exist', if no, then create
*
* @param $directories
*/
private static function check_directories($directories): void
{
foreach ($directories as $directory) {
if (!Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
if (!is_storage_driver(['local'])) {
if (!Storage::exists($directory)) {
Storage::makeDirectory($directory);
}
}
}
}
/**
* Create thumbnail for images
*
* @param string $file_path
* @param string $filename
* @param $file
* @return string|null
*/
private static function get_image_thumbnail(string $file_path, string $filename)
{
$local_disk = Storage::disk('local');
// Create thumbnail from image
if (in_array($local_disk->mimeType($file_path), ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'])) {
// Get thumbnail name
$thumbnail = 'thumbnail-' . $filename;
// Create intervention image
$image = Image::make(config('filesystems.disks.local.root') . '/' . $file_path)->orientate();
// Resize image
$image->resize(512, null, function ($constraint) {
$constraint->aspectRatio();
})->stream();
// Store thumbnail to disk
$local_disk->put('file-manager/' . $thumbnail, $image);
}
// Return thumbnail as svg file
if ($local_disk->mimeType($file_path) === 'image/svg+xml') {
$thumbnail = $filename;
}
return $thumbnail ?? null;
}
/**
* Check if user has enough space to upload file
*
* @param $user_id
* @param int $file_size
* @param $temp_filename
*/
private static function check_user_storage_capacity($user_id, int $file_size, $temp_filename): void
{
// Get user storage percentage and get storage_limitation setting
$user_storage_used = user_storage_percentage($user_id, $file_size);
$storage_limitation = get_setting('storage_limitation');
// Check if user can upload
if ($storage_limitation && $user_storage_used >= 100) {
// Delete file
Storage::disk('local')->delete('chunks/' . $temp_filename);
// Abort uploading
abort(423, 'You exceed your storage limit!');
}
}
}

View File

@@ -1,64 +0,0 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* App\Invoice
*
* @property int $id
* @property string $token
* @property string $order
* @property string|null $provider
* @property string $user_id
* @property string $plan_id
* @property array $seller
* @property array $client
* @property array $bag
* @property string|null $notes
* @property string $total
* @property string $currency
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \App\User|null $user
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice query()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereBag($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereClient($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereCurrency($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereNotes($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereOrder($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice wherePlanId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereProvider($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereSeller($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereTotal($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereUserId($value)
* @mixin \Eloquent
*/
class Invoice extends Model
{
protected $guarded = [
'id'
];
protected $casts = [
'seller' => 'array',
'client' => 'array',
'bag' => 'array',
];
/**
* Get user instance
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function user() {
return $this->hasOne(User::class, 'id', 'user_id');
}
}

View File

@@ -1,26 +0,0 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Kyslik\ColumnSortable\Sortable;
class Page extends Model
{
use Sortable;
/**
* Sortable columns
*
* @var string[]
*/
public $sortable = [
'title',
'slug',
'visibility',
];
public $timestamps = false;
protected $guarded = ['id'];
}

View File

@@ -1,42 +0,0 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* App\PaymentGateway
*
* @property int $id
* @property int $status
* @property int $sandbox
* @property string $name
* @property string $slug
* @property string $logo
* @property string|null $client_id
* @property string|null $secret
* @property string|null $webhook
* @property string|null $optional
* @property int|null $payment_processed
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway query()
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereClientId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereLogo($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereOptional($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway wherePaymentProcessed($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereSandbox($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereSecret($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereSlug($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereWebhook($value)
* @mixin \Eloquent
*/
class PaymentGateway extends Model
{
protected $guarded = ['id'];
public $timestamps = false;
}

View File

@@ -1,45 +0,0 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
use Laravel\Passport\Console\ClientCommand;
use Laravel\Passport\Console\InstallCommand;
use Laravel\Passport\Console\KeysCommand;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
$get_time_locale = App::getLocale() . '_' . mb_strtoupper(App::getLocale());
// Set locale for carbon dates
setlocale(LC_TIME, $get_time_locale);
// Install passport commands
$this->commands([
InstallCommand::class,
ClientCommand::class,
KeysCommand::class,
]);
}
}

View File

@@ -1,48 +0,0 @@
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
// Define admin settings gate
Gate::define('admin-settings', function ($user) {
return $user->role === 'admin';
});
Passport::routes();
Passport::tokensCan([
'master' => 'Master',
'editor' => 'Editor',
'visitor' => 'Visitor',
]);
Passport::setDefaultScope([
'master',
'editor',
'visitor',
]);
}
}

View File

@@ -1,80 +0,0 @@
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* The path to the "home" route for your application.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
//
parent::boot();
}
/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
//
}
/**
* Define the "web" routes for the application.
*
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
/**
* Define the "api" routes for the application.
*
* These routes are typically stateless.
*
* @return void
*/
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
}

View File

@@ -1,387 +0,0 @@
<?php
namespace App\Services;
use App\User;
use Artisan;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Laravel\Cashier\Exceptions\IncompletePayment;
use Laravel\Cashier\Exceptions\PaymentActionRequired;
use Stripe;
use Symfony\Component\HttpKernel\Exception\HttpException;
class StripeService
{
/**
* Stripe Service constructor.
*/
public function __construct()
{
$this->stripe = Stripe::make(config('cashier.secret'), '2020-03-02');
}
/**
* Get Stripe account details
*
* @return mixed
*/
public function getAccountDetails()
{
$account = $this->stripe->account()->details();
return $account;
}
/**
* Get setup intent
*
* @param $user
* @return mixed
*/
public function getSetupIntent($user)
{
// Create stripe customer if not exist
$user->createOrGetStripeCustomer();
// Return setup intent
return $user->createSetupIntent();
}
/**
* Get tax rate ids
* @return array
*/
public function getTaxRates()
{
$tax_rates = $this->stripe->taxRates()->all();
return $tax_rates['data'];
}
/**
* Get default payment option or set new default payment
*
* @param $request
* @param $user
* @return mixed
*/
public function getOrSetDefaultPaymentMethod($request, $user)
{
// Check payment method
if (!$request->has('payment.meta.pm') && $user->hasDefaultPaymentMethod()) {
// Get default payment
return $user->defaultPaymentMethod()->paymentMethod;
}
// Clear cached payment methods
cache_forget_many([
'payment-methods-user-' . $user->id,
'default-payment-methods-user-' . $user->id
]);
if ($request->has('payment.meta.pm') && $user->hasDefaultPaymentMethod()) {
// Set new payment
return $user->addPaymentMethod($request->input('payment.meta.pm'))->paymentMethod;
} else if ($request->has('payment.meta.pm') && !$user->hasDefaultPaymentMethod()) {
// Set new payment
return $user->updateDefaultPaymentMethod($request->input('payment.meta.pm'))->paymentMethod;
} else {
throw new HttpException(400, 'Something went wrong.');
}
}
/**
* Register new payment method
*
* @param $request
* @param $user
* @return mixed
*/
public function registerNewPaymentMethod($request, $user)
{
// Clear cached payment methods
cache_forget_many([
'payment-methods-user-' . $user->id,
'default-payment-methods-user-' . $user->id
]);
// Set new payment method
$user->addPaymentMethod($request->token)->paymentMethod;
// Set new default payment
if ($request->default) {
$user->updateDefaultPaymentMethod($request->token)->paymentMethod;
}
}
/**
* Create new subscription or replace by new subscription
*
* @param $request
* @param $user
* @param $paymentMethod
* @return \Illuminate\Http\RedirectResponse
*/
public function createOrReplaceSubscription($request, $user)
{
try {
// Get payment method
$paymentMethod = $this->getOrSetDefaultPaymentMethod($request, $user);
// Check if user have subscription
if ($user->subscribed('main')) {
// Change subscription plan
$user->subscription('main')->skipTrial()->swap($request->input('plan.data.id'));
} else {
// Create subscription
$user->newSubscription('main', $request->input('plan.data.id'))->create($paymentMethod);
}
} catch (IncompletePayment $exception) {
if ($exception instanceof PaymentActionRequired) {
$cashier_route = route('cashier.payment', [$exception->payment->id, 'redirect' => url('/settings/subscription')]);
throw new HttpException(402, $cashier_route);
} else {
throw new HttpException(400, $exception->getMessage());
}
}
}
/**
* Update customer details
*
* @param $user
*/
public function updateCustomerDetails($user)
{
$user->updateStripeCustomer([
'name' => $user->settings->billing_name,
'phone' => $user->settings->billing_phone_number,
'address' => [
'line1' => $user->settings->billing_address,
'city' => $user->settings->billing_city,
'country' => $user->settings->billing_country,
'postal_code' => $user->settings->billing_postal_code,
'state' => $user->settings->billing_state,
]
]);
}
/**
* Get all plans
*
* @return mixed
*/
public function getPlans()
{
// Get stripe plans
$stripe_plans = $this->stripe->plans()->all();
// Plans container
$plans = [];
foreach ($stripe_plans['data'] as $plan) {
// Get stripe product
$product = $this->stripe->products()->find($plan['product']);
// Push data to $plan container
if ($product['active'] && isset($product['metadata']['capacity'])) {
array_push($plans, [
'plan' => $plan,
'product' => $product,
]);
}
}
return $plans;
}
/**
* Get all active plans
*
* @return mixed
*/
public function getActivePlans()
{
// Get stripe plans
$stripe_plans = $this->stripe->plans()->all();
// Plans container
$plans = [];
foreach ($stripe_plans['data'] as $plan) {
if ($plan['active']) {
// Get stripe product
$product = $this->stripe->products()->find($plan['product']);
// Push data to $plan container
if ($product['active'] && isset($product['metadata']['capacity'])) {
array_push($plans, [
'plan' => $plan,
'product' => $product,
]);
}
}
}
return $plans;
}
/**
* Get plan details
*
* @param $id
* @return mixed
*/
public function getPlan($id)
{
$plan = $this->stripe->plans()->find($id);
$product = $this->stripe->products()->find($plan['product']);
return compact('plan', 'product');
}
/**
* Create plan
*
* @param $data
* @return mixed
*/
public function createPlan($data)
{
if ($data instanceof Request) {
$plan = [
'name' => $data->input('attributes.name'),
'description' => $data->input('attributes.description'),
'price' => $data->input('attributes.price'),
'capacity' => $data->input('attributes.capacity'),
];
} else {
$plan = [
'name' => $data['attributes']['name'],
'description' => $data['attributes']['description'],
'price' => $data['attributes']['price'],
'capacity' => $data['attributes']['capacity'],
];
}
$product = $this->stripe->products()->create([
'name' => $plan['name'],
'description' => $plan['description'],
'metadata' => [
'capacity' => $plan['capacity']
]
]);
$plan = $this->stripe->plans()->create([
'id' => Str::slug($plan['name']),
'amount' => $plan['price'],
'currency' => config('cashier.currency'),
'interval' => 'month',
'product' => $product['id'],
]);
return compact('plan', 'product');
}
/**
* Update plan
*
* @param $request
* @param $id
*/
public function updatePlan($request, $id)
{
$plan_colls = ['is_active', 'price'];
$product_colls = ['name', 'description', 'capacity'];
$plan = $this->stripe->plans()->find($id);
// Update product
if (in_array($request->name, $product_colls)) {
if ($request->name === 'capacity') {
$this->stripe->products()->update($plan['product'], ['metadata' => ['capacity' => $request->value]]);
}
if ($request->name === 'name') {
$this->stripe->products()->update($plan['product'], ['name' => $request->value]);
}
if ($request->name === 'description') {
$this->stripe->products()->update($plan['product'], ['description' => $request->value]);
}
}
// Update plan
if (in_array($request->name, $plan_colls)) {
if ($request->name === 'is_active') {
$this->stripe->plans()->update($id, ['active' => $request->value]);
}
}
}
/**
* Delete plan
*
* @param $slug
*/
public function deletePlan($slug)
{
$this->stripe->plans()->delete($slug);
}
/**
* Get all user invoices
*
* @param $user
* @return mixed
*/
public function getUserInvoices($user)
{
return $user->invoices();
}
/**
* Get user invoice by id
*
* @param $id
* @return \Laravel\Cashier\Invoice|null
*/
public function getUserInvoice($customer, $id)
{
$user = User::where('stripe_id', $customer)->firstOrFail();
return $user->findInvoice($id);
}
/**
* Get all invoices
*
* @return mixed
*/
public function getInvoices()
{
return $this->stripe->invoices()->all([
'limit' => 20
]);
}
}

View File

@@ -1,12 +0,0 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Setting extends Model
{
public $timestamps = false;
protected $guarded = ['id'];
}

View File

@@ -1,51 +0,0 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* App\Share
*
* @property int $id
* @property int $user_id
* @property string $token
* @property int $item_id
* @property string $type
* @property string|null $permission
* @property int $protected
* @property string|null $password
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read string $link
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share query()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereItemId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share wherePassword($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share wherePermission($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereProtected($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Share whereUserId($value)
* @mixin \Eloquent
*/
class Share extends Model
{
protected $guarded = ['id'];
protected $appends = ['link'];
/**
* Generate share link
*
* @return string
*/
public function getLinkAttribute() {
return url('/shared', ['token' => $this->attributes['token']]);
}
}

View File

@@ -1,303 +0,0 @@
<?php
namespace App;
use App\Notifications\ResetPassword;
use App\Notifications\ResetUserPasswordNotification;
use ByteUnits\Metric;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Storage;
use Laravel\Cashier\Billable;
use Laravel\Passport\HasApiTokens;
use Kyslik\ColumnSortable\Sortable;
use Rinvex\Subscriptions\Traits\HasSubscriptions;
/**
* App\User
*
* @property int $id
* @property string $name
* @property string $email
* @property \Illuminate\Support\Carbon|null $email_verified_at
* @property string $password
* @property \Illuminate\Contracts\Routing\UrlGenerator|string $avatar
* @property string|null $remember_token
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Collection|\Laravel\Passport\Client[] $clients
* @property-read int|null $clients_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFolder[] $favourites
* @property-read int|null $favourites_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFile[] $files
* @property-read int|null $files_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFile[] $files_with_trashed
* @property-read int|null $files_with_trashed_count
* @property-read mixed $used_capacity
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFile[] $latest_uploads
* @property-read int|null $latest_uploads_count
* @property-read \Illuminate\Notifications\DatabaseNotificationCollection|\Illuminate\Notifications\DatabaseNotification[] $notifications
* @property-read int|null $notifications_count
* @property-read \Illuminate\Database\Eloquent\Collection|\Laravel\Passport\Token[] $tokens
* @property-read int|null $tokens_count
* @method static \Illuminate\Database\Eloquent\Builder|\App\User newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\User newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\User query()
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereAvatar($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereEmail($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereEmailVerifiedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User wherePassword($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereRememberToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereUpdatedAt($value)
* @mixin \Eloquent
* @property string $role
* @property string|null $stripe_id
* @property string|null $card_brand
* @property string|null $card_last_four
* @property string|null $trial_ends_at
* @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFolder[] $favourite_folders
* @property-read int|null $favourite_folders_count
* @property-read mixed $folder_tree
* @property-read mixed $storage
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Invoice[] $invoices
* @property-read int|null $invoices_count
* @property-read int|null $payment_cards_count
* @property-read \App\UserSettings|null $settings
* @property-read \Illuminate\Database\Eloquent\Collection|\Laravel\Cashier\Subscription[] $subscriptions
* @property-read int|null $subscriptions_count
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereCardBrand($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereCardLastFour($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereRole($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereStripeId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereTrialEndsAt($value)
*/
class User extends Authenticatable
{
use HasApiTokens, Notifiable, Billable, Sortable;
protected $guarded = ['id', 'role'];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password', 'avatar',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
protected $appends = [
'used_capacity', 'storage'
];
/**
* Sortable columns
*
* @var string[]
*/
public $sortable = [
'id',
'name',
'role',
'created_at',
'storage_capacity',
];
/**
* Get tax rate id for user
*
* @return array
*/
public function taxRates()
{
$stripe = resolve('App\Services\StripeService');
// Get tax rates
$rates = collect($stripe->getTaxRates());
// Find tax rate
$user_tax_rate = $rates->first(function ($item) {
return $item['jurisdiction'] === $this->settings->billing_country && $item['active'];
});
return $user_tax_rate ? [$user_tax_rate['id']] : [];
}
/**
* Get user used storage details
*
* @return mixed
*/
public function getStorageAttribute()
{
// Get storage limitation setup
$storage_limitation = get_setting('storage_limitation');
$is_storage_limit = $storage_limitation ? $storage_limitation : 1;
// Get user storage usage
if (! $is_storage_limit) {
return [
'used' => $this->used_capacity,
'used_formatted' => Metric::bytes($this->used_capacity)->format(),
];
}
return [
'used' => (float)get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity),
'used_formatted' => get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity) . '%',
'capacity' => $this->settings->storage_capacity,
'capacity_formatted' => format_gigabytes($this->settings->storage_capacity),
];
}
/**
* Get user used storage capacity in bytes
*
* @return mixed
*/
public function getUsedCapacityAttribute()
{
$user_capacity = $this->files_with_trashed->map(function ($item) {
return $item->getRawOriginal();
})->sum('filesize');
return $user_capacity;
}
/**
* Get user full folder tree
*
* @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
*/
public function getFolderTreeAttribute()
{
return FileManagerFolder::with(['folders.shared', 'shared:token,id,item_id,permission,protected'])
->where('parent_id', 0)
->where('user_id', $this->id)
->get();
}
/**
* Format avatar to full url
*
* @return \Illuminate\Contracts\Routing\UrlGenerator|string
*/
public function getAvatarAttribute()
{
// Get avatar from external storage
if ($this->attributes['avatar'] && is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) {
return Storage::temporaryUrl($this->attributes['avatar'], now()->addDay());
}
// Get avatar from local storage
if ($this->attributes['avatar']) {
return url('/' . $this->attributes['avatar']);
}
return url('/assets/images/' . 'default-avatar.png');
}
/**
* Set user billing info
*
* @param $billing
* @return UserSettings
*/
public function setBilling($billing)
{
$this->settings()->update([
'billing_address' => $billing['billing_address'],
'billing_city' => $billing['billing_city'],
'billing_country' => $billing['billing_country'],
'billing_name' => $billing['billing_name'],
'billing_phone_number' => $billing['billing_phone_number'],
'billing_postal_code' => $billing['billing_postal_code'],
'billing_state' => $billing['billing_state'],
]);
return $this->settings;
}
/**
* Send the password reset notification.
*
* @param string $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetPassword($token));
}
/**
* Get user favourites folder
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function favourite_folders()
{
return $this->belongsToMany(FileManagerFolder::class, 'favourite_folder', 'user_id', 'folder_unique_id', 'id', 'unique_id')->with('shared:token,id,item_id,permission,protected');
}
/**
* Get 5 latest uploads
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Query\Builder
*/
public function latest_uploads()
{
return $this->hasMany(FileManagerFile::class)->with(['parent'])->orderBy('created_at', 'DESC')->take(40);
}
/**
* Get all user files
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function files()
{
return $this->hasMany(FileManagerFile::class);
}
/**
* Get all user files
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function files_with_trashed()
{
return $this->hasMany(FileManagerFile::class)->withTrashed();
}
/**
* Get user attributes
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function settings()
{
return $this->hasOne(UserSettings::class);
}
}

View File

@@ -1,12 +0,0 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserSettings extends Model
{
public $timestamps = false;
protected $guarded = ['id', 'storage_capacity'];
}

14
changelog.md Normal file
View File

@@ -0,0 +1,14 @@
## Version 1.0.2
#### Release date: 9. May 2022
- Improved sanitization for .env values to prevent crash your app
- Improved reCaptcha validation errors
- Fixed issue when upload doesn't start after you drag the file into empty view
- Fixed trash navigator issue
## Version 1.0.1
#### Release date: 8. May 2022
- Fixed issue with chunk upload
## Version 1.0.0
#### Release date: 1. May 2022
- Release

203
codecanyon.html Normal file
View File

@@ -0,0 +1,203 @@
<h2>Your Self-Hosted Storage Client Platform</h2>
<p>
<strong>
Vuefilemanager Light is a Lightweight version of VueFileManager Pro which fullfill all your personal needs.
</strong>
</p>
<a href="http://demo-light.vuefilemanager.com/">
<img src="https://i.ibb.co/dmfy0v8/main-features.jpg" alt="VueFileManager Light Main Features" />
</a>
<h3>Core Functionalities</h3>
<h5><strong>Meticulously Designed User Interface & User Experience</strong></h5>
<p>
In last 2 years of VueFileManager evolution with help of our users, we spend a lot of time designing gorgeous
looking user interface and seamless user experience with our file management frontend. We advocate simplicity and
usability.
</p>
<h5><strong>Responsive</strong></h5>
<p>
Meticulously optimized mobile version of VueFileManager, we just love how nice and easy are all components working.
Mobile responsive version should be nice and usable as his bigger desktop brother.
</p>
<h5><strong>Upload Files</strong></h5>
<p>
With VueFileManager you can upload files up to tens of gigabytes, dont worry that your big files won't be uploaded.
We support chunk upload and multipart uploads for your s3 storage service. All work seamlessly.
</p>
<h5><strong>Folder Upload</strong></h5>
<p>
For VueFileManager it isn't any problem to upload a folder with your files. The same folder structure will be
recreated in the app.
</p>
<h5><strong>Sharing Files</strong></h5>
<p>
With our reach sharing functionalities, you can easily just click on your file or folder, and generate a shared link
for everyone. Also you can protect your shared files with your password. 
</p>
<p>
Use expiration functionality to automatically expire links, share links directly via email or generate QR code and
share it with guys on your left.
</p>
<h5><strong>Shared Pages</strong></h5>
<p>
If you share any folder with files within, the user has the same user experience as a logged user. He can create
folders, name it, upload files or move them into other folders directly in your shared folder.
</p>
<p>
Videos have their own dedicated shared page with your app logo and ability to play video directly in this page with
the download button above, try it, its magic!
</p>
<h5><strong>Spotlight</strong></h5>
<p>
With the spotlight, you can search for your users, files, folders, navigate throughout the app, toggle dark mode,
toggle emojis and many more from any location in the app. Its like magic. Good suit for super users.
</p>
<h5><strong>External Storage Services</strong></h5>
<p>
You can use it as main storage for all your files external storage service. We support all S3 compatible services
like Amazon Web Services S3, Spaces from Digital Ocean, Backblaze, Wasabi, Alibaba Cloud OSS, Storj and many more.
</p>
<h5><strong>Decentralized Storage Service</strong></h5>
<p>
With Storj DCS (Decentralized Cloud Storage) files arent stored in centralized data centers — instead, they're
encrypted, split into pieces, and distributed on a global cloud network.
</p>
<h5><strong>Full-Fledged API</strong></h5>
<p>
You can integrate VueFileManager into your app seamlessly. Users can generate authentication tokens in their profile
settings. Documentation for API coming soon.
</p>
<h5><strong>2-Factor Verification</strong></h5>
<p>
Another layer of security to make sure your files are secured. Users can set up 2 factor verification with their
favourite authenticator app.
</p>
<h5><strong>Customizable Folder Icons</strong></h5>
<p>
Set your favourite emoji to your folder as an icon and make VueFileManager more personal for you! If you are an
apple user, you can switch between Apple emojis and Tweemojis from twitter.
</p>
<h5><strong>Admin Panel</strong></h5>
<p>
As admin, you have full control over the entire app, you can create or delete users, manage their storage size, set upload limits and many more.
</p>
<h5><strong>Dark Mode</strong></h5>
<p>
We support dark mode natively. Users can set dark mode via application, or let Dark/Light mode handle with preferred
OS settings.
</p>
<h5><strong>Language Editor</strong></h5>
<p>
With our language editor you can translate applications into your home language. Its at your hand in the admin
panel.
</p>
<h5><strong>Auto Database Backup</strong></h5>
<p>
VueFileManager will take care of your daily database backups. When an unexpected event occurs, your database backup
will be ready for you.
</p>
<h5><strong>reCaptcha</strong></h5>
<p>
reCaptcha will provide security for registration and contact form from internet bots and prevent spammers from
abusing your application.
</p>
<h5><strong>Server Status</strong></h5>
<p>
You can check the admin panel server status. You can download your server logs for support communication, check your
latest database backups, check if your cron is running smoothly or if you have correctly set up your PHP with all
required php extensions.
</p>
<h5><strong>Easy Installation with Setup Wizard</strong></h5>
<p>
Setup Wizard is a convenient way to set up and configure your VueFileManager app in a few steps. Before you run your
installation, Setup Wizard will check all your server components and let you know, when you are missing something.
</p>
<h5><strong>Drag & Drop</strong></h5>
<p>You can drag your files or folder to another folder seamlessly</p>
<h5><strong>Source Code</strong></h5>
<p>
All source files of VueFileManager are included in download. You can easily inspect code and build your own
functionality.
</p>
<h3>Useful Links</h3>
<p>
<a href="https://gist.github.com/MakingCG/f3332c4f1e6eaee45d443cdff0bb97ab">
<strong>Installation Guide</strong>
</a>
</p>
<p>
<a href="https://twitter.com/vuefilemanager">
<strong>VueFileManager on Twitter</strong>
</a>
</p>
<h3>Tips</h3>
<p>
<a
href="https://medium.com/vuefilemanager/how-to-set-up-vuefilemanager-laravel-application-on-vps-with-debian-10-64676a3ff4d7"
>
<strong>How to install VueFileManager on VPS with Debian 10</strong>
</a>
</p>
<p>
<a
href="https://medium.com/vuefilemanager/how-to-set-up-vuefilemanager-with-aws-s3-as-an-external-storage-a2c525aec698"
>
<strong>How to Set Up AWS S3</strong>
</a>
</p>
<p>
<a
href="https://medium.com/vuefilemanager/how-to-set-up-vuefilemanager-with-digital-ocean-spaces-as-a-external-storage-6cccf590c23d"
>
<strong>How to Set Up Digital Ocean Spaces</strong>
</a>
</p>
<h3>Demo</h3>
<h5>
<strong>
<a href="http://demo-light.vuefilemanager.com/">Demo for VueFileManager Light</a>
</strong>
</h5>
<p>
Some functions for default howdy account are restricted. Feel free to create your own account via administration.
</p>
<h3>Technologies</h3>
<ul>
<li>Laravel 9.x</li>
<li>Vue 2.6.x</li>
<li>Tailwind 3</li>
</ul>
<h3>Server Requirements</h3>
<ul>
<li>PHP >= 8.0.2 version (8.1+ recommended)</li>
<li>MySQL 5.6+</li>
<li>Nginx or Apache</li>
</ul>

View File

@@ -8,31 +8,49 @@
],
"license": "MIT",
"require": {
"php": "^7.2",
"cartalyst/stripe-laravel": "^12.0",
"doctrine/dbal": "^2.10",
"fideloper/proxy": "^4.0",
"fruitcake/laravel-cors": "^1.0",
"php": "^8.0.2",
"ext-json": "*",
"ext-pdo": "*",
"brianium/paratest": "^6.4.1",
"cocur/slugify": "^4.1",
"doctrine/dbal": "^2.13.7",
"fruitcake/laravel-cors": "^2.0.5",
"gabrielelana/byte-units": "^0.5.0",
"intervention/image": "^2.5",
"kyslik/column-sortable": "^6.3",
"laravel/cashier": "^12.0",
"laravel/framework": "^7.0",
"laravel/passport": "^8.4",
"laravel/scout": "^7.2",
"laravel/tinker": "^2.0",
"laravel/ui": "^2.0",
"league/flysystem-aws-s3-v3": "^1.0",
"league/flysystem-cached-adapter": "^1.0",
"teamtnt/laravel-scout-tntsearch-driver": "^8.3"
"guzzlehttp/guzzle": "^7.4.1",
"intervention/image": "^2.7.1",
"jaybizzle/laravel-crawler-detect": "^1.2",
"kyslik/column-sortable": "^6.4.1",
"laravel/fortify": "^1.12.0",
"laravel/framework": "^9.2",
"laravel/sanctum": "^2.14.2",
"laravel/tinker": "^2.7",
"laravel/ui": "^3.4.2",
"league/flysystem-aws-s3-v3": "^3.0.9",
"league/flysystem-ftp": "^3.0",
"makingcg/subscription": "^1.0.5",
"matthewbdaly/laravel-azure-storage": "^2.0",
"spatie/data-transfer-object": "^3.7.3",
"spatie/laravel-backup": "^8.0.8",
"spatie/laravel-query-builder": "^5.0.0",
"spatie/laravel-queueable-action": "^2.13.1",
"spatie/laravel-tail": "^4.4.0",
"stechstudio/laravel-zipstream": "^4.5",
"symfony/http-client": "^6.0",
"symfony/mailgun-mailer": "^6.0",
"symfony/postmark-mailer": "^6.0",
"teamtnt/laravel-scout-tntsearch-driver": "^11.6",
"vimeo/psalm": "^4.19.0"
},
"require-dev": {
"barryvdh/laravel-ide-helper": "^2.7",
"facade/ignition": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^4.1",
"phpunit/phpunit": "^8.5"
"barryvdh/laravel-ide-helper": "^2.12.1",
"friendsofphp/php-cs-fixer": "^3.5.0",
"spatie/laravel-ignition": "^1.0",
"nunomaduro/larastan": "^0.7.15",
"nunomaduro/collision": "^6.1",
"phpunit/phpunit": "^9.5.16",
"mockery/mockery": "^1.5.0",
"fakerphp/faker": "^1.19.0",
"ext-json": "*"
},
"config": {
"optimize-autoloader": true,
@@ -46,15 +64,19 @@
},
"autoload": {
"psr-4": {
"App\\": "app/"
"App\\" : "src/App/",
"Domain\\" : "src/Domain/",
"Support\\" : "src/Support/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
},
"classmap": [
"database/seeds",
"database/factories"
],
"files": [
"app/Http//Helpers/helpers.php",
"app/Http//Helpers/subscription.php"
"src/Support/errors.php",
"src/Support/helpers.php"
]
},
"autoload-dev": {
@@ -74,6 +96,7 @@
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
],
"format": "vendor/bin/php-cs-fixer fix --allow-risky=yes"
}
}

12034
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Name
@@ -135,7 +134,6 @@ return [
*/
'providers' => [
/*
* Laravel Framework Service Providers...
*/
@@ -164,7 +162,7 @@ return [
TeamTNT\Scout\TNTSearchScoutServiceProvider::class,
Intervention\Image\ImageServiceProvider::class,
Laravel\Passport\PassportServiceProvider::class,
App\Providers\FortifyServiceProvider::class,
/*
* Package Service Providers...
@@ -175,10 +173,9 @@ return [
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
/*
@@ -193,7 +190,6 @@ return [
*/
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
@@ -231,35 +227,27 @@ return [
'View' => Illuminate\Support\Facades\View::class,
'Image' => Intervention\Image\Facades\Image::class,
'Stripe' => Cartalyst\Stripe\Laravel\Facades\Stripe::class,
'Crawler' => Jaybizzle\LaravelCrawlerDetect\Facades\LaravelCrawlerDetect::class,
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
],
'deploy_secret' => env('APP_DEPLOY_SECRET'),
'deploy_branch' => env('APP_DEPLOY_BRANCH'),
'debug_blacklist' => [
'_ENV' => [
'APP_KEY',
'DB_USERNAME',
'DB_PASSWORD',
'REDIS_PASSWORD',
'MAIL_PASSWORD',
'PUSHER_APP_KEY',
'PUSHER_APP_SECRET',
'PASSPORT_CLIENT_ID',
'PASSPORT_CLIENT_SECRET',
'AWS_SECRET_ACCESS_KEY',
'AWS_ACCESS_KEY_ID',
'S3_SECRET_ACCESS_KEY',
'S3_ACCESS_KEY_ID',
'DO_SPACES_KEY',
'DO_SPACES_SECRET',
'WASABI_KEY',
'WASABI_SECRET',
'BACKBLAZE_KEY',
'BACKBLAZE_SECRET',
],
@@ -277,8 +265,8 @@ return [
'PASSPORT_CLIENT_ID',
'PASSPORT_CLIENT_SECRET',
'AWS_SECRET_ACCESS_KEY',
'AWS_ACCESS_KEY_ID',
'S3_SECRET_ACCESS_KEY',
'S3_ACCESS_KEY_ID',
'DO_SPACES_KEY',
'DO_SPACES_SECRET',
@@ -293,5 +281,4 @@ return [
'password',
],
],
];

View File

@@ -1,7 +1,6 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Defaults
@@ -14,7 +13,7 @@ return [
*/
'defaults' => [
'guard' => 'web',
'guard' => 'web',
'passwords' => 'users',
],
@@ -37,13 +36,14 @@ return [
'guards' => [
'web' => [
'driver' => 'session',
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
@@ -67,7 +67,7 @@ return [
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
'model' => App\Users\Models\User::class,
],
// 'users' => [
@@ -94,8 +94,8 @@ return [
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],
@@ -112,5 +112,4 @@ return [
*/
'password_timeout' => 10800,
];

257
config/backup.php Normal file
View File

@@ -0,0 +1,257 @@
<?php
return [
'backup' => [
/*
* The name of this application. You can use this name to monitor
* the backups.
*/
'name' => 'app-backup',
'source' => [
'files' => [
/*
* The list of directories and files that will be included in the backup.
*/
'include' => [
base_path(),
],
/*
* These directories and files will be excluded from the backup.
*
* Directories used by the backup process will automatically be excluded.
*/
'exclude' => [
base_path('vendor'),
base_path('node_modules'),
],
/*
* Determines if symlinks should be followed.
*/
'follow_links' => false,
/*
* Determines if it should avoid unreadable folders.
*/
'ignore_unreadable_directories' => false,
/*
* This path is used to make directories in resulting zip-file relative
* Set to `null` to include complete absolute path
* Example: base_path()
*/
'relative_path' => null,
],
/*
* The names of the connections to the databases that should be backed up
* MySQL, PostgreSQL, SQLite and Mongo databases are supported.
*
* The content of the database dump may be customized for each connection
* by adding a 'dump' key to the connection settings in config/database.php.
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'excludeTables' => [
* 'table_to_exclude_from_backup',
* 'another_table_to_exclude'
* ]
* ],
* ],
*
* If you are using only InnoDB tables on a MySQL server, you can
* also supply the useSingleTransaction option to avoid table locking.
*
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'useSingleTransaction' => true,
* ],
* ],
*
* For a complete list of available customization options, see https://github.com/spatie/db-dumper
*/
'databases' => [
'mysql',
],
],
/*
* The database dump can be compressed to decrease diskspace usage.
*
* Out of the box Laravel-backup supplies
* Spatie\DbDumper\Compressors\GzipCompressor::class.
*
* You can also create custom compressor. More info on that here:
* https://github.com/spatie/db-dumper#using-compression
*
* If you do not want any compressor at all, set it to null.
*/
'database_dump_compressor' => null,
/*
* The file extension used for the database dump files.
*
* If not specified, the file extension will be .archive for MongoDB and .sql for all other databases
* The file extension should be specified without a leading .
*/
'database_dump_file_extension' => '',
'destination' => [
/*
* The filename prefix used for the backup zip file.
*/
'filename_prefix' => 'backup-',
/*
* The disk names on which the backups will be stored.
*/
'disks' => [
env('FILESYSTEM_DISK', 'local'),
],
],
/*
* The directory where the temporary files will be stored.
*/
'temporary_directory' => storage_path('app/backup-temp'),
/*
* The password to be used for archive encryption.
* Set to `null` to disable encryption.
*/
'password' => env('BACKUP_ARCHIVE_PASSWORD', null),
/*
* The encryption algorithm to be used for archive encryption.
* You can set it to `null` or `false` to disable encryption.
*
* When set to 'default', we'll use ZipArchive::EM_AES_256 if it is
* available on your system.
*/
'encryption' => 'default',
],
/*
* You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'.
* For Slack you need to install laravel/slack-notification-channel.
*
* You can also use your own notification classes, just make sure the class is named after one of
* the `Spatie\Backup\Events` classes.
*/
'notifications' => [
'notifications' => [
\Spatie\Backup\Notifications\Notifications\BackupHasFailedNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFoundNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\CleanupHasFailedNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\BackupWasSuccessfulNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\HealthyBackupWasFoundNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\CleanupWasSuccessfulNotification::class => ['mail'],
],
/*
* Here you can specify the notifiable to which the notifications should be sent. The default
* notifiable will use the variables specified in this config file.
*/
'notifiable' => \Spatie\Backup\Notifications\Notifiable::class,
/*'mail' => [
'to' => 'your@example.com',
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
],*/
'slack' => [
'webhook_url' => '',
/*
* If this is set to null the default channel of the webhook will be used.
*/
'channel' => null,
'username' => null,
'icon' => null,
],
],
/*
* Here you can specify which backups should be monitored.
* If a backup does not meet the specified requirements the
* UnHealthyBackupWasFound event will be fired.
*/
'monitor_backups' => [
[
'name' => env('APP_NAME', 'laravel-backup'),
'disks' => ['local'],
'health_checks' => [
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
],
],
/*
[
'name' => 'name of the second app',
'disks' => ['local', 's3'],
'health_checks' => [
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
],
],
*/
],
'cleanup' => [
/*
* The strategy that will be used to cleanup old backups. The default strategy
* will keep all backups for a certain amount of days. After that period only
* a daily backup will be kept. After that period only weekly backups will
* be kept and so on.
*
* No matter how you configure it the default strategy will never
* delete the newest backup.
*/
'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'default_strategy' => [
/*
* The number of days for which backups must be kept.
*/
'keep_all_backups_for_days' => 10,
/*
* The number of days for which daily backups must be kept.
*/
'keep_daily_backups_for_days' => 16,
/*
* The number of weeks for which one weekly backup must be kept.
*/
'keep_weekly_backups_for_weeks' => 8,
/*
* The number of months for which one monthly backup must be kept.
*/
'keep_monthly_backups_for_months' => 4,
/*
* The number of years for which one yearly backup must be kept.
*/
'keep_yearly_backups_for_years' => 2,
/*
* After cleaning up the backups remove the oldest backup until
* this amount of megabytes has been reached.
*/
'delete_oldest_backups_when_using_more_megabytes_than' => 5000,
],
],
];

View File

@@ -1,7 +1,6 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Broadcaster
@@ -29,20 +28,22 @@ return [
*/
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
'cluster' => env('PUSHER_APP_CLUSTER'),
'encrypted' => true,
'host' => env('PUSHER_APP_HOST'),
'port' => env('PUSHER_APP_PORT'),
'scheme' => env('PUSHER_APP_TLS', true) ? 'https' : 'http',
],
],
'redis' => [
'driver' => 'redis',
'driver' => 'redis',
'connection' => 'default',
],
@@ -53,7 +54,5 @@ return [
'null' => [
'driver' => 'null',
],
],
];

View File

@@ -3,7 +3,6 @@
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Cache Store
@@ -32,7 +31,6 @@ return [
*/
'stores' => [
'apc' => [
'driver' => 'apc',
],
@@ -42,20 +40,20 @@ return [
],
'database' => [
'driver' => 'database',
'table' => 'cache',
'driver' => 'database',
'table' => 'cache',
'connection' => null,
],
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache/data'),
'path' => storage_path('framework/cache/data'),
],
'memcached' => [
'driver' => 'memcached',
'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
'sasl' => [
'sasl' => [
env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'),
],
@@ -64,27 +62,26 @@ return [
],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
],
'redis' => [
'driver' => 'redis',
'driver' => 'redis',
'connection' => 'cache',
],
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'driver' => 'dynamodb',
'key' => env('S3_ACCESS_KEY_ID'),
'secret' => env('S3_SECRET_ACCESS_KEY'),
'region' => env('S3_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
],
/*
@@ -99,5 +96,4 @@ return [
*/
'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
];

View File

@@ -1,129 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Stripe Keys
|--------------------------------------------------------------------------
|
| The Stripe publishable key and secret key give you access to Stripe's
| API. The "publishable" key is typically used when interacting with
| Stripe.js while the "secret" key accesses private API endpoints.
|
*/
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
/*
|--------------------------------------------------------------------------
| Cashier Path
|--------------------------------------------------------------------------
|
| This is the base URI path where Cashier's views, such as the payment
| verification screen, will be available from. You're free to tweak
| this path according to your preferences and application design.
|
*/
'path' => env('CASHIER_PATH', 'stripe'),
/*
|--------------------------------------------------------------------------
| Stripe Webhooks
|--------------------------------------------------------------------------
|
| Your Stripe webhook secret is used to prevent unauthorized requests to
| your Stripe webhook handling controllers. The tolerance setting will
| check the drift between the current time and the signed request's.
|
*/
'webhook' => [
'secret' => env('STRIPE_WEBHOOK_SECRET'),
'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
],
/*
|--------------------------------------------------------------------------
| Cashier Model
|--------------------------------------------------------------------------
|
| This is the model in your application that implements the Billable trait
| provided by Cashier. It will serve as the primary model you use while
| interacting with Cashier related methods, subscriptions, and so on.
|
*/
'model' => env('CASHIER_MODEL', App\User::class),
/*
|--------------------------------------------------------------------------
| Currency
|--------------------------------------------------------------------------
|
| This is the default currency that will be used when generating charges
| from your application. Of course, you are welcome to use any of the
| various world currencies that are currently supported via Stripe.
|
*/
'currency' => env('CASHIER_CURRENCY', 'usd'),
/*
|--------------------------------------------------------------------------
| Currency Locale
|--------------------------------------------------------------------------
|
| This is the default locale in which your money values are formatted in
| for display. To utilize other locales besides the default en locale
| verify you have the "intl" PHP extension installed on the system.
|
*/
'currency_locale' => env('CASHIER_CURRENCY_LOCALE', 'en'),
/*
|--------------------------------------------------------------------------
| Payment Confirmation Notification
|--------------------------------------------------------------------------
|
| If this setting is enabled, Cashier will automatically notify customers
| whose payments require additional verification. You should listen to
| Stripe's webhooks in order for this feature to function correctly.
|
*/
'payment_notification' => env('CASHIER_PAYMENT_NOTIFICATION'),
/*
|--------------------------------------------------------------------------
| Invoice Paper Size
|--------------------------------------------------------------------------
|
| This option is the default paper size for all invoices generated using
| Cashier. You are free to customize this settings based on the usual
| paper size used by the customers using your Laravel applications.
|
| Supported sizes: 'letter', 'legal', 'A4'
|
*/
'paper' => env('CASHIER_PAPER', 'letter'),
/*
|--------------------------------------------------------------------------
| Stripe Logger
|--------------------------------------------------------------------------
|
| This setting defines which logging channel will be used by the Stripe
| library to write log messages. You are free to specify any of your
| logging channels listed inside the "logging" configuration file.
|
*/
'logger' => env('CASHIER_LOGGER'),
];

View File

@@ -1,102 +1,15 @@
<?php
return [
'pages' => [
[
'visibility' => 1,
'title' => 'Terms of Service',
'slug' => 'terms-of-service',
'content' => 'Laoreet cum hendrerit iaculis arcu phasellus congue et elementum, pharetra risus imperdiet aptent posuere rutrum parturient blandit, dapibus tellus ridiculus potenti aliquam sociis turpis. Nullam commodo eget laoreet risus cursus vel placerat, in dapibus sociis gravida faucibus sodales, fringilla potenti elit semper iaculis ullamcorper. Dignissim vulputate pretium montes pellentesque mollis, consectetur adipiscing curabitur semper sem rhoncus, litora viverra curae proin.',
],
[
'visibility' => 1,
'title' => 'Privacy Policy',
'slug' => 'privacy-policy',
'content' => 'Sit orci justo augue maecenas laoreet consectetur natoque magnis in viverra sagittis, himenaeos urna facilisis mus proin primis diam accumsan tristique inceptos. Primis quisque posuere sit praesent lobortis feugiat semper convallis facilisis, vivamus gravida ligula nostra curae eu donec duis parturient senectus, arcu dolor viverra penatibus natoque cum nisi commodo. Litora sociis mauris justo nullam suspendisse mattis maecenas nascetur congue phasellus cras ultricies posuere donec, dapibus egestas diam lacus ornare montes senectus tincidunt eu taciti sed consequat.',
],
[
'visibility' => 1,
'title' => 'Cookie Policy',
'slug' => 'cookie-policy',
'content' => 'Metus penatibus ligula dolor natoque non habitasse laoreet facilisis, libero vivamus eget semper vulputate interdum integer, phasellus lorem enim blandit consectetur nullam sollicitudin. Hendrerit interdum luctus ut in molestie himenaeos eros cum laoreet parturient est, eu lectus hac et netus viverra dictumst congue elit sem senectus litora, fames scelerisque adipiscing inceptos fringilla montes sociosqu suscipit auctor potenti. Elementum lacus vulputate viverra ac morbi ligula ipsum facilisi, sit eu imperdiet lacinia congue dis vitae.',
],
],
'content' => [
[
'name' => 'section_features',
'value' => '1',
'regular' => [
[
'name' => 'allowed_recaptcha',
'value' => 0,
],
],
[
'name' => 'section_feature_boxes',
'value' => '1',
],
[
'name' => 'section_pricing_content',
'value' => '1',
],
[
'name' => 'section_get_started',
'value' => '1',
],
[
'name' => 'header_title',
'value' => 'Simple <span style="color: #41B883">&</span> Powerful Personal Cloud Storage',
],
[
'name' => 'header_description',
'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
],
[
'name' => 'features_title',
'value' => 'The Fastest Growing <span style="color: #41B883">File Manager</span> on the CodeCanyon Market',
],
[
'name' => 'features_description',
'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
],
[
'name' => 'feature_title_1',
'value' => 'Truly Freedom',
],
[
'name' => 'feature_description_1',
'value' => 'You have full control over VueFileManager, no third authorities will control your service or usage, only you.',
],
[
'name' => 'feature_title_2',
'value' => 'The Sky is the Limit',
],
[
'name' => 'feature_description_2',
'value' => 'VueFileManager is cloud storage software. You have to install and running application on your own server hosting.',
],
[
'name' => 'feature_title_3',
'value' => 'No Monthly Fees',
],
[
'name' => 'feature_description_3',
'value' => 'When you running VueFileManager on your own server hosting, anybody can\'t control your content or resell your user data. Your data is safe.',
],
[
'name' => 'pricing_title',
'value' => 'Pick the <span style="color: #41B883;">Best Plan</span> For Your Needs',
],
[
'name' => 'pricing_description',
'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
],
[
'name' => 'get_started_title',
'value' => 'Ready to Get <span style="color: #41B883">Started</span><br> With Us?',
],
[
'name' => 'get_started_description',
'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
],
[
'name' => 'footer_content',
'value' => '© 2020 Simple & Powerful Personal Cloud Storage. Developed by <a href="https://hi5ve.digital" target="_blank">Hi5Ve.Digital</a>',
'extended' => [
],
],
];
];

View File

@@ -1,7 +1,6 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Laravel CORS Options

View File

@@ -0,0 +1,11 @@
<?php
/*
* Place here your custom translations for your project.
* These translation will be automatically seeded after you
* run setup:dev script or installing app via Setup Wizard Tool
*/
return [
'custom' => 'translation',
];

View File

@@ -3,7 +3,6 @@
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
@@ -34,63 +33,66 @@ return [
*/
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
'dump' => [
'dump_binary_path' => env('DB_MYSQLDUMP_PATH', 'usr/bin'), // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 360,
],
],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
'schema' => 'public',
'sslmode' => 'prefer',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'driver' => 'sqlsrv',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],
],
/*
@@ -118,30 +120,27 @@ return [
*/
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
];

View File

@@ -0,0 +1,557 @@
<?php
// List based on michenriksen/disposable-email-provider-domains
// https://gist.github.com/michenriksen/8710649
return [
'0815.ru',
'0wnd.net',
'0wnd.org',
'10minutemail.co.za',
'10minutemail.com',
'123-m.com',
'1fsdfdsfsdf.tk',
'1pad.de',
'20minutemail.com',
'21cn.com',
'2fdgdfgdfgdf.tk',
'2prong.com',
'30minutemail.com',
'33mail.com',
'3trtretgfrfe.tk',
'4gfdsgfdgfd.tk',
'4warding.com',
'5ghgfhfghfgh.tk',
'6hjgjhgkilkj.tk',
'6paq.com',
'7tags.com',
'9ox.net',
'a-bc.net',
'agedmail.com',
'ama-trade.de',
'amilegit.com',
'amiri.net',
'amiriindustries.com',
'anonmails.de',
'anonymbox.com',
'antichef.com',
'antichef.net',
'antireg.ru',
'antispam.de',
'antispammail.de',
'armyspy.com',
'artman-conception.com',
'azmeil.tk',
'baxomale.ht.cx',
'beefmilk.com',
'bigstring.com',
'binkmail.com',
'bio-muesli.net',
'bobmail.info',
'bodhi.lawlita.com',
'bofthew.com',
'bootybay.de',
'boun.cr',
'bouncr.com',
'breakthru.com',
'brefmail.com',
'bsnow.net',
'bspamfree.org',
'bugmenot.com',
'bund.us',
'burstmail.info',
'buymoreplays.com',
'byom.de',
'c2.hu',
'card.zp.ua',
'casualdx.com',
'cek.pm',
'centermail.com',
'centermail.net',
'chammy.info',
'childsavetrust.org',
'chogmail.com',
'choicemail1.com',
'clixser.com',
'cmail.net',
'cmail.org',
'coldemail.info',
'cool.fr.nf',
'courriel.fr.nf',
'courrieltemporaire.com',
'crapmail.org',
'cust.in',
'cuvox.de',
'd3p.dk',
'dacoolest.com',
'dandikmail.com',
'dayrep.com',
'dcemail.com',
'deadaddress.com',
'deadspam.com',
'delikkt.de',
'despam.it',
'despammed.com',
'devnullmail.com',
'dfgh.net',
'digitalsanctuary.com',
'dingbone.com',
'disposableaddress.com',
'disposableemailaddresses.com',
'disposableinbox.com',
'dispose.it',
'dispostable.com',
'dodgeit.com',
'dodgit.com',
'donemail.ru',
'dontreg.com',
'dontsendmespam.de',
'drdrb.net',
'dump-email.info',
'dumpandjunk.com',
'dumpyemail.com',
'e-mail.com',
'e-mail.org',
'e4ward.com',
'easytrashmail.com',
'einmalmail.de',
'einrot.com',
'eintagsmail.de',
'emailgo.de',
'emailias.com',
'emaillime.com',
'emailsensei.com',
'emailtemporanea.com',
'emailtemporanea.net',
'emailtemporar.ro',
'emailtemporario.com.br',
'emailthe.net',
'emailtmp.com',
'emailwarden.com',
'emailx.at.hm',
'emailxfer.com',
'emeil.in',
'emeil.ir',
'emz.net',
'ero-tube.org',
'evopo.com',
'explodemail.com',
'express.net.ua',
'eyepaste.com',
'fakeinbox.com',
'fakeinformation.com',
'fansworldwide.de',
'fantasymail.de',
'fightallspam.com',
'filzmail.com',
'fivemail.de',
'fleckens.hu',
'frapmail.com',
'friendlymail.co.uk',
'fuckingduh.com',
'fudgerub.com',
'fyii.de',
'garliclife.com',
'gehensiemirnichtaufdensack.de',
'get2mail.fr',
'getairmail.com',
'getmails.eu',
'getonemail.com',
'giantmail.de',
'girlsundertheinfluence.com',
'gishpuppy.com',
'gmial.com',
'goemailgo.com',
'gotmail.net',
'gotmail.org',
'gotti.otherinbox.com',
'great-host.in',
'greensloth.com',
'grr.la',
'gsrv.co.uk',
'guerillamail.biz',
'guerillamail.com',
'guerrillamail.biz',
'guerrillamail.com',
'guerrillamail.de',
'guerrillamail.info',
'guerrillamail.net',
'guerrillamail.org',
'guerrillamailblock.com',
'gustr.com',
'harakirimail.com',
'hat-geld.de',
'hatespam.org',
'herp.in',
'hidemail.de',
'hidzz.com',
'hmamail.com',
'hopemail.biz',
'ieh-mail.de',
'ikbenspamvrij.nl',
'imails.info',
'inbax.tk',
'inbox.si',
'inboxalias.com',
'inboxclean.com',
'inboxclean.org',
'infocom.zp.ua',
'instant-mail.de',
'ip6.li',
'irish2me.com',
'iwi.net',
'jetable.com',
'jetable.fr.nf',
'jetable.net',
'jetable.org',
'jnxjn.com',
'jourrapide.com',
'jsrsolutions.com',
'kasmail.com',
'kaspop.com',
'killmail.com',
'killmail.net',
'klassmaster.com',
'klzlk.com',
'koszmail.pl',
'kurzepost.de',
'lawlita.com',
'letthemeatspam.com',
'lhsdv.com',
'lifebyfood.com',
'link2mail.net',
'litedrop.com',
'lol.ovpn.to',
'lolfreak.net',
'lookugly.com',
'lortemail.dk',
'lr78.com',
'lroid.com',
'lukop.dk',
'm21.cc',
'mail-filter.com',
'mail-temporaire.fr',
'mail.by',
'mail.mezimages.net',
'mail.zp.ua',
'mail1a.de',
'mail21.cc',
'mail2rss.org',
'mail333.com',
'mailbidon.com',
'mailbiz.biz',
'mailblocks.com',
'mailbucket.org',
'mailcat.biz',
'mailcatch.com',
'mailde.de',
'mailde.info',
'maildrop.cc',
'maileimer.de',
'mailexpire.com',
'mailfa.tk',
'mailforspam.com',
'mailfreeonline.com',
'mailguard.me',
'mailin8r.com',
'mailinater.com',
'mailinator.com',
'mailinator.net',
'mailinator.org',
'mailinator2.com',
'mailincubator.com',
'mailismagic.com',
'mailme.lv',
'mailme24.com',
'mailmetrash.com',
'mailmoat.com',
'mailms.com',
'mailnesia.com',
'mailnull.com',
'mailorg.org',
'mailpick.biz',
'mailrock.biz',
'mailscrap.com',
'mailshell.com',
'mailsiphon.com',
'mailtemp.info',
'mailtome.de',
'mailtothis.com',
'mailtrash.net',
'mailtv.net',
'mailtv.tv',
'mailzilla.com',
'makemetheking.com',
'manybrain.com',
'mbx.cc',
'mega.zik.dj',
'meinspamschutz.de',
'meltmail.com',
'messagebeamer.de',
'mezimages.net',
'ministry-of-silly-walks.de',
'mintemail.com',
'misterpinball.de',
'moncourrier.fr.nf',
'monemail.fr.nf',
'monmail.fr.nf',
'monumentmail.com',
'mt2009.com',
'mt2014.com',
'mycard.net.ua',
'mycleaninbox.net',
'mymail-in.net',
'mypacks.net',
'mypartyclip.de',
'myphantomemail.com',
'mysamp.de',
'mytempemail.com',
'mytempmail.com',
'mytrashmail.com',
'nabuma.com',
'neomailbox.com',
'nepwk.com',
'nervmich.net',
'nervtmich.net',
'netmails.com',
'netmails.net',
'neverbox.com',
'nice-4u.com',
'nincsmail.hu',
'nnh.com',
'no-spam.ws',
'noblepioneer.com',
'nomail.pw',
'nomail.xl.cx',
'nomail2me.com',
'nomorespamemails.com',
'nospam.ze.tc',
'nospam4.us',
'nospamfor.us',
'nospammail.net',
'notmailinator.com',
'nowhere.org',
'nowmymail.com',
'nurfuerspam.de',
'nus.edu.sg',
'objectmail.com',
'obobbo.com',
'odnorazovoe.ru',
'oneoffemail.com',
'onewaymail.com',
'onlatedotcom.info',
'online.ms',
'opayq.com',
'ordinaryamerican.net',
'otherinbox.com',
'ovpn.to',
'owlpic.com',
'pancakemail.com',
'pcusers.otherinbox.com',
'pjjkp.com',
'plexolan.de',
'poczta.onet.pl',
'politikerclub.de',
'poofy.org',
'pookmail.com',
'privacy.net',
'privatdemail.net',
'proxymail.eu',
'prtnx.com',
'putthisinyourspamdatabase.com',
'putthisinyourspamdatabase.com',
'qq.com',
'quickinbox.com',
'rcpt.at',
'reallymymail.com',
'realtyalerts.ca',
'recode.me',
'recursor.net',
'reliable-mail.com',
'rhyta.com',
'rmqkr.net',
'royal.net',
'rtrtr.com',
's0ny.net',
'safe-mail.net',
'safersignup.de',
'safetymail.info',
'safetypost.de',
'saynotospams.com',
'schafmail.de',
'schrott-email.de',
'secretemail.de',
'secure-mail.biz',
'senseless-entertainment.com',
'services391.com',
'sharklasers.com',
'shieldemail.com',
'shiftmail.com',
'shitmail.me',
'shitware.nl',
'shmeriously.com',
'shortmail.net',
'sibmail.com',
'sinnlos-mail.de',
'slapsfromlastnight.com',
'slaskpost.se',
'smashmail.de',
'smellfear.com',
'snakemail.com',
'sneakemail.com',
'sneakmail.de',
'snkmail.com',
'sofimail.com',
'solvemail.info',
'sogetthis.com',
'soodonims.com',
'spam4.me',
'spamail.de',
'spamarrest.com',
'spambob.net',
'spambog.ru',
'spambox.us',
'spamcannon.com',
'spamcannon.net',
'spamcon.org',
'spamcorptastic.com',
'spamcowboy.com',
'spamcowboy.net',
'spamcowboy.org',
'spamday.com',
'spamex.com',
'spamfree.eu',
'spamfree24.com',
'spamfree24.de',
'spamfree24.org',
'spamgoes.in',
'spamgourmet.com',
'spamgourmet.net',
'spamgourmet.org',
'spamherelots.com',
'spamherelots.com',
'spamhereplease.com',
'spamhereplease.com',
'spamhole.com',
'spamify.com',
'spaml.de',
'spammotel.com',
'spamobox.com',
'spamslicer.com',
'spamspot.com',
'spamthis.co.uk',
'spamtroll.net',
'speed.1s.fr',
'spoofmail.de',
'stuffmail.de',
'super-auswahl.de',
'supergreatmail.com',
'supermailer.jp',
'superrito.com',
'superstachel.de',
'suremail.info',
'talkinator.com',
'teewars.org',
'teleworm.com',
'teleworm.us',
'temp-mail.org',
'temp-mail.ru',
'tempe-mail.com',
'tempemail.co.za',
'tempemail.com',
'tempemail.net',
'tempemail.net',
'tempinbox.co.uk',
'tempinbox.com',
'tempmail.eu',
'tempmaildemo.com',
'tempmailer.com',
'tempmailer.de',
'tempomail.fr',
'temporaryemail.net',
'temporaryforwarding.com',
'temporaryinbox.com',
'temporarymailaddress.com',
'tempthe.net',
'thankyou2010.com',
'thc.st',
'thelimestones.com',
'thisisnotmyrealemail.com',
'thismail.net',
'throwawayemailaddress.com',
'tilien.com',
'tittbit.in',
'tizi.com',
'tmailinator.com',
'toomail.biz',
'topranklist.de',
'tradermail.info',
'trash-mail.at',
'trash-mail.com',
'trash-mail.de',
'trash2009.com',
'trashdevil.com',
'trashemail.de',
'trashmail.at',
'trashmail.com',
'trashmail.de',
'trashmail.me',
'trashmail.net',
'trashmail.org',
'trashymail.com',
'trialmail.de',
'trillianpro.com',
'twinmail.de',
'tyldd.com',
'uggsrock.com',
'umail.net',
'uroid.com',
'us.af',
'venompen.com',
'veryrealemail.com',
'viditag.com',
'viralplays.com',
'vpn.st',
'vsimcard.com',
'vubby.com',
'wasteland.rfc822.org',
'webemail.me',
'weg-werf-email.de',
'wegwerf-emails.de',
'wegwerfadresse.de',
'wegwerfemail.com',
'wegwerfemail.de',
'wegwerfmail.de',
'wegwerfmail.info',
'wegwerfmail.net',
'wegwerfmail.org',
'wh4f.org',
'whyspam.me',
'willhackforfood.biz',
'willselfdestruct.com',
'winemaven.info',
'wronghead.com',
'www.e4ward.com',
'www.mailinator.com',
'wwwnew.eu',
'x.ip6.li',
'xagloo.com',
'xemaps.com',
'xents.com',
'xmaily.com',
'xoxy.net',
'yep.it',
'yogamaven.com',
'yopmail.com',
'yopmail.fr',
'yopmail.net',
'yourdomain.com',
'yuurok.com',
'z1p.biz',
'za.com',
'zehnminuten.de',
'zehnminutenmail.de',
'zippymail.info',
'zoemail.net',
'zomg.info',
];

View File

@@ -1,7 +1,6 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Filesystem Disk
@@ -13,20 +12,7 @@ return [
|
*/
'default' => env('FILESYSTEM_DRIVER', 'local'),
/*
|--------------------------------------------------------------------------
| Default Cloud Filesystem Disk
|--------------------------------------------------------------------------
|
| Many applications store files both locally and in the cloud. For this
| reason, you may specify a default "cloud" driver here. This driver
| will be bound as the Cloud disk implementation in the container.
|
*/
'cloud' => env('FILESYSTEM_CLOUD', 's3'),
'default' => env('FILESYSTEM_DISK', 'local'),
/*
|--------------------------------------------------------------------------
@@ -42,55 +28,39 @@ return [
*/
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'root' => storage_path('app'),
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'endpoint' => env('AWS_URL'),
'driver' => 's3',
'key' => env('S3_ACCESS_KEY_ID'),
'secret' => env('S3_SECRET_ACCESS_KEY'),
'region' => env('S3_DEFAULT_REGION'),
'bucket' => env('S3_BUCKET'),
'endpoint' => env('S3_URL'),
'visibility' => 'private',
],
'spaces' => [
'driver' => 's3',
'key' => env('DO_SPACES_KEY'),
'secret' => env('DO_SPACES_SECRET'),
'endpoint' => env('DO_SPACES_ENDPOINT'),
'region' => env('DO_SPACES_REGION'),
'bucket' => env('DO_SPACES_BUCKET'),
'ftp' => [
'driver' => 'ftp',
'host' => env('FTP_HOST'),
'username' => env('FTP_USERNAME'),
'password' => env('FTP_PASSWORD'),
],
'wasabi' => [
'driver' => 's3',
'key' => env('WASABI_KEY'),
'secret' => env('WASABI_SECRET'),
'endpoint' => env('WASABI_ENDPOINT'),
'region' => env('WASABI_REGION'),
'bucket' => env('WASABI_BUCKET'),
'azure' => [
'driver' => 'azure',
'name' => env('AZURE_STORAGE_NAME'),
'key' => env('AZURE_STORAGE_KEY'),
'container' => env('AZURE_STORAGE_CONTAINER'),
'url' => env('AZURE_STORAGE_URL'),
'prefix' => null,
'connection_string' => env('AZURE_STORAGE_CONNECTION_STRING'), // optional, will override default endpoint builder
],
'backblaze' => [
'driver' => 's3',
'key' => env('BACKBLAZE_KEY'),
'secret' => env('BACKBLAZE_SECRET'),
'endpoint' => env('BACKBLAZE_ENDPOINT'),
'region' => env('BACKBLAZE_REGION'),
'bucket' => env('BACKBLAZE_BUCKET'),
],
],
];

139
config/fortify.php Normal file
View File

@@ -0,0 +1,139 @@
<?php
use Laravel\Fortify\Features;
use App\Providers\RouteServiceProvider;
return [
/*
|--------------------------------------------------------------------------
| Fortify Guard
|--------------------------------------------------------------------------
|
| Here you may specify which authentication guard Fortify will use while
| authenticating users. This value should correspond with one of your
| guards that is already present in your "auth" configuration file.
|
*/
'guard' => 'web',
/*
|--------------------------------------------------------------------------
| Fortify Password Broker
|--------------------------------------------------------------------------
|
| Here you may specify which password broker Fortify can use when a user
| is resetting their password. This configured value should match one
| of your password brokers setup in your "auth" configuration file.
|
*/
'passwords' => 'users',
/*
|--------------------------------------------------------------------------
| Username / Email
|--------------------------------------------------------------------------
|
| This value defines which model attribute should be considered as your
| application's "username" field. Typically, this might be the email
| address of the users but you are free to change this value here.
|
| Out of the box, Fortify expects forgot password and reset password
| requests to have a field named 'email'. If the application uses
| another name for the field you may define it below as needed.
|
*/
'username' => 'email',
'email' => 'email',
/*
|--------------------------------------------------------------------------
| Home Path
|--------------------------------------------------------------------------
|
| Here you may configure the path where users will get redirected during
| authentication or password reset when the operations are successful
| and the user is authenticated. You are free to change this value.
|
*/
'home' => RouteServiceProvider::HOME,
/*
|--------------------------------------------------------------------------
| Fortify Routes Prefix / Subdomain
|--------------------------------------------------------------------------
|
| Here you may specify which prefix Fortify will assign to all the routes
| that it registers with the application. If necessary, you may change
| subdomain under which all of the Fortify routes will be available.
|
*/
'prefix' => '',
'domain' => null,
/*
|--------------------------------------------------------------------------
| Fortify Routes Middleware
|--------------------------------------------------------------------------
|
| Here you may specify which middleware Fortify will assign to the routes
| that it registers with the application. If necessary, you may change
| these middleware but typically this provided default is preferred.
|
*/
'middleware' => ['web'],
/*
|--------------------------------------------------------------------------
| Rate Limiting
|--------------------------------------------------------------------------
|
| By default, Fortify will throttle logins to five requests per minute for
| every email and IP address combination. However, if you would like to
| specify a custom rate limiter to call then you may specify it here.
|
*/
'limiters' => [
'login' => 'login',
'two-factor' => 'two-factor',
],
/*
|--------------------------------------------------------------------------
| Register View Routes
|--------------------------------------------------------------------------
|
| Here you may specify if the routes returning views should be disabled as
| you may not need them when building your own application. This may be
| especially true if you're writing a custom single-page application.
|
*/
'views' => true,
/*
|--------------------------------------------------------------------------
| Features
|--------------------------------------------------------------------------
|
| Some of the Fortify features are optional. You may disable the features
| by removing them from this array. You're free to only remove some of
| these features or you can even remove all of these if you need to.
|
*/
'features' => [
Features::twoFactorAuthentication([
'confirm' => true,
'confirmPassword' => true,
]),
],
];

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