diff --git a/.env.testing b/.env.testing index b9f884b9..50560bc6 100644 --- a/.env.testing +++ b/.env.testing @@ -1,6 +1,6 @@ APP_NAME=Laravel APP_ENV=local -APP_KEY=base64:H+C6Ovly2gudhK4Zyn0EOED/ZOKNXthKIr6fv6bXJUM= +APP_KEY=base64:8lOt4iwu42v5k2gtFMMiVwlK+Lrms8ZCPx9f6dp0Qlo= APP_DEBUG=true APP_URL=http://localhost APP_DEMO=false diff --git a/routes/share.php b/routes/share.php index eb02f9ae..df07f5c6 100644 --- a/routes/share.php +++ b/routes/share.php @@ -7,6 +7,7 @@ use Domain\Files\Controllers\VisitorUploadFileController; use Domain\Folders\Controllers\VisitorCreateFolderController; use Domain\Sharing\Controllers\WebCrawlerOpenGraphController; use Domain\Browsing\Controllers\VisitorBrowseFolderController; +use Domain\Files\Controllers\VisitorRemoteUploadFileController; use Domain\Items\Controllers\VisitorMoveFileOrFolderController; use Domain\Items\Controllers\VisitorDeleteFileOrFolderController; use Domain\Items\Controllers\VisitorRenameFileOrFolderController; @@ -16,6 +17,7 @@ use Domain\Browsing\Controllers\VisitorSearchFilesAndFoldersController; // Browse functions Route::group(['prefix' => 'editor'], function () { + Route::post('/upload/remote/{shared}', VisitorRemoteUploadFileController::class); Route::post('/create-folder/{shared}', VisitorCreateFolderController::class); Route::post('/upload/{shared}', VisitorUploadFileController::class); diff --git a/src/Domain/Files/Actions/GetContentFromExternalSource.php b/src/Domain/Files/Actions/GetContentFromExternalSource.php index 88145f45..6672f0bb 100644 --- a/src/Domain/Files/Actions/GetContentFromExternalSource.php +++ b/src/Domain/Files/Actions/GetContentFromExternalSource.php @@ -1,15 +1,14 @@ ($this->moveFileToFTPStorage)($basename, $user->id), default => null }; - } catch ( ErrorException | Error $e) { + } catch (ErrorException | Error $e) { Log::error("Remote upload failed as {$e->getMessage()}"); Log::error($e->getTraceAsString()); } diff --git a/src/Domain/Files/Actions/StoreFileExifMetadataAction.php b/src/Domain/Files/Actions/StoreFileExifMetadataAction.php index 68259eb4..979bad8b 100644 --- a/src/Domain/Files/Actions/StoreFileExifMetadataAction.php +++ b/src/Domain/Files/Actions/StoreFileExifMetadataAction.php @@ -1,5 +1,4 @@ fakeUploadFile)($request); } @@ -33,7 +34,6 @@ class UploadFileController extends Controller // Proceed after last chunk if ($request->boolean('is_last')) { - // Process file $file = ($this->processFie)($request, null, $chunkPath); diff --git a/src/Domain/Files/Controllers/VisitorRemoteUploadFileController.php b/src/Domain/Files/Controllers/VisitorRemoteUploadFileController.php new file mode 100644 index 00000000..0c051659 --- /dev/null +++ b/src/Domain/Files/Controllers/VisitorRemoteUploadFileController.php @@ -0,0 +1,39 @@ +protectShareRecord)($shared); + + // Check shared permission + if (is_visitor($shared)) { + abort(403, "You don't have access to this item"); + } + + // Check access to requested directory + ($this->verifyAccessToItem)($request->input('parent_id'), $shared); + + // Execute job for get content from url and save + ($this->getContentFromExternalSource)($request->all(), $shared->user); + + return response('Files were successfully added to the upload queue', 201); + } +} diff --git a/src/Domain/Files/Controllers/VisitorUploadFileController.php b/src/Domain/Files/Controllers/VisitorUploadFileController.php index aab84af1..37efcf61 100644 --- a/src/Domain/Files/Controllers/VisitorUploadFileController.php +++ b/src/Domain/Files/Controllers/VisitorUploadFileController.php @@ -8,7 +8,7 @@ use Domain\Files\Requests\UploadRequest; use Domain\Files\Resources\FileResource; use Domain\Files\Actions\ProcessFileAction; use Support\Demo\Actions\FakeUploadFileAction; -use App\Users\Exceptions\InvalidUserActionException; +use Domain\Files\Actions\StoreFileChunksAction; use Domain\Sharing\Actions\ProtectShareRecordAction; use Domain\Sharing\Actions\VerifyAccessToItemAction; use Illuminate\Contracts\Filesystem\FileNotFoundException; @@ -19,8 +19,9 @@ use Illuminate\Contracts\Filesystem\FileNotFoundException; class VisitorUploadFileController extends Controller { public function __construct( - private ProcessFileAction $uploadFile, - private FakeUploadFileAction $fakeUploadFile, + public ProcessFileAction $processFie, + public StoreFileChunksAction $storeFileChunks, + private FakeUploadFileAction $fakeUploadFile, private ProtectShareRecordAction $protectShareRecord, private VerifyAccessToItemAction $verifyAccessToItem, ) { @@ -48,19 +49,18 @@ class VisitorUploadFileController extends Controller // Check access to requested directory ($this->verifyAccessToItem)($request->input('parent_id'), $shared); - try { - // Return new uploaded file - $file = ($this->uploadFile)($request, $shared->user_id); + // Store file chunks + $chunkPath = ($this->storeFileChunks)($request); + + // Proceed after last chunk + if ($request->boolean('is_last')) { + // Process file + $file = ($this->processFie)($request, $shared->user_id, $chunkPath); // Set public access url $file->setSharedPublicUrl($shared->token); return response(new FileResource($file), 201); - } catch (InvalidUserActionException $e) { - return response([ - 'type' => 'error', - 'message' => $e->getMessage(), - ], 401); } } } diff --git a/src/Domain/Files/Requests/RemoteUploadRequest.php b/src/Domain/Files/Requests/RemoteUploadRequest.php index 60bf9d4b..24426059 100644 --- a/src/Domain/Files/Requests/RemoteUploadRequest.php +++ b/src/Domain/Files/Requests/RemoteUploadRequest.php @@ -24,7 +24,7 @@ class RemoteUploadRequest extends FormRequest { return [ 'urls.*' => 'required|url', - 'parent_id' => 'nullable|uuid', + 'parent_id' => 'nullable|uuid', ]; } } diff --git a/src/Domain/Files/Requests/UploadRequest.php b/src/Domain/Files/Requests/UploadRequest.php index a91b2cf3..7224374d 100644 --- a/src/Domain/Files/Requests/UploadRequest.php +++ b/src/Domain/Files/Requests/UploadRequest.php @@ -1,5 +1,4 @@ createFolder($uploadRequest); } - try { - // Set default parent_id for uploaded file - if (is_null($request->input('parent_id'))) { - $request->merge(['parent_id' => $uploadRequest->id]); - } + // Set default parent_id for uploaded file + if (is_null($request->input('parent_id'))) { + $request->merge(['parent_id' => $uploadRequest->id]); + } - // Upload file - $file = ($this->uploadFile)($request, $uploadRequest->user_id); + // Store file chunks + $chunkPath = ($this->storeFileChunks)($request); + + // Proceed after last chunk + if ($request->boolean('is_last')) { + // Process file + $file = ($this->processFie)($request, $uploadRequest->user_id, $chunkPath); // Set public access url $file->setUploadRequestPublicUrl($uploadRequest->id); @@ -44,13 +49,7 @@ class UploadFilesForUploadRequestController // Set timestamp for auto filling cache()->set("auto-filling.$uploadRequest->id", now()->toString()); - // Return new uploaded file return response(new FileResource($file), 201); - } catch (InvalidUserActionException $e) { - return response([ - 'type' => 'error', - 'message' => $e->getMessage(), - ], 401); } } diff --git a/src/Support/errors.php b/src/Support/errors.php index 5eb7db27..1e9595d6 100644 --- a/src/Support/errors.php +++ b/src/Support/errors.php @@ -1,17 +1,17 @@ 'error', - 'message' => 'Access Denied', - ]; -} + function accessDeniedError(): array + { + return [ + 'type' => 'error', + 'message' => 'Access Denied', + ]; + } -function userActionNotAllowedError(): array -{ - return [ - 'type' => 'error', - 'message' => 'This user action is not allowed.', - ]; -} + function userActionNotAllowedError(): array + { + return [ + 'type' => 'error', + 'message' => 'This user action is not allowed.', + ]; + } diff --git a/tests/Domain/Admin/AdminTest.php b/tests/Domain/Admin/AdminTest.php index 6d6fac97..aaf7deeb 100644 --- a/tests/Domain/Admin/AdminTest.php +++ b/tests/Domain/Admin/AdminTest.php @@ -279,7 +279,8 @@ class AdminTest extends TestCase ->create("fake-file-$index.pdf", 1200, 'application/pdf'); $this->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", diff --git a/tests/Domain/Files/FileTest.php b/tests/Domain/Files/FileTest.php index 0751841b..c4d88935 100644 --- a/tests/Domain/Files/FileTest.php +++ b/tests/Domain/Files/FileTest.php @@ -1,5 +1,4 @@ actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => '.jpg', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -61,7 +61,7 @@ class FileTest extends TestCase ]) ->collapse() ->each( - fn($item) => Storage::assertExists( + fn ($item) => Storage::assertExists( "files/{$user->id}/{$item['name']}-{$file->basename}" ) ); @@ -82,7 +82,8 @@ class FileTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -175,7 +176,8 @@ class FileTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'jpeg', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -208,6 +210,7 @@ class FileTest extends TestCase ->actingAs($user) ->postJson('/api/upload', [ 'file' => $file, + 'extension' => 'pdf', 'parent_id' => null, 'path' => "/$file->name", 'is_last' => 'true', @@ -338,7 +341,7 @@ class FileTest extends TestCase // Assert thumbnail was deleted getThumbnailFileList('fake-image.jpeg') - ->each(fn($thumbnail) => Storage::assertMissing("files/$user->id/$thumbnail")); + ->each(fn ($thumbnail) => Storage::assertMissing("files/$user->id/$thumbnail")); } /** @@ -398,7 +401,8 @@ class FileTest extends TestCase ->create("fake-file-$index.pdf", 1200, 'application/pdf'); $this->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -451,7 +455,8 @@ class FileTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'jpg', 'file' => $file, 'parent_id' => null, 'path' => '/' . $file->name, diff --git a/tests/Domain/Folders/FolderTest.php b/tests/Domain/Folders/FolderTest.php index b58213fc..0507aa76 100644 --- a/tests/Domain/Folders/FolderTest.php +++ b/tests/Domain/Folders/FolderTest.php @@ -371,7 +371,8 @@ class FolderTest extends TestCase ->create("fake-file-$index.pdf", 1200, 'application/pdf'); $this->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name", diff --git a/tests/Domain/Folders/FolderUploadTest.php b/tests/Domain/Folders/FolderUploadTest.php index 0b5c8941..c6466b9f 100644 --- a/tests/Domain/Folders/FolderUploadTest.php +++ b/tests/Domain/Folders/FolderUploadTest.php @@ -30,7 +30,8 @@ class FolderUploadTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'path' => '/', 'parent_id' => $folder->id, @@ -59,7 +60,8 @@ class FolderUploadTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'path' => "/level_1/level_2/level_3/$file->name", 'parent_id' => null, @@ -69,7 +71,8 @@ class FolderUploadTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'path' => "/level_1/level_2/level_3/$file->name", 'parent_id' => null, @@ -127,7 +130,8 @@ class FolderUploadTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'path' => "/another_folder/level_2/level_3/$file->name", 'parent_id' => null, @@ -163,7 +167,8 @@ class FolderUploadTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $brother->name, + 'name' => $brother->name, + 'extension' => 'pdf', 'file' => $brother, 'path' => "/Folder/Brother/$brother->name", 'parent_id' => null, @@ -173,7 +178,8 @@ class FolderUploadTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $sister->name, + 'name' => $sister->name, + 'extension' => 'pdf', 'file' => $sister, 'path' => "/Folder/Sister/$sister->name", 'parent_id' => null, diff --git a/tests/Domain/Sharing/VisitorManipulatingTest.php b/tests/Domain/Sharing/VisitorManipulatingTest.php index ea5df238..d4dc1ee2 100644 --- a/tests/Domain/Sharing/VisitorManipulatingTest.php +++ b/tests/Domain/Sharing/VisitorManipulatingTest.php @@ -330,7 +330,8 @@ class VisitorManipulatingTest extends TestCase $this ->withUnencryptedCookies($cookie) ->post("/api/editor/upload/$share->token", [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name", @@ -341,7 +342,8 @@ class VisitorManipulatingTest extends TestCase // Check public shared item if (! $is_protected) { $this->postJson("/api/editor/upload/$share->token", [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name", diff --git a/tests/Domain/Teams/TeamFileAccessTest.php b/tests/Domain/Teams/TeamFileAccessTest.php index a23e9d52..bfbf087c 100644 --- a/tests/Domain/Teams/TeamFileAccessTest.php +++ b/tests/Domain/Teams/TeamFileAccessTest.php @@ -32,7 +32,8 @@ class TeamFileAccessTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name", @@ -80,7 +81,8 @@ class TeamFileAccessTest extends TestCase $this ->actingAs($user) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name", diff --git a/tests/Domain/Teams/TeamsTest.php b/tests/Domain/Teams/TeamsTest.php index f87c1a15..e1257852 100644 --- a/tests/Domain/Teams/TeamsTest.php +++ b/tests/Domain/Teams/TeamsTest.php @@ -283,7 +283,8 @@ class TeamsTest extends TestCase $this ->actingAs($member) ->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name", diff --git a/tests/Domain/Traffic/TrafficTest.php b/tests/Domain/Traffic/TrafficTest.php index f5e4df3f..48572845 100644 --- a/tests/Domain/Traffic/TrafficTest.php +++ b/tests/Domain/Traffic/TrafficTest.php @@ -37,7 +37,7 @@ class TrafficTest extends TestCase $this ->actingAs($this->user) ->postJson('/api/upload', [ - 'filename' => $this->file->name, + 'name' => $this->file->name, 'file' => $this->file, 'parent_id' => null, 'path' => '/' . $this->file->name, @@ -58,7 +58,7 @@ class TrafficTest extends TestCase $this ->actingAs($this->user) ->postJson('/api/upload', [ - 'filename' => $this->file->name, + 'name' => $this->file->name, 'file' => $this->file, 'parent_id' => null, 'path' => '/' . $this->file->name, @@ -79,7 +79,7 @@ class TrafficTest extends TestCase $this ->actingAs($this->user) ->postJson('/api/upload', [ - 'filename' => $secondFile->name, + 'name' => $secondFile->name, 'file' => $secondFile, 'parent_id' => null, 'path' => '/' . $secondFile->name, @@ -117,7 +117,7 @@ class TrafficTest extends TestCase // Check public shared item $this->postJson("/api/editor/upload/$share->token", [ - 'filename' => $this->file->name, + 'name' => $this->file->name, 'file' => $this->file, 'parent_id' => $folder->id, 'path' => '/' . $this->file->name, diff --git a/tests/Domain/Trash/TrashTest.php b/tests/Domain/Trash/TrashTest.php index a691c5a3..007d91f0 100644 --- a/tests/Domain/Trash/TrashTest.php +++ b/tests/Domain/Trash/TrashTest.php @@ -75,7 +75,7 @@ class TrashTest extends TestCase ->image('fake-image.jpg'); $this->postJson('/api/upload', [ - 'filename' => $image->name, + 'name' => $image->name, 'file' => $image, 'parent_id' => null, 'path' => '/' . $image->name, diff --git a/tests/Domain/UploadRequest/UploadRequestTest.php b/tests/Domain/UploadRequest/UploadRequestTest.php index a0459a6e..e71345f4 100644 --- a/tests/Domain/UploadRequest/UploadRequestTest.php +++ b/tests/Domain/UploadRequest/UploadRequestTest.php @@ -150,7 +150,8 @@ class UploadRequestTest extends TestCase $this ->postJson("/api/upload-request/$uploadRequest->id/upload", [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -195,7 +196,8 @@ class UploadRequestTest extends TestCase $this ->postJson("/api/upload-request/$uploadRequest->id/upload", [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -239,7 +241,7 @@ class UploadRequestTest extends TestCase $this ->postJson("/api/upload-request/$uploadRequest->id/upload", [ - 'filename' => $file->name, + 'name' => $file->name, 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -312,7 +314,8 @@ class UploadRequestTest extends TestCase $this ->postJson("/api/upload-request/$uploadRequest->id/upload", [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", diff --git a/tests/Domain/Zip/UserZippingTest.php b/tests/Domain/Zip/UserZippingTest.php index 9f42014a..dd095a87 100644 --- a/tests/Domain/Zip/UserZippingTest.php +++ b/tests/Domain/Zip/UserZippingTest.php @@ -32,7 +32,8 @@ class UserZippingTest extends TestCase ->create("fake-inner-file-$index.pdf", 1200, 'application/pdf'); $this->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name", @@ -46,7 +47,8 @@ class UserZippingTest extends TestCase ->create("fake-file-$index.pdf", 1200, 'application/pdf'); $this->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => null, 'path' => "/$file->name", @@ -87,7 +89,8 @@ class UserZippingTest extends TestCase ->create("fake-file-$index.pdf", 1200, 'application/pdf'); $this->postJson('/api/upload', [ - 'filename' => $file->name, + 'name' => $file->name, + 'extension' => 'pdf', 'file' => $file, 'parent_id' => $folder->id, 'path' => "/$file->name",