remote upload for shared route

This commit is contained in:
Čarodej
2022-04-21 16:47:22 +02:00
parent e4dd9de931
commit 8be0ae2a62
23 changed files with 152 additions and 90 deletions
@@ -1,15 +1,14 @@
<?php
namespace Domain\Files\Actions;
use App\Users\Models\User;
use Domain\Files\Models\File;
use Log;
use Error;
use ErrorException;
use App\Users\Models\User;
use Illuminate\Support\Str;
use Domain\Sharing\Models\Share;
use Domain\Files\Models\File;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Log;
use Spatie\QueueableAction\QueueableAction;
class GetContentFromExternalSource
@@ -22,7 +21,8 @@ class GetContentFromExternalSource
public MoveFileToFTPStorageAction $moveFileToFTPStorage,
public ProcessImageThumbnailAction $createImageThumbnail,
public MoveFileToExternalStorageAction $moveFileToExternalStorage,
) {}
) {
}
public function __invoke(
array $payload,
@@ -80,7 +80,7 @@ class GetContentFromExternalSource
'ftp', 'azure' => ($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());
}
@@ -1,5 +1,4 @@
<?php
namespace Domain\Files\Actions;
use Domain\Files\Models\File;
@@ -1,10 +1,9 @@
<?php
namespace Domain\Files\Controllers;
use Domain\Folders\Models\Folder;
use Illuminate\Http\Response;
use Domain\Sharing\Models\Share;
use Domain\Folders\Models\Folder;
use App\Http\Controllers\Controller;
use Domain\Files\Requests\RemoteUploadRequest;
use Domain\Files\Actions\GetContentFromExternalSource;
@@ -13,7 +12,8 @@ class RemoteUploadFileController extends Controller
{
public function __construct(
public GetContentFromExternalSource $getContentFromExternalSource,
) {}
) {
}
public function __invoke(RemoteUploadRequest $request, ?Share $shared = null): Response|array
{
@@ -12,8 +12,8 @@ use Illuminate\Contracts\Filesystem\FileNotFoundException;
class UploadFileController extends Controller
{
public function __construct(
public ProcessFileAction $processFie,
public FakeUploadFileAction $fakeUploadFile,
public ProcessFileAction $processFie,
public FakeUploadFileAction $fakeUploadFile,
public StoreFileChunksAction $storeFileChunks,
) {
}
@@ -23,7 +23,8 @@ class UploadFileController extends Controller
*
* @throws FileNotFoundException
*/
public function __invoke(UploadRequest $request) {
public function __invoke(UploadRequest $request)
{
if (is_demo_account()) {
return ($this->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);
@@ -0,0 +1,39 @@
<?php
namespace Domain\Files\Controllers;
use Illuminate\Http\Response;
use Domain\Sharing\Models\Share;
use App\Http\Controllers\Controller;
use Domain\Files\Requests\RemoteUploadRequest;
use Domain\Sharing\Actions\ProtectShareRecordAction;
use Domain\Sharing\Actions\VerifyAccessToItemAction;
use Domain\Files\Actions\GetContentFromExternalSource;
class VisitorRemoteUploadFileController extends Controller
{
public function __construct(
public ProtectShareRecordAction $protectShareRecord,
public VerifyAccessToItemAction $verifyAccessToItem,
public GetContentFromExternalSource $getContentFromExternalSource,
) {
}
public function __invoke(RemoteUploadRequest $request, ?Share $shared = null): Response|array
{
// Check ability to access protected share record
($this->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);
}
}
@@ -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);
}
}
}
@@ -24,7 +24,7 @@ class RemoteUploadRequest extends FormRequest
{
return [
'urls.*' => 'required|url',
'parent_id' => 'nullable|uuid',
'parent_id' => 'nullable|uuid',
];
}
}
@@ -1,5 +1,4 @@
<?php
namespace Domain\Files\Requests;
use Domain\Admin\Rules\DisabledMimetypes;
@@ -6,13 +6,14 @@ use Domain\Folders\Models\Folder;
use Domain\Files\Resources\FileResource;
use Domain\Files\Actions\ProcessFileAction;
use Domain\UploadRequest\Models\UploadRequest;
use App\Users\Exceptions\InvalidUserActionException;
use Domain\Files\Actions\StoreFileChunksAction;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
class UploadFilesForUploadRequestController
{
public function __construct(
private ProcessFileAction $uploadFile,
private ProcessFileAction $processFie,
private StoreFileChunksAction $storeFileChunks,
) {
}
@@ -29,14 +30,18 @@ class UploadFilesForUploadRequestController
$this->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);
}
}
+14 -14
View File
@@ -1,17 +1,17 @@
<?php
function accessDeniedError(): array
{
return [
'type' => '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.',
];
}