diff --git a/routes/teams.php b/routes/teams.php index 9939a6a7..def00553 100644 --- a/routes/teams.php +++ b/routes/teams.php @@ -10,11 +10,11 @@ use Domain\Teams\Controllers\ConvertFolderIntoTeamFolderController; Route::apiResource('/invitations', InvitationsController::class); Route::group(['middleware' => ['auth:sanctum']], function () { + Route::get('/shared-with-me/{id}', BrowseSharedWithMeController::class); Route::apiResource('/folders', TeamFoldersController::class); Route::post('/folders/{folder}/convert', ConvertFolderIntoTeamFolderController::class); Route::delete('/folders/{folder}/leave', LeaveTeamFolderController::class); Route::get('/folders/{folder}/tree', NavigationTreeController::class); - Route::get('/shared-with-me/{id}', BrowseSharedWithMeController::class); }); diff --git a/src/Domain/Teams/Actions/UpdateMembersAction.php b/src/Domain/Teams/Actions/UpdateMembersAction.php index b7cc31e8..a45a8159 100644 --- a/src/Domain/Teams/Actions/UpdateMembersAction.php +++ b/src/Domain/Teams/Actions/UpdateMembersAction.php @@ -6,7 +6,10 @@ use Domain\Folders\Models\Folder; class UpdateMembersAction { - // TODO: after removing user from team folder from administrator, set file owner + public function __construct( + public TransferContentOwnershipToTeamFolderOwnerAction $transferContentOwnership, + ) {} + public function __invoke(Folder $folder, $members): void { $existingMembers = $folder @@ -24,6 +27,9 @@ 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 diff --git a/tests/Domain/Teams/TeamManagementTest.php b/tests/Domain/Teams/TeamManagementTest.php index 85fb0047..e7b40abb 100644 --- a/tests/Domain/Teams/TeamManagementTest.php +++ b/tests/Domain/Teams/TeamManagementTest.php @@ -296,8 +296,10 @@ class TeamManagementTest extends TestCase $user = User::factory() ->create(); - $members = User::factory() - ->count(2) + $member = User::factory() + ->create(); + + $deletedMember = User::factory() ->create(); $folder = Folder::factory() @@ -306,26 +308,45 @@ 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([ [ 'parent_id' => $folder->id, - 'user_id' => $members[0]->id, + 'user_id' => $member->id, 'permission' => 'can-edit', ], [ 'parent_id' => $folder->id, - 'user_id' => $members[1]->id, + 'user_id' => $deletedMember->id, 'permission' => 'can-edit', ], ]); + // Update team folder members $this ->actingAs($user) ->patchJson("/api/teams/folders/{$folder->id}", [ 'members' => [ [ - 'id' => $members[0]->id, + 'id' => $member->id, 'permission' => 'can-edit', ], ], @@ -333,10 +354,14 @@ 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', [ - 'user_id' => $members[1]->id, + 'user_id' => $deletedMember->id, ]); }