Compare commits
	
		
			2 Commits
		
	
	
		
			ff3516ca4f
			...
			fb15678d4e
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | fb15678d4e | |
|  | f2218d83ad | 
|  | @ -19,6 +19,16 @@ 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 after() | ||||||
|  |             { | ||||||
|  |                 return fn ($callback) => $this->registerCustomCallback('after', $callback); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             public function withDefaultProperties() |             public function withDefaultProperties() | ||||||
|             { |             { | ||||||
|                 return fn ($callback) => $this->registerCustomCallback('withDefaultProperties', $callback); |                 return fn ($callback) => $this->registerCustomCallback('withDefaultProperties', $callback); | ||||||
|  | @ -67,6 +77,8 @@ 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, | ||||||
|  |                         'after' => 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) => [], | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  | @ -59,6 +58,8 @@ class MediaController | ||||||
|             ); |             ); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|  |         $collection->runCallback('after', $model->fresh()); | ||||||
|  | 
 | ||||||
|         return $isSingle ? MediaData::from($medias->first()) : MediaData::collection($medias); |         return $isSingle ? MediaData::from($medias->first()) : MediaData::collection($medias); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -72,6 +73,7 @@ class MediaController | ||||||
|         $validated = $request->validate($rules); |         $validated = $request->validate($rules); | ||||||
| 
 | 
 | ||||||
|         $media->update(['custom_properties' => data_get($validated, 'properties', [])]); |         $media->update(['custom_properties' => data_get($validated, 'properties', [])]); | ||||||
|  |         $media->model->getMediaCollection($media->collection_name)->runCallback('after', $media->model->fresh()); | ||||||
| 
 | 
 | ||||||
|         return MediaData::from($media); |         return MediaData::from($media); | ||||||
|     } |     } | ||||||
|  | @ -98,7 +100,11 @@ 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()); | ||||||
|  |         $collection->runCallback('after', $media->model->fresh()); | ||||||
| 
 | 
 | ||||||
|         return response()->json([]); |         return response()->json([]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Zoomyboy\MedialibraryHelper\Tests\Events; | ||||||
|  | 
 | ||||||
|  | use Illuminate\Foundation\Events\Dispatchable; | ||||||
|  | use Illuminate\Queue\SerializesModels; | ||||||
|  | use Spatie\MediaLibrary\HasMedia; | ||||||
|  | 
 | ||||||
|  | class MediaChange | ||||||
|  | { | ||||||
|  |     use Dispatchable; | ||||||
|  |     use SerializesModels; | ||||||
|  | 
 | ||||||
|  |     public function __construct(public HasMedia $model) | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function broadcastOn() | ||||||
|  |     { | ||||||
|  |         return []; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -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 []; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -2,8 +2,12 @@ | ||||||
| 
 | 
 | ||||||
| namespace Zoomyboy\MedialibraryHelper\Tests\Feature; | namespace Zoomyboy\MedialibraryHelper\Tests\Feature; | ||||||
| 
 | 
 | ||||||
|  | use Illuminate\Support\Facades\Event; | ||||||
|  | use Zoomyboy\MedialibraryHelper\Tests\Events\MediaChange; | ||||||
|  | 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 +37,16 @@ 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)); | ||||||
|  |     Event::assertDispatched(MediaChange::class, fn ($event) => $event->model->is($post)); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | @ -2,7 +2,11 @@ | ||||||
| 
 | 
 | ||||||
| namespace Zoomyboy\MedialibraryHelper\Tests\Feature; | namespace Zoomyboy\MedialibraryHelper\Tests\Feature; | ||||||
| 
 | 
 | ||||||
|  | use Illuminate\Support\Facades\Event; | ||||||
|  | use Zoomyboy\MedialibraryHelper\Tests\Events\MediaChange; | ||||||
|  | 
 | ||||||
| test('it updates a single files properties', function () { | test('it updates a single files properties', function () { | ||||||
|  |     Event::fake(); | ||||||
|     $this->auth()->registerModel(); |     $this->auth()->registerModel(); | ||||||
|     $post = $this->newPost(); |     $post = $this->newPost(); | ||||||
|     $post->addMedia($this->pdfFile()->getPathname())->withCustomProperties(['test' => 'old'])->preservingOriginal()->toMediaCollection('multipleProperties'); |     $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')); |     $this->assertEquals(null, $media->fresh()->getCustomProperty('missing')); | ||||||
|     $response->assertJsonPath('properties.test', 'new'); |     $response->assertJsonPath('properties.test', 'new'); | ||||||
|     $response->assertJsonMissingPath('properties.missing'); |     $response->assertJsonMissingPath('properties.missing'); | ||||||
|  |     Event::assertDispatched(MediaChange::class, fn ($event) => $event->model->is($post)); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| test('it validates a single files properties', function () { | test('it validates a single files properties', function () { | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ namespace Zoomyboy\MedialibraryHelper\Tests\Feature; | ||||||
| 
 | 
 | ||||||
| use Carbon\Carbon; | use Carbon\Carbon; | ||||||
| use Illuminate\Support\Facades\Event; | use Illuminate\Support\Facades\Event; | ||||||
|  | use Zoomyboy\MedialibraryHelper\Tests\Events\MediaChange; | ||||||
| use Zoomyboy\MedialibraryHelper\Tests\Events\MediaStored; | use Zoomyboy\MedialibraryHelper\Tests\Events\MediaStored; | ||||||
| 
 | 
 | ||||||
| test('it uploads a single file to a single file collection', function () { | 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); |     $response->assertStatus(201); | ||||||
|     Event::assertDispatched(MediaStored::class, fn ($event) => $event->media->id === $response->json('id')); |     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 () { | test('it throws event when multiple files uploaded', function () { | ||||||
|  |  | ||||||
|  | @ -8,6 +8,8 @@ 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\MediaChange; | ||||||
|  | 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 +48,9 @@ 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))) | ||||||
|  |         ->after(fn ($model) => Event::dispatch(new MediaChange($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)); | ||||||
|  | @ -56,6 +60,7 @@ class Post extends Model implements HasMedia | ||||||
|             'test' => Str::camel($path), |             'test' => Str::camel($path), | ||||||
|         ])->withPropertyValidation(fn ($path) => [ |         ])->withPropertyValidation(fn ($path) => [ | ||||||
|             'test' => 'string|max:10', |             'test' => 'string|max:10', | ||||||
|         ]); |         ]) | ||||||
|  |         ->after(fn ($model) => Event::dispatch(new MediaChange($model))); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue