diff --git a/src/CollectionExtension.php b/src/CollectionExtension.php index d1af021..efe680f 100644 --- a/src/CollectionExtension.php +++ b/src/CollectionExtension.php @@ -24,6 +24,11 @@ class CollectionExtension return fn ($callback) => $this->registerCustomCallback('destroyed', $callback); } + public function after() + { + return fn ($callback) => $this->registerCustomCallback('after', $callback); + } + public function withDefaultProperties() { return fn ($callback) => $this->registerCustomCallback('withDefaultProperties', $callback); @@ -72,6 +77,7 @@ class CollectionExtension $this->customCallbacks = collect([ 'forceFileName' => fn ($model, $name) => $name, 'stored' => fn ($event) => true, + 'after' => fn ($event) => true, 'destroyed' => fn ($event) => true, 'storing' => fn ($adder, $name) => $adder, 'withDefaultProperties' => fn ($path) => [], diff --git a/src/MediaController.php b/src/MediaController.php index b92f82a..50c944d 100644 --- a/src/MediaController.php +++ b/src/MediaController.php @@ -58,6 +58,8 @@ class MediaController ); }); + $collection->runCallback('after', $model->fresh()); + return $isSingle ? MediaData::from($medias->first()) : MediaData::collection($medias); } @@ -71,6 +73,7 @@ class MediaController $validated = $request->validate($rules); $media->update(['custom_properties' => data_get($validated, 'properties', [])]); + $media->model->getMediaCollection($media->collection_name)->runCallback('after', $media->model->fresh()); return MediaData::from($media); } @@ -101,6 +104,7 @@ class MediaController $collection = $model->getMediaCollection($media->collection_name); $media->delete(); $collection->runCallback('destroyed', $media->model->fresh()); + $collection->runCallback('after', $media->model->fresh()); return response()->json([]); } diff --git a/tests/Events/MediaChange.php b/tests/Events/MediaChange.php new file mode 100644 index 0000000..2c1fd85 --- /dev/null +++ b/tests/Events/MediaChange.php @@ -0,0 +1,22 @@ +deleteJson("/mediaupload/{$media->id}")->assertStatus(200); Event::assertDispatched(MediaDestroyed::class, fn ($event) => $event->model->is($post)); + Event::assertDispatched(MediaChange::class, fn ($event) => $event->model->is($post)); }); diff --git a/tests/Feature/UpdateTest.php b/tests/Feature/UpdateTest.php index 70b3d20..68e788c 100644 --- a/tests/Feature/UpdateTest.php +++ b/tests/Feature/UpdateTest.php @@ -2,7 +2,11 @@ namespace Zoomyboy\MedialibraryHelper\Tests\Feature; +use Illuminate\Support\Facades\Event; +use Zoomyboy\MedialibraryHelper\Tests\Events\MediaChange; + test('it updates a single files properties', function () { + Event::fake(); $this->auth()->registerModel(); $post = $this->newPost(); $post->addMedia($this->pdfFile()->getPathname())->withCustomProperties(['test' => 'old'])->preservingOriginal()->toMediaCollection('multipleProperties'); @@ -20,6 +24,7 @@ test('it updates a single files properties', function () { $this->assertEquals(null, $media->fresh()->getCustomProperty('missing')); $response->assertJsonPath('properties.test', 'new'); $response->assertJsonMissingPath('properties.missing'); + Event::assertDispatched(MediaChange::class, fn ($event) => $event->model->is($post)); }); test('it validates a single files properties', function () { diff --git a/tests/Feature/UploadTest.php b/tests/Feature/UploadTest.php index 549a649..52dfa25 100644 --- a/tests/Feature/UploadTest.php +++ b/tests/Feature/UploadTest.php @@ -4,6 +4,7 @@ namespace Zoomyboy\MedialibraryHelper\Tests\Feature; use Carbon\Carbon; use Illuminate\Support\Facades\Event; +use Zoomyboy\MedialibraryHelper\Tests\Events\MediaChange; use Zoomyboy\MedialibraryHelper\Tests\Events\MediaStored; test('it uploads a single file to a single file collection', function () { @@ -140,6 +141,7 @@ test('it throws event when file has been uploaded', function () { $response->assertStatus(201); Event::assertDispatched(MediaStored::class, fn ($event) => $event->media->id === $response->json('id')); + Event::assertDispatched(MediaChange::class, fn ($event) => $event->model->is($post)); }); test('it throws event when multiple files uploaded', function () { diff --git a/tests/Models/Post.php b/tests/Models/Post.php index 9951ce2..1dfcbaa 100644 --- a/tests/Models/Post.php +++ b/tests/Models/Post.php @@ -8,6 +8,7 @@ use Illuminate\Support\Str; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; +use Zoomyboy\MedialibraryHelper\Tests\Events\MediaChange; use Zoomyboy\MedialibraryHelper\Tests\Events\MediaDestroyed; use Zoomyboy\MedialibraryHelper\Tests\Events\MediaStored; @@ -48,7 +49,8 @@ class Post extends Model implements HasMedia $this->addMediaCollection('singleWithEvent')->singleFile()->stored(function (Media $media) { Event::dispatch(new MediaStored($media)); }) - ->destroyed(fn ($model) => Event::dispatch(new MediaDestroyed($model))); + ->destroyed(fn ($model) => Event::dispatch(new MediaDestroyed($model))) + ->after(fn ($model) => Event::dispatch(new MediaChange($model))); $this->addMediaCollection('multipleFilesWithEvent')->stored(function (Media $media) { Event::dispatch(new MediaStored($media)); @@ -58,6 +60,7 @@ class Post extends Model implements HasMedia 'test' => Str::camel($path), ])->withPropertyValidation(fn ($path) => [ 'test' => 'string|max:10', - ]); + ]) + ->after(fn ($model) => Event::dispatch(new MediaChange($model))); } }