diff --git a/database/migrations/2021_08_24_092726_create_team_folder_members_table.php b/database/migrations/2021_08_24_092726_create_team_folder_members_table.php index 0c7da85c..cf413427 100644 --- a/database/migrations/2021_08_24_092726_create_team_folder_members_table.php +++ b/database/migrations/2021_08_24_092726_create_team_folder_members_table.php @@ -15,7 +15,7 @@ class CreateTeamFolderMembersTable extends Migration { Schema::create('team_folder_members', function (Blueprint $table) { $table->uuid('folder_id'); - $table->uuid('member_id'); + $table->uuid('user_id'); $table->string('permission'); $table->charset = 'utf8mb4'; $table->collation = 'utf8mb4_unicode_ci'; diff --git a/src/Domain/Teams/Controllers/BrowseSharedWithMeController.php b/src/Domain/Teams/Controllers/BrowseSharedWithMeController.php index 44b84f52..3c2cae45 100644 --- a/src/Domain/Teams/Controllers/BrowseSharedWithMeController.php +++ b/src/Domain/Teams/Controllers/BrowseSharedWithMeController.php @@ -32,7 +32,7 @@ class BrowseSharedWithMeController if (! $rootId) { $folderIds = DB::table('team_folder_members') - ->where('member_id', Auth::id()) + ->where('user_id', Auth::id()) ->pluck('folder_id'); $folders = Folder::with(['parent:id,name', 'shared:token,id,item_id,permission,is_protected,expire_in']) diff --git a/src/Domain/Teams/Controllers/InvitationsController.php b/src/Domain/Teams/Controllers/InvitationsController.php index 05d5d8c9..73931695 100644 --- a/src/Domain/Teams/Controllers/InvitationsController.php +++ b/src/Domain/Teams/Controllers/InvitationsController.php @@ -23,7 +23,7 @@ class InvitationsController extends Controller DB::table('team_folder_members') ->insert([ 'folder_id' => $invitation->folder_id, - 'member_id' => $user->id, + 'user_id' => $user->id, 'permission' => 'can-edit', ]); diff --git a/src/Domain/Teams/Controllers/TeamFoldersController.php b/src/Domain/Teams/Controllers/TeamFoldersController.php index 1cbad088..3203278a 100644 --- a/src/Domain/Teams/Controllers/TeamFoldersController.php +++ b/src/Domain/Teams/Controllers/TeamFoldersController.php @@ -11,6 +11,7 @@ use Domain\Folders\Models\Folder; use App\Http\Controllers\Controller; use Domain\Teams\DTO\CreateTeamFolderData; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Str; class TeamFoldersController extends Controller { @@ -61,12 +62,52 @@ class TeamFoldersController extends Controller return response($folder, 201); } + public function update(Request $request, Folder $folder) + { + $existingMembers = DB::table('team_folder_members') + ->where('folder_id', $folder->id) + ->pluck('user_id'); + + $deletedMembers = $existingMembers + ->filter(fn ($memberId) => ! in_array( + $memberId, collect($request->input('members'))->pluck('id')->toArray() + )); + + $newMembers = collect($request->input('members')) + ->filter(fn ($member) => ! Str::isUuid($member['id'])); + + // Invite team members + if ($newMembers->isNotEmpty()) { + ($this->inviteMembers)($newMembers->toArray(), $folder); + } + + if ($deletedMembers->isNotEmpty()) { + DB::table('team_folder_members') + ->whereIn('user_id', $deletedMembers->toArray()) + ->delete(); + } + + // Update privileges + collect($request->input('members')) + ->each(function ($member) { + DB::table('team_folder_members') + ->where('user_id', $member['id']) + ->update([ + 'permission' => $member['permission'], + ]); + }); + + return response('Done', 201); + } + public function destroy(Folder $folder): Response { $folder->update([ 'team_folder' => 0, ]); + // TODO: delete invitations + DB::table('team_folder_members') ->where('folder_id', $folder->id) ->delete(); diff --git a/tests/Domain/Teams/TeamsTest.php b/tests/Domain/Teams/TeamsTest.php index c5f79d5a..f493622e 100644 --- a/tests/Domain/Teams/TeamsTest.php +++ b/tests/Domain/Teams/TeamsTest.php @@ -134,7 +134,7 @@ class TeamsTest extends TestCase ]) ->assertDatabaseHas('team_folder_members', [ 'folder_id' => $folder->id, - 'member_id' => $member->id, + 'user_id' => $member->id, 'permission' => 'can-edit', ]); } @@ -172,22 +172,181 @@ class TeamsTest extends TestCase ]) ->assertDatabaseMissing('team_folder_members', [ 'folder_id' => $folder->id, - 'member_id' => $member->id, + 'user_id' => $member->id, ]); } /** - * + * @test */ public function it_add_member_into_team_folder() { + $user = User::factory(User::class) + ->create(); + + $members = User::factory(User::class) + ->count(2) + ->create(); + + $folder = Folder::factory() + ->create([ + 'user_id' => $user->id, + 'team_folder' => 1, + ]); + + DB::table('team_folder_members') + ->insert([ + [ + 'folder_id' => $folder->id, + 'user_id' => $members[0]->id, + 'permission' => 'can-edit', + ], + [ + 'folder_id' => $folder->id, + 'user_id' => $members[1]->id, + 'permission' => 'can-edit', + ], + ]); + + $this + ->actingAs($user) + ->patchJson("/api/teams/folders/{$folder->id}", [ + 'members' => [ + [ + 'id' => $members[0]->id, + 'email' => 'john@internal.com', + 'permission' => 'can-edit', + ], + [ + 'id' => $members[1]->id, + 'email' => 'jane@external.com', + 'permission' => 'can-view', + ], + [ + 'id' => null, + 'email' => 'new@member.com', + 'permission' => 'can-view', + ], + ], + ]) + ->assertCreated(); + + $this + ->assertDatabaseCount('team_folder_members', 2) + ->assertDatabaseHas('team_folders_invitations', [ + 'email' => 'new@member.com', + 'permission' => 'can-view', + ]); + + Notification::assertTimesSent(1, InvitationIntoTeamFolder::class); } /** - * + * @test */ public function it_remove_member_from_team_folder() { + $user = User::factory(User::class) + ->create(); + + $members = User::factory(User::class) + ->count(2) + ->create(); + + $folder = Folder::factory() + ->create([ + 'user_id' => $user->id, + 'team_folder' => 1, + ]); + + DB::table('team_folder_members') + ->insert([ + [ + 'folder_id' => $folder->id, + 'user_id' => $members[0]->id, + 'permission' => 'can-edit', + ], + [ + 'folder_id' => $folder->id, + 'user_id' => $members[1]->id, + 'permission' => 'can-edit', + ], + ]); + + $this + ->actingAs($user) + ->patchJson("/api/teams/folders/{$folder->id}", [ + 'members' => [ + [ + 'id' => $members[0]->id, + 'email' => 'john@internal.com', + 'permission' => 'can-edit', + ], + ], + ]) + ->assertCreated(); + + $this + ->assertDatabaseCount('team_folder_members', 1) + ->assertDatabaseMissing('team_folder_members', [ + 'user_id' => $members[1]->id, + ]); + } + + /** + * @test + */ + public function it_update_member_permission_in_team_folder() + { + $user = User::factory(User::class) + ->create(); + + $members = User::factory(User::class) + ->count(2) + ->create(); + + $folder = Folder::factory() + ->create([ + 'user_id' => $user->id, + 'team_folder' => 1, + ]); + + DB::table('team_folder_members') + ->insert([ + [ + 'folder_id' => $folder->id, + 'user_id' => $members[0]->id, + 'permission' => 'can-edit', + ], + [ + 'folder_id' => $folder->id, + 'user_id' => $members[1]->id, + 'permission' => 'can-edit', + ], + ]); + + $this + ->actingAs($user) + ->patchJson("/api/teams/folders/{$folder->id}", [ + 'members' => [ + [ + 'id' => $members[0]->id, + 'email' => 'john@internal.com', + 'permission' => 'can-edit', + ], + [ + 'id' => $members[1]->id, + 'email' => 'jane@external.com', + 'permission' => 'can-view', + ], + ], + ]) + ->assertCreated(); + + $this->assertDatabaseHas('team_folder_members', [ + 'user_id' => $members[1]->id, + 'permission' => 'can-view', + ]); } /** @@ -212,12 +371,12 @@ class TeamsTest extends TestCase ->insert([ [ 'folder_id' => $folder->id, - 'member_id' => $members[0]->id, + 'user_id' => $members[0]->id, 'permission' => 'can-edit', ], [ 'folder_id' => $folder->id, - 'member_id' => $members[1]->id, + 'user_id' => $members[1]->id, 'permission' => 'can-edit', ], ]); @@ -269,8 +428,8 @@ class TeamsTest extends TestCase $file = File::factory() ->create([ - 'folder_id' => $folder->id, - 'user_id' => $user->id, + 'folder_id' => $folder->id, + 'user_id' => $user->id, ]); $this @@ -304,12 +463,12 @@ class TeamsTest extends TestCase ->insert([ [ 'folder_id' => $folders[0]->id, - 'member_id' => $member->id, + 'user_id' => $member->id, 'permission' => 'can-edit', ], [ 'folder_id' => $folders[1]->id, - 'member_id' => $member->id, + 'user_id' => $member->id, 'permission' => 'can-edit', ], ]);