upload file into request folder and get their thumbnails

This commit is contained in:
Čarodej
2022-02-19 12:32:19 +01:00
parent 5be55b52bd
commit 1107bf66af
25 changed files with 349 additions and 60 deletions
@@ -46,7 +46,7 @@ class VisitorBrowseFolderController
->get();
// Set thumbnail links for public files
$files->map(fn ($file) => $file->setPublicUrl($shared->token));
$files->map(fn ($file) => $file->setSharedPublicUrl($shared->token));
return [
'folders' => new FolderCollection($folders),
@@ -62,7 +62,7 @@ class VisitorSearchFilesAndFoldersController extends Controller
->take(3);
// Map files and set public url for files
$files->map(fn ($file) => $file->setPublicUrl($shared->token));
$files->map(fn ($file) => $file->setSharedPublicUrl($shared->token));
$folders = Folder::search($query)
->constrain($folderConstrain)
@@ -1,8 +1,8 @@
<?php
namespace Domain\Files\Actions;
use App\Users\Models\User;
use Illuminate\Support\Str;
use Domain\Sharing\Models\Share;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
@@ -29,7 +29,7 @@ class UploadFileAction
*/
public function __invoke(
UploadRequest $request,
?Share $shared = null,
?string $userId = null,
) {
$file = $request->file('file');
@@ -62,7 +62,7 @@ class UploadFileAction
$disk_local = Storage::disk('local');
// Get user data
$user = $shared->user ?? Auth::user();
$user = $userId ? User::find($userId) : Auth::user();
// File Info
$fileSize = $disk_local->size("chunks/$chunkName");
@@ -98,7 +98,7 @@ class UploadFileAction
'metadata' => $metadata,
'name' => $request->input('filename'),
'basename' => $fileName,
'author' => $shared ? 'visitor' : 'user',
'author' => $userId ? 'visitor' : 'user',
'filesize' => $fileSize,
'user_id' => $user->id,
]);
@@ -53,7 +53,7 @@ class VisitorGetFileController extends Controller
user_id: $shared->user_id,
);
// Finally download file
// Finally, download file
return ($this->downloadFile)($file, $shared->user_id);
}
}
@@ -22,7 +22,7 @@ class VisitorShowFileController
Gate::authorize('can-view', [$file, $shared]);
// Set access urls
$file->setPublicUrl($shared->token);
$file->setSharedPublicUrl($shared->token);
return response(new FileResource($file), 200);
}
@@ -50,10 +50,10 @@ class VisitorUploadFileController extends Controller
try {
// Return new uploaded file
$file = ($this->uploadFile)($request, $shared);
$file = ($this->uploadFile)($request, $shared->user_id);
// Set public access url
$file->setPublicUrl($shared->token);
$file->setSharedPublicUrl($shared->token);
return response(new FileResource($file), 201);
} catch (InvalidUserActionException $e) {
+33 -9
View File
@@ -43,7 +43,8 @@ class File extends Model
use HasFactory;
use Sortable;
public ?string $public_access = null;
public ?string $sharedAccess = null;
public ?string $uploadRequestAccess = null;
protected $guarded = [
'id',
@@ -78,11 +79,19 @@ class File extends Model
}
/**
* Set routes with public access
* Set shared routes with public access
*/
public function setPublicUrl(string $token)
public function setSharedPublicUrl(string $token)
{
$this->public_access = $token;
$this->sharedAccess = $token;
}
/**
* Set upload request routes with public access
*/
public function setUploadRequestPublicUrl(string $token)
{
$this->uploadRequestAccess = $token;
}
/**
@@ -94,7 +103,7 @@ class File extends Model
$thumbnail_sizes = collect(config('vuefilemanager.image_sizes'))->collapse()->all();
// Generate thumbnail link for external storage service
if ($this->type === 'image' && ! is_storage_driver(['local'])) {
if ($this->type === 'image' && ! is_storage_driver('local')) {
foreach ($thumbnail_sizes as $item) {
$filePath = "files/{$this->user_id}/{$item['name']}-{$this->basename}";
@@ -106,11 +115,19 @@ class File extends Model
// Generate thumbnail link for local storage
if ($this->type === 'image') {
foreach ($thumbnail_sizes as $item) {
$route = route('thumbnail', ['name' => $item['name'] . '-' . $this->basename]);
if ($this->public_access) {
$route .= "/$this->public_access";
// Set shared public url
if ($this->sharedAccess) {
$route .= "/shared/$this->sharedAccess";
}
// Set upload request public url
if ($this->uploadRequestAccess) {
// TODO: review request for s3
$route .= "/upload-request/$this->uploadRequestAccess";
}
$links[$item['name']] = $route;
@@ -147,8 +164,15 @@ class File extends Model
// Get thumbnail from local storage
$route = route('file', ['name' => $this->attributes['basename']]);
if ($this->public_access) {
return "$route/$this->public_access";
// Set shared public url
if ($this->sharedAccess) {
return "$route/$this->sharedAccess";
}
// Set upload request public url
if ($this->uploadRequestAccess) {
// TODO: review request for s3
$route .= "/upload-request/$this->uploadRequestAccess";
}
return $route;
@@ -10,8 +10,6 @@ class FileResource extends JsonResource
/**
* Transform the resource into an array.
*
* TODO: optimize created_at/updated_at conversion because of performance issue
*
* @param \Illuminate\Http\Request $request
* @return array
*/
@@ -60,7 +60,7 @@ class VisitorRenameFileOrFolderController extends Controller
// Set public url
if ($request->input('type') !== 'folder') {
$item->setPublicUrl($shared->token);
$item->setSharedPublicUrl($shared->token);
}
if ($request->input('type') === 'folder') {
@@ -26,7 +26,7 @@ class WebCrawlerOpenGraphController extends Controller
->first();
if ($item->thumbnail) {
$item->setPublicUrl($share->token);
$item->setSharedPublicUrl($share->token);
}
return view('vuefilemanager.crawler.og-view')
@@ -0,0 +1,45 @@
<?php
namespace Domain\UploadRequest\Controllers\FileAccess;
use Domain\Files\Actions\DownloadFileAction;
use Domain\Sharing\Actions\ProtectShareRecordAction;
use Domain\Sharing\Actions\VerifyAccessToItemWithinAction;
use Domain\Traffic\Actions\RecordDownloadAction;
use Domain\UploadRequest\Models\UploadRequest;
use Gate;
use Domain\Files\Models\File;
use Illuminate\Http\Response;
use Domain\Sharing\Models\Share;
use Domain\Files\Resources\FileResource;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
/**
* Get shared file record
*/
class GetFileFromUploadRequestController
{
public function __construct(
private DownloadFileAction $downloadFile,
private RecordDownloadAction $recordDownload,
) {
}
public function __invoke(
string $filename,
UploadRequest $uploadRequest
): BinaryFileResponse {
// Get file
$file = File::where('user_id', $uploadRequest->user_id)
->where('basename', $filename)
->firstOrFail();
// Store user download size
($this->recordDownload)(
file_size: (int) $file->getRawOriginal('filesize'),
user_id: $uploadRequest->user_id,
);
// Finally, download file
return ($this->downloadFile)($file, $uploadRequest->user_id);
}
}
@@ -0,0 +1,42 @@
<?php
namespace Domain\UploadRequest\Controllers\FileAccess;
use App\Http\Controllers\Controller;
use Domain\Files\Actions\DownloadThumbnailAction;
use Domain\Traffic\Actions\RecordDownloadAction;
use Domain\UploadRequest\Models\UploadRequest;
use Domain\Files\Models\File;
use Symfony\Component\HttpFoundation\StreamedResponse;
/**
* Get shared file record
*/
class GetThumbnailFromUploadRequestController extends Controller
{
public function __construct(
private DownloadThumbnailAction $downloadThumbnail,
private RecordDownloadAction $recordDownload,
) {
}
public function __invoke(
string $filename,
UploadRequest $uploadRequest
): StreamedResponse {
$originalFileName = substr($filename, 3);
// Get file
$file = File::where('user_id', $uploadRequest->user_id)
->where('basename', $originalFileName)
->firstOrFail();
// Store user download size
($this->recordDownload)(
file_size: (int) $file->getRawOriginal('filesize'),
user_id: $uploadRequest->user_id,
);
// Finally, download thumbnail
return ($this->downloadThumbnail)($filename, $file);
}
}
@@ -2,30 +2,73 @@
namespace Domain\UploadRequest\Controllers;
use DB;
use Domain\Folders\Models\Folder;
use App\Users\Exceptions\InvalidUserActionException;
use Domain\Files\Resources\FileResource;
use Domain\UploadRequest\Models\UploadRequest;
use Illuminate\Http\Request;
use Domain\Files\Actions\UploadFileAction;
use Domain\Folders\Models\Folder;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use DB;
class UploadFilesForUploadRequestController
{
public function __invoke(Request $request, UploadRequest $uploadRequest)
public function __construct(
private UploadFileAction $uploadFile,
) {}
/**
* @throws FileNotFoundException
*/
public function __invoke(\Domain\Files\Requests\UploadRequest $request, UploadRequest $uploadRequest)
{
// Check if upload request is active
if ($uploadRequest->status !== 'active') {
return response('Gone', 410);
}
// Get upload request root folder query
$folder = Folder::where('id', $uploadRequest->id);
// Create folder if not exist
if ($folder->doesntExist()) {
$timestampName = format_date($uploadRequest->created_at, 'd. M. Y');
DB::table('folders')->insert([
'id' => $uploadRequest->id,
'parent_id' => $uploadRequest->folder_id,
'user_id' => $uploadRequest->user_id,
'name' => "Upload Request from $timestampName",
]);
$this->createFolder($uploadRequest);
}
return response('Done!', 201);
try {
// 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);
// Set public access url
$file->setUploadRequestPublicUrl($uploadRequest->id);
// Return new uploaded file
return response(new FileResource($file), 201);
} catch (InvalidUserActionException $e) {
return response([
'type' => 'error',
'message' => $e->getMessage(),
], 401);
}
}
/**
* Create root Upload Request folder
*/
private function createFolder(UploadRequest $uploadRequest): void
{
$timestampName = format_date($uploadRequest->created_at, 'd. M. Y');
DB::table('folders')->insert([
'id' => $uploadRequest->id,
'parent_id' => $uploadRequest->folder_id,
'user_id' => $uploadRequest->user_id,
'name' => "Upload Request from $timestampName",
]);
}
}
@@ -3,6 +3,7 @@ namespace Domain\UploadRequest\Models;
use App\Users\Models\User;
use Database\Factories\UploadRequestFactory;
use Domain\Folders\Models\Folder;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
@@ -43,6 +44,11 @@ class UploadRequest extends Model
return $this->hasOne(User::class, 'id', 'user_id');
}
public function folder(): HasOne
{
return $this->hasOne(Folder::class, 'id', 'id');
}
protected static function boot()
{
parent::boot();
@@ -2,6 +2,7 @@
namespace Domain\UploadRequest\Resources;
use Domain\Folders\Resources\FolderResource;
use Illuminate\Http\Resources\Json\JsonResource;
class UploadRequestResource extends JsonResource
@@ -20,6 +21,9 @@ class UploadRequestResource extends JsonResource
'url' => url("/request/$this->id/upload"),
],
'relationships' => [
$this->mergeWhen($this->folder, fn () => [
'folder' => new FolderResource($this->folder),
]),
'user' => [
'data' => [
'id' => $this->user->id,