Transfer Content Ownership To Team Folder Owner

This commit is contained in:
Čarodej
2021-11-04 17:37:25 +01:00
parent 8d8fdbf9ba
commit d600ee7830
9 changed files with 189 additions and 14 deletions
@@ -17,7 +17,7 @@ class SetTeamFolderPropertyForAllChildrenAction
// Set all children as team_folder = true
DB::table('folders')
->whereIn('id', Arr::flatten([filter_folders_ids($childrenFolderIds)]))
->whereIn('id', Arr::flatten(filter_folders_ids($childrenFolderIds)))
->update(['team_folder' => $isTeamFolder]);
}
}
@@ -0,0 +1,72 @@
<?php
namespace Domain\Teams\Actions;
use Domain\Folders\Models\Folder;
use Illuminate\Support\Arr;
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 = get_thumbnail_file_list($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,6 +6,7 @@ use Domain\Folders\Models\Folder;
class UpdateMembersAction
{
// TODO: after removing user from team folder from administrator, set file owner
public function __invoke(Folder $folder, $members): void
{
$existingMembers = $folder
@@ -1,23 +1,31 @@
<?php
namespace Domain\Teams\Controllers;
use Auth;
use Gate;
use Illuminate\Http\Response;
use Domain\Folders\Models\Folder;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Domain\Teams\Actions\TransferContentOwnershipToTeamFolderOwnerAction;
class LeaveTeamFolderController extends Controller
{
public function __invoke(Folder $folder): Response | Application | ResponseFactory
public function __construct(
public TransferContentOwnershipToTeamFolderOwnerAction $transferContentOwnership,
) {}
public function __invoke(Folder $folder): Response|Application|ResponseFactory
{
// Find and delete attached member from team folder
DB::table('team_folder_members')
->where('parent_id', $folder->id)
->where('user_id', Auth::id())
->delete();
// Authorize action
if (! Gate::any(['can-edit', 'can-view'], [$folder, null])) {
abort(403, 'Access Denied');
}
// Transfer files/folders ownership to team folder owner
($this->transferContentOwnership)($folder, Auth::id());
return response('Done.', 204);
}