Add destroyed event

This commit is contained in:
Philipp Lang 2023-03-13 10:17:14 +01:00
parent ff3516ca4f
commit f2218d83ad
5 changed files with 50 additions and 3 deletions

View File

@ -19,6 +19,11 @@ class CollectionExtension
return fn ($callback) => $this->registerCustomCallback('storing', $callback); return fn ($callback) => $this->registerCustomCallback('storing', $callback);
} }
public function destroyed()
{
return fn ($callback) => $this->registerCustomCallback('destroyed', $callback);
}
public function withDefaultProperties() public function withDefaultProperties()
{ {
return fn ($callback) => $this->registerCustomCallback('withDefaultProperties', $callback); return fn ($callback) => $this->registerCustomCallback('withDefaultProperties', $callback);
@ -67,6 +72,7 @@ class CollectionExtension
$this->customCallbacks = collect([ $this->customCallbacks = collect([
'forceFileName' => fn ($model, $name) => $name, 'forceFileName' => fn ($model, $name) => $name,
'stored' => fn ($event) => true, 'stored' => fn ($event) => true,
'destroyed' => fn ($event) => true,
'storing' => fn ($adder, $name) => $adder, 'storing' => fn ($adder, $name) => $adder,
'withDefaultProperties' => fn ($path) => [], 'withDefaultProperties' => fn ($path) => [],
'withPropertyValidation' => fn ($path) => [], 'withPropertyValidation' => fn ($path) => [],

View File

@ -5,7 +5,6 @@ namespace Zoomyboy\MedialibraryHelper;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Spatie\LaravelData\DataCollection; use Spatie\LaravelData\DataCollection;
@ -98,7 +97,10 @@ class MediaController
public function destroy(Media $media, Request $request): JsonResponse public function destroy(Media $media, Request $request): JsonResponse
{ {
$this->authorize('destroyMedia', [$media->model, $media->collection_name]); $this->authorize('destroyMedia', [$media->model, $media->collection_name]);
$model = $media->model->fresh();
$collection = $model->getMediaCollection($media->collection_name);
$media->delete(); $media->delete();
$collection->runCallback('destroyed', $media->model->fresh());
return response()->json([]); return response()->json([]);
} }

View File

@ -0,0 +1,22 @@
<?php
namespace Zoomyboy\MedialibraryHelper\Tests\Events;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Spatie\MediaLibrary\HasMedia;
class MediaDestroyed
{
use Dispatchable;
use SerializesModels;
public function __construct(public HasMedia $model)
{
}
public function broadcastOn()
{
return [];
}
}

View File

@ -2,8 +2,11 @@
namespace Zoomyboy\MedialibraryHelper\Tests\Feature; namespace Zoomyboy\MedialibraryHelper\Tests\Feature;
use Illuminate\Support\Facades\Event;
use Zoomyboy\MedialibraryHelper\Tests\Events\MediaDestroyed;
test('it deletes multiple media', function () { test('it deletes multiple media', function () {
$this->auth()->registerModel(); $this->auth()->registerModel()->withoutExceptionHandling();
$post = $this->newPost(); $post = $this->newPost();
$post->addMedia($this->pdfFile()->getPathname())->withCustomProperties(['test' => 'old'])->preservingOriginal()->toMediaCollection('multipleForced'); $post->addMedia($this->pdfFile()->getPathname())->withCustomProperties(['test' => 'old'])->preservingOriginal()->toMediaCollection('multipleForced');
$post->addMedia($this->pdfFile()->getPathname())->withCustomProperties(['test' => 'old'])->preservingOriginal()->toMediaCollection('multipleForced'); $post->addMedia($this->pdfFile()->getPathname())->withCustomProperties(['test' => 'old'])->preservingOriginal()->toMediaCollection('multipleForced');
@ -33,3 +36,15 @@ test('it needs authorization', function () {
$this->deleteJson("/mediaupload/{$media->id}")->assertStatus(403); $this->deleteJson("/mediaupload/{$media->id}")->assertStatus(403);
}); });
test('it fires event', function () {
Event::fake();
$this->auth()->registerModel()->withoutExceptionHandling();
$post = $this->newPost();
$post->addMedia($this->pdfFile()->getPathname())->preservingOriginal()->toMediaCollection('singleWithEvent');
$media = $post->getFirstMedia('singleWithEvent');
$this->deleteJson("/mediaupload/{$media->id}")->assertStatus(200);
Event::assertDispatched(MediaDestroyed::class, fn ($event) => $event->model->is($post));
});

View File

@ -8,6 +8,7 @@ use Illuminate\Support\Str;
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media; use Spatie\MediaLibrary\MediaCollections\Models\Media;
use Zoomyboy\MedialibraryHelper\Tests\Events\MediaDestroyed;
use Zoomyboy\MedialibraryHelper\Tests\Events\MediaStored; use Zoomyboy\MedialibraryHelper\Tests\Events\MediaStored;
class Post extends Model implements HasMedia class Post extends Model implements HasMedia
@ -46,7 +47,8 @@ class Post extends Model implements HasMedia
$this->addMediaCollection('singleWithEvent')->singleFile()->stored(function (Media $media) { $this->addMediaCollection('singleWithEvent')->singleFile()->stored(function (Media $media) {
Event::dispatch(new MediaStored($media)); Event::dispatch(new MediaStored($media));
}); })
->destroyed(fn ($model) => Event::dispatch(new MediaDestroyed($model)));
$this->addMediaCollection('multipleFilesWithEvent')->stored(function (Media $media) { $this->addMediaCollection('multipleFilesWithEvent')->stored(function (Media $media) {
Event::dispatch(new MediaStored($media)); Event::dispatch(new MediaStored($media));