From 354601f421a0d3572aaf0954185be740baba3bef Mon Sep 17 00:00:00 2001 From: Nicolas Widart Date: Tue, 10 Oct 2017 15:49:09 +0200 Subject: [PATCH] Extract global moving logic to a Mover class --- .../Controllers/Api/MoveMediaController.php | 30 ++----- .../Eloquent/EloquentFileRepository.php | 1 + Modules/Media/Services/Movers/Mover.php | 37 +++++++++ Modules/Media/Tests/MoverTest.php | 82 +++++++++++++++++++ 4 files changed, 126 insertions(+), 24 deletions(-) create mode 100644 Modules/Media/Services/Movers/Mover.php create mode 100644 Modules/Media/Tests/MoverTest.php diff --git a/Modules/Media/Http/Controllers/Api/MoveMediaController.php b/Modules/Media/Http/Controllers/Api/MoveMediaController.php index fd362b8c4..2946ce0ce 100644 --- a/Modules/Media/Http/Controllers/Api/MoveMediaController.php +++ b/Modules/Media/Http/Controllers/Api/MoveMediaController.php @@ -7,8 +7,7 @@ use Modules\Media\Http\Requests\MoveMediaRequest; use Modules\Media\Repositories\FileRepository; use Modules\Media\Repositories\FolderRepository; -use Modules\Media\Services\Movers\FileMover; -use Modules\Media\Services\Movers\FolderMover; +use Modules\Media\Services\Movers\Mover; class MoveMediaController extends Controller { @@ -21,25 +20,19 @@ class MoveMediaController extends Controller */ private $folder; /** - * @var FolderMover + * @var Mover */ - private $folderMover; - /** - * @var FileMover - */ - private $fileMover; + private $mover; public function __construct( FileRepository $file, FolderRepository $folder, - FolderMover $folderMover, - FileMover $fileMover + Mover $mover ) { $this->file = $file; $this->folder = $folder; - $this->folderMover = $folderMover; - $this->fileMover = $fileMover; + $this->mover = $mover; } public function __invoke(MoveMediaRequest $request) @@ -48,18 +41,7 @@ public function __invoke(MoveMediaRequest $request) $failedMoves = 0; foreach ($request->get('files') as $file) { - $file = $this->file->find($file['id']); - // $this->>mover->move($file, $destination) - if ($file->is_folder === false) { - if ($this->fileMover->move($file, $destination) === false) { - $failedMoves++; - } - } - if ($file->is_folder === true) { - if ($this->folderMover->move($file, $destination) === false) { - $failedMoves++; - } - } + $failedMoves = $this->mover->move($this->file->find($file['id']), $destination); } return response()->json([ diff --git a/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php b/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php index 6cd62c765..33b1eeaa1 100644 --- a/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php +++ b/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php @@ -59,6 +59,7 @@ public function createFromFile(UploadedFile $file, int $parentId = 0) 'mimetype' => $file->getClientMimeType(), 'filesize' => $file->getFileInfo()->getSize(), 'folder_id' => $parentId, + 'is_folder' => 0, ]; event($event = new FileIsCreating($data)); diff --git a/Modules/Media/Services/Movers/Mover.php b/Modules/Media/Services/Movers/Mover.php new file mode 100644 index 000000000..3b4d9c334 --- /dev/null +++ b/Modules/Media/Services/Movers/Mover.php @@ -0,0 +1,37 @@ +fileMover = $fileMover; + $this->folderMover = $folderMover; + } + + public function move(File $file, File $destination) : int + { + $failedMoves = 0; + + if ($file->is_folder === false && $this->fileMover->move($file, $destination) === false) { + $failedMoves++; + } + if ($file->is_folder === true && $this->folderMover->move($file, $destination) === false) { + $failedMoves++; + } + + return $failedMoves; + } +} diff --git a/Modules/Media/Tests/MoverTest.php b/Modules/Media/Tests/MoverTest.php new file mode 100644 index 000000000..406f4a5dd --- /dev/null +++ b/Modules/Media/Tests/MoverTest.php @@ -0,0 +1,82 @@ +resetDatabase(); + + $this->mover = app(Mover::class); + //$this->file = app(FileRepository::class); + $this->app['config']->set('asgard.media.config.files-path', '/assets/media/'); + } + + public function tearDown() + { + if ($this->app['files']->isDirectory(public_path('assets')) === true) { + $this->app['files']->deleteDirectory(public_path('assets')); + } + } + + /** @test */ + public function it_detects_its_a_file_to_move() + { + $folderRepository = app(FolderRepository::class); + $parentFolder = $folderRepository->create(['name' => 'My Folder', 'parent_id' => 0]); + + $file = app(FileService::class)->store(\Illuminate\Http\UploadedFile::fake()->create('my-file.pdf')); + + $this->assertTrue($this->app['files']->exists(public_path('/assets/media/my-file.pdf'))); + $failedAmount = $this->mover->move($file, $parentFolder); + $this->assertTrue($this->app['files']->exists(public_path('/assets/media/my-folder/my-file.pdf'))); + $this->assertSame(0, $failedAmount); + } + + /** @test */ + public function it_detects_its_a_folder_to_move() + { + $folderRepository = app(FolderRepository::class); + $parentFolder = $folderRepository->create(['name' => 'My Folder', 'parent_id' => 0]); + $childFolder = $folderRepository->create(['name' => 'Child Folder', 'parent_id' => 0]); + + $this->assertTrue($this->app['files']->isDirectory(public_path('/assets/media/child-folder'))); + $failedAmount = $this->mover->move($childFolder, $parentFolder); + $this->assertTrue($this->app['files']->isDirectory(public_path('/assets/media/my-folder/child-folder'))); + $this->assertSame(0, $failedAmount); + } + + /** @test */ + public function it_counts_amount_of_failed_moves() + { + $folderRepository = app(FolderRepository::class); + $folder = $folderRepository->create(['name' => 'My Folder', 'parent_id' => 0]); + $file = app(FileService::class)->store(\Illuminate\Http\UploadedFile::fake()->image('my-file.jpg'), $folder->id); + $fileTwo = app(FileService::class)->store(\Illuminate\Http\UploadedFile::fake()->image('my-file.jpg')); + + $this->assertTrue($this->app['files']->exists(public_path('/assets/media/my-file.jpg'))); + $this->assertTrue($this->app['files']->exists(public_path('/assets/media/my-folder/my-file.jpg'))); + $this->assertEquals('/assets/media/my-folder/my-file.jpg', $file->path->getRelativeUrl()); + $this->assertEquals('/assets/media/my-file.jpg', $fileTwo->path->getRelativeUrl()); + + $failedAmount = $this->mover->move($fileTwo, $folder); + + $this->assertTrue($this->app['files']->exists(public_path('/assets/media/my-file.jpg'))); + $this->assertTrue($this->app['files']->exists(public_path('/assets/media/my-folder/my-file.jpg'))); + $this->assertEquals('/assets/media/my-folder/my-file.jpg', $file->path->getRelativeUrl()); + $this->assertEquals('/assets/media/my-file.jpg', $fileTwo->path->getRelativeUrl()); + $this->assertSame(1, $failedAmount); + } +}