Adding login to rename a folder on disk as well

parent b84f1451
...@@ -14,10 +14,15 @@ class FolderWasUpdated ...@@ -14,10 +14,15 @@ class FolderWasUpdated
* @var array * @var array
*/ */
public $data; public $data;
/**
* @var array
*/
public $previousFolderData;
public function __construct(File $folder, array $data) public function __construct(File $folder, array $data, array $previousFolderData)
{ {
$this->folder = $folder; $this->folder = $folder;
$this->data = $data; $this->data = $data;
$this->previousFolderData = $previousFolderData;
} }
} }
<?php
namespace Modules\Media\Events\Handlers;
use Illuminate\Contracts\Filesystem\Factory;
use Modules\Media\Events\FolderWasUpdated;
class RenameFolderOnDisk
{
/**
* @var Factory
*/
private $filesystem;
public function __construct(Factory $filesystem)
{
$this->filesystem = $filesystem;
}
public function handle(FolderWasUpdated $event)
{
$this->filesystem->disk($this->getConfiguredFilesystem())
->move(
$this->getDestinationPath($event->previousFolderData['path']->getRelativeUrl()),
$this->getDestinationPath($event->folder->path->getRelativeUrl())
);
}
private function getDestinationPath($path)
{
if ($this->getConfiguredFilesystem() === 'local') {
return basename(public_path()) . $path;
}
return $path;
}
/**
* @return string
*/
private function getConfiguredFilesystem()
{
return config('asgard.media.config.filesystem');
}
}
...@@ -15,10 +15,12 @@ use Modules\Media\Contracts\DeletingMedia; ...@@ -15,10 +15,12 @@ use Modules\Media\Contracts\DeletingMedia;
use Modules\Media\Contracts\StoringMedia; use Modules\Media\Contracts\StoringMedia;
use Modules\Media\Entities\File; use Modules\Media\Entities\File;
use Modules\Media\Events\FolderWasCreated; use Modules\Media\Events\FolderWasCreated;
use Modules\Media\Events\FolderWasUpdated;
use Modules\Media\Events\Handlers\CreateFolderOnDisk; use Modules\Media\Events\Handlers\CreateFolderOnDisk;
use Modules\Media\Events\Handlers\HandleMediaStorage; use Modules\Media\Events\Handlers\HandleMediaStorage;
use Modules\Media\Events\Handlers\RegisterMediaSidebar; use Modules\Media\Events\Handlers\RegisterMediaSidebar;
use Modules\Media\Events\Handlers\RemovePolymorphicLink; use Modules\Media\Events\Handlers\RemovePolymorphicLink;
use Modules\Media\Events\Handlers\RenameFolderOnDisk;
use Modules\Media\Image\ThumbnailManager; use Modules\Media\Image\ThumbnailManager;
use Modules\Media\Repositories\Eloquent\EloquentFileRepository; use Modules\Media\Repositories\Eloquent\EloquentFileRepository;
use Modules\Media\Repositories\Eloquent\EloquentFolderRepository; use Modules\Media\Repositories\Eloquent\EloquentFolderRepository;
...@@ -72,6 +74,7 @@ class MediaServiceProvider extends ServiceProvider ...@@ -72,6 +74,7 @@ class MediaServiceProvider extends ServiceProvider
$events->listen(StoringMedia::class, HandleMediaStorage::class); $events->listen(StoringMedia::class, HandleMediaStorage::class);
$events->listen(DeletingMedia::class, RemovePolymorphicLink::class); $events->listen(DeletingMedia::class, RemovePolymorphicLink::class);
$events->listen(FolderWasCreated::class, CreateFolderOnDisk::class); $events->listen(FolderWasCreated::class, CreateFolderOnDisk::class);
$events->listen(FolderWasUpdated::class, RenameFolderOnDisk::class);
$this->app[TagManager::class]->registerNamespace(new File()); $this->app[TagManager::class]->registerNamespace(new File());
$this->registerThumbnails(); $this->registerThumbnails();
......
...@@ -40,6 +40,10 @@ class EloquentFolderRepository extends EloquentBaseRepository implements FolderR ...@@ -40,6 +40,10 @@ class EloquentFolderRepository extends EloquentBaseRepository implements FolderR
public function update($model, $data) public function update($model, $data)
{ {
$previousData = [
'filename' => $model->filename,
'path' => $model->path,
];
$formattedData = [ $formattedData = [
'filename' => array_get($data, 'name'), 'filename' => array_get($data, 'name'),
'path' => $this->getPath($data), 'path' => $this->getPath($data),
...@@ -47,7 +51,7 @@ class EloquentFolderRepository extends EloquentBaseRepository implements FolderR ...@@ -47,7 +51,7 @@ class EloquentFolderRepository extends EloquentBaseRepository implements FolderR
event($event = new FolderIsUpdating($formattedData)); event($event = new FolderIsUpdating($formattedData));
$model->update($event->getAttributes()); $model->update($event->getAttributes());
event(new FolderWasUpdated($model, $formattedData)); event(new FolderWasUpdated($model, $formattedData, $previousData));
return $model; return $model;
} }
......
...@@ -9,6 +9,7 @@ use Modules\Media\Events\FolderIsUpdating; ...@@ -9,6 +9,7 @@ use Modules\Media\Events\FolderIsUpdating;
use Modules\Media\Events\FolderWasCreated; use Modules\Media\Events\FolderWasCreated;
use Modules\Media\Events\FolderWasUpdated; use Modules\Media\Events\FolderWasUpdated;
use Modules\Media\Repositories\FolderRepository; use Modules\Media\Repositories\FolderRepository;
use Modules\Media\Services\FileService;
final class EloquentFolderRepositoryTest extends MediaTestCase final class EloquentFolderRepositoryTest extends MediaTestCase
{ {
...@@ -164,4 +165,28 @@ final class EloquentFolderRepositoryTest extends MediaTestCase ...@@ -164,4 +165,28 @@ final class EloquentFolderRepositoryTest extends MediaTestCase
$this->assertEquals('NEW NAME!', $folder->filename); $this->assertEquals('NEW NAME!', $folder->filename);
} }
/** @test */
public function it_can_rename_folder_on_disk()
{
$folder = $this->folder->create(['name' => 'My Folder']);
$this->assertTrue($this->app['files']->isDirectory(public_path('assets/media/my-folder')));
$folder = $this->folder->update($folder, ['name' => 'New Name!']);
$this->assertTrue($this->app['files']->isDirectory(public_path('assets/media/new-name')));
}
/** @test */
public function it_can_rename_folder_with_content()
{
$folder = $this->folder->create(['name' => 'My Folder']);
$file = \Illuminate\Http\UploadedFile::fake()->image('my-file.jpg');
app(FileService::class)->store($file, $folder->id);
$folder = $this->folder->update($folder, ['name' => 'New Name!']);
$this->assertTrue($this->app['files']->isDirectory(public_path('assets/media/new-name')));
$this->assertTrue($this->app['files']->exists(public_path('assets/media/new-name/my-file.jpg')));
$this->assertTrue($this->app['files']->exists(public_path('assets/media/new-name/my-file_smallThumb.jpg')));
$this->assertTrue($this->app['files']->exists(public_path('assets/media/new-name/my-file_mediumThumb.jpg')));
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment