mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-05 18:23:48 +00:00
- when member upload files or create folder in team folder, the true owner of the content is creator of team member. That means the upload bandwidth and storage go to creator responsibility
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
APP_NAME=Laravel
|
||||
APP_ENV=local
|
||||
APP_KEY=base64:Rv3QVmDH6npEiVy+pKyyjWYyTJfMvsQdFZ2YA7hAclg=
|
||||
APP_KEY=base64:HHr62VlPgXN/+sC/WV0m5gZVCbzV+k1ZdpI83fJCtO4=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://localhost
|
||||
APP_DEMO=false
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'version' => '2.0.9',
|
||||
'version' => '2.0.10',
|
||||
|
||||
'is_demo' => env('APP_DEMO', false),
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ class FileFactory extends Factory
|
||||
return [
|
||||
'id' => $this->faker->uuid,
|
||||
'user_id' => $this->faker->uuid,
|
||||
'creator_id' => $this->faker->uuid,
|
||||
'name' => $this->faker->word,
|
||||
'basename' => Str::slug($this->faker->name),
|
||||
'mimetype' => $this->faker->mimeType,
|
||||
@@ -32,9 +33,6 @@ class FileFactory extends Factory
|
||||
'type' => $this->faker->randomElement(
|
||||
['image', 'file', 'video', 'audio']
|
||||
),
|
||||
'author' => $this->faker->randomElement(
|
||||
['user', 'member', 'visitor']
|
||||
),
|
||||
'created_at' => $this->faker->dateTimeBetween('-36 months'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('files', function (Blueprint $table) {
|
||||
$table->dropColumn('author');
|
||||
});
|
||||
|
||||
Schema::table('files', function (Blueprint $table) {
|
||||
$table->uuid('creator_id')->after('user_id')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('files', function (Blueprint $table) {
|
||||
$table->dropColumn('creator_id');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -1,75 +1,75 @@
|
||||
{
|
||||
"/js/main.js": "/js/main.js",
|
||||
"/chunks/request.js": "/chunks/request.js?id=37e3e34fbcc98d4c",
|
||||
"/chunks/request-upload.js": "/chunks/request-upload.js?id=2a6d910114ffb8d2",
|
||||
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=3c2fc454c3fce8d2",
|
||||
"/chunks/status-check.js": "/chunks/status-check.js?id=ea0f79fc9a604cff",
|
||||
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=c1df85c34d7e9521",
|
||||
"/chunks/database.js": "/chunks/database.js?id=c686d46622194c7e",
|
||||
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=d045f6827f61ac9b",
|
||||
"/chunks/app-setup.js": "/chunks/app-setup.js?id=c37d19ccd20b6656",
|
||||
"/chunks/admin-account.js": "/chunks/admin-account.js?id=666e7ee49b02b57c",
|
||||
"/chunks/shared.js": "/chunks/shared.js?id=557e8a1b4256d65a",
|
||||
"/chunks/shared/browser.js": "/chunks/shared/browser.js?id=a9710655d75c8079",
|
||||
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=7865f79c2905e81d",
|
||||
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=ca8cc89fe5982782",
|
||||
"/chunks/not-found.js": "/chunks/not-found.js?id=4cb8d3a7a2212c3c",
|
||||
"/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=c71981d946a9ca71",
|
||||
"/chunks/admin.js": "/chunks/admin.js?id=4264091e17e2ceed",
|
||||
"/chunks/dashboard.js": "/chunks/dashboard.js?id=98dade7f03d93826",
|
||||
"/chunks/invoices.js": "/chunks/invoices.js?id=70fb9a603be2f554",
|
||||
"/chunks/subscriptions.js": "/chunks/subscriptions.js?id=94e96e1bb505ae59",
|
||||
"/chunks/pages.js": "/chunks/pages.js?id=d1f5d211e9dfc4ae",
|
||||
"/chunks/page-edit.js": "/chunks/page-edit.js?id=c241f8733acb584f",
|
||||
"/chunks/plans.js": "/chunks/plans.js?id=f6e9d2f34fac6d79",
|
||||
"/chunks/users.js": "/chunks/users.js?id=651b8af7afecc88e",
|
||||
"/chunks/user-create.js": "/chunks/user-create.js?id=3b0c4a348a5b1857",
|
||||
"/chunks/plan-create/fixed.js": "/chunks/plan-create/fixed.js?id=81dcec66b3ab0f9c",
|
||||
"/chunks/plan-create/metered.js": "/chunks/plan-create/metered.js?id=e7d07663f1ec94fb",
|
||||
"/chunks/user.js": "/chunks/user.js?id=dae4ac26750f99d0",
|
||||
"/chunks/user-detail.js": "/chunks/user-detail.js?id=207de969e16d9284",
|
||||
"/chunks/user-storage.js": "/chunks/user-storage.js?id=d56b28f604b1d012",
|
||||
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=25a31d9cbbb0507a",
|
||||
"/chunks/user-password.js": "/chunks/user-password.js?id=be5d5cdf90f1e0de",
|
||||
"/chunks/user-delete.js": "/chunks/user-delete.js?id=0783eb95a7226ff8",
|
||||
"/chunks/plan.js": "/chunks/plan.js?id=d8ffa85dc9b68966",
|
||||
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=3010ddb4ba7419e9",
|
||||
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=f41fe30f2273279c",
|
||||
"/chunks/plan-delete.js": "/chunks/plan-delete.js?id=bf5e732edaff3608",
|
||||
"/chunks/payments.js": "/chunks/payments.js?id=051e8246e2b5c9d0",
|
||||
"/chunks/payments/billings.js": "/chunks/payments/billings.js?id=893998fa7380c5a0",
|
||||
"/chunks/payments/settings.js": "/chunks/payments/settings.js?id=189bb7b91cd6a32a",
|
||||
"/chunks/app-settings.js": "/chunks/app-settings.js?id=692d3291fb9d2cf7",
|
||||
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=e8377974f2444a44",
|
||||
"/chunks/app-index.js": "/chunks/app-index.js?id=9aadc4841d83e821",
|
||||
"/chunks/app-environment.js": "/chunks/app-environment.js?id=637b39d290081e0d",
|
||||
"/chunks/app-others.js": "/chunks/app-others.js?id=ac2dccb4b4a87bfb",
|
||||
"/chunks/app-sign-in-out.js": "/chunks/app-sign-in-out.js?id=04fbf6846bbc6ade",
|
||||
"/chunks/app-adsense.js": "/chunks/app-adsense.js?id=18842ed46783ea39",
|
||||
"/chunks/app-server.js": "/chunks/app-server.js?id=6dbdc01c6b0e65b3",
|
||||
"/chunks/app-language.js": "/chunks/app-language.js?id=db16d24415743d42",
|
||||
"/chunks/homepage.js": "/chunks/homepage.js?id=828e3e90bf35b652",
|
||||
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=e110e8923b6ca22f",
|
||||
"/chunks/contact-us.js": "/chunks/contact-us.js?id=5ca104a75598dd39",
|
||||
"/chunks/successfully-email-verified.js": "/chunks/successfully-email-verified.js?id=3153532f0d2273c8",
|
||||
"/chunks/successfully-email-send.js": "/chunks/successfully-email-send.js?id=d630ed9f6f558509",
|
||||
"/chunks/sign-in.js": "/chunks/sign-in.js?id=8cec25f9f11b217a",
|
||||
"/chunks/sign-up.js": "/chunks/sign-up.js?id=c1cadbfd4ac0df7b",
|
||||
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=9c62b8573fbdd567",
|
||||
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=926b35b6745d99ba",
|
||||
"/chunks/settings.js": "/chunks/settings.js?id=0f15f42736478feb",
|
||||
"/chunks/profile.js": "/chunks/profile.js?id=013b252e73d160d0",
|
||||
"/chunks/settings-password.js": "/chunks/settings-password.js?id=149343604362b7df",
|
||||
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=68765cac4e648e90",
|
||||
"/chunks/billing.js": "/chunks/billing.js?id=c77093c6a0dc65e3",
|
||||
"/chunks/platform.js": "/chunks/platform.js?id=9d964a12c50eebea",
|
||||
"/chunks/files.js": "/chunks/files.js?id=5d6eb9b9f9ecd296",
|
||||
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=827d3a5dcce159b5",
|
||||
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=2a4e4e0db02cbcbb",
|
||||
"/chunks/trash.js": "/chunks/trash.js?id=8362aa0f91231350",
|
||||
"/chunks/team-folders.js": "/chunks/team-folders.js?id=0a46fecf35a23406",
|
||||
"/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=77a33583775c6d8f",
|
||||
"/chunks/invitation.js": "/chunks/invitation.js?id=64a211c90b505767",
|
||||
"/chunks/request.js": "/chunks/request.js?id=14b4eff14acc96f0",
|
||||
"/chunks/request-upload.js": "/chunks/request-upload.js?id=5cf8338c7200a1bf",
|
||||
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=19a0784e59d768ec",
|
||||
"/chunks/status-check.js": "/chunks/status-check.js?id=51a75f0b3b260189",
|
||||
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=df5bd89528649783",
|
||||
"/chunks/database.js": "/chunks/database.js?id=15cc488117dccf7b",
|
||||
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=e1ad83583367917a",
|
||||
"/chunks/app-setup.js": "/chunks/app-setup.js?id=288594cd7f628cf8",
|
||||
"/chunks/admin-account.js": "/chunks/admin-account.js?id=916450217130f3b8",
|
||||
"/chunks/shared.js": "/chunks/shared.js?id=b493900394d77a9c",
|
||||
"/chunks/shared/browser.js": "/chunks/shared/browser.js?id=09c2c58a5688eddb",
|
||||
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=9ae0babfa7134c29",
|
||||
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=672e931a9fb0b672",
|
||||
"/chunks/not-found.js": "/chunks/not-found.js?id=9f6ce23ce5d969f1",
|
||||
"/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=f564565faa09d6d6",
|
||||
"/chunks/admin.js": "/chunks/admin.js?id=a0c8318fb3480cb0",
|
||||
"/chunks/dashboard.js": "/chunks/dashboard.js?id=ec5474f5a9da434c",
|
||||
"/chunks/invoices.js": "/chunks/invoices.js?id=1416cbf6d1a593ac",
|
||||
"/chunks/subscriptions.js": "/chunks/subscriptions.js?id=5bf6704f5b599f36",
|
||||
"/chunks/pages.js": "/chunks/pages.js?id=c8380d571e91e8be",
|
||||
"/chunks/page-edit.js": "/chunks/page-edit.js?id=fb3f9eda3dc1d15c",
|
||||
"/chunks/plans.js": "/chunks/plans.js?id=c8506e0e20966ef7",
|
||||
"/chunks/users.js": "/chunks/users.js?id=ec687ee365c4248a",
|
||||
"/chunks/user-create.js": "/chunks/user-create.js?id=8dd9d29f024132f5",
|
||||
"/chunks/plan-create/fixed.js": "/chunks/plan-create/fixed.js?id=b24d8dbe1f0f706f",
|
||||
"/chunks/plan-create/metered.js": "/chunks/plan-create/metered.js?id=d9f1bcb1fe44a6ae",
|
||||
"/chunks/user.js": "/chunks/user.js?id=c191b906a0496fe5",
|
||||
"/chunks/user-detail.js": "/chunks/user-detail.js?id=f9e17ff98354e984",
|
||||
"/chunks/user-storage.js": "/chunks/user-storage.js?id=a8e0bce4703232a0",
|
||||
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=27d046c1122783ea",
|
||||
"/chunks/user-password.js": "/chunks/user-password.js?id=23d3aee39f539a3c",
|
||||
"/chunks/user-delete.js": "/chunks/user-delete.js?id=6bea6f8cadf4d74f",
|
||||
"/chunks/plan.js": "/chunks/plan.js?id=4b267375ea9f19b3",
|
||||
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=a956ceca6865c50c",
|
||||
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=715ee86991d5e4db",
|
||||
"/chunks/plan-delete.js": "/chunks/plan-delete.js?id=1ad77372d342326f",
|
||||
"/chunks/payments.js": "/chunks/payments.js?id=dc4586691c25de6f",
|
||||
"/chunks/payments/billings.js": "/chunks/payments/billings.js?id=dd6c9d6a29a47808",
|
||||
"/chunks/payments/settings.js": "/chunks/payments/settings.js?id=5b139952f337c83e",
|
||||
"/chunks/app-settings.js": "/chunks/app-settings.js?id=55da23af2b076069",
|
||||
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=a694a01f3641712c",
|
||||
"/chunks/app-index.js": "/chunks/app-index.js?id=efdbfa062749ca00",
|
||||
"/chunks/app-environment.js": "/chunks/app-environment.js?id=9632034e8ded7d34",
|
||||
"/chunks/app-others.js": "/chunks/app-others.js?id=0f84e2ed1230558e",
|
||||
"/chunks/app-sign-in-out.js": "/chunks/app-sign-in-out.js?id=1cfffc99465b9a7a",
|
||||
"/chunks/app-adsense.js": "/chunks/app-adsense.js?id=a5dc9e715f8561bd",
|
||||
"/chunks/app-server.js": "/chunks/app-server.js?id=4510d63685353c68",
|
||||
"/chunks/app-language.js": "/chunks/app-language.js?id=7e5f3d5ec447e397",
|
||||
"/chunks/homepage.js": "/chunks/homepage.js?id=b6597181c9e4353d",
|
||||
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=2504793131107b1f",
|
||||
"/chunks/contact-us.js": "/chunks/contact-us.js?id=9adc7e145be4e160",
|
||||
"/chunks/successfully-email-verified.js": "/chunks/successfully-email-verified.js?id=25b805ade5230382",
|
||||
"/chunks/successfully-email-send.js": "/chunks/successfully-email-send.js?id=f4562229776d9f56",
|
||||
"/chunks/sign-in.js": "/chunks/sign-in.js?id=0d48d229038a3a1e",
|
||||
"/chunks/sign-up.js": "/chunks/sign-up.js?id=bb92bad614e60d45",
|
||||
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=50a1bc5e4ed86ec9",
|
||||
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=f652de052dba55c1",
|
||||
"/chunks/settings.js": "/chunks/settings.js?id=9e0671d49295178e",
|
||||
"/chunks/profile.js": "/chunks/profile.js?id=0eca231475e267ab",
|
||||
"/chunks/settings-password.js": "/chunks/settings-password.js?id=11d4331650cac280",
|
||||
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=994b669a56fd417b",
|
||||
"/chunks/billing.js": "/chunks/billing.js?id=4ea77ab501b8c575",
|
||||
"/chunks/platform.js": "/chunks/platform.js?id=9d926efeacb4d530",
|
||||
"/chunks/files.js": "/chunks/files.js?id=053fc46f0a783697",
|
||||
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=aefaf719fbafa603",
|
||||
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=ea72dbc73a771e4a",
|
||||
"/chunks/trash.js": "/chunks/trash.js?id=6bc564374cb24449",
|
||||
"/chunks/team-folders.js": "/chunks/team-folders.js?id=f2c2722451de236c",
|
||||
"/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=fcf601ec2d9e3318",
|
||||
"/chunks/invitation.js": "/chunks/invitation.js?id=9ed8456c9d6d5ce1",
|
||||
"/css/tailwind.css": "/css/tailwind.css",
|
||||
"/css/app.css": "/css/app.css"
|
||||
}
|
||||
|
||||
@@ -87,9 +87,9 @@
|
||||
<!--Author-->
|
||||
<ListInfoItem v-if="canShowAuthor" :title="$t('author')">
|
||||
<div class="mt-1.5 flex items-center">
|
||||
<MemberAvatar :size="32" :member="singleFile.data.relationships.owner" />
|
||||
<MemberAvatar :size="32" :member="singleFile.data.relationships.creator" />
|
||||
<span class="ml-3 block text-sm font-bold">
|
||||
{{ singleFile.data.relationships.owner.data.attributes.name }}
|
||||
{{ singleFile.data.relationships.creator.data.attributes.name }}
|
||||
</span>
|
||||
</div>
|
||||
</ListInfoItem>
|
||||
@@ -160,7 +160,7 @@ import { mapGetters } from 'vuex'
|
||||
return (
|
||||
this.$isThisRoute(this.$route, ['SharedWithMe', 'TeamFolders']) &&
|
||||
this.clipboard[0].data.type !== 'folder' &&
|
||||
this.user.data.id !== this.clipboard[0].data.relationships.owner.data.id
|
||||
this.user.data.id !== this.clipboard[0].data.relationships.creator.data.id
|
||||
)
|
||||
},
|
||||
},
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
v-if="user && canShowAuthor"
|
||||
:size="38"
|
||||
:is-border="true"
|
||||
:member="entry.data.relationships.owner"
|
||||
:member="entry.data.relationships.creator"
|
||||
class="absolute right-2 -bottom-5 z-10 z-10 scale-75 transform lg:-bottom-7 lg:scale-100"
|
||||
/>
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
v-if="user && canShowAuthor"
|
||||
:size="38"
|
||||
:is-border="true"
|
||||
:member="entry.data.relationships.owner"
|
||||
:member="entry.data.relationships.creator"
|
||||
class="absolute -right-3 -bottom-2.5 z-10 scale-75 transform lg:scale-100"
|
||||
/>
|
||||
|
||||
@@ -200,9 +200,10 @@ export default {
|
||||
},
|
||||
canShowAuthor() {
|
||||
return (
|
||||
this.$isThisRoute(this.$route, ['SharedWithMe', 'TeamFolders']) &&
|
||||
!this.isFolder &&
|
||||
this.user.data.id !== this.entry.data.relationships.owner.data.id
|
||||
this.$isThisRoute(this.$route, ['SharedWithMe', 'TeamFolders'])
|
||||
&& !this.isFolder
|
||||
&& this.entry.data.relationships.creator
|
||||
&& this.user.data.id !== this.entry.data.relationships.creator.data.id
|
||||
)
|
||||
},
|
||||
canShowLinkIcon() {
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
v-if="user && canShowAuthor"
|
||||
:size="28"
|
||||
:is-border="true"
|
||||
:member="entry.data.relationships.owner"
|
||||
:member="entry.data.relationships.creator"
|
||||
class="absolute right-1.5 -bottom-2 z-10"
|
||||
/>
|
||||
|
||||
@@ -183,7 +183,7 @@ export default {
|
||||
: this.entry.data.attributes.items
|
||||
},
|
||||
canShowAuthor() {
|
||||
return !this.isFolder && this.user.data.id !== this.entry.data.relationships.owner.data.id
|
||||
return !this.isFolder && this.entry.data.relationships.creator && this.user.data.id !== this.entry.data.relationships.creator.data.id
|
||||
},
|
||||
canDrag() {
|
||||
return !this.isDeleted && this.$checkPermission(['master', 'editor'])
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
v-if="user && canShowAuthor"
|
||||
:size="28"
|
||||
:is-border="true"
|
||||
:member="item.data.relationships.owner"
|
||||
:member="item.data.relationships.creator"
|
||||
class="absolute right-1.5 -bottom-2 z-10"
|
||||
/>
|
||||
|
||||
@@ -130,7 +130,7 @@ export default {
|
||||
: this.item.data.attributes.items
|
||||
},
|
||||
canShowAuthor() {
|
||||
return !this.isFolder && this.user.data.id !== this.item.data.relationships.owner.data.id
|
||||
return !this.isFolder && this.user.data.id !== this.item.data.relationships.creator.data.id
|
||||
},
|
||||
canDrag() {
|
||||
return !this.isDeleted && this.$checkPermission(['master', 'editor'])
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<template>
|
||||
<div
|
||||
:class="{
|
||||
'pointer-events-none opacity-50': (disabledById && disabledById.data.id === nodes.id) || !disableId || (isRootDepth && !nodes.folders.length),
|
||||
'pointer-events-none opacity-50': (disabledById && disabledById.data.id === nodes.id) || !disableId || (isRootDepth && !nodes.folders.length && nodes.location !== 'files'),
|
||||
'mb-2.5': isRootDepth,
|
||||
}"
|
||||
>
|
||||
<div
|
||||
:style="indent"
|
||||
class="relative relative flex cursor-pointer select-none items-center whitespace-nowrap lg:py-2 py-3.5 px-1.5 transition-all duration-150"
|
||||
class="relative relative flex cursor-pointer select-none items-center whitespace-nowrap px-1.5 transition-all duration-150"
|
||||
>
|
||||
<!--Arrow icon-->
|
||||
<span @click.stop="showTree" class="-m-2 p-2">
|
||||
@@ -51,7 +51,7 @@
|
||||
<!--Item label-->
|
||||
<b
|
||||
@click="getFolder"
|
||||
class="ml-3 inline-block overflow-x-hidden text-ellipsis whitespace-nowrap text-xs font-bold transition-all duration-150"
|
||||
class="lg:py-2 py-3.5 ml-3 inline-block overflow-x-hidden text-ellipsis whitespace-nowrap text-xs font-bold transition-all duration-150"
|
||||
:class="{'text-theme': isSelectedItem }"
|
||||
>
|
||||
{{ nodes.name }}
|
||||
|
||||
@@ -788,37 +788,36 @@ export default {
|
||||
},
|
||||
})
|
||||
} else if (file.data.attributes.isTeamFolder) {
|
||||
if (file.data.relationships.owner.data.id === this.user.data.id) {
|
||||
this.$router.push({
|
||||
name: 'TeamFolders',
|
||||
params: { id: file.data.id },
|
||||
})
|
||||
} else {
|
||||
this.$router.push({
|
||||
name: 'SharedWithMe',
|
||||
params: { id: file.data.id },
|
||||
})
|
||||
}
|
||||
let route = file.data.relationships.user.data.id === this.user.data.id
|
||||
? 'TeamFolders'
|
||||
: 'SharedWithMe'
|
||||
|
||||
this.$router.push({
|
||||
name: route,
|
||||
params: { id: file.data.id },
|
||||
})
|
||||
} else {
|
||||
this.$router.push({
|
||||
name: 'Files',
|
||||
params: { id: file.data.id },
|
||||
})
|
||||
}
|
||||
} else {
|
||||
// Show file
|
||||
if (['video', 'audio', 'image'].includes(file.data.type) || file.data.attributes.mimetype === 'pdf') {
|
||||
this.$store.commit('ADD_TO_FAST_PREVIEW', file)
|
||||
|
||||
events.$emit('file-preview:show')
|
||||
} else {
|
||||
this.$downloadFile(
|
||||
file.data.attributes.file_url,
|
||||
file.data.attributes.name + '.' + file.data.attributes.mimetype
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (file.data.type !== 'folder') {
|
||||
// Show file
|
||||
if (['video', 'audio', 'image'].includes(file.data.type) || file.data.attributes.mimetype === 'pdf') {
|
||||
this.$store.commit('ADD_TO_FAST_PREVIEW', file)
|
||||
|
||||
events.$emit('file-preview:show')
|
||||
} else {
|
||||
this.$downloadFile(
|
||||
file.data.attributes.file_url,
|
||||
file.data.attributes.name + '.' + file.data.attributes.mimetype
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
this.exitSpotlight()
|
||||
},
|
||||
findResult: debounce(function (value) {
|
||||
|
||||
@@ -268,7 +268,8 @@ export default {
|
||||
this.$updateText(
|
||||
'/user/settings',
|
||||
'last_name',
|
||||
this.user.data.relationships.settings.data.attributes.last_name
|
||||
this.user.data.relationships.settings.data.attributes.last_name,
|
||||
true
|
||||
)
|
||||
},
|
||||
},
|
||||
|
||||
@@ -213,7 +213,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -329,7 +328,6 @@ class SetupDevEnvironment extends Command
|
||||
$shared_folder = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'author' => 'user',
|
||||
'name' => 'Shared Folder',
|
||||
'emoji' => [
|
||||
'codes' => '1F680',
|
||||
@@ -365,7 +363,6 @@ class SetupDevEnvironment extends Command
|
||||
$random_pics = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'author' => 'user',
|
||||
'name' => 'Random Pics',
|
||||
'emoji' => [
|
||||
'codes' => '1F4F7',
|
||||
@@ -414,7 +411,6 @@ class SetupDevEnvironment extends Command
|
||||
$playable_media = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'author' => 'user',
|
||||
'name' => 'Playable Media',
|
||||
'created_at' => now()->subMinutes(2),
|
||||
]);
|
||||
@@ -439,7 +435,6 @@ class SetupDevEnvironment extends Command
|
||||
$multi_level = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'author' => 'user',
|
||||
'name' => 'Multi Level Folder',
|
||||
'created_at' => now()->subMinutes(3),
|
||||
]);
|
||||
@@ -472,7 +467,6 @@ class SetupDevEnvironment extends Command
|
||||
$documents = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'author' => 'user',
|
||||
'name' => 'Documents',
|
||||
'created_at' => now()->subMinutes(4),
|
||||
]);
|
||||
@@ -492,7 +486,6 @@ class SetupDevEnvironment extends Command
|
||||
$videohive = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'author' => 'user',
|
||||
'name' => 'Videohive',
|
||||
'created_at' => now()->subMinutes(5),
|
||||
]);
|
||||
@@ -542,7 +535,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file['name'],
|
||||
'basename' => $basename,
|
||||
'type' => 'file',
|
||||
'author' => 'user',
|
||||
'mimetype' => $file['mimetype'],
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -585,7 +577,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file['name'],
|
||||
'basename' => $basename,
|
||||
'type' => 'file',
|
||||
'author' => 'user',
|
||||
'mimetype' => $file['mimetype'],
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -617,7 +608,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file['name'],
|
||||
'basename' => $basename,
|
||||
'type' => 'file',
|
||||
'author' => 'user',
|
||||
'mimetype' => $file['mimetype'],
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -675,7 +665,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file['name'],
|
||||
'basename' => $basename,
|
||||
'type' => 'file',
|
||||
'author' => 'visitor',
|
||||
'mimetype' => $file['mimetype'],
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -702,7 +691,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file,
|
||||
'basename' => $basename,
|
||||
'type' => 'video',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'mp4',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -726,7 +714,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file,
|
||||
'basename' => $basename,
|
||||
'type' => 'video',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'mp4',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -750,7 +737,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file,
|
||||
'basename' => $basename,
|
||||
'type' => 'audio',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'mp3',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -781,7 +767,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -808,7 +793,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -839,7 +823,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -901,7 +884,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -924,7 +906,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -972,7 +953,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -995,7 +975,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1046,7 +1025,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file['name'],
|
||||
'basename' => $basename,
|
||||
'type' => 'file',
|
||||
'author' => 'user',
|
||||
'mimetype' => $file['mimetype'],
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1088,7 +1066,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1128,7 +1105,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file['name'],
|
||||
'basename' => $basename,
|
||||
'type' => 'file',
|
||||
'author' => 'user',
|
||||
'mimetype' => $file['mimetype'],
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1268,7 +1244,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file,
|
||||
'basename' => $basename,
|
||||
'type' => 'video',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'mp4',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1297,7 +1272,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $file['name'],
|
||||
'basename' => $basename,
|
||||
'type' => 'file',
|
||||
'author' => 'user',
|
||||
'mimetype' => $file['mimetype'],
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1319,7 +1293,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1340,7 +1313,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
@@ -1361,7 +1333,6 @@ class SetupDevEnvironment extends Command
|
||||
'name' => $thumbnail['name'],
|
||||
'basename' => $thumbnail['basename'],
|
||||
'type' => 'image',
|
||||
'author' => 'user',
|
||||
'mimetype' => 'jpg',
|
||||
'filesize' => rand(1000000, 4000000),
|
||||
'created_at' => now()->subMinutes(rand(1, 5)),
|
||||
|
||||
@@ -25,7 +25,7 @@ class UpdateUserProfileSettingsRequest extends FormRequest
|
||||
return [
|
||||
'avatar' => 'sometimes|file',
|
||||
'name' => 'string',
|
||||
'value' => 'string',
|
||||
'value' => 'string|nullable',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
<?php
|
||||
namespace Domain\Files\Actions;
|
||||
|
||||
use App\Users\Models\User;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Domain\Folders\Models\Folder;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Domain\Files\Requests\UploadRequest;
|
||||
@@ -60,13 +59,14 @@ class UploadFileAction
|
||||
// File name
|
||||
$fileName = Str::uuid() . '.' . $request->input('extension');
|
||||
|
||||
// Get user data
|
||||
$user = $userId ? User::find($userId) : Auth::user();
|
||||
// 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");
|
||||
|
||||
$file_mimetype = $disk_local->mimeType("chunks/$chunkName");
|
||||
$fileMimetype = $disk_local->mimeType("chunks/$chunkName");
|
||||
|
||||
// Check if user has enough space to upload file
|
||||
if (! $user->canUpload($fileSize)) {
|
||||
@@ -80,27 +80,24 @@ class UploadFileAction
|
||||
|
||||
// Create multiple image thumbnails
|
||||
($this->createImageThumbnail)($fileName, $file, $user->id);
|
||||
|
||||
|
||||
// Move files to external storage
|
||||
if (! isStorageDriver('local')) {
|
||||
($this->moveFileToExternalStorage)($fileName, $user->id);
|
||||
}
|
||||
|
||||
// Store user upload size
|
||||
($this->recordUpload)($fileSize, $user->id);
|
||||
|
||||
// Create new file
|
||||
$item = UserFile::create([
|
||||
'mimetype' => get_file_type_from_mimetype($file_mimetype),
|
||||
'type' => get_file_type($file_mimetype),
|
||||
'mimetype' => get_file_type_from_mimetype($fileMimetype),
|
||||
'type' => get_file_type($fileMimetype),
|
||||
'parent_id' => ($this->getFileParentId)($request, $user->id),
|
||||
'name' => $request->input('filename'),
|
||||
'basename' => $fileName,
|
||||
'author' => $userId ? 'visitor' : 'user',
|
||||
'filesize' => $fileSize,
|
||||
'user_id' => $user->id,
|
||||
'creator_id' => auth()->id(),
|
||||
]);
|
||||
|
||||
|
||||
// Store exif metadata for files
|
||||
($this->storeExifMetadata)($item, $file);
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ class GetFileController extends Controller
|
||||
->firstOrFail();
|
||||
|
||||
// Check if user can download file
|
||||
if (! $file->owner->canDownload()) {
|
||||
if (! $file->user->canDownload()) {
|
||||
return response(userActionNotAllowedError(), 401);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
namespace Domain\Files\Models;
|
||||
|
||||
use App\Users\Models\User;
|
||||
use Domain\Traffic\Actions\RecordUploadAction;
|
||||
use Illuminate\Support\Str;
|
||||
use Laravel\Scout\Searchable;
|
||||
use Domain\Sharing\Models\Share;
|
||||
@@ -174,7 +175,12 @@ class File extends Model
|
||||
return $this->hasOne(Share::class, 'item_id', 'id');
|
||||
}
|
||||
|
||||
public function owner(): HasOne
|
||||
public function creator(): HasOne
|
||||
{
|
||||
return $this->hasOne(User::class, 'id', 'creator_id');
|
||||
}
|
||||
|
||||
public function user(): HasOne
|
||||
{
|
||||
return $this->hasOne(User::class, 'id', 'user_id');
|
||||
}
|
||||
@@ -207,6 +213,9 @@ class File extends Model
|
||||
|
||||
static::creating(function ($file) {
|
||||
$file->id = (string) Str::uuid();
|
||||
|
||||
// Store upload record
|
||||
resolve(RecordUploadAction::class)($file->filesize, $file->user_id);
|
||||
});
|
||||
|
||||
static::deleting(function ($file) {
|
||||
|
||||
@@ -29,10 +29,10 @@ class FileResource extends JsonResource
|
||||
'file_url' => $this->file_url,
|
||||
'thumbnail' => $this->thumbnail,
|
||||
'parent_id' => $this->parent_id,
|
||||
'created_at' => set_time_by_user_timezone($this->owner, $this->created_at),
|
||||
'updated_at' => set_time_by_user_timezone($this->owner, $this->updated_at),
|
||||
'created_at' => set_time_by_user_timezone($this->user, $this->created_at),
|
||||
'updated_at' => set_time_by_user_timezone($this->user, $this->updated_at),
|
||||
'deleted_at' => $this->deleted_at
|
||||
? set_time_by_user_timezone($this->owner, $this->deleted_at)
|
||||
? set_time_by_user_timezone($this->user, $this->deleted_at)
|
||||
: null,
|
||||
],
|
||||
'relationships' => [
|
||||
@@ -50,15 +50,15 @@ class FileResource extends JsonResource
|
||||
],
|
||||
],
|
||||
]),
|
||||
$this->mergeWhen($this->owner, fn () => [
|
||||
'owner' => [
|
||||
$this->mergeWhen($this->creator, fn () => [
|
||||
'creator' => [
|
||||
'data' => [
|
||||
'type' => 'owner',
|
||||
'id' => $this->user_id,
|
||||
'type' => 'creator',
|
||||
'id' => $this->creator->id,
|
||||
'attributes' => [
|
||||
'name' => $this->owner->settings->name,
|
||||
'avatar' => $this->owner->settings->avatar,
|
||||
'color' => $this->owner->settings->color,
|
||||
'name' => $this->creator->settings->name,
|
||||
'avatar' => $this->creator->settings->avatar,
|
||||
'color' => $this->creator->settings->color,
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
@@ -18,35 +18,31 @@ class CreateFolderAction
|
||||
CreateFolderRequest $request,
|
||||
?Share $shared = null,
|
||||
): Folder|array {
|
||||
// Get user model
|
||||
$user = $shared
|
||||
? $shared->user
|
||||
: Auth::user();
|
||||
// Get stuff
|
||||
$isFilledParentId = $request->filled('parent_id');
|
||||
$parentId = $request->input('parent_id');
|
||||
|
||||
// Get user
|
||||
$user = $isFilledParentId
|
||||
? Folder::find($parentId)->getLatestParent()->user
|
||||
: auth()->user();
|
||||
|
||||
// Check if user can create folder
|
||||
if (! $user->canCreateFolder()) {
|
||||
throw new InvalidUserActionException();
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if exist parent team folder, if yes,
|
||||
* then get the latest parent folder to detect whether it is team_folder
|
||||
*/
|
||||
if ($request->has('parent_id')) {
|
||||
$isTeamFolder = Folder::find($request->input('parent_id'))
|
||||
->getLatestParent()
|
||||
->team_folder;
|
||||
}
|
||||
|
||||
// Create folder record
|
||||
return Folder::create([
|
||||
'parent_id' => $request->input('parent_id'),
|
||||
'parent_id' => $parentId,
|
||||
'name' => $request->input('name'),
|
||||
'color' => $request->input('color') ?? null,
|
||||
'emoji' => $request->input('emoji') ?? null,
|
||||
'author' => $shared ? 'visitor' : 'user',
|
||||
'user_id' => $user->id,
|
||||
'team_folder' => $isTeamFolder ?? false,
|
||||
'team_folder' => $isFilledParentId
|
||||
? Folder::find($parentId)->getLatestParent()->team_folder
|
||||
: false
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ class Folder extends Model
|
||||
->withPivot('permission');
|
||||
}
|
||||
|
||||
public function owner(): HasOne
|
||||
public function user(): HasOne
|
||||
{
|
||||
return $this->hasOne(User::class, 'id', 'user_id');
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ class FolderResource extends JsonResource
|
||||
'isTeamFolder' => $this->team_folder,
|
||||
'items' => $this->items,
|
||||
'trashed_items' => $this->trashed_items,
|
||||
'created_at' => set_time_by_user_timezone($this->owner, $this->created_at),
|
||||
'updated_at' => set_time_by_user_timezone($this->owner, $this->updated_at),
|
||||
'created_at' => set_time_by_user_timezone($this->user, $this->created_at),
|
||||
'updated_at' => set_time_by_user_timezone($this->user, $this->updated_at),
|
||||
'deleted_at' => $this->deleted_at
|
||||
? set_time_by_user_timezone($this->owner, $this->deleted_at)
|
||||
? set_time_by_user_timezone($this->user, $this->deleted_at)
|
||||
: null,
|
||||
],
|
||||
'relationships' => [
|
||||
@@ -49,15 +49,15 @@ class FolderResource extends JsonResource
|
||||
],
|
||||
],
|
||||
]),
|
||||
$this->mergeWhen($this->owner, fn () => [
|
||||
'owner' => [
|
||||
$this->mergeWhen($this->user, fn () => [
|
||||
'user' => [
|
||||
'data' => [
|
||||
'type' => 'owner',
|
||||
'type' => 'user',
|
||||
'id' => $this->user_id,
|
||||
'attributes' => [
|
||||
'name' => $this->owner->settings->name,
|
||||
'avatar' => $this->owner->settings->avatar,
|
||||
'color' => $this->owner->settings->color,
|
||||
'name' => $this->user->settings->name,
|
||||
'avatar' => $this->user->settings->avatar,
|
||||
'color' => $this->user->settings->color,
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
<?php
|
||||
namespace Domain\Teams\Actions;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use Domain\Folders\Models\Folder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class TransferContentOwnershipToTeamFolderOwnerAction
|
||||
{
|
||||
public function __invoke(Folder $folder, $leavingUserId)
|
||||
{
|
||||
// Find and delete attached member from team folder
|
||||
DB::table('team_folder_members')
|
||||
->where('parent_id', $folder->id)
|
||||
->where('user_id', $leavingUserId)
|
||||
->delete();
|
||||
|
||||
// Get all inherited folder from team folder
|
||||
$childrenFolderIds = Folder::with('folders:id,parent_id')
|
||||
->where('id', $folder->id)
|
||||
->get('id');
|
||||
|
||||
$teamFolderIds = Arr::flatten(filter_folders_ids($childrenFolderIds));
|
||||
|
||||
// Replace leaver content ownership for author of team folder
|
||||
DB::table('files')
|
||||
->whereIn('parent_id', $teamFolderIds)
|
||||
->where('user_id', $leavingUserId)
|
||||
->cursor()
|
||||
->each(
|
||||
fn ($file) =>
|
||||
$this->move_files_to_the_new_destination($file, $folder)
|
||||
);
|
||||
|
||||
DB::table('files')
|
||||
->whereIn('parent_id', $teamFolderIds)
|
||||
->where('user_id', $leavingUserId)
|
||||
->update(['user_id' => $folder->user_id]);
|
||||
|
||||
DB::table('folders')
|
||||
->whereIn('id', $teamFolderIds)
|
||||
->where('user_id', $leavingUserId)
|
||||
->update(['user_id' => $folder->user_id]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $file
|
||||
* @param Folder $folder
|
||||
*/
|
||||
private function move_files_to_the_new_destination($file, Folder $folder): void
|
||||
{
|
||||
// Move image thumbnails
|
||||
if ($file->type === 'image') {
|
||||
// Get image thumbnail list
|
||||
$thumbnailList = getThumbnailFileList($file->basename);
|
||||
|
||||
// move thumbnails to the new location
|
||||
$thumbnailList->each(function ($basename) use ($file, $folder) {
|
||||
$oldPath = "files/$file->user_id/$basename";
|
||||
$newPath = "files/$folder->user_id/$basename";
|
||||
|
||||
if (Storage::exists($oldPath)) {
|
||||
Storage::move($oldPath, $newPath);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Move single file
|
||||
Storage::move("files/$file->user_id/$file->basename", "files/$folder->user_id/$file->basename");
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,6 @@ use Domain\Folders\Models\Folder;
|
||||
|
||||
class UpdateMembersAction
|
||||
{
|
||||
public function __construct(
|
||||
public TransferContentOwnershipToTeamFolderOwnerAction $transferContentOwnership,
|
||||
) {
|
||||
}
|
||||
|
||||
public function __invoke(Folder $folder, $members): void
|
||||
{
|
||||
$existingMembers = $folder
|
||||
@@ -28,9 +23,6 @@ class UpdateMembersAction
|
||||
->where('parent_id', $folder->id)
|
||||
->whereIn('user_id', $deletedMembers->toArray())
|
||||
->delete();
|
||||
|
||||
// Transfer files/folders ownership to team folder owner
|
||||
$deletedMembers->each(fn ($memberId) => ($this->transferContentOwnership)($folder, $memberId));
|
||||
}
|
||||
|
||||
// Update privileges
|
||||
|
||||
@@ -28,7 +28,7 @@ class ConvertFolderIntoTeamFolderController extends Controller
|
||||
}
|
||||
|
||||
// Check if user didn't exceed max team members limit
|
||||
if (! $folder->owner->canInviteTeamMembers($request->input('invitations'))) {
|
||||
if (! $folder->user->canInviteTeamMembers($request->input('invitations'))) {
|
||||
return response([
|
||||
'type' => 'error',
|
||||
'message' => 'You exceed your members limit.',
|
||||
|
||||
@@ -1,22 +1,16 @@
|
||||
<?php
|
||||
namespace Domain\Teams\Controllers;
|
||||
|
||||
use Auth;
|
||||
use Gate;
|
||||
use Illuminate\Http\Response;
|
||||
use Domain\Folders\Models\Folder;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Contracts\Foundation\Application;
|
||||
use Illuminate\Contracts\Routing\ResponseFactory;
|
||||
use Domain\Teams\Actions\TransferContentOwnershipToTeamFolderOwnerAction;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class LeaveTeamFolderController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
public TransferContentOwnershipToTeamFolderOwnerAction $transferContentOwnership,
|
||||
) {
|
||||
}
|
||||
|
||||
public function __invoke(Folder $folder): Response|Application|ResponseFactory
|
||||
{
|
||||
// Abort in demo mode
|
||||
@@ -29,8 +23,11 @@ class LeaveTeamFolderController extends Controller
|
||||
abort(403, 'Access Denied');
|
||||
}
|
||||
|
||||
// Transfer files/folders ownership to team folder owner
|
||||
($this->transferContentOwnership)($folder, Auth::id());
|
||||
// Find and delete attached member from team folder
|
||||
DB::table('team_folder_members')
|
||||
->where('parent_id', $folder->id)
|
||||
->where('user_id', auth()->id())
|
||||
->delete();
|
||||
|
||||
return response('Done.', 204);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ class FakeUploadFileAction
|
||||
'basename' => $filename,
|
||||
'mimetype' => $file->getClientOriginalExtension(),
|
||||
'file_url' => 'https://vuefilemanager.hi5ve.digital/assets/vue-file-manager-preview.jpg',
|
||||
'author' => $request->user() ? 'user' : 'visitor',
|
||||
'created_at' => now()->format(__t('time')),
|
||||
'updated_at' => now()->format(__t('time')),
|
||||
'type' => $fileType,
|
||||
|
||||
@@ -158,7 +158,6 @@ class BrowseTest extends TestCase
|
||||
'name' => 'Document',
|
||||
'basename' => 'document.pdf',
|
||||
'mimetype' => 'application/pdf',
|
||||
'author' => 'user',
|
||||
'type' => 'file',
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
@@ -199,7 +198,6 @@ class BrowseTest extends TestCase
|
||||
'name' => 'Document 1',
|
||||
'basename' => 'document-1.pdf',
|
||||
'mimetype' => 'application/pdf',
|
||||
'author' => 'user',
|
||||
'type' => 'file',
|
||||
'user_id' => $user->id,
|
||||
'created_at' => now(),
|
||||
@@ -213,7 +211,6 @@ class BrowseTest extends TestCase
|
||||
'name' => 'Document 2',
|
||||
'basename' => 'document-2.pdf',
|
||||
'mimetype' => 'application/pdf',
|
||||
'author' => 'user',
|
||||
'type' => 'file',
|
||||
'user_id' => $user->id,
|
||||
'created_at' => now(),
|
||||
@@ -255,7 +252,6 @@ class BrowseTest extends TestCase
|
||||
'name' => 'Document',
|
||||
'basename' => 'document.pdf',
|
||||
'mimetype' => 'application/pdf',
|
||||
'author' => 'user',
|
||||
'type' => 'file',
|
||||
'user_id' => $user->id,
|
||||
'deleted_at' => now(),
|
||||
|
||||
@@ -158,7 +158,6 @@ class VisitorBrowseTest extends TestCase
|
||||
->create([
|
||||
'parent_id' => $root->id,
|
||||
'name' => 'Documents',
|
||||
'author' => 'user',
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
|
||||
@@ -168,7 +167,6 @@ class VisitorBrowseTest extends TestCase
|
||||
'name' => 'Document',
|
||||
'basename' => 'document.pdf',
|
||||
'mimetype' => 'application/pdf',
|
||||
'author' => 'user',
|
||||
'type' => 'file',
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
@@ -238,7 +236,6 @@ class VisitorBrowseTest extends TestCase
|
||||
->create([
|
||||
'name' => 'level 2',
|
||||
'parent_id' => $folder_level_1->id,
|
||||
'author' => 'user',
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
|
||||
@@ -246,7 +243,6 @@ class VisitorBrowseTest extends TestCase
|
||||
->create([
|
||||
'name' => 'level 3',
|
||||
'parent_id' => $folder_level_2->id,
|
||||
'author' => 'user',
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
|
||||
@@ -254,7 +250,6 @@ class VisitorBrowseTest extends TestCase
|
||||
->create([
|
||||
'name' => 'level 2 Sibling',
|
||||
'parent_id' => $folder_level_1->id,
|
||||
'author' => 'user',
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
|
||||
|
||||
@@ -306,7 +306,6 @@ class VisitorManipulatingTest extends TestCase
|
||||
$folder = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'author' => 'user',
|
||||
]);
|
||||
|
||||
$share = Share::factory()
|
||||
@@ -350,10 +349,6 @@ class VisitorManipulatingTest extends TestCase
|
||||
])->assertStatus(201);
|
||||
}
|
||||
|
||||
$this->assertDatabaseHas('files', [
|
||||
'author' => 'visitor',
|
||||
]);
|
||||
|
||||
$file = File::all()->last();
|
||||
|
||||
Storage::disk('local')
|
||||
|
||||
@@ -420,23 +420,6 @@ class TeamManagementTest extends TestCase
|
||||
'team_folder' => 1,
|
||||
]);
|
||||
|
||||
// Create fake file record
|
||||
File::factory()
|
||||
->create([
|
||||
'name' => 'Member File',
|
||||
'basename' => 'fake-file.zip',
|
||||
'parent_id' => $folder->id,
|
||||
'user_id' => $deletedMember->id,
|
||||
'type' => 'file',
|
||||
]);
|
||||
|
||||
// Create fake file
|
||||
$fakeFile = UploadedFile::fake()
|
||||
->create('fake-file.zip', 2000, 'application/zip');
|
||||
|
||||
// Put fake file into correct directory
|
||||
Storage::putFileAs("files/{$deletedMember->id}", $fakeFile, 'fake-file.zip');
|
||||
|
||||
// Attach members to the team folder
|
||||
DB::table('team_folder_members')
|
||||
->insert([
|
||||
@@ -466,10 +449,6 @@ class TeamManagementTest extends TestCase
|
||||
])
|
||||
->assertCreated();
|
||||
|
||||
// Check if file was moved from member directory to owner directory
|
||||
Storage::assertMissing("files/{$deletedMember->id}/fake-file.zip");
|
||||
Storage::assertExists("files/{$user->id}/fake-file.zip");
|
||||
|
||||
$this
|
||||
->assertDatabaseCount('team_folder_members', 1)
|
||||
->assertDatabaseMissing('team_folder_members', [
|
||||
@@ -709,57 +688,6 @@ class TeamManagementTest extends TestCase
|
||||
'team_folder' => 1,
|
||||
]);
|
||||
|
||||
$folderWithin = Folder::factory()
|
||||
->create([
|
||||
'name' => 'Member Content',
|
||||
'parent_id' => $folder->id,
|
||||
'user_id' => $member->id,
|
||||
'team_folder' => 1,
|
||||
]);
|
||||
|
||||
$file = File::factory()
|
||||
->create([
|
||||
'name' => 'Member File',
|
||||
'basename' => 'fake-file.zip',
|
||||
'parent_id' => $folderWithin->id,
|
||||
'user_id' => $member->id,
|
||||
'type' => 'file',
|
||||
]);
|
||||
|
||||
// Create fake file
|
||||
$fakeFile = UploadedFile::fake()
|
||||
->create('fake-file.zip', 2000, 'application/zip');
|
||||
|
||||
// Put fake file into correct directory
|
||||
Storage::putFileAs("files/$member->id", $fakeFile, 'fake-file.zip');
|
||||
|
||||
File::factory()
|
||||
->create([
|
||||
'name' => 'Good image',
|
||||
'basename' => 'fake-image.jpeg',
|
||||
'parent_id' => $folderWithin->id,
|
||||
'user_id' => $member->id,
|
||||
'type' => 'image',
|
||||
]);
|
||||
|
||||
// Create fake image
|
||||
$fakeFile = UploadedFile::fake()
|
||||
->create('fake-image.jpeg', 2000, 'image/jpeg');
|
||||
|
||||
// Put fake image into correct directory
|
||||
Storage::putFileAs("files/$member->id", $fakeFile, $fakeFile->name);
|
||||
|
||||
$thumbnail_sizes = collect([config('vuefilemanager.image_sizes.later'), config('vuefilemanager.image_sizes.immediately')])->collapse();
|
||||
|
||||
// Create fake image thumbnails
|
||||
$thumbnail_sizes
|
||||
->each(function ($item) use ($member) {
|
||||
$fakeFile = UploadedFile::fake()
|
||||
->create("{$item['name']}-fake-image.jpeg", 2000, 'image/jpeg');
|
||||
|
||||
Storage::putFileAs("files/$member->id", $fakeFile, $fakeFile->name);
|
||||
});
|
||||
|
||||
// add member to the team folder
|
||||
DB::table('team_folder_members')
|
||||
->insert([
|
||||
@@ -775,31 +703,11 @@ class TeamManagementTest extends TestCase
|
||||
->deleteJson("/api/teams/folders/{$folder->id}/leave")
|
||||
->assertNoContent();
|
||||
|
||||
// Check if file was moved from member directory to owner directory
|
||||
Storage::assertMissing("files/$member->id/fake-file.zip");
|
||||
Storage::assertExists("files/$user->id/fake-file.zip");
|
||||
|
||||
// Assert if image thumbnails was moved correctly to the new destination
|
||||
$thumbnail_sizes
|
||||
->each(function ($item) use ($user) {
|
||||
Storage::assertExists("files/$user->id/{$item['name']}-fake-image.jpeg");
|
||||
});
|
||||
|
||||
$this
|
||||
->assertDatabaseMissing('team_folder_members', [
|
||||
'parent_id' => $folder->id,
|
||||
'user_id' => $member->id,
|
||||
'permission' => 'can-edit',
|
||||
])
|
||||
->assertDatabaseHas('files', [
|
||||
'id' => $file->id,
|
||||
'parent_id' => $folderWithin->id,
|
||||
'user_id' => $user->id,
|
||||
])
|
||||
->assertDatabaseHas('folders', [
|
||||
'id' => $folderWithin->id,
|
||||
'parent_id' => $folder->id,
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Domain\Teams;
|
||||
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Notification;
|
||||
use Tests\TestCase;
|
||||
use App\Users\Models\User;
|
||||
@@ -31,9 +33,8 @@ class TeamsTest extends TestCase
|
||||
'parent_id' => $level_1->id,
|
||||
]);
|
||||
|
||||
$teamRoot = $level_2->getLatestParent();
|
||||
|
||||
$this->assertEquals($teamFolder->id, $teamRoot->id);
|
||||
$this->assertEquals($teamFolder->id, $level_2->getLatestParent()->id);
|
||||
$this->assertEquals($teamFolder->id, $teamFolder->getLatestParent()->id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,6 +73,7 @@ class TeamsTest extends TestCase
|
||||
|
||||
$this
|
||||
->assertDatabaseHas('folders', [
|
||||
'user_id' => $user->id,
|
||||
'name' => 'Company Project',
|
||||
'team_folder' => 1,
|
||||
])
|
||||
@@ -96,6 +98,7 @@ class TeamsTest extends TestCase
|
||||
|
||||
$teamFolder = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'team_folder' => 1,
|
||||
]);
|
||||
|
||||
@@ -108,6 +111,7 @@ class TeamsTest extends TestCase
|
||||
->assertStatus(201)
|
||||
->assertJsonFragment([
|
||||
'isTeamFolder' => true,
|
||||
'id' => $user->id,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -254,4 +258,42 @@ class TeamsTest extends TestCase
|
||||
'id' => $folders[0]->id,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function team_member_upload_new_file()
|
||||
{
|
||||
$file = UploadedFile::fake()
|
||||
->create('fake-file.pdf', 12000000, 'application/pdf');
|
||||
|
||||
$user = User::factory()
|
||||
->hasSettings()
|
||||
->create();
|
||||
|
||||
$member = User::factory()
|
||||
->hasSettings()
|
||||
->create();
|
||||
|
||||
$folder = Folder::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'team_folder' => 1,
|
||||
]);
|
||||
|
||||
$this
|
||||
->actingAs($member)
|
||||
->postJson('/api/upload', [
|
||||
'filename' => $file->name,
|
||||
'file' => $file,
|
||||
'parent_id' => $folder->id,
|
||||
'path' => "/$file->name",
|
||||
'is_last' => 'true',
|
||||
])->assertStatus(201);
|
||||
|
||||
$this->assertDatabaseHas('files', [
|
||||
'user_id' => $user->id,
|
||||
'creator_id' => $member->id,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user