mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-05-13 08:45:01 +00:00
Merge remote-tracking branch 'origin/remote-upload-merge'
# Conflicts: # public/mix-manifest.json
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
APP_NAME=Laravel
|
APP_NAME=Laravel
|
||||||
APP_ENV=local
|
APP_ENV=local
|
||||||
APP_KEY=base64:H+C6Ovly2gudhK4Zyn0EOED/ZOKNXthKIr6fv6bXJUM=
|
APP_KEY=base64:k5FduZ4Vu5ONvcJysN6xZYlix606oNocewyXSyOEspQ=
|
||||||
APP_DEBUG=true
|
APP_DEBUG=true
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
APP_DEMO=false
|
APP_DEMO=false
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ return [
|
|||||||
'container' => env('AZURE_STORAGE_CONTAINER'),
|
'container' => env('AZURE_STORAGE_CONTAINER'),
|
||||||
'url' => env('AZURE_STORAGE_URL'),
|
'url' => env('AZURE_STORAGE_URL'),
|
||||||
'prefix' => null,
|
'prefix' => null,
|
||||||
'connection_string' => env('AZURE_STORAGE_CONNECTION_STRING') // optional, will override default endpoint builder
|
'connection_string' => env('AZURE_STORAGE_CONNECTION_STRING'), // optional, will override default endpoint builder
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -942,5 +942,12 @@ return [
|
|||||||
'paste_code_from_2fa_app' => 'Paste the latest code from 2fa app...',
|
'paste_code_from_2fa_app' => 'Paste the latest code from 2fa app...',
|
||||||
'zero_for_unlimited_members' => 'Type -1 to set unlimited team members.',
|
'zero_for_unlimited_members' => 'Type -1 to set unlimited team members.',
|
||||||
'max_team_members' => 'Max Team Members',
|
'max_team_members' => 'Max Team Members',
|
||||||
|
'remote_upload' => 'Remote Upload',
|
||||||
|
'upload_files_remotely' => 'Upload Files Remotely',
|
||||||
|
'remote_links' => 'Remote Links',
|
||||||
|
'remote_links_help' => 'For every line paste one link',
|
||||||
|
'paste_remote_links_here' => 'Paste your remote links here...',
|
||||||
|
'remote_download_submitted' => 'Your links will be downloaded as soon as possible',
|
||||||
|
'remote_download_processed' => 'Your links were processed successfully',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
+19
-19
@@ -1,27 +1,27 @@
|
|||||||
{
|
{
|
||||||
"/js/main.js": "/js/main.js",
|
"/js/main.js": "/js/main.js",
|
||||||
"/chunks/request.js": "/chunks/request.js?id=6770484e564115b3",
|
"/chunks/request.js": "/chunks/request.js?id=b493de3b8cf4a8f2",
|
||||||
"/chunks/request-upload.js": "/chunks/request-upload.js?id=eb234dacadd33d8b",
|
"/chunks/request-upload.js": "/chunks/request-upload.js?id=efb89edeaed37404",
|
||||||
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=19a0784e59d768ec",
|
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=19a0784e59d768ec",
|
||||||
"/chunks/status-check.js": "/chunks/status-check.js?id=9239a586761b912d",
|
"/chunks/status-check.js": "/chunks/status-check.js?id=f40938d1fb43820f",
|
||||||
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=ba76b9a8adbfdc0b",
|
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=ba76b9a8adbfdc0b",
|
||||||
"/chunks/database.js": "/chunks/database.js?id=5113b0d4284f764f",
|
"/chunks/database.js": "/chunks/database.js?id=5113b0d4284f764f",
|
||||||
"/chunks/environment.js": "/chunks/environment.js?id=e4fdb87ff173d48a",
|
"/chunks/environment.js": "/chunks/environment.js?id=784c2442268b36dc",
|
||||||
"/chunks/app-setup.js": "/chunks/app-setup.js?id=cbe7bfed06400736",
|
"/chunks/app-setup.js": "/chunks/app-setup.js?id=cbe7bfed06400736",
|
||||||
"/chunks/admin-account.js": "/chunks/admin-account.js?id=78d257775f5fc485",
|
"/chunks/admin-account.js": "/chunks/admin-account.js?id=78d257775f5fc485",
|
||||||
"/chunks/shared.js": "/chunks/shared.js?id=c0fa346721760ad2",
|
"/chunks/shared.js": "/chunks/shared.js?id=54733651dfb0af9f",
|
||||||
"/chunks/shared/browser.js": "/chunks/shared/browser.js?id=6020e9e778bd00e5",
|
"/chunks/shared/browser.js": "/chunks/shared/browser.js?id=d2fff07a2bc7af3f",
|
||||||
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=a6063bed9be75a09",
|
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=a6063bed9be75a09",
|
||||||
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=b5519d193bce2339",
|
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=b5519d193bce2339",
|
||||||
"/chunks/not-found.js": "/chunks/not-found.js?id=d31bd699138cf828",
|
"/chunks/not-found.js": "/chunks/not-found.js?id=d31bd699138cf828",
|
||||||
"/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=26798085f527d955",
|
"/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=26798085f527d955",
|
||||||
"/chunks/admin.js": "/chunks/admin.js?id=a881c02da23d7112",
|
"/chunks/admin.js": "/chunks/admin.js?id=780ebe14261335f6",
|
||||||
"/chunks/dashboard.js": "/chunks/dashboard.js?id=5ab55a12214433c8",
|
"/chunks/dashboard.js": "/chunks/dashboard.js?id=5ab55a12214433c8",
|
||||||
"/chunks/invoices.js": "/chunks/invoices.js?id=799928609f57ca10",
|
"/chunks/invoices.js": "/chunks/invoices.js?id=799928609f57ca10",
|
||||||
"/chunks/subscriptions.js": "/chunks/subscriptions.js?id=a0c4f59d0ec4aee0",
|
"/chunks/subscriptions.js": "/chunks/subscriptions.js?id=a0c4f59d0ec4aee0",
|
||||||
"/chunks/pages.js": "/chunks/pages.js?id=bb5cc8327ca846a3",
|
"/chunks/pages.js": "/chunks/pages.js?id=bb5cc8327ca846a3",
|
||||||
"/chunks/page-edit.js": "/chunks/page-edit.js?id=0bdc8a5935fd2197",
|
"/chunks/page-edit.js": "/chunks/page-edit.js?id=0bdc8a5935fd2197",
|
||||||
"/chunks/plans.js": "/chunks/plans.js?id=76398906ad873fc3",
|
"/chunks/plans.js": "/chunks/plans.js?id=1d04fbdca84afd42",
|
||||||
"/chunks/users.js": "/chunks/users.js?id=b6629338e26b8313",
|
"/chunks/users.js": "/chunks/users.js?id=b6629338e26b8313",
|
||||||
"/chunks/user-create.js": "/chunks/user-create.js?id=40254ae98547761e",
|
"/chunks/user-create.js": "/chunks/user-create.js?id=40254ae98547761e",
|
||||||
"/chunks/plan-create/fixed.js": "/chunks/plan-create/fixed.js?id=18f9d1ab17996507",
|
"/chunks/plan-create/fixed.js": "/chunks/plan-create/fixed.js?id=18f9d1ab17996507",
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
"/chunks/app-settings.js": "/chunks/app-settings.js?id=b0d1082fdcbbd17c",
|
"/chunks/app-settings.js": "/chunks/app-settings.js?id=b0d1082fdcbbd17c",
|
||||||
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=8ba3feb2cc81a2c3",
|
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=8ba3feb2cc81a2c3",
|
||||||
"/chunks/app-index.js": "/chunks/app-index.js?id=0c50096e8de09288",
|
"/chunks/app-index.js": "/chunks/app-index.js?id=0c50096e8de09288",
|
||||||
"/chunks/app-environment.js": "/chunks/app-environment.js?id=3436286fd625f8b7",
|
"/chunks/app-environment.js": "/chunks/app-environment.js?id=f5cdd68ebc6a6b54",
|
||||||
"/chunks/app-others.js": "/chunks/app-others.js?id=dd23507db4551d0a",
|
"/chunks/app-others.js": "/chunks/app-others.js?id=dd23507db4551d0a",
|
||||||
"/chunks/app-sign-in-out.js": "/chunks/app-sign-in-out.js?id=f79027ce1f1f4c4b",
|
"/chunks/app-sign-in-out.js": "/chunks/app-sign-in-out.js?id=f79027ce1f1f4c4b",
|
||||||
"/chunks/app-adsense.js": "/chunks/app-adsense.js?id=c7e7dc2975317062",
|
"/chunks/app-adsense.js": "/chunks/app-adsense.js?id=c7e7dc2975317062",
|
||||||
@@ -53,22 +53,22 @@
|
|||||||
"/chunks/contact-us.js": "/chunks/contact-us.js?id=ea99d85aa3500595",
|
"/chunks/contact-us.js": "/chunks/contact-us.js?id=ea99d85aa3500595",
|
||||||
"/chunks/successfully-email-verified.js": "/chunks/successfully-email-verified.js?id=c26cb144101e7c79",
|
"/chunks/successfully-email-verified.js": "/chunks/successfully-email-verified.js?id=c26cb144101e7c79",
|
||||||
"/chunks/successfully-email-send.js": "/chunks/successfully-email-send.js?id=170d814982e1c475",
|
"/chunks/successfully-email-send.js": "/chunks/successfully-email-send.js?id=170d814982e1c475",
|
||||||
"/chunks/sign-in.js": "/chunks/sign-in.js?id=c648cb698176a993",
|
"/chunks/sign-in.js": "/chunks/sign-in.js?id=5f7111f8ee7639bf",
|
||||||
"/chunks/sign-up.js": "/chunks/sign-up.js?id=3d7559511768cd0e",
|
"/chunks/sign-up.js": "/chunks/sign-up.js?id=80da89f329c514fc",
|
||||||
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=27cda9364b6593d8",
|
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=27cda9364b6593d8",
|
||||||
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=2f0401ee2fc148c4",
|
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=2f0401ee2fc148c4",
|
||||||
"/chunks/settings.js": "/chunks/settings.js?id=13f38ad770e862c6",
|
"/chunks/settings.js": "/chunks/settings.js?id=c8a4915f96c762d4",
|
||||||
"/chunks/profile.js": "/chunks/profile.js?id=3e24bb5e1f52d4bb",
|
"/chunks/profile.js": "/chunks/profile.js?id=3e24bb5e1f52d4bb",
|
||||||
"/chunks/settings-password.js": "/chunks/settings-password.js?id=d00bf503d8126dc4",
|
"/chunks/settings-password.js": "/chunks/settings-password.js?id=d00bf503d8126dc4",
|
||||||
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=092e324aad54656b",
|
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=092e324aad54656b",
|
||||||
"/chunks/billing.js": "/chunks/billing.js?id=115c25478cee576d",
|
"/chunks/billing.js": "/chunks/billing.js?id=115c25478cee576d",
|
||||||
"/chunks/platform.js": "/chunks/platform.js?id=622fe102512635e6",
|
"/chunks/platform.js": "/chunks/platform.js?id=907e530c6cc415bc",
|
||||||
"/chunks/files.js": "/chunks/files.js?id=e91e9fa66c979280",
|
"/chunks/files.js": "/chunks/files.js?id=aaea9173f7697d6e",
|
||||||
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=bc93b317f1ddc35a",
|
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=4bab41df721a6fc6",
|
||||||
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=dc31d8d4dd8220bb",
|
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=c62bc3eb07de20df",
|
||||||
"/chunks/trash.js": "/chunks/trash.js?id=dff5da6dd52cf85a",
|
"/chunks/trash.js": "/chunks/trash.js?id=31e826373e0d01f8",
|
||||||
"/chunks/team-folders.js": "/chunks/team-folders.js?id=8926350140fe5aa2",
|
"/chunks/team-folders.js": "/chunks/team-folders.js?id=4babe7db8a9a3a16",
|
||||||
"/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=b9dcedcf37d523b5",
|
"/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=cfb073052d66d07c",
|
||||||
"/chunks/invitation.js": "/chunks/invitation.js?id=424b2783d9785a09",
|
"/chunks/invitation.js": "/chunks/invitation.js?id=424b2783d9785a09",
|
||||||
"/css/tailwind.css": "/css/tailwind.css",
|
"/css/tailwind.css": "/css/tailwind.css",
|
||||||
"/css/app.css": "/css/app.css"
|
"/css/app.css": "/css/app.css"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<div class="mr-3 ml-0 flex items-center lg:mx-3">
|
<div class="mr-3 ml-0 flex items-center lg:mx-3">
|
||||||
<span
|
<span
|
||||||
class="inline-block max-w-[150px] xs:max-w-[230px] md:max-w-[290px] overflow-hidden text-ellipsis whitespace-nowrap text-sm font-bold"
|
class="inline-block max-w-[150px] xs:max-w-[220px] md:max-w-[240px] overflow-hidden text-ellipsis whitespace-nowrap text-sm font-bold"
|
||||||
>
|
>
|
||||||
{{ currentFile.data.attributes.name }}
|
{{ currentFile.data.attributes.name }}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -12,17 +12,22 @@
|
|||||||
:action="$t('create_something')"
|
:action="$t('create_something')"
|
||||||
/>
|
/>
|
||||||
<PopoverItem name="desktop-create" side="left">
|
<PopoverItem name="desktop-create" side="left">
|
||||||
<OptionGroup :title="$t('upload')">
|
<OptionGroup :title="$t('frequently_used')">
|
||||||
<OptionUpload :title="$t('upload_files')" type="file" />
|
<OptionUpload :title="$t('upload_files')" type="file" />
|
||||||
<OptionUpload :title="$t('upload_folder')" type="folder" />
|
|
||||||
</OptionGroup>
|
|
||||||
<OptionGroup :title="$t('create')">
|
|
||||||
<Option
|
<Option
|
||||||
@click.native="$createFolder"
|
@click.native="$createFolder"
|
||||||
:title="$t('create_folder')"
|
:title="$t('create_folder')"
|
||||||
icon="folder-plus"
|
icon="folder-plus"
|
||||||
/>
|
/>
|
||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
|
<OptionGroup :title="$t('others')">
|
||||||
|
<OptionUpload :title="$t('upload_folder')" type="folder" />
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
/>
|
||||||
|
</OptionGroup>
|
||||||
</PopoverItem>
|
</PopoverItem>
|
||||||
</PopoverWrapper>
|
</PopoverWrapper>
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,11 @@
|
|||||||
:title="$t('upload_folder')"
|
:title="$t('upload_folder')"
|
||||||
type="folder"
|
type="folder"
|
||||||
/>
|
/>
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
/>
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createTeamFolder"
|
@click.stop.native="$createTeamFolder"
|
||||||
:class="{ 'is-inactive': canCreateTeamFolder }"
|
:class="{ 'is-inactive': canCreateTeamFolder }"
|
||||||
|
|||||||
@@ -24,17 +24,22 @@
|
|||||||
:action="$t('create_something')"
|
:action="$t('create_something')"
|
||||||
/>
|
/>
|
||||||
<PopoverItem name="desktop-create" side="left">
|
<PopoverItem name="desktop-create" side="left">
|
||||||
<OptionGroup :title="$t('upload')">
|
<OptionGroup :title="$t('frequently_used')">
|
||||||
<OptionUpload :title="$t('upload_files')" type="file" />
|
<OptionUpload :title="$t('upload_files')" type="file" />
|
||||||
<OptionUpload :title="$t('upload_folder')" type="folder" />
|
|
||||||
</OptionGroup>
|
|
||||||
<OptionGroup :title="$t('create')">
|
|
||||||
<Option
|
<Option
|
||||||
@click.native="$createFolder"
|
@click.native="$createFolder"
|
||||||
:title="$t('create_folder')"
|
:title="$t('create_folder')"
|
||||||
icon="folder-plus"
|
icon="folder-plus"
|
||||||
/>
|
/>
|
||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
|
<OptionGroup :title="$t('others')">
|
||||||
|
<OptionUpload :title="$t('upload_folder')" type="folder" />
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
/>
|
||||||
|
</OptionGroup>
|
||||||
</PopoverItem>
|
</PopoverItem>
|
||||||
</PopoverWrapper>
|
</PopoverWrapper>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<!--Menu icon-->
|
<!--Menu icon-->
|
||||||
<div
|
<div
|
||||||
v-if="!isVisibleNavigationBars"
|
v-if="!isVisibleNavigationBars"
|
||||||
@click="toggleNavigationBars"
|
@click.stop="toggleNavigationBars"
|
||||||
class="-mt-0.5 mr-2 hidden cursor-pointer p-2 lg:block"
|
class="-mt-0.5 mr-2 hidden cursor-pointer p-2 lg:block"
|
||||||
>
|
>
|
||||||
<menu-icon size="17" />
|
<menu-icon size="17" />
|
||||||
|
|||||||
@@ -119,6 +119,12 @@
|
|||||||
class="vue-feather group-hover-text-theme"
|
class="vue-feather group-hover-text-theme"
|
||||||
:class="{ 'text-theme': isActive }"
|
:class="{ 'text-theme': isActive }"
|
||||||
/>
|
/>
|
||||||
|
<link2-icon
|
||||||
|
v-if="icon === 'remote-upload'"
|
||||||
|
size="17"
|
||||||
|
class="vue-feather group-hover-text-theme"
|
||||||
|
:class="{ 'text-theme': isActive }"
|
||||||
|
/>
|
||||||
<users-icon
|
<users-icon
|
||||||
v-if="icon === 'users'"
|
v-if="icon === 'users'"
|
||||||
size="17"
|
size="17"
|
||||||
@@ -246,6 +252,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import AlphabetIcon from '../../Icons/AlphabetIcon'
|
import AlphabetIcon from '../../Icons/AlphabetIcon'
|
||||||
import {
|
import {
|
||||||
|
Link2Icon,
|
||||||
UserMinusIcon,
|
UserMinusIcon,
|
||||||
UserCheckIcon,
|
UserCheckIcon,
|
||||||
UserPlusIcon,
|
UserPlusIcon,
|
||||||
@@ -287,6 +294,7 @@ export default {
|
|||||||
name: 'Option',
|
name: 'Option',
|
||||||
props: ['isHoverDisabled', 'isActive', 'title', 'arrow', 'icon'],
|
props: ['isHoverDisabled', 'isActive', 'title', 'arrow', 'icon'],
|
||||||
components: {
|
components: {
|
||||||
|
Link2Icon,
|
||||||
UserMinusIcon,
|
UserMinusIcon,
|
||||||
UserCheckIcon,
|
UserCheckIcon,
|
||||||
UserPlusIcon,
|
UserPlusIcon,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
<div class="flex items-center justify-between px-6 pt-6 pb-6">
|
<div class="flex items-center justify-between px-6 pt-6 pb-6">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<div class="mr-3">
|
<div class="mr-3">
|
||||||
|
<link2-icon v-if="icon === 'remote-upload'" size="18" class="vue-feather text-theme" />
|
||||||
<upload-cloud-icon v-if="icon === 'upload'" size="18" class="vue-feather text-theme" />
|
<upload-cloud-icon v-if="icon === 'upload'" size="18" class="vue-feather text-theme" />
|
||||||
<corner-down-right-icon v-if="icon === 'move'" size="18" class="vue-feather text-theme" />
|
<corner-down-right-icon v-if="icon === 'move'" size="18" class="vue-feather text-theme" />
|
||||||
<share-icon v-if="icon === 'share'" size="18" class="vue-feather text-theme" />
|
<share-icon v-if="icon === 'share'" size="18" class="vue-feather text-theme" />
|
||||||
@@ -25,6 +26,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
|
Link2Icon,
|
||||||
BellIcon,
|
BellIcon,
|
||||||
UploadCloudIcon,
|
UploadCloudIcon,
|
||||||
CreditCardIcon,
|
CreditCardIcon,
|
||||||
@@ -43,6 +45,7 @@ export default {
|
|||||||
name: 'PopupHeader',
|
name: 'PopupHeader',
|
||||||
props: ['title', 'icon'],
|
props: ['title', 'icon'],
|
||||||
components: {
|
components: {
|
||||||
|
Link2Icon,
|
||||||
BellIcon,
|
BellIcon,
|
||||||
UploadCloudIcon,
|
UploadCloudIcon,
|
||||||
CornerDownRightIcon,
|
CornerDownRightIcon,
|
||||||
|
|||||||
@@ -0,0 +1,135 @@
|
|||||||
|
<template>
|
||||||
|
<PopupWrapper name="remote-upload">
|
||||||
|
<PopupHeader :title="$t('upload_files_remotely')" icon="remote-upload" />
|
||||||
|
|
||||||
|
<PopupContent>
|
||||||
|
<ValidationObserver @submit.prevent ref="createForm" v-slot="{ invalid }" tag="form">
|
||||||
|
<ValidationProvider tag="div" mode="passive" name="Remote Links" rules="required" v-slot="{ errors }">
|
||||||
|
<AppInputText
|
||||||
|
:title="$t('remote_links')"
|
||||||
|
:description="$t('remote_links_help')"
|
||||||
|
:error="errors[0]"
|
||||||
|
:is-last="true"
|
||||||
|
>
|
||||||
|
<textarea
|
||||||
|
v-model="links"
|
||||||
|
class="focus-border-theme input-dark whitespace-nowrap"
|
||||||
|
rows="6"
|
||||||
|
:placeholder="$t('paste_remote_links_here')"
|
||||||
|
:class="{ '!border-rose-600': errors[0] }"
|
||||||
|
ref="textarea"
|
||||||
|
>
|
||||||
|
</textarea>
|
||||||
|
</AppInputText>
|
||||||
|
</ValidationProvider>
|
||||||
|
</ValidationObserver>
|
||||||
|
</PopupContent>
|
||||||
|
|
||||||
|
<PopupActions>
|
||||||
|
<ButtonBase class="w-full" @click.native="$closePopup()" button-style="secondary">
|
||||||
|
{{ $t('cancel') }}
|
||||||
|
</ButtonBase>
|
||||||
|
<ButtonBase class="w-full" @click.native="upload" button-style="theme" :loading="loading">
|
||||||
|
{{ $t('upload') }}
|
||||||
|
</ButtonBase>
|
||||||
|
</PopupActions>
|
||||||
|
</PopupWrapper>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { ValidationProvider, ValidationObserver } from 'vee-validate/dist/vee-validate.full'
|
||||||
|
import PopupWrapper from '../Popups/Components/PopupWrapper'
|
||||||
|
import PopupContent from '../Popups/Components/PopupContent'
|
||||||
|
import PopupActions from '../Popups/Components/PopupActions'
|
||||||
|
import PopupHeader from '../Popups/Components/PopupHeader'
|
||||||
|
import AppInputText from '../Forms/Layouts/AppInputText'
|
||||||
|
import { required } from 'vee-validate/dist/rules'
|
||||||
|
import ButtonBase from '../UI/Buttons/ButtonBase'
|
||||||
|
import { events } from '../../bus'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'RemoteUploadPopup',
|
||||||
|
components: {
|
||||||
|
ValidationProvider,
|
||||||
|
ValidationObserver,
|
||||||
|
required,
|
||||||
|
PopupWrapper,
|
||||||
|
PopupContent,
|
||||||
|
PopupHeader,
|
||||||
|
PopupActions,
|
||||||
|
AppInputText,
|
||||||
|
ButtonBase,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
links: undefined,
|
||||||
|
loading: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async upload() {
|
||||||
|
// Validate fields
|
||||||
|
const isValid = await this.$refs.createForm.validate()
|
||||||
|
|
||||||
|
if (!isValid) return
|
||||||
|
|
||||||
|
this.loading = true
|
||||||
|
|
||||||
|
// Get route
|
||||||
|
let route = {
|
||||||
|
RequestUpload: `/api/upload-request/${this.$router.currentRoute.params.token}/upload/remote`,
|
||||||
|
Public: `/api/editor/upload/remote/${this.$router.currentRoute.params.token}`,
|
||||||
|
}[this.$router.currentRoute.name] || '/api/upload/remote'
|
||||||
|
|
||||||
|
let parentId = this.$store.getters.currentFolder
|
||||||
|
? this.$store.getters.currentFolder.data.id
|
||||||
|
: undefined
|
||||||
|
|
||||||
|
axios
|
||||||
|
.post(route, {
|
||||||
|
urls: this.links
|
||||||
|
.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm, "")
|
||||||
|
.split(/\r?\n/),
|
||||||
|
parent_id: parentId,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
events.$emit('toaster', {
|
||||||
|
type: 'success',
|
||||||
|
message: this.$t('remote_download_processed'),
|
||||||
|
})
|
||||||
|
|
||||||
|
events.$emit('popup:close')
|
||||||
|
|
||||||
|
// Reload data
|
||||||
|
this.$getDataByLocation()
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
if (error.response.status === 422) {
|
||||||
|
this.$refs.createForm.setErrors({
|
||||||
|
'Remote Links': error.response.data.message,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
events.$emit('toaster', {
|
||||||
|
type: 'danger',
|
||||||
|
message: this.$t('popup_error.title'),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
events.$on('popup:open', (args) => {
|
||||||
|
if (args.name !== 'remote-upload') return
|
||||||
|
|
||||||
|
this.links = undefined
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
setTimeout(() => this.$refs.textarea.focus(), 100)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -139,6 +139,11 @@
|
|||||||
size="18"
|
size="18"
|
||||||
class="vue-feather text-theme"
|
class="vue-feather text-theme"
|
||||||
/>
|
/>
|
||||||
|
<link2-icon
|
||||||
|
v-if="result.action.value === 'remote-upload'"
|
||||||
|
size="18"
|
||||||
|
class="vue-feather text-theme"
|
||||||
|
/>
|
||||||
<upload-cloud-icon
|
<upload-cloud-icon
|
||||||
v-if="result.action.value === 'RecentUploads'"
|
v-if="result.action.value === 'RecentUploads'"
|
||||||
size="18"
|
size="18"
|
||||||
@@ -309,6 +314,7 @@ import KeyboardHints from './Components/KeyboardHints'
|
|||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash'
|
||||||
import {
|
import {
|
||||||
|
Link2Icon,
|
||||||
FolderPlusIcon,
|
FolderPlusIcon,
|
||||||
SmileIcon,
|
SmileIcon,
|
||||||
BoxIcon,
|
BoxIcon,
|
||||||
@@ -340,6 +346,7 @@ import { mapGetters } from 'vuex'
|
|||||||
export default {
|
export default {
|
||||||
name: 'Spotlight',
|
name: 'Spotlight',
|
||||||
components: {
|
components: {
|
||||||
|
Link2Icon,
|
||||||
FolderPlusIcon,
|
FolderPlusIcon,
|
||||||
SmileIcon,
|
SmileIcon,
|
||||||
KeyboardHints,
|
KeyboardHints,
|
||||||
@@ -598,6 +605,13 @@ export default {
|
|||||||
value: 'create-file-request',
|
value: 'create-file-request',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: this.$t('remote_upload'),
|
||||||
|
action: {
|
||||||
|
type: 'function',
|
||||||
|
value: 'remote-upload',
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
let functionList = [
|
let functionList = [
|
||||||
@@ -813,6 +827,10 @@ export default {
|
|||||||
if (arg.action.value === 'create-file-request') {
|
if (arg.action.value === 'create-file-request') {
|
||||||
this.$createFileRequest()
|
this.$createFileRequest()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arg.action.value === 'remote-upload') {
|
||||||
|
this.$openRemoteUploadPopup()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.exitSpotlight()
|
this.exitSpotlight()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
v-if="toasters.length || notifications.length"
|
v-if="toasters.length || notifications.length"
|
||||||
class="fixed bottom-4 right-4 left-4 z-50 sm:w-[360px] sm:left-auto lg:bottom-8 lg:right-8"
|
class="fixed bottom-4 right-4 left-4 z-[55] sm:w-[360px] sm:left-auto lg:bottom-8 lg:right-8"
|
||||||
>
|
>
|
||||||
<ToasterWrapper
|
<ToasterWrapper
|
||||||
v-for="notification in notifications"
|
v-for="notification in notifications"
|
||||||
|
|||||||
+5
-1
@@ -231,7 +231,7 @@ const FunctionHelpers = {
|
|||||||
attempts = 0
|
attempts = 0
|
||||||
|
|
||||||
// Set form data
|
// Set form data
|
||||||
formData.set('filename', item.file.name)
|
formData.set('name', item.file.name)
|
||||||
formData.set('file', chunk, source_name)
|
formData.set('file', chunk, source_name)
|
||||||
formData.set('path', item.path)
|
formData.set('path', item.path)
|
||||||
formData.set('parent_id', item.parent_id)
|
formData.set('parent_id', item.parent_id)
|
||||||
@@ -569,6 +569,10 @@ const FunctionHelpers = {
|
|||||||
Vue.prototype.$changeSubscriptionOptions = function () {
|
Vue.prototype.$changeSubscriptionOptions = function () {
|
||||||
events.$emit('popup:open', { name: 'change-plan-subscription' })
|
events.$emit('popup:open', { name: 'change-plan-subscription' })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vue.prototype.$openRemoteUploadPopup = function () {
|
||||||
|
events.$emit('popup:open', {name: 'remote-upload'})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
<CreateUploadRequestPopup />
|
<CreateUploadRequestPopup />
|
||||||
<CreateTeamFolderPopup />
|
<CreateTeamFolderPopup />
|
||||||
<NotificationsPopup />
|
<NotificationsPopup />
|
||||||
|
<RemoteUploadPopup />
|
||||||
|
|
||||||
<!--Mobile Navigation-->
|
<!--Mobile Navigation-->
|
||||||
<MobileNavigation />
|
<MobileNavigation />
|
||||||
@@ -86,6 +87,7 @@ import { mapGetters } from 'vuex'
|
|||||||
import CreateUploadRequestPopup from "../components/UploadRequest/CreateUploadRequestPopup";
|
import CreateUploadRequestPopup from "../components/UploadRequest/CreateUploadRequestPopup";
|
||||||
import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup";
|
import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup";
|
||||||
import NotificationsPopup from "../components/Notifications/NotificationsPopup";
|
import NotificationsPopup from "../components/Notifications/NotificationsPopup";
|
||||||
|
import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Admin',
|
name: 'Admin',
|
||||||
@@ -190,6 +192,7 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
|
RemoteUploadPopup,
|
||||||
NotificationsPopup,
|
NotificationsPopup,
|
||||||
CreateTeamFolderPopup,
|
CreateTeamFolderPopup,
|
||||||
CreateUploadRequestPopup,
|
CreateUploadRequestPopup,
|
||||||
|
|||||||
@@ -46,6 +46,11 @@
|
|||||||
/>
|
/>
|
||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
<OptionGroup :title="$t('others')">
|
<OptionGroup :title="$t('others')">
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
/>
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createTeamFolder"
|
@click.stop.native="$createTeamFolder"
|
||||||
:title="$t('create_team_folder')"
|
:title="$t('create_team_folder')"
|
||||||
|
|||||||
@@ -37,11 +37,8 @@
|
|||||||
</MobileContextMenu>
|
</MobileContextMenu>
|
||||||
|
|
||||||
<MobileCreateMenu>
|
<MobileCreateMenu>
|
||||||
<OptionGroup :title="$t('upload')">
|
<OptionGroup :title="$t('frequently_used')">
|
||||||
<OptionUpload :title="$t('upload_files')" type="file" :is-hover-disabled="true" />
|
<OptionUpload :title="$t('upload_files')" type="file" :is-hover-disabled="true" />
|
||||||
<OptionUpload :title="$t('upload_folder')" type="folder" :is-hover-disabled="true" />
|
|
||||||
</OptionGroup>
|
|
||||||
<OptionGroup :title="$t('create')">
|
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="createFolder"
|
@click.stop.native="createFolder"
|
||||||
:title="$t('create_folder')"
|
:title="$t('create_folder')"
|
||||||
@@ -49,6 +46,15 @@
|
|||||||
:is-hover-disabled="true"
|
:is-hover-disabled="true"
|
||||||
/>
|
/>
|
||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
|
<OptionGroup :title="$t('others')">
|
||||||
|
<OptionUpload :title="$t('upload_folder')" type="folder" :is-hover-disabled="true" />
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
:is-hover-disabled="true"
|
||||||
|
/>
|
||||||
|
</OptionGroup>
|
||||||
</MobileCreateMenu>
|
</MobileCreateMenu>
|
||||||
|
|
||||||
<MobileMultiSelectToolbar>
|
<MobileMultiSelectToolbar>
|
||||||
|
|||||||
@@ -21,6 +21,14 @@
|
|||||||
:is-hover-disabled="true"
|
:is-hover-disabled="true"
|
||||||
/>
|
/>
|
||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
|
<OptionGroup :title="$t('others')">
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
:class="{'is-inactive': isTeamFolderHomepage}"
|
||||||
|
/>
|
||||||
|
</OptionGroup>
|
||||||
</MobileCreateMenu>
|
</MobileCreateMenu>
|
||||||
|
|
||||||
<MobileTeamContextMenu>
|
<MobileTeamContextMenu>
|
||||||
|
|||||||
@@ -43,6 +43,12 @@
|
|||||||
/>
|
/>
|
||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
<OptionGroup :title="$t('others')">
|
<OptionGroup :title="$t('others')">
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
:class="{'is-inactive': isTeamFolderHomepage}"
|
||||||
|
/>
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createTeamFolder"
|
@click.stop.native="$createTeamFolder"
|
||||||
:title="$t('create_team_folder')"
|
:title="$t('create_team_folder')"
|
||||||
|
|||||||
@@ -9,11 +9,8 @@
|
|||||||
</MobileContextMenu>
|
</MobileContextMenu>
|
||||||
|
|
||||||
<MobileCreateMenu>
|
<MobileCreateMenu>
|
||||||
<OptionGroup :title="$t('upload')">
|
<OptionGroup :title="$t('frequently_used')">
|
||||||
<OptionUpload :title="$t('upload_files')" type="file" :is-hover-disabled="true" />
|
<OptionUpload :title="$t('upload_files')" type="file" :is-hover-disabled="true" />
|
||||||
<OptionUpload :title="$t('upload_folder')" type="folder" />
|
|
||||||
</OptionGroup>
|
|
||||||
<OptionGroup :title="$t('create')">
|
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="createFolder"
|
@click.stop.native="createFolder"
|
||||||
:title="$t('create_folder')"
|
:title="$t('create_folder')"
|
||||||
@@ -21,6 +18,14 @@
|
|||||||
:is-hover-disabled="true"
|
:is-hover-disabled="true"
|
||||||
/>
|
/>
|
||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
|
<OptionGroup :title="$t('others')">
|
||||||
|
<OptionUpload :title="$t('upload_folder')" type="folder" />
|
||||||
|
<Option
|
||||||
|
@click.stop.native="$openRemoteUploadPopup"
|
||||||
|
:title="$t('remote_upload')"
|
||||||
|
icon="remote-upload"
|
||||||
|
/>
|
||||||
|
</OptionGroup>
|
||||||
</MobileCreateMenu>
|
</MobileCreateMenu>
|
||||||
|
|
||||||
<MobileMultiSelectToolbar>
|
<MobileMultiSelectToolbar>
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
<CreateUploadRequestPopup />
|
<CreateUploadRequestPopup />
|
||||||
<NotificationsPopup />
|
<NotificationsPopup />
|
||||||
|
<RemoteUploadPopup />
|
||||||
<CreateFolderPopup />
|
<CreateFolderPopup />
|
||||||
<RenameItemPopup />
|
<RenameItemPopup />
|
||||||
<MoveItemPopup />
|
<MoveItemPopup />
|
||||||
@@ -79,10 +80,12 @@ import { events } from '../bus'
|
|||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import CreateUploadRequestPopup from "../components/UploadRequest/CreateUploadRequestPopup";
|
import CreateUploadRequestPopup from "../components/UploadRequest/CreateUploadRequestPopup";
|
||||||
import NotificationsPopup from "../components/Notifications/NotificationsPopup";
|
import NotificationsPopup from "../components/Notifications/NotificationsPopup";
|
||||||
|
import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Platform',
|
name: 'Platform',
|
||||||
components: {
|
components: {
|
||||||
|
RemoteUploadPopup,
|
||||||
NotificationsPopup,
|
NotificationsPopup,
|
||||||
CreateUploadRequestPopup,
|
CreateUploadRequestPopup,
|
||||||
CreateTeamFolderPopup,
|
CreateTeamFolderPopup,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
<CreateUploadRequestPopup />
|
<CreateUploadRequestPopup />
|
||||||
<CreateTeamFolderPopup />
|
<CreateTeamFolderPopup />
|
||||||
<NotificationsPopup />
|
<NotificationsPopup />
|
||||||
|
<RemoteUploadPopup />
|
||||||
|
|
||||||
<ConfirmPopup />
|
<ConfirmPopup />
|
||||||
|
|
||||||
@@ -94,10 +95,12 @@ import CreateUploadRequestPopup from "../components/UploadRequest/CreateUploadRe
|
|||||||
import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup";
|
import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup";
|
||||||
import ChangeSubscriptionPopup from "../components/Subscription/Popups/ChangeSubscriptionPopup";
|
import ChangeSubscriptionPopup from "../components/Subscription/Popups/ChangeSubscriptionPopup";
|
||||||
import NotificationsPopup from "../components/Notifications/NotificationsPopup";
|
import NotificationsPopup from "../components/Notifications/NotificationsPopup";
|
||||||
|
import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Settings',
|
name: 'Settings',
|
||||||
components: {
|
components: {
|
||||||
|
RemoteUploadPopup,
|
||||||
NotificationsPopup,
|
NotificationsPopup,
|
||||||
ChangeSubscriptionPopup,
|
ChangeSubscriptionPopup,
|
||||||
CreateTeamFolderPopup,
|
CreateTeamFolderPopup,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
<!--Popups-->
|
<!--Popups-->
|
||||||
<ProcessingPopup />
|
<ProcessingPopup />
|
||||||
|
|
||||||
|
<RemoteUploadPopup />
|
||||||
<CreateFolderPopup />
|
<CreateFolderPopup />
|
||||||
<RenameItemPopup />
|
<RenameItemPopup />
|
||||||
<MoveItemPopup />
|
<MoveItemPopup />
|
||||||
@@ -61,12 +62,13 @@ import DragUI from '../components/UI/Others/DragUI'
|
|||||||
import Alert from '../components/Popups/Alert'
|
import Alert from '../components/Popups/Alert'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import { events } from '../bus'
|
import { events } from '../bus'
|
||||||
import router from '../router'
|
|
||||||
import DesktopSharepageToolbar from '../components/Layout/Toolbars/DesktopSharepageToolbar'
|
import DesktopSharepageToolbar from '../components/Layout/Toolbars/DesktopSharepageToolbar'
|
||||||
|
import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Shared',
|
name: 'Shared',
|
||||||
components: {
|
components: {
|
||||||
|
RemoteUploadPopup,
|
||||||
DesktopSharepageToolbar,
|
DesktopSharepageToolbar,
|
||||||
MobileToolbar,
|
MobileToolbar,
|
||||||
InfoSidebar,
|
InfoSidebar,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
<!--Popups-->
|
<!--Popups-->
|
||||||
<CreateFolderPopup />
|
<CreateFolderPopup />
|
||||||
|
<RemoteUploadPopup />
|
||||||
<RenameItemPopup />
|
<RenameItemPopup />
|
||||||
<MoveItemPopup />
|
<MoveItemPopup />
|
||||||
|
|
||||||
@@ -54,10 +55,12 @@ import Spotlight from '../components/Spotlight/Spotlight'
|
|||||||
import DragUI from '../components/UI/Others/DragUI'
|
import DragUI from '../components/UI/Others/DragUI'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import { events } from '../bus'
|
import { events } from '../bus'
|
||||||
|
import RemoteUploadPopup from "../components/RemoteUpload/RemoteUploadPopup";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'UploadRequest',
|
name: 'UploadRequest',
|
||||||
components: {
|
components: {
|
||||||
|
RemoteUploadPopup,
|
||||||
DesktopUploadRequestToolbar,
|
DesktopUploadRequestToolbar,
|
||||||
MobileUploadRequestToolBar,
|
MobileUploadRequestToolBar,
|
||||||
InfoSidebarUploadRequest,
|
InfoSidebarUploadRequest,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ use Domain\SetupWizard\Controllers\PingAPIController;
|
|||||||
use Domain\Folders\Controllers\CreateFolderController;
|
use Domain\Folders\Controllers\CreateFolderController;
|
||||||
use Domain\Browsing\Controllers\BrowseFolderController;
|
use Domain\Browsing\Controllers\BrowseFolderController;
|
||||||
use Domain\Sharing\Controllers\ShareViaEmailController;
|
use Domain\Sharing\Controllers\ShareViaEmailController;
|
||||||
|
use Domain\Files\Controllers\RemoteUploadFileController;
|
||||||
use Domain\Folders\Controllers\NavigationTreeController;
|
use Domain\Folders\Controllers\NavigationTreeController;
|
||||||
use Domain\Items\Controllers\MoveFileOrFolderController;
|
use Domain\Items\Controllers\MoveFileOrFolderController;
|
||||||
use App\Socialite\Controllers\SocialiteRedirectController;
|
use App\Socialite\Controllers\SocialiteRedirectController;
|
||||||
@@ -78,6 +79,7 @@ Route::group(['middleware' => ['auth:sanctum']], function () {
|
|||||||
|
|
||||||
// User master,editor routes
|
// User master,editor routes
|
||||||
Route::group(['middleware' => ['auth:sanctum']], function () {
|
Route::group(['middleware' => ['auth:sanctum']], function () {
|
||||||
|
Route::post('/upload/remote', RemoteUploadFileController::class);
|
||||||
Route::post('/create-folder', CreateFolderController::class);
|
Route::post('/create-folder', CreateFolderController::class);
|
||||||
Route::post('/upload', UploadFileController::class);
|
Route::post('/upload', UploadFileController::class);
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use Domain\Files\Controllers\VisitorUploadFileController;
|
|||||||
use Domain\Folders\Controllers\VisitorCreateFolderController;
|
use Domain\Folders\Controllers\VisitorCreateFolderController;
|
||||||
use Domain\Sharing\Controllers\WebCrawlerOpenGraphController;
|
use Domain\Sharing\Controllers\WebCrawlerOpenGraphController;
|
||||||
use Domain\Browsing\Controllers\VisitorBrowseFolderController;
|
use Domain\Browsing\Controllers\VisitorBrowseFolderController;
|
||||||
|
use Domain\Files\Controllers\VisitorRemoteUploadFileController;
|
||||||
use Domain\Items\Controllers\VisitorMoveFileOrFolderController;
|
use Domain\Items\Controllers\VisitorMoveFileOrFolderController;
|
||||||
use Domain\Items\Controllers\VisitorDeleteFileOrFolderController;
|
use Domain\Items\Controllers\VisitorDeleteFileOrFolderController;
|
||||||
use Domain\Items\Controllers\VisitorRenameFileOrFolderController;
|
use Domain\Items\Controllers\VisitorRenameFileOrFolderController;
|
||||||
@@ -16,6 +17,7 @@ use Domain\Browsing\Controllers\VisitorSearchFilesAndFoldersController;
|
|||||||
|
|
||||||
// Browse functions
|
// Browse functions
|
||||||
Route::group(['prefix' => 'editor'], function () {
|
Route::group(['prefix' => 'editor'], function () {
|
||||||
|
Route::post('/upload/remote/{shared}', VisitorRemoteUploadFileController::class);
|
||||||
Route::post('/create-folder/{shared}', VisitorCreateFolderController::class);
|
Route::post('/create-folder/{shared}', VisitorCreateFolderController::class);
|
||||||
Route::post('/upload/{shared}', VisitorUploadFileController::class);
|
Route::post('/upload/{shared}', VisitorUploadFileController::class);
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use Domain\UploadRequest\Controllers\MoveItemInUploadRequestController;
|
|||||||
use Domain\UploadRequest\Controllers\SetUploadRequestAsFilledController;
|
use Domain\UploadRequest\Controllers\SetUploadRequestAsFilledController;
|
||||||
use Domain\UploadRequest\Controllers\UploadFilesForUploadRequestController;
|
use Domain\UploadRequest\Controllers\UploadFilesForUploadRequestController;
|
||||||
use Domain\UploadRequest\Controllers\GetFolderTreeForUploadRequestController;
|
use Domain\UploadRequest\Controllers\GetFolderTreeForUploadRequestController;
|
||||||
|
use Domain\UploadRequest\Controllers\UploadFilesRemotelyForUploadRequestController;
|
||||||
|
|
||||||
Route::get('/{uploadRequest}', GetUploadRequestController::class);
|
Route::get('/{uploadRequest}', GetUploadRequestController::class);
|
||||||
|
|
||||||
@@ -19,6 +20,7 @@ Route::group(['middleware' => 'upload-request'], function () {
|
|||||||
Route::delete('/{uploadRequest}', SetUploadRequestAsFilledController::class);
|
Route::delete('/{uploadRequest}', SetUploadRequestAsFilledController::class);
|
||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
Route::post('/{uploadRequest}/upload/remote', UploadFilesRemotelyForUploadRequestController::class);
|
||||||
Route::post('/{uploadRequest}/upload', UploadFilesForUploadRequestController::class);
|
Route::post('/{uploadRequest}/upload', UploadFilesForUploadRequestController::class);
|
||||||
Route::patch('/{uploadRequest}/rename/{id}', RenameFileOrFolderController::class);
|
Route::patch('/{uploadRequest}/rename/{id}', RenameFileOrFolderController::class);
|
||||||
Route::post('/{uploadRequest}/create-folder', CreateFolderController::class);
|
Route::post('/{uploadRequest}/create-folder', CreateFolderController::class);
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ use VueFileManager\Subscription\App\User\Traits\Billable;
|
|||||||
* @method static where(string $string, string $string1)
|
* @method static where(string $string, string $string1)
|
||||||
* @method static create(array $array)
|
* @method static create(array $array)
|
||||||
* @method static find(mixed $email)
|
* @method static find(mixed $email)
|
||||||
|
* @method canUpload(int $size)
|
||||||
*/
|
*/
|
||||||
class User extends Authenticatable implements MustVerifyEmail
|
class User extends Authenticatable implements MustVerifyEmail
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,102 @@
|
|||||||
|
<?php
|
||||||
|
namespace Domain\Files\Actions;
|
||||||
|
|
||||||
|
use Log;
|
||||||
|
use Error;
|
||||||
|
use ErrorException;
|
||||||
|
use App\Users\Models\User;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use Domain\Files\Models\File;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Spatie\QueueableAction\QueueableAction;
|
||||||
|
|
||||||
|
class GetContentFromExternalSource
|
||||||
|
{
|
||||||
|
use QueueableAction;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
public ProcessFileAction $processFile,
|
||||||
|
public StoreFileExifMetadataAction $storeExifMetadata,
|
||||||
|
public MoveFileToFTPStorageAction $moveFileToFTPStorage,
|
||||||
|
public ProcessImageThumbnailAction $createImageThumbnail,
|
||||||
|
public MoveFileToExternalStorageAction $moveFileToExternalStorage,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __invoke(
|
||||||
|
array $payload,
|
||||||
|
User $user,
|
||||||
|
) {
|
||||||
|
foreach ($payload['urls'] as $url) {
|
||||||
|
try {
|
||||||
|
// Get local disk instance
|
||||||
|
$localDisk = Storage::disk('local');
|
||||||
|
|
||||||
|
// Get file from external source
|
||||||
|
$response = Http::get($url);
|
||||||
|
|
||||||
|
// Get extension from response
|
||||||
|
$extension = extractExtensionFromUrl($url, $response);
|
||||||
|
|
||||||
|
// Get blacklisted mimetypes
|
||||||
|
$this->checkDisabledMimetypes($extension);
|
||||||
|
|
||||||
|
// Get file basename
|
||||||
|
$basename = Str::uuid() . ".$extension";
|
||||||
|
|
||||||
|
// Get file name
|
||||||
|
$name = array_key_exists('filename', pathinfo($url))
|
||||||
|
? explode('?', pathinfo($url)['filename'])[0]
|
||||||
|
: Str::uuid();
|
||||||
|
|
||||||
|
// Get file path
|
||||||
|
$path = "files/$user->id/$basename";
|
||||||
|
|
||||||
|
// Store file to main storage disk
|
||||||
|
$localDisk->put($path, $response->getBody());
|
||||||
|
|
||||||
|
// Create multiple image thumbnails
|
||||||
|
($this->createImageThumbnail)($basename, $user->id);
|
||||||
|
|
||||||
|
// Create new file
|
||||||
|
$file = File::create([
|
||||||
|
'mimetype' => $extension,
|
||||||
|
'type' => getFileType($localDisk->mimeType($path)),
|
||||||
|
'parent_id' => $payload['parent_id'] ?? null,
|
||||||
|
'name' => $name ?? $basename,
|
||||||
|
'basename' => $basename,
|
||||||
|
'filesize' => $localDisk->size($path),
|
||||||
|
'user_id' => $user->id,
|
||||||
|
'creator_id' => auth()->id(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Store file exif information
|
||||||
|
($this->storeExifMetadata)($file);
|
||||||
|
|
||||||
|
// Move file to external storage
|
||||||
|
match (config('filesystems.default')) {
|
||||||
|
's3' => ($this->moveFileToExternalStorage)($basename, $user->id),
|
||||||
|
'ftp', 'azure' => ($this->moveFileToFTPStorage)($basename, $user->id),
|
||||||
|
default => null
|
||||||
|
};
|
||||||
|
} catch (ErrorException | Error $e) {
|
||||||
|
Log::error("Remote upload failed as {$e->getMessage()}");
|
||||||
|
Log::error($e->getTraceAsString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|null $extension
|
||||||
|
*/
|
||||||
|
protected function checkDisabledMimetypes(?string $extension): void
|
||||||
|
{
|
||||||
|
$mimetypeBlacklist = explode(',', get_settings('mimetypes_blacklist')) ?? null;
|
||||||
|
|
||||||
|
// If is extension in mimetype blacklist, Abort!
|
||||||
|
if ($extension && array_intersect([str_replace('.', '', ".$extension")], $mimetypeBlacklist)) {
|
||||||
|
abort(422);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,7 +12,6 @@ class MoveFileToFTPStorageAction
|
|||||||
string $file,
|
string $file,
|
||||||
string $userId
|
string $userId
|
||||||
): void {
|
): void {
|
||||||
|
|
||||||
// Stream file object to ftp
|
// Stream file object to ftp
|
||||||
Storage::putFileAs("files/$userId", config('filesystems.disks.local.root') . "/files/$userId/$file", $file, 'private');
|
Storage::putFileAs("files/$userId", config('filesystems.disks.local.root') . "/files/$userId/$file", $file, 'private');
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
namespace Domain\Files\Actions;
|
||||||
|
|
||||||
|
use App\Users\Models\User;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use Domain\Files\Models\File;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Domain\Files\Requests\UploadRequest;
|
||||||
|
use Domain\Traffic\Actions\RecordUploadAction;
|
||||||
|
|
||||||
|
class ProcessFileAction
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public RecordUploadAction $recordUpload,
|
||||||
|
public GetFileParentId $getFileParentId,
|
||||||
|
public StoreFileExifMetadataAction $storeExifMetadata,
|
||||||
|
public MoveFileToFTPStorageAction $moveFileToFTPStorage,
|
||||||
|
public ProcessImageThumbnailAction $createImageThumbnail,
|
||||||
|
public MoveFileToExternalStorageAction $moveFileToExternalStorage,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upload new file
|
||||||
|
*/
|
||||||
|
public function __invoke(
|
||||||
|
UploadRequest $request,
|
||||||
|
User $user,
|
||||||
|
string $chunkPath,
|
||||||
|
) {
|
||||||
|
// Get local disk instance
|
||||||
|
$localDisk = Storage::disk('local');
|
||||||
|
|
||||||
|
// Get file data
|
||||||
|
$size = $localDisk->size($chunkPath);
|
||||||
|
$mimetype = $localDisk->mimeType($chunkPath);
|
||||||
|
$name = Str::uuid() . '.' . $request->input('extension');
|
||||||
|
|
||||||
|
// Get upload limit
|
||||||
|
$uploadLimit = get_settings('upload_limit');
|
||||||
|
|
||||||
|
// File size handling
|
||||||
|
if ($uploadLimit && $size > format_bytes($uploadLimit)) {
|
||||||
|
abort(413);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if user has enough space to upload file
|
||||||
|
if (! $user->canUpload($size)) {
|
||||||
|
// Delete file from chunk directory
|
||||||
|
$localDisk->delete($chunkPath);
|
||||||
|
|
||||||
|
// Set up response
|
||||||
|
$response = response([
|
||||||
|
'type' => 'error',
|
||||||
|
'message' => __t('user_action_not_allowed'),
|
||||||
|
], 401);
|
||||||
|
|
||||||
|
// Abort code
|
||||||
|
abort($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move file to user directory
|
||||||
|
$localDisk->move($chunkPath, "files/$user->id/$name");
|
||||||
|
|
||||||
|
// Create multiple image thumbnails
|
||||||
|
($this->createImageThumbnail)($name, $user->id);
|
||||||
|
|
||||||
|
// Move file to external storage
|
||||||
|
match (config('filesystems.default')) {
|
||||||
|
's3' => ($this->moveFileToExternalStorage)($name, $user->id),
|
||||||
|
'ftp', 'azure' => ($this->moveFileToFTPStorage)($name, $user->id),
|
||||||
|
default => null
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create new file
|
||||||
|
$file = File::create([
|
||||||
|
'mimetype' => $request->input('extension'),
|
||||||
|
'type' => getFileType($mimetype),
|
||||||
|
'parent_id' => ($this->getFileParentId)($request, $user->id),
|
||||||
|
'name' => $request->input('name'),
|
||||||
|
'basename' => $name,
|
||||||
|
'filesize' => $size,
|
||||||
|
'user_id' => $user->id,
|
||||||
|
'creator_id' => auth()->check() ? auth()->id() : $user->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Store file exif data
|
||||||
|
($this->storeExifMetadata)($file);
|
||||||
|
|
||||||
|
// Return new file
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,28 +22,33 @@ class ProcessImageThumbnailAction
|
|||||||
* Create image thumbnail from uploaded image
|
* Create image thumbnail from uploaded image
|
||||||
*/
|
*/
|
||||||
public function __invoke(
|
public function __invoke(
|
||||||
string $fileName,
|
string $name,
|
||||||
$file,
|
string $userId,
|
||||||
string $userId
|
|
||||||
): void {
|
): void {
|
||||||
// Create thumbnail from image
|
// Get local disk instance
|
||||||
if (in_array($file->getClientMimeType(), $this->availableFormats)) {
|
$disk = Storage::disk('local');
|
||||||
|
|
||||||
|
if (! in_array($disk->mimeType("files/$userId/$name"), $this->availableFormats)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Make copy of file for the thumbnail generation
|
// Make copy of file for the thumbnail generation
|
||||||
Storage::disk('local')->copy("files/$userId/{$fileName}", "temp/$userId/{$fileName}");
|
$disk->copy("files/$userId/$name", "temp/$userId/$name");
|
||||||
|
|
||||||
// Create thumbnails instantly
|
// Create thumbnails instantly
|
||||||
($this->generateImageThumbnail)(
|
($this->generateImageThumbnail)(
|
||||||
fileName: $fileName,
|
fileName: $name,
|
||||||
userId: $userId,
|
userId: $userId,
|
||||||
execution: 'immediately'
|
execution: 'immediately'
|
||||||
);
|
);
|
||||||
|
|
||||||
// Create thumbnails later
|
// Create thumbnails later
|
||||||
($this->generateImageThumbnail)->onQueue('high')->execute(
|
($this->generateImageThumbnail)
|
||||||
fileName: $fileName,
|
->onQueue('high')
|
||||||
|
->execute(
|
||||||
|
fileName: $name,
|
||||||
userId: $userId,
|
userId: $userId,
|
||||||
execution: 'later'
|
execution: 'later'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
namespace Domain\Files\Actions;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\File;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Domain\Files\Requests\UploadRequest;
|
||||||
|
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
||||||
|
|
||||||
|
class StoreFileChunksAction
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
*/
|
||||||
|
public function __invoke(UploadRequest $request)
|
||||||
|
{
|
||||||
|
// Get uploaded file
|
||||||
|
$file = $request->file('file');
|
||||||
|
|
||||||
|
// Get chunk name
|
||||||
|
$name = $file->getClientOriginalName();
|
||||||
|
|
||||||
|
// Get chunk file path
|
||||||
|
$path = Storage::disk('local')->path("chunks/$name");
|
||||||
|
|
||||||
|
// Build the file
|
||||||
|
File::append($path, $file->get());
|
||||||
|
|
||||||
|
// If last chunk, then return file path
|
||||||
|
if ($request->boolean('is_last')) {
|
||||||
|
return "chunks/$name";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,22 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Domain\Files\Actions;
|
namespace Domain\Files\Actions;
|
||||||
|
|
||||||
|
use Domain\Files\Models\File;
|
||||||
|
|
||||||
class StoreFileExifMetadataAction
|
class StoreFileExifMetadataAction
|
||||||
{
|
{
|
||||||
public function __invoke($item, $file)
|
public function __invoke(File $file)
|
||||||
{
|
{
|
||||||
// Get exif metadata
|
// Get exif metadata
|
||||||
$exif_data = get_image_meta_data($file);
|
$data = readExifData("files/$file->user_id/$file->basename");
|
||||||
|
|
||||||
if ($exif_data) {
|
if (is_null($data)) {
|
||||||
// Convert array to collection
|
return;
|
||||||
$data = json_decode(json_encode($exif_data));
|
}
|
||||||
|
|
||||||
$item->exif()->create([
|
$file
|
||||||
|
->exif()
|
||||||
|
->create([
|
||||||
'date_time_original' => $data->DateTimeOriginal ?? null,
|
'date_time_original' => $data->DateTimeOriginal ?? null,
|
||||||
'artist' => $data->OwnerName ?? null,
|
'artist' => $data->OwnerName ?? null,
|
||||||
'width' => $data->COMPUTED->Width ?? null,
|
'width' => $data->COMPUTED->Width ?? null,
|
||||||
@@ -35,4 +39,3 @@ class StoreFileExifMetadataAction
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Domain\Files\Actions;
|
|
||||||
|
|
||||||
use Illuminate\Support\Str;
|
|
||||||
use Domain\Folders\Models\Folder;
|
|
||||||
use Illuminate\Support\Facades\File;
|
|
||||||
use Illuminate\Support\Facades\Storage;
|
|
||||||
use Domain\Files\Requests\UploadRequest;
|
|
||||||
use Domain\Files\Models\File as UserFile;
|
|
||||||
use Domain\Traffic\Actions\RecordUploadAction;
|
|
||||||
use App\Users\Exceptions\InvalidUserActionException;
|
|
||||||
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
|
||||||
|
|
||||||
class UploadFileAction
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
public RecordUploadAction $recordUpload,
|
|
||||||
public GetFileParentId $getFileParentId,
|
|
||||||
public StoreFileExifMetadataAction $storeExifMetadata,
|
|
||||||
public MoveFileToFTPStorageAction $moveFileToFTPStorage,
|
|
||||||
public ProcessImageThumbnailAction $createImageThumbnail,
|
|
||||||
public MoveFileToExternalStorageAction $moveFileToExternalStorage,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Upload new file
|
|
||||||
*
|
|
||||||
* @throws InvalidUserActionException|FileNotFoundException
|
|
||||||
*/
|
|
||||||
public function __invoke(
|
|
||||||
UploadRequest $request,
|
|
||||||
?string $userId = null,
|
|
||||||
) {
|
|
||||||
$file = $request->file('file');
|
|
||||||
|
|
||||||
$chunkName = $file->getClientOriginalName();
|
|
||||||
|
|
||||||
// File Path
|
|
||||||
$filePath = Storage::disk('local')->path('chunks/' . $chunkName);
|
|
||||||
|
|
||||||
// Generate file
|
|
||||||
File::append($filePath, $file->get());
|
|
||||||
|
|
||||||
// Size of file
|
|
||||||
$fileSize = File::size($filePath);
|
|
||||||
|
|
||||||
// Size of limit
|
|
||||||
$uploadLimit = get_settings('upload_limit');
|
|
||||||
|
|
||||||
// File size handling
|
|
||||||
if ($uploadLimit && $fileSize > format_bytes($uploadLimit)) {
|
|
||||||
abort(413);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If last then process file
|
|
||||||
if ($request->boolean('is_last')) {
|
|
||||||
$disk_local = Storage::disk('local');
|
|
||||||
|
|
||||||
// File name
|
|
||||||
$fileName = Str::uuid() . '.' . $request->input('extension');
|
|
||||||
|
|
||||||
// Get user
|
|
||||||
$user = $request->filled('parent_id')
|
|
||||||
? Folder::find($request->input('parent_id'))->getLatestParent()->user
|
|
||||||
: auth()->user();
|
|
||||||
|
|
||||||
// File Info
|
|
||||||
$fileSize = $disk_local->size("chunks/$chunkName");
|
|
||||||
$fileMimetype = $disk_local->mimeType("chunks/$chunkName");
|
|
||||||
|
|
||||||
// Check if user has enough space to upload file
|
|
||||||
if (! $user->canUpload($fileSize)) {
|
|
||||||
Storage::disk('local')->delete("chunks/$chunkName");
|
|
||||||
|
|
||||||
throw new InvalidUserActionException();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move finished file from chunk to file-manager directory
|
|
||||||
$disk_local->move("chunks/$chunkName", "files/$user->id/$fileName");
|
|
||||||
|
|
||||||
// Create multiple image thumbnails
|
|
||||||
($this->createImageThumbnail)($fileName, $file, $user->id);
|
|
||||||
|
|
||||||
// Move files to external storage
|
|
||||||
match (config('filesystems.default')) {
|
|
||||||
's3' => ($this->moveFileToExternalStorage)($fileName, $user->id),
|
|
||||||
'ftp', 'azure' => ($this->moveFileToFTPStorage)($fileName, $user->id),
|
|
||||||
default => null
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create new file
|
|
||||||
$item = UserFile::create([
|
|
||||||
'mimetype' => $request->input('extension'),
|
|
||||||
'type' => get_file_type($fileMimetype),
|
|
||||||
'parent_id' => ($this->getFileParentId)($request, $user->id),
|
|
||||||
'name' => $request->input('filename'),
|
|
||||||
'basename' => $fileName,
|
|
||||||
'filesize' => $fileSize,
|
|
||||||
'user_id' => $user->id,
|
|
||||||
'creator_id' => auth()->id(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Store exif metadata for files
|
|
||||||
($this->storeExifMetadata)($item, $file);
|
|
||||||
|
|
||||||
// Return new file
|
|
||||||
return $item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
namespace Domain\Files\Controllers;
|
||||||
|
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use Domain\Sharing\Models\Share;
|
||||||
|
use Domain\Folders\Models\Folder;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Domain\Files\Requests\RemoteUploadRequest;
|
||||||
|
use Domain\Files\Actions\GetContentFromExternalSource;
|
||||||
|
|
||||||
|
class RemoteUploadFileController extends Controller
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public GetContentFromExternalSource $getContentFromExternalSource,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __invoke(RemoteUploadRequest $request, ?Share $shared = null): Response|array
|
||||||
|
{
|
||||||
|
if (is_demo_account()) {
|
||||||
|
return response('Files were successfully added to the upload queue', 201);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get user
|
||||||
|
$user = $request->filled('parent_id')
|
||||||
|
? Folder::find($request->input('parent_id'))
|
||||||
|
->getLatestParent()
|
||||||
|
->user
|
||||||
|
: auth()->user();
|
||||||
|
|
||||||
|
// Execute job for get content from url and save
|
||||||
|
($this->getContentFromExternalSource)($request->all(), $user);
|
||||||
|
|
||||||
|
return response('Files were successfully added to the upload queue', 201);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,24 +1,28 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Domain\Files\Controllers;
|
namespace Domain\Files\Controllers;
|
||||||
|
|
||||||
use Domain\Files\Models\File;
|
use Domain\Folders\Models\Folder;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Domain\Files\Requests\UploadRequest;
|
use Domain\Files\Requests\UploadRequest;
|
||||||
use Domain\Files\Resources\FileResource;
|
use Domain\Files\Resources\FileResource;
|
||||||
use Domain\Files\Actions\UploadFileAction;
|
use Domain\Files\Actions\ProcessFileAction;
|
||||||
use Support\Demo\Actions\FakeUploadFileAction;
|
use Support\Demo\Actions\FakeUploadFileAction;
|
||||||
use App\Users\Exceptions\InvalidUserActionException;
|
use Domain\Files\Actions\StoreFileChunksAction;
|
||||||
|
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
||||||
|
|
||||||
class UploadFileController extends Controller
|
class UploadFileController extends Controller
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
public UploadFileAction $uploadFiles,
|
public ProcessFileAction $processFie,
|
||||||
public FakeUploadFileAction $fakeUploadFile,
|
public FakeUploadFileAction $fakeUploadFile,
|
||||||
|
public StoreFileChunksAction $storeFileChunks,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Upload file for authenticated master|editor user
|
* Upload file for authenticated master|editor user
|
||||||
|
*
|
||||||
|
* @throws FileNotFoundException
|
||||||
*/
|
*/
|
||||||
public function __invoke(UploadRequest $request)
|
public function __invoke(UploadRequest $request)
|
||||||
{
|
{
|
||||||
@@ -26,20 +30,22 @@ class UploadFileController extends Controller
|
|||||||
return ($this->fakeUploadFile)($request);
|
return ($this->fakeUploadFile)($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
// Store file chunks
|
||||||
// Upload and store file record
|
$chunkPath = ($this->storeFileChunks)($request);
|
||||||
if (! $request->boolean('is_last')) {
|
|
||||||
return ($this->uploadFiles)($request);
|
|
||||||
}
|
|
||||||
|
|
||||||
$file = ($this->uploadFiles)($request);
|
// Proceed after last chunk
|
||||||
|
if ($request->boolean('is_last')) {
|
||||||
|
// Get user
|
||||||
|
$user = $request->filled('parent_id')
|
||||||
|
? Folder::find($request->input('parent_id'))
|
||||||
|
->getLatestParent()
|
||||||
|
->user
|
||||||
|
: auth()->user();
|
||||||
|
|
||||||
|
// Process file
|
||||||
|
$file = ($this->processFie)($request, $user, $chunkPath);
|
||||||
|
|
||||||
return response(new FileResource($file), 201);
|
return response(new FileResource($file), 201);
|
||||||
} catch (InvalidUserActionException $e) {
|
|
||||||
return response([
|
|
||||||
'type' => 'error',
|
|
||||||
'message' => $e->getMessage(),
|
|
||||||
], 401);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
namespace Domain\Files\Controllers;
|
||||||
|
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use Domain\Sharing\Models\Share;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Domain\Files\Requests\RemoteUploadRequest;
|
||||||
|
use Domain\Sharing\Actions\ProtectShareRecordAction;
|
||||||
|
use Domain\Sharing\Actions\VerifyAccessToItemAction;
|
||||||
|
use Domain\Files\Actions\GetContentFromExternalSource;
|
||||||
|
|
||||||
|
class VisitorRemoteUploadFileController extends Controller
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public ProtectShareRecordAction $protectShareRecord,
|
||||||
|
public VerifyAccessToItemAction $verifyAccessToItem,
|
||||||
|
public GetContentFromExternalSource $getContentFromExternalSource,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __invoke(RemoteUploadRequest $request, ?Share $shared = null): Response|array
|
||||||
|
{
|
||||||
|
// Check ability to access protected share record
|
||||||
|
($this->protectShareRecord)($shared);
|
||||||
|
|
||||||
|
// Check shared permission
|
||||||
|
if (is_visitor($shared)) {
|
||||||
|
abort(403, "You don't have access to this item");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check access to requested directory
|
||||||
|
($this->verifyAccessToItem)($request->input('parent_id'), $shared);
|
||||||
|
|
||||||
|
// Execute job for get content from url and save
|
||||||
|
($this->getContentFromExternalSource)($request->all(), $shared->user);
|
||||||
|
|
||||||
|
return response('Files were successfully added to the upload queue', 201);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Domain\Files\Controllers;
|
namespace Domain\Files\Controllers;
|
||||||
|
|
||||||
use Illuminate\Http\Response;
|
|
||||||
use Domain\Sharing\Models\Share;
|
use Domain\Sharing\Models\Share;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Domain\Files\Requests\UploadRequest;
|
use Domain\Files\Requests\UploadRequest;
|
||||||
use Domain\Files\Resources\FileResource;
|
use Domain\Files\Resources\FileResource;
|
||||||
use Domain\Files\Actions\UploadFileAction;
|
use Domain\Files\Actions\ProcessFileAction;
|
||||||
use Support\Demo\Actions\FakeUploadFileAction;
|
use Support\Demo\Actions\FakeUploadFileAction;
|
||||||
use App\Users\Exceptions\InvalidUserActionException;
|
use Domain\Files\Actions\StoreFileChunksAction;
|
||||||
use Domain\Sharing\Actions\ProtectShareRecordAction;
|
use Domain\Sharing\Actions\ProtectShareRecordAction;
|
||||||
use Domain\Sharing\Actions\VerifyAccessToItemAction;
|
use Domain\Sharing\Actions\VerifyAccessToItemAction;
|
||||||
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
||||||
@@ -19,7 +18,8 @@ use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
|||||||
class VisitorUploadFileController extends Controller
|
class VisitorUploadFileController extends Controller
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private UploadFileAction $uploadFile,
|
public ProcessFileAction $processFie,
|
||||||
|
public StoreFileChunksAction $storeFileChunks,
|
||||||
private FakeUploadFileAction $fakeUploadFile,
|
private FakeUploadFileAction $fakeUploadFile,
|
||||||
private ProtectShareRecordAction $protectShareRecord,
|
private ProtectShareRecordAction $protectShareRecord,
|
||||||
private VerifyAccessToItemAction $verifyAccessToItem,
|
private VerifyAccessToItemAction $verifyAccessToItem,
|
||||||
@@ -32,7 +32,7 @@ class VisitorUploadFileController extends Controller
|
|||||||
public function __invoke(
|
public function __invoke(
|
||||||
UploadRequest $request,
|
UploadRequest $request,
|
||||||
Share $shared,
|
Share $shared,
|
||||||
): Response | array {
|
) {
|
||||||
if (is_demo_account()) {
|
if (is_demo_account()) {
|
||||||
return ($this->fakeUploadFile)($request);
|
return ($this->fakeUploadFile)($request);
|
||||||
}
|
}
|
||||||
@@ -48,19 +48,18 @@ class VisitorUploadFileController extends Controller
|
|||||||
// Check access to requested directory
|
// Check access to requested directory
|
||||||
($this->verifyAccessToItem)($request->input('parent_id'), $shared);
|
($this->verifyAccessToItem)($request->input('parent_id'), $shared);
|
||||||
|
|
||||||
try {
|
// Store file chunks
|
||||||
// Return new uploaded file
|
$chunkPath = ($this->storeFileChunks)($request);
|
||||||
$file = ($this->uploadFile)($request, $shared->user_id);
|
|
||||||
|
// Proceed after last chunk
|
||||||
|
if ($request->boolean('is_last')) {
|
||||||
|
// Process file
|
||||||
|
$file = ($this->processFie)($request, $shared->user, $chunkPath);
|
||||||
|
|
||||||
// Set public access url
|
// Set public access url
|
||||||
$file->setSharedPublicUrl($shared->token);
|
$file->setSharedPublicUrl($shared->token);
|
||||||
|
|
||||||
return response(new FileResource($file), 201);
|
return response(new FileResource($file), 201);
|
||||||
} catch (InvalidUserActionException $e) {
|
|
||||||
return response([
|
|
||||||
'type' => 'error',
|
|
||||||
'message' => $e->getMessage(),
|
|
||||||
], 401);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
namespace Domain\Files\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class RemoteUploadRequest 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 [
|
||||||
|
'urls.*' => 'required|url',
|
||||||
|
'parent_id' => 'nullable|uuid',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,9 +24,9 @@ class UploadRequest extends FormRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'filename' => 'required|string',
|
'name' => 'required|string',
|
||||||
'parent_id' => 'nullable|uuid',
|
'parent_id' => 'nullable|uuid',
|
||||||
'path' => 'required|string',
|
'path' => 'sometimes|string',
|
||||||
'is_last' => 'sometimes|string',
|
'is_last' => 'sometimes|string',
|
||||||
'extension' => 'sometimes|string|nullable',
|
'extension' => 'sometimes|string|nullable',
|
||||||
'file' => ['required', 'file', new DisabledMimetypes],
|
'file' => ['required', 'file', new DisabledMimetypes],
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Domain\Settings\Actions;
|
namespace Domain\Settings\Actions;
|
||||||
|
|
||||||
use ErrorException;
|
|
||||||
use League\Flysystem\Ftp\UnableToAuthenticate;
|
|
||||||
use League\Flysystem\UnableToWriteFile;
|
|
||||||
use Storage;
|
use Storage;
|
||||||
|
use ErrorException;
|
||||||
|
use League\Flysystem\UnableToWriteFile;
|
||||||
|
use League\Flysystem\Ftp\UnableToAuthenticate;
|
||||||
|
|
||||||
class TestFTPConnectionAction
|
class TestFTPConnectionAction
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
namespace Domain\Settings\Controllers;
|
namespace Domain\Settings\Controllers;
|
||||||
|
|
||||||
use Artisan;
|
use Artisan;
|
||||||
use Domain\Settings\Actions\TestFTPConnectionAction;
|
|
||||||
use Illuminate\Http\Response;
|
use Illuminate\Http\Response;
|
||||||
use Domain\Settings\DTO\S3CredentialsData;
|
use Domain\Settings\DTO\S3CredentialsData;
|
||||||
use Domain\Settings\Actions\TestS3ConnectionAction;
|
use Domain\Settings\Actions\TestS3ConnectionAction;
|
||||||
|
use Domain\Settings\Actions\TestFTPConnectionAction;
|
||||||
use Domain\Settings\Requests\StoreStorageCredentialsRequest;
|
use Domain\Settings\Requests\StoreStorageCredentialsRequest;
|
||||||
|
|
||||||
class StoreStorageCredentialsController
|
class StoreStorageCredentialsController
|
||||||
@@ -13,7 +13,8 @@ class StoreStorageCredentialsController
|
|||||||
public function __construct(
|
public function __construct(
|
||||||
private TestFTPConnectionAction $testFTPConnection,
|
private TestFTPConnectionAction $testFTPConnection,
|
||||||
private TestS3ConnectionAction $testS3Connection,
|
private TestS3ConnectionAction $testS3Connection,
|
||||||
) {}
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set new email credentials to .env file
|
* Set new email credentials to .env file
|
||||||
@@ -31,7 +32,6 @@ class StoreStorageCredentialsController
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (! app()->runningUnitTests()) {
|
if (! app()->runningUnitTests()) {
|
||||||
|
|
||||||
// Test driver connection
|
// Test driver connection
|
||||||
match ($driver) {
|
match ($driver) {
|
||||||
's3' => ($this->testS3Connection)(
|
's3' => ($this->testS3Connection)(
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
namespace Domain\SetupWizard\Controllers;
|
namespace Domain\SetupWizard\Controllers;
|
||||||
|
|
||||||
use Artisan;
|
use Artisan;
|
||||||
use Domain\Settings\Actions\TestFTPConnectionAction;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Domain\Settings\DTO\S3CredentialsData;
|
use Domain\Settings\DTO\S3CredentialsData;
|
||||||
use Domain\Settings\Actions\TestS3ConnectionAction;
|
use Domain\Settings\Actions\TestS3ConnectionAction;
|
||||||
|
use Domain\Settings\Actions\TestFTPConnectionAction;
|
||||||
use Domain\Settings\Actions\TestSESConnectionAction;
|
use Domain\Settings\Actions\TestSESConnectionAction;
|
||||||
use Domain\Settings\Actions\TestSMTPConnectionAction;
|
use Domain\Settings\Actions\TestSMTPConnectionAction;
|
||||||
use Domain\Settings\Actions\TestMailgunConnectionAction;
|
use Domain\Settings\Actions\TestMailgunConnectionAction;
|
||||||
@@ -22,7 +22,8 @@ class StoreEnvironmentSettingsController extends Controller
|
|||||||
private TestSMTPConnectionAction $testSMTPConnection,
|
private TestSMTPConnectionAction $testSMTPConnection,
|
||||||
private TestMailgunConnectionAction $testMailgunConnection,
|
private TestMailgunConnectionAction $testMailgunConnection,
|
||||||
private TestPostmarkConnectionAction $testPostmarkConnection,
|
private TestPostmarkConnectionAction $testPostmarkConnection,
|
||||||
) {}
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store environment setup
|
* Store environment setup
|
||||||
|
|||||||
@@ -4,15 +4,16 @@ namespace Domain\UploadRequest\Controllers;
|
|||||||
use DB;
|
use DB;
|
||||||
use Domain\Folders\Models\Folder;
|
use Domain\Folders\Models\Folder;
|
||||||
use Domain\Files\Resources\FileResource;
|
use Domain\Files\Resources\FileResource;
|
||||||
use Domain\Files\Actions\UploadFileAction;
|
use Domain\Files\Actions\ProcessFileAction;
|
||||||
use Domain\UploadRequest\Models\UploadRequest;
|
use Domain\UploadRequest\Models\UploadRequest;
|
||||||
use App\Users\Exceptions\InvalidUserActionException;
|
use Domain\Files\Actions\StoreFileChunksAction;
|
||||||
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
||||||
|
|
||||||
class UploadFilesForUploadRequestController
|
class UploadFilesForUploadRequestController
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private UploadFileAction $uploadFile,
|
private ProcessFileAction $processFie,
|
||||||
|
private StoreFileChunksAction $storeFileChunks,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,14 +30,18 @@ class UploadFilesForUploadRequestController
|
|||||||
$this->createFolder($uploadRequest);
|
$this->createFolder($uploadRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
// Set default parent_id for uploaded file
|
// Set default parent_id for uploaded file
|
||||||
if (is_null($request->input('parent_id'))) {
|
if (is_null($request->input('parent_id'))) {
|
||||||
$request->merge(['parent_id' => $uploadRequest->id]);
|
$request->merge(['parent_id' => $uploadRequest->id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upload file
|
// Store file chunks
|
||||||
$file = ($this->uploadFile)($request, $uploadRequest->user_id);
|
$chunkPath = ($this->storeFileChunks)($request);
|
||||||
|
|
||||||
|
// Proceed after last chunk
|
||||||
|
if ($request->boolean('is_last')) {
|
||||||
|
// Process file
|
||||||
|
$file = ($this->processFie)($request, $uploadRequest->user, $chunkPath);
|
||||||
|
|
||||||
// Set public access url
|
// Set public access url
|
||||||
$file->setUploadRequestPublicUrl($uploadRequest->id);
|
$file->setUploadRequestPublicUrl($uploadRequest->id);
|
||||||
@@ -44,13 +49,7 @@ class UploadFilesForUploadRequestController
|
|||||||
// Set timestamp for auto filling
|
// Set timestamp for auto filling
|
||||||
cache()->set("auto-filling.$uploadRequest->id", now()->toString());
|
cache()->set("auto-filling.$uploadRequest->id", now()->toString());
|
||||||
|
|
||||||
// Return new uploaded file
|
|
||||||
return response(new FileResource($file), 201);
|
return response(new FileResource($file), 201);
|
||||||
} catch (InvalidUserActionException $e) {
|
|
||||||
return response([
|
|
||||||
'type' => 'error',
|
|
||||||
'message' => $e->getMessage(),
|
|
||||||
], 401);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+68
@@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
namespace Domain\UploadRequest\Controllers;
|
||||||
|
|
||||||
|
use DB;
|
||||||
|
use Domain\Folders\Models\Folder;
|
||||||
|
use Domain\Files\Requests\RemoteUploadRequest;
|
||||||
|
use Domain\UploadRequest\Models\UploadRequest;
|
||||||
|
use Domain\Files\Actions\GetContentFromExternalSource;
|
||||||
|
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
||||||
|
|
||||||
|
class UploadFilesRemotelyForUploadRequestController
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private GetContentFromExternalSource $getContentFromExternalSource,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
*/
|
||||||
|
public function __invoke(RemoteUploadRequest $request, UploadRequest $uploadRequest)
|
||||||
|
{
|
||||||
|
// Get upload request root folder query
|
||||||
|
$folder = Folder::where('id', $uploadRequest->id);
|
||||||
|
|
||||||
|
// Create folder if not exist
|
||||||
|
if ($folder->doesntExist()) {
|
||||||
|
$this->createFolder($uploadRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set default parent_id for uploaded file
|
||||||
|
if (is_null($request->input('parent_id'))) {
|
||||||
|
$request->merge(['parent_id' => $uploadRequest->id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute job for get content from url and save
|
||||||
|
($this->getContentFromExternalSource)($request->all(), $uploadRequest->user);
|
||||||
|
|
||||||
|
// Set timestamp for auto filling
|
||||||
|
cache()->set("auto-filling.$uploadRequest->id", now()->toString());
|
||||||
|
|
||||||
|
return response('Files were successfully added to the upload queue', 201);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create root Upload Request folder
|
||||||
|
*/
|
||||||
|
private function createFolder(UploadRequest $uploadRequest): void
|
||||||
|
{
|
||||||
|
// Format timestamp
|
||||||
|
$timestamp = format_date($uploadRequest->created_at, 'd. M. Y');
|
||||||
|
|
||||||
|
// Create folder
|
||||||
|
DB::table('folders')->insert([
|
||||||
|
'id' => $uploadRequest->id,
|
||||||
|
'parent_id' => $uploadRequest->folder_id ?? null,
|
||||||
|
'user_id' => $uploadRequest->user_id,
|
||||||
|
'name' => $uploadRequest->name ?? __t('upload_request_default_folder', ['timestamp' => $timestamp]),
|
||||||
|
'created_at' => now(),
|
||||||
|
'updated_at' => now(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Update upload request status
|
||||||
|
$uploadRequest->update([
|
||||||
|
'status' => 'filling',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@ class FakeUploadFileAction
|
|||||||
return [
|
return [
|
||||||
'data' => [
|
'data' => [
|
||||||
'id' => Str::uuid(),
|
'id' => Str::uuid(),
|
||||||
'type' => get_file_type($file->getMimeType()),
|
'type' => getFileType($file->getMimeType()),
|
||||||
'attributes' => [
|
'attributes' => [
|
||||||
'filesize' => Metric::bytes($file->getSize())->format(),
|
'filesize' => Metric::bytes($file->getSize())->format(),
|
||||||
'name' => $request->input('filename'),
|
'name' => $request->input('filename'),
|
||||||
|
|||||||
+56
-12
@@ -210,7 +210,6 @@ if (! function_exists('setEnvironmentValue')) {
|
|||||||
|
|
||||||
if (count($values) > 0) {
|
if (count($values) > 0) {
|
||||||
foreach ($values as $envKey => $envValue) {
|
foreach ($values as $envKey => $envValue) {
|
||||||
|
|
||||||
$str .= "\n"; // In case the searched variable is in the last line without \n
|
$str .= "\n"; // In case the searched variable is in the last line without \n
|
||||||
$keyPosition = strpos($str, "{$envKey}=");
|
$keyPosition = strpos($str, "{$envKey}=");
|
||||||
|
|
||||||
@@ -640,7 +639,7 @@ if (! function_exists('get_file_type')) {
|
|||||||
/**
|
/**
|
||||||
* Get file type from mimetype
|
* Get file type from mimetype
|
||||||
*/
|
*/
|
||||||
function get_file_type(string $fileMimetype): string
|
function getFileType(string $fileMimetype): string
|
||||||
{
|
{
|
||||||
// Get mimetype from file
|
// Get mimetype from file
|
||||||
$mimetype = explode('/', $fileMimetype);
|
$mimetype = explode('/', $fileMimetype);
|
||||||
@@ -747,22 +746,32 @@ if (! function_exists('getPrettyName')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! function_exists('get_image_meta_data')) {
|
if (! function_exists('readExifData')) {
|
||||||
/**
|
/**
|
||||||
* Get exif data from jpeg image
|
* Get exif data from jpeg image
|
||||||
*
|
|
||||||
* @param $file
|
|
||||||
* @return array|null
|
|
||||||
*/
|
*/
|
||||||
function get_image_meta_data($file)
|
function readExifData(string $file): object|null
|
||||||
{
|
{
|
||||||
if (get_file_type_from_mimetype($file->getMimeType()) === 'jpeg') {
|
$disk = Storage::disk('local');
|
||||||
try {
|
|
||||||
// Try to get the exif data
|
$type = get_file_type_from_mimetype(
|
||||||
return mb_convert_encoding(Image::make($file->getRealPath())->exif(), 'UTF8', 'UTF8');
|
$disk->mimeType($file)
|
||||||
} catch (\Exception $e) {
|
);
|
||||||
|
|
||||||
|
if ($type !== 'jpeg') {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Try to get the exif data
|
||||||
|
$data = Image::make($disk->path($file))->exif();
|
||||||
|
|
||||||
|
// Encode data
|
||||||
|
$encodedData = mb_convert_encoding($data, 'UTF8', 'UTF8');
|
||||||
|
|
||||||
|
return json_decode(json_encode($encodedData));
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1148,4 +1157,39 @@ if (! function_exists('replace_occurrence')) {
|
|||||||
return "{$degrees}°$minutes'$seconds\"$ref";
|
return "{$degrees}°$minutes'$seconds\"$ref";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! function_exists('extractExtensionFromUrl')) {
|
||||||
|
/**
|
||||||
|
* Extract extension from the url
|
||||||
|
*
|
||||||
|
* TODO: make unit test
|
||||||
|
*/
|
||||||
|
function extractExtensionFromUrl($url, $response): string|null
|
||||||
|
{
|
||||||
|
$extension = null;
|
||||||
|
|
||||||
|
if (array_key_exists('extension', pathinfo($url))) {
|
||||||
|
// Break attributes
|
||||||
|
$string = str_replace(['&'], '?', pathinfo($url)['extension']);
|
||||||
|
|
||||||
|
// Get extension from url path
|
||||||
|
$extension = explode('?', $string)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return pure extension
|
||||||
|
if ($extension) {
|
||||||
|
return $extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare header for extracting content-type line
|
||||||
|
$header = array_change_key_case($response->headers(), CASE_LOWER);
|
||||||
|
|
||||||
|
// Get extension
|
||||||
|
if (array_key_exists('content-type', $header)) {
|
||||||
|
return explode('/', $header['content-type'][0])[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,8 @@ class AdminTest extends TestCase
|
|||||||
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
||||||
|
|
||||||
$this->postJson('/api/upload', [
|
$this->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use Domain\Files\Models\File;
|
|||||||
use Domain\Folders\Models\Folder;
|
use Domain\Folders\Models\Folder;
|
||||||
use Illuminate\Http\UploadedFile;
|
use Illuminate\Http\UploadedFile;
|
||||||
use Domain\Settings\Models\Setting;
|
use Domain\Settings\Models\Setting;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
|
|
||||||
class FileTest extends TestCase
|
class FileTest extends TestCase
|
||||||
{
|
{
|
||||||
@@ -40,7 +41,8 @@ class FileTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => '.jpg',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -80,7 +82,8 @@ class FileTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -100,6 +103,54 @@ class FileTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function it_remotely_upload_new_file()
|
||||||
|
{
|
||||||
|
$user = User::factory()
|
||||||
|
->hasSettings()
|
||||||
|
->create();
|
||||||
|
|
||||||
|
$folder = Folder::factory()
|
||||||
|
->create([
|
||||||
|
'user_id' => $user->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$fakeFile = UploadedFile::fake()
|
||||||
|
->create('top-secret-document.pdf', 12000000, 'application/pdf');
|
||||||
|
|
||||||
|
Http::fake([
|
||||||
|
'https://fake.com/top-secret-document.pdf' => Http::response($fakeFile->getContent()),
|
||||||
|
'https://fake.com/another-secret-document.pdf' => Http::response($fakeFile->getContent()),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this
|
||||||
|
->actingAs($user)
|
||||||
|
->postJson('/api/upload/remote', [
|
||||||
|
'urls' => [
|
||||||
|
'https://fake.com/top-secret-document.pdf',
|
||||||
|
'https://fake.com/another-secret-document.pdf',
|
||||||
|
],
|
||||||
|
'parent_id' => $folder->id,
|
||||||
|
])->assertStatus(201);
|
||||||
|
|
||||||
|
$this
|
||||||
|
->assertDatabaseHas('files', [
|
||||||
|
'user_id' => $user->id,
|
||||||
|
'name' => 'top-secret-document',
|
||||||
|
'parent_id' => $folder->id,
|
||||||
|
])
|
||||||
|
->assertDatabaseHas('files', [
|
||||||
|
'name' => 'another-secret-document',
|
||||||
|
]);
|
||||||
|
|
||||||
|
File::all()
|
||||||
|
->each(function ($file) {
|
||||||
|
Storage::assertExists("files/$file->user_id/$file->basename");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
*/
|
*/
|
||||||
@@ -125,7 +176,8 @@ class FileTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'jpeg',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -158,6 +210,7 @@ class FileTest extends TestCase
|
|||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
|
'extension' => 'pdf',
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
'is_last' => 'true',
|
'is_last' => 'true',
|
||||||
@@ -348,7 +401,8 @@ class FileTest extends TestCase
|
|||||||
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
||||||
|
|
||||||
$this->postJson('/api/upload', [
|
$this->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -401,7 +455,8 @@ class FileTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'jpg',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => '/' . $file->name,
|
'path' => '/' . $file->name,
|
||||||
|
|||||||
@@ -371,7 +371,8 @@ class FolderTest extends TestCase
|
|||||||
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
||||||
|
|
||||||
$this->postJson('/api/upload', [
|
$this->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
|
|||||||
@@ -30,7 +30,8 @@ class FolderUploadTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'path' => '/',
|
'path' => '/',
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
@@ -59,7 +60,8 @@ class FolderUploadTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'path' => "/level_1/level_2/level_3/$file->name",
|
'path' => "/level_1/level_2/level_3/$file->name",
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
@@ -69,7 +71,8 @@ class FolderUploadTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'path' => "/level_1/level_2/level_3/$file->name",
|
'path' => "/level_1/level_2/level_3/$file->name",
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
@@ -127,7 +130,8 @@ class FolderUploadTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'path' => "/another_folder/level_2/level_3/$file->name",
|
'path' => "/another_folder/level_2/level_3/$file->name",
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
@@ -163,7 +167,8 @@ class FolderUploadTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $brother->name,
|
'name' => $brother->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $brother,
|
'file' => $brother,
|
||||||
'path' => "/Folder/Brother/$brother->name",
|
'path' => "/Folder/Brother/$brother->name",
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
@@ -173,7 +178,8 @@ class FolderUploadTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $sister->name,
|
'name' => $sister->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $sister,
|
'file' => $sister,
|
||||||
'path' => "/Folder/Sister/$sister->name",
|
'path' => "/Folder/Sister/$sister->name",
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
|
|||||||
@@ -330,7 +330,8 @@ class VisitorManipulatingTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->withUnencryptedCookies($cookie)
|
->withUnencryptedCookies($cookie)
|
||||||
->post("/api/editor/upload/$share->token", [
|
->post("/api/editor/upload/$share->token", [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -341,7 +342,8 @@ class VisitorManipulatingTest extends TestCase
|
|||||||
// Check public shared item
|
// Check public shared item
|
||||||
if (! $is_protected) {
|
if (! $is_protected) {
|
||||||
$this->postJson("/api/editor/upload/$share->token", [
|
$this->postJson("/api/editor/upload/$share->token", [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ class TeamFileAccessTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -80,7 +81,8 @@ class TeamFileAccessTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($user)
|
->actingAs($user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
|
|||||||
@@ -283,7 +283,8 @@ class TeamsTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($member)
|
->actingAs($member)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class TrafficTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($this->user)
|
->actingAs($this->user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $this->file->name,
|
'name' => $this->file->name,
|
||||||
'file' => $this->file,
|
'file' => $this->file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => '/' . $this->file->name,
|
'path' => '/' . $this->file->name,
|
||||||
@@ -58,7 +58,7 @@ class TrafficTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($this->user)
|
->actingAs($this->user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $this->file->name,
|
'name' => $this->file->name,
|
||||||
'file' => $this->file,
|
'file' => $this->file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => '/' . $this->file->name,
|
'path' => '/' . $this->file->name,
|
||||||
@@ -79,7 +79,7 @@ class TrafficTest extends TestCase
|
|||||||
$this
|
$this
|
||||||
->actingAs($this->user)
|
->actingAs($this->user)
|
||||||
->postJson('/api/upload', [
|
->postJson('/api/upload', [
|
||||||
'filename' => $secondFile->name,
|
'name' => $secondFile->name,
|
||||||
'file' => $secondFile,
|
'file' => $secondFile,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => '/' . $secondFile->name,
|
'path' => '/' . $secondFile->name,
|
||||||
@@ -117,7 +117,7 @@ class TrafficTest extends TestCase
|
|||||||
|
|
||||||
// Check public shared item
|
// Check public shared item
|
||||||
$this->postJson("/api/editor/upload/$share->token", [
|
$this->postJson("/api/editor/upload/$share->token", [
|
||||||
'filename' => $this->file->name,
|
'name' => $this->file->name,
|
||||||
'file' => $this->file,
|
'file' => $this->file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => '/' . $this->file->name,
|
'path' => '/' . $this->file->name,
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class TrashTest extends TestCase
|
|||||||
->image('fake-image.jpg');
|
->image('fake-image.jpg');
|
||||||
|
|
||||||
$this->postJson('/api/upload', [
|
$this->postJson('/api/upload', [
|
||||||
'filename' => $image->name,
|
'name' => $image->name,
|
||||||
'file' => $image,
|
'file' => $image,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => '/' . $image->name,
|
'path' => '/' . $image->name,
|
||||||
|
|||||||
@@ -150,7 +150,8 @@ class UploadRequestTest extends TestCase
|
|||||||
|
|
||||||
$this
|
$this
|
||||||
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -195,7 +196,8 @@ class UploadRequestTest extends TestCase
|
|||||||
|
|
||||||
$this
|
$this
|
||||||
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -239,7 +241,7 @@ class UploadRequestTest extends TestCase
|
|||||||
|
|
||||||
$this
|
$this
|
||||||
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -312,7 +314,8 @@ class UploadRequestTest extends TestCase
|
|||||||
|
|
||||||
$this
|
$this
|
||||||
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
->postJson("/api/upload-request/$uploadRequest->id/upload", [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ class UserZippingTest extends TestCase
|
|||||||
->create("fake-inner-file-$index.pdf", 1200, 'application/pdf');
|
->create("fake-inner-file-$index.pdf", 1200, 'application/pdf');
|
||||||
|
|
||||||
$this->postJson('/api/upload', [
|
$this->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -46,7 +47,8 @@ class UserZippingTest extends TestCase
|
|||||||
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
||||||
|
|
||||||
$this->postJson('/api/upload', [
|
$this->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => null,
|
'parent_id' => null,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
@@ -87,7 +89,8 @@ class UserZippingTest extends TestCase
|
|||||||
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
->create("fake-file-$index.pdf", 1200, 'application/pdf');
|
||||||
|
|
||||||
$this->postJson('/api/upload', [
|
$this->postJson('/api/upload', [
|
||||||
'filename' => $file->name,
|
'name' => $file->name,
|
||||||
|
'extension' => 'pdf',
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'parent_id' => $folder->id,
|
'parent_id' => $folder->id,
|
||||||
'path' => "/$file->name",
|
'path' => "/$file->name",
|
||||||
|
|||||||
Reference in New Issue
Block a user