- 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:
Čarodej
2022-03-30 09:34:25 +02:00
parent 0fbb8fd8ee
commit 0ca67c2348
31 changed files with 256 additions and 396 deletions

View File

@@ -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

View File

@@ -1,7 +1,7 @@
<?php
return [
'version' => '2.0.9',
'version' => '2.0.10',
'is_demo' => env('APP_DEMO', false),

View File

@@ -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'),
];
}

View File

@@ -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');
});
}
};

View File

@@ -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"
}

View File

@@ -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
)
},
},

View File

@@ -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() {

View File

@@ -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'])

View File

@@ -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'])

View File

@@ -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 }}

View File

@@ -788,24 +788,23 @@ export default {
},
})
} else if (file.data.attributes.isTeamFolder) {
if (file.data.relationships.owner.data.id === this.user.data.id) {
let route = file.data.relationships.user.data.id === this.user.data.id
? 'TeamFolders'
: 'SharedWithMe'
this.$router.push({
name: 'TeamFolders',
name: route,
params: { id: file.data.id },
})
} else {
this.$router.push({
name: 'SharedWithMe',
params: { id: file.data.id },
})
}
} else {
this.$router.push({
name: 'Files',
params: { id: file.data.id },
})
}
} else {
}
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)

View File

@@ -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
)
},
},

View File

@@ -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)),

View File

@@ -25,7 +25,7 @@ class UpdateUserProfileSettingsRequest extends FormRequest
return [
'avatar' => 'sometimes|file',
'name' => 'string',
'value' => 'string',
'value' => 'string|nullable',
];
}
}

View File

@@ -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)) {
@@ -86,19 +86,16 @@ class UploadFileAction
($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

View 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);
}

View File

@@ -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) {

View 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,
],
],
],

View File

@@ -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
]);
}
}

View File

@@ -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');
}

View File

@@ -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,
],
],
],

View File

@@ -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");
}
}

View File

@@ -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

View File

@@ -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.',

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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(),

View File

@@ -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,
]);

View File

@@ -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')

View File

@@ -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,
]);
}

View File

@@ -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,
]);
}
}