From 1107bf66aff8b8c4cfad4cf0632afec8659036b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Sat, 19 Feb 2022 12:32:19 +0100 Subject: [PATCH] upload file into request folder and get their thumbnails --- .env.testing | 2 +- resources/js/store/modules/fileFunctions.js | 7 +- resources/js/store/modules/uploadRequest.js | 18 ++- .../js/views/FileView/UploadRequestFiles.vue | 5 +- routes/file.php | 11 +- .../VisitorBrowseFolderController.php | 2 +- ...VisitorSearchFilesAndFoldersController.php | 2 +- src/Domain/Files/Actions/UploadFileAction.php | 8 +- .../FileAccess/VisitorGetFileController.php | 2 +- .../Controllers/VisitorShowFileController.php | 2 +- .../VisitorUploadFileController.php | 4 +- src/Domain/Files/Models/File.php | 42 ++++-- src/Domain/Files/Resources/FileResource.php | 2 - .../VisitorRenameFileOrFolderController.php | 2 +- .../WebCrawlerOpenGraphController.php | 2 +- .../GetFileFromUploadRequestController.php | 45 +++++++ ...etThumbnailFromUploadRequestController.php | 42 ++++++ .../UploadFilesForUploadRequestController.php | 71 +++++++++-- .../UploadRequest/Models/UploadRequest.php | 6 + .../Resources/UploadRequestResource.php | 4 + .../Restrictions/DefaultRestrictionsTest.php | 2 +- .../FixedBillingRestrictionsTest.php | 2 +- .../MeteredBillingRestrictionsTest.php | 4 +- tests/Domain/Traffic/TrafficTest.php | 2 +- .../UploadRequest/UploadRequestTest.php | 120 ++++++++++++++++-- 25 files changed, 349 insertions(+), 60 deletions(-) create mode 100644 src/Domain/UploadRequest/Controllers/FileAccess/GetFileFromUploadRequestController.php create mode 100644 src/Domain/UploadRequest/Controllers/FileAccess/GetThumbnailFromUploadRequestController.php diff --git a/.env.testing b/.env.testing index 84b8fb35..e3507529 100644 --- a/.env.testing +++ b/.env.testing @@ -1,6 +1,6 @@ APP_NAME=Laravel APP_ENV=local -APP_KEY=base64:MzktLd8L9CrZsaNj5lDDewmUcI9VVQWq5eWMFxU5LvI= +APP_KEY=base64:uM4NZoG/Wgk0ruC0hs4FkYVEChkviOQy8ekOaVpr/pA= APP_DEBUG=true APP_URL=http://localhost APP_DEMO=false diff --git a/resources/js/store/modules/fileFunctions.js b/resources/js/store/modules/fileFunctions.js index 02f1b424..eeab7456 100644 --- a/resources/js/store/modules/fileFunctions.js +++ b/resources/js/store/modules/fileFunctions.js @@ -169,7 +169,7 @@ const actions = { if (percentCompleted >= 100) commit('PROCESSING_FILE', true) }, }) - .then((response) => { + .then(async (response) => { resolve(response) // Proceed if was returned database record @@ -179,6 +179,11 @@ const actions = { // Remove first file from file queue commit('SHIFT_FROM_FILE_QUEUE') + // Refresh request detail to update currentFolder in Vuex + if (router.currentRoute.name === 'RequestUpload' && !getters.currentFolder) { + await dispatch('getUploadRequestDetail') + } + // Check if user is in uploading folder, if yes, than show new file if ( (!getters.currentFolder && !response.data.data.attributes.parent_id) || diff --git a/resources/js/store/modules/uploadRequest.js b/resources/js/store/modules/uploadRequest.js index 881d261a..a23b84ff 100644 --- a/resources/js/store/modules/uploadRequest.js +++ b/resources/js/store/modules/uploadRequest.js @@ -8,7 +8,23 @@ const defaultState = { uploadRequest: undefined, } -const actions = {} +const actions = { + getUploadRequestDetail: ({ commit, getters }) => { + + axios.get(`/api/upload-request/${router.currentRoute.params.token}`) + .then((response) => { + + commit('LOADING_STATE', { loading: false, data: [] }) + + commit('SET_UPLOAD_REQUEST', response.data) + + // Set current folder if exist + if (response.data.data.relationships.folder) { + commit('SET_CURRENT_FOLDER', response.data.data.relationships.folder) + } + }) + }, +} const mutations = { SET_UPLOAD_REQUEST(state, payload) { diff --git a/resources/js/views/FileView/UploadRequestFiles.vue b/resources/js/views/FileView/UploadRequestFiles.vue index 1f28cd98..37d1d08d 100644 --- a/resources/js/views/FileView/UploadRequestFiles.vue +++ b/resources/js/views/FileView/UploadRequestFiles.vue @@ -189,11 +189,8 @@ export default { events.$on('context-menu:current-folder', (folder) => (this.item = folder)) events.$on('mobile-context-menu:show', (item) => (this.item = item)) - //this.$store.dispatch('getFolder', this.$route.params.id) - this.$store.commit('LOADING_STATE', { loading: false, data: [] }) + this.$store.dispatch('getUploadRequestDetail') - axios.get(`/api/upload-request/${this.$router.currentRoute.params.token}`) - .then((response) => this.$store.commit('SET_UPLOAD_REQUEST', response.data)) }, } diff --git a/routes/file.php b/routes/file.php index e96e58b4..b8eb44e8 100644 --- a/routes/file.php +++ b/routes/file.php @@ -1,19 +1,24 @@ ['auth:sanctum']], function () { diff --git a/src/Domain/Browsing/Controllers/VisitorBrowseFolderController.php b/src/Domain/Browsing/Controllers/VisitorBrowseFolderController.php index 43319529..fc0ddaad 100644 --- a/src/Domain/Browsing/Controllers/VisitorBrowseFolderController.php +++ b/src/Domain/Browsing/Controllers/VisitorBrowseFolderController.php @@ -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), diff --git a/src/Domain/Browsing/Controllers/VisitorSearchFilesAndFoldersController.php b/src/Domain/Browsing/Controllers/VisitorSearchFilesAndFoldersController.php index c7409b79..2fe682cc 100644 --- a/src/Domain/Browsing/Controllers/VisitorSearchFilesAndFoldersController.php +++ b/src/Domain/Browsing/Controllers/VisitorSearchFilesAndFoldersController.php @@ -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) diff --git a/src/Domain/Files/Actions/UploadFileAction.php b/src/Domain/Files/Actions/UploadFileAction.php index bc267e25..9098433d 100644 --- a/src/Domain/Files/Actions/UploadFileAction.php +++ b/src/Domain/Files/Actions/UploadFileAction.php @@ -1,8 +1,8 @@ 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, ]); diff --git a/src/Domain/Files/Controllers/FileAccess/VisitorGetFileController.php b/src/Domain/Files/Controllers/FileAccess/VisitorGetFileController.php index f236d817..de76edbf 100644 --- a/src/Domain/Files/Controllers/FileAccess/VisitorGetFileController.php +++ b/src/Domain/Files/Controllers/FileAccess/VisitorGetFileController.php @@ -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); } } diff --git a/src/Domain/Files/Controllers/VisitorShowFileController.php b/src/Domain/Files/Controllers/VisitorShowFileController.php index 062fd017..7ccea4c4 100644 --- a/src/Domain/Files/Controllers/VisitorShowFileController.php +++ b/src/Domain/Files/Controllers/VisitorShowFileController.php @@ -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); } diff --git a/src/Domain/Files/Controllers/VisitorUploadFileController.php b/src/Domain/Files/Controllers/VisitorUploadFileController.php index a50ce038..dfef2645 100644 --- a/src/Domain/Files/Controllers/VisitorUploadFileController.php +++ b/src/Domain/Files/Controllers/VisitorUploadFileController.php @@ -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) { diff --git a/src/Domain/Files/Models/File.php b/src/Domain/Files/Models/File.php index c7250b82..f9c5d346 100644 --- a/src/Domain/Files/Models/File.php +++ b/src/Domain/Files/Models/File.php @@ -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; diff --git a/src/Domain/Files/Resources/FileResource.php b/src/Domain/Files/Resources/FileResource.php index 110d3c13..1bf74509 100644 --- a/src/Domain/Files/Resources/FileResource.php +++ b/src/Domain/Files/Resources/FileResource.php @@ -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 */ diff --git a/src/Domain/Items/Controllers/VisitorRenameFileOrFolderController.php b/src/Domain/Items/Controllers/VisitorRenameFileOrFolderController.php index 6bf8bda3..f4933e76 100644 --- a/src/Domain/Items/Controllers/VisitorRenameFileOrFolderController.php +++ b/src/Domain/Items/Controllers/VisitorRenameFileOrFolderController.php @@ -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') { diff --git a/src/Domain/Sharing/Controllers/WebCrawlerOpenGraphController.php b/src/Domain/Sharing/Controllers/WebCrawlerOpenGraphController.php index e2c8bfa7..768e5fea 100644 --- a/src/Domain/Sharing/Controllers/WebCrawlerOpenGraphController.php +++ b/src/Domain/Sharing/Controllers/WebCrawlerOpenGraphController.php @@ -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') diff --git a/src/Domain/UploadRequest/Controllers/FileAccess/GetFileFromUploadRequestController.php b/src/Domain/UploadRequest/Controllers/FileAccess/GetFileFromUploadRequestController.php new file mode 100644 index 00000000..727371c6 --- /dev/null +++ b/src/Domain/UploadRequest/Controllers/FileAccess/GetFileFromUploadRequestController.php @@ -0,0 +1,45 @@ +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); + } +} diff --git a/src/Domain/UploadRequest/Controllers/FileAccess/GetThumbnailFromUploadRequestController.php b/src/Domain/UploadRequest/Controllers/FileAccess/GetThumbnailFromUploadRequestController.php new file mode 100644 index 00000000..6de38df6 --- /dev/null +++ b/src/Domain/UploadRequest/Controllers/FileAccess/GetThumbnailFromUploadRequestController.php @@ -0,0 +1,42 @@ +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); + } +} diff --git a/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php b/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php index 42bf245a..f2232a39 100644 --- a/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php +++ b/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php @@ -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", + ]); } } \ No newline at end of file diff --git a/src/Domain/UploadRequest/Models/UploadRequest.php b/src/Domain/UploadRequest/Models/UploadRequest.php index d5235993..953020b1 100644 --- a/src/Domain/UploadRequest/Models/UploadRequest.php +++ b/src/Domain/UploadRequest/Models/UploadRequest.php @@ -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(); diff --git a/src/Domain/UploadRequest/Resources/UploadRequestResource.php b/src/Domain/UploadRequest/Resources/UploadRequestResource.php index f644f827..14c9328c 100644 --- a/src/Domain/UploadRequest/Resources/UploadRequestResource.php +++ b/src/Domain/UploadRequest/Resources/UploadRequestResource.php @@ -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, diff --git a/tests/App/Restrictions/DefaultRestrictionsTest.php b/tests/App/Restrictions/DefaultRestrictionsTest.php index 583b14b9..bfb8ac58 100644 --- a/tests/App/Restrictions/DefaultRestrictionsTest.php +++ b/tests/App/Restrictions/DefaultRestrictionsTest.php @@ -160,7 +160,7 @@ class DefaultRestrictionsTest extends TestCase // 404 but, ok, because there is not stored temporary file in test $this - ->get("file/$file->name/$share->token") + ->get("file/$file->name/shared/$share->token") ->assertStatus(404); } diff --git a/tests/App/Restrictions/FixedBillingRestrictionsTest.php b/tests/App/Restrictions/FixedBillingRestrictionsTest.php index 8aeb6ed5..a7f97cef 100644 --- a/tests/App/Restrictions/FixedBillingRestrictionsTest.php +++ b/tests/App/Restrictions/FixedBillingRestrictionsTest.php @@ -199,7 +199,7 @@ class FixedBillingRestrictionsTest extends TestCase // 404 but, ok, because there is not stored temporary file in test $this - ->get("file/$file->name/$share->token") + ->get("file/$file->name/shared/$share->token") ->assertStatus(404); } diff --git a/tests/App/Restrictions/MeteredBillingRestrictionsTest.php b/tests/App/Restrictions/MeteredBillingRestrictionsTest.php index 0cb53c14..76a44444 100644 --- a/tests/App/Restrictions/MeteredBillingRestrictionsTest.php +++ b/tests/App/Restrictions/MeteredBillingRestrictionsTest.php @@ -184,7 +184,7 @@ class MeteredBillingRestrictionsTest extends TestCase ]); $this - ->get("file/$file->name/$share->token") + ->get("file/$file->name/shared/$share->token") ->assertStatus(401); } @@ -214,7 +214,7 @@ class MeteredBillingRestrictionsTest extends TestCase // 404 but, ok, because there is not stored temporary file in test $this - ->get("file/$file->name/$share->token") + ->get("file/$file->name/shared/$share->token") ->assertStatus(404); } diff --git a/tests/Domain/Traffic/TrafficTest.php b/tests/Domain/Traffic/TrafficTest.php index 6c2c6715..d7bc58a3 100644 --- a/tests/Domain/Traffic/TrafficTest.php +++ b/tests/Domain/Traffic/TrafficTest.php @@ -185,7 +185,7 @@ class TrafficTest extends TestCase 'is_protected' => false, ]); - $this->get("/file/$document->name/$share->token") + $this->get("/file/$document->name/shared/$share->token") ->assertStatus(200); $this->assertDatabaseHas('traffic', [ diff --git a/tests/Domain/UploadRequest/UploadRequestTest.php b/tests/Domain/UploadRequest/UploadRequestTest.php index 1c0df8f3..3c0eb85b 100644 --- a/tests/Domain/UploadRequest/UploadRequestTest.php +++ b/tests/Domain/UploadRequest/UploadRequestTest.php @@ -2,10 +2,12 @@ namespace Tests\Domain\UploadRequest; +use Domain\Files\Models\File; use Domain\UploadRequest\Notifications\UploadRequestNotification; use Domain\UploadRequest\Models\UploadRequest; use App\Users\Models\User; use Illuminate\Http\UploadedFile; +use Illuminate\Support\Str; use Storage; use Tests\TestCase; use Notification; @@ -87,6 +89,7 @@ class UploadRequestTest extends TestCase $uploadRequest = UploadRequest::factory() ->create([ + 'status' => 'active', 'user_id' => $user->id, ]); @@ -108,7 +111,8 @@ class UploadRequestTest extends TestCase $uploadRequest = UploadRequest::factory() ->create([ - 'user_id' => $user->id, + 'status' => 'active', + 'user_id' => $user->id, 'created_at' => now(), ]); @@ -116,20 +120,120 @@ class UploadRequestTest extends TestCase ->create('fake-file.pdf', 12000000, 'application/pdf'); $this - ->actingAs($user) ->postJson("/api/upload-request/$uploadRequest->id", [ 'filename' => $file->name, 'file' => $file, - 'parent_id' => $uploadRequest->id, + 'parent_id' => null, 'path' => "/$file->name", 'is_last' => 'true', ])->assertStatus(201); - $this->assertDatabaseHas('folders', [ - 'id' => $uploadRequest->id, - 'name' => 'Upload Request from 01. Jan. 2021', - ]); + $this + ->assertDatabaseHas('folders', [ + 'id' => $uploadRequest->id, + 'name' => 'Upload Request from 01. Jan. 2021', + ])->assertDatabaseHas('files', [ + 'parent_id' => $uploadRequest->id, + ]); - //Storage::assertExists("files/$user->id/$file->basename"); + $file = File::first(); + + Storage::assertExists("files/$user->id/$file->basename"); + } + + /** + * @test + */ + public function it_upload_file_into_non_active_upload_request() + { + $user = User::factory() + ->hasSettings() + ->create(); + + $uploadRequest = UploadRequest::factory() + ->create([ + 'status' => 'expired', + 'user_id' => $user->id, + 'created_at' => now(), + ]); + + $file = UploadedFile::fake() + ->create('fake-file.pdf', 12000000, 'application/pdf'); + + $this + ->postJson("/api/upload-request/$uploadRequest->id", [ + 'filename' => $file->name, + 'file' => $file, + 'parent_id' => null, + 'path' => "/$file->name", + 'is_last' => 'true', + ])->assertStatus(410); + } + + /** + * @test + */ + public function it_get_file_from_upload_request_folder() + { + $user = User::factory() + ->hasSettings() + ->create(); + + $uploadRequest = UploadRequest::factory() + ->create([ + 'status' => 'active', + 'user_id' => $user->id, + 'created_at' => now(), + ]); + + $file = UploadedFile::fake() + ->create(Str::random() . '-fake-file.pdf', 1200, 'application/pdf'); + + Storage::putFileAs("files/$user->id", $file, $file->name); + + File::factory() + ->create([ + 'parent_id' => $uploadRequest->id, + 'basename' => $file->name, + 'user_id' => $user->id, + 'name' => 'fake-file.pdf', + ]); + + $this + ->get("/file/$file->name/upload-request/$uploadRequest->id") + ->assertOk(); + } + + /** + * @test + */ + public function it_get_thumbnail_from_upload_request_folder() + { + $user = User::factory() + ->hasSettings() + ->create(); + + $uploadRequest = UploadRequest::factory() + ->create([ + 'status' => 'active', + 'user_id' => $user->id, + 'created_at' => now(), + ]); + + $thumbnail = UploadedFile::fake() + ->image('fake-thumbnail.jpg'); + + Storage::putFileAs("files/$user->id", $thumbnail, $thumbnail->name); + + File::factory() + ->create([ + 'parent_id' => $uploadRequest->id, + 'basename' => 'fake-thumbnail.jpg', + 'user_id' => $user->id, + ]); + + $this + ->get("/thumbnail/xs-$thumbnail->name/upload-request/$uploadRequest->id") + ->assertOk(); } } \ No newline at end of file