From 512932471eec14998c55cfe97c35a1181de6d351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9ia=20Bohner?= Date: Tue, 9 Jun 2026 20:18:13 -0300 Subject: [PATCH] Add file restored event --- README.md | 23 +++++++++++ src/Events/LibraryFileRestored.php | 23 +++++++++++ src/FilamentLibraryServiceProvider.php | 26 +++++++++++++ tests/Unit/LibraryFileRestoredEventTest.php | 43 +++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 src/Events/LibraryFileRestored.php create mode 100644 tests/Unit/LibraryFileRestoredEventTest.php diff --git a/README.md b/README.md index cca49ff..7127d5d 100644 --- a/README.md +++ b/README.md @@ -233,6 +233,29 @@ public function boot(): void } ``` +### `LibraryFileRestored` + +[`Tapp\FilamentLibrary\Events\LibraryFileRestored`](src/Events/LibraryFileRestored.php) is fired after a soft-deleted `LibraryItem` of type `file` is restored (for example via Filament's Restore action). + +The event exposes: + +- `$libraryItem` — the restored [`LibraryItem`](src/Models/LibraryItem.php) +- `$media` — the item's first [`Media`](https://github.com/spatie/laravel-medialibrary) record, or `null` if none is attached + +Example listener registration in `AppServiceProvider`: + +```php +use Illuminate\Support\Facades\Event; +use Tapp\FilamentLibrary\Events\LibraryFileRestored; + +public function boot(): void +{ + Event::listen(LibraryFileRestored::class, function (LibraryFileRestored $event): void { + // e.g. re-index or re-ingest RAG chunks here + }); +} +``` + ## Testing ```bash diff --git a/src/Events/LibraryFileRestored.php b/src/Events/LibraryFileRestored.php new file mode 100644 index 0000000..d6570a9 --- /dev/null +++ b/src/Events/LibraryFileRestored.php @@ -0,0 +1,23 @@ +loadViewsFrom(__DIR__ . '/Resources/views', static::$viewNamespace); $this->registerLibraryFileStoredEvent(); + $this->registerLibraryFileRestoredEvent(); // Publish views manually (optional) $this->publishes([ @@ -200,6 +203,29 @@ protected function registerLibraryFileStoredEvent(): void }); } + /** + * When a soft-deleted library file is restored, notify host apps (e.g. for RAG re-ingestion). + */ + protected function registerLibraryFileRestoredEvent(): void + { + $libraryItemModel = FilamentLibraryPlugin::libraryItemModelClass(); + + $libraryItemModel::restored(function (LibraryItem $item): void { + if ($item->type !== 'file') { + return; + } + + $media = null; + + if (class_exists(Media::class) && Schema::hasTable('media')) { + $firstMedia = $item->getFirstMedia(); + $media = $firstMedia instanceof Media ? $firstMedia : null; + } + + event(new LibraryFileRestored($item, $media)); + }); + } + /** * @return array */ diff --git a/tests/Unit/LibraryFileRestoredEventTest.php b/tests/Unit/LibraryFileRestoredEventTest.php new file mode 100644 index 0000000..44241b6 --- /dev/null +++ b/tests/Unit/LibraryFileRestoredEventTest.php @@ -0,0 +1,43 @@ +create([ + 'name' => 'Restored brief.pdf', + 'slug' => 'restored-brief-' . uniqid('', true), + 'type' => 'file', + 'created_by' => 1, + 'updated_by' => 1, + 'general_access' => 'private', + ]); + + $item->delete(); + $item->restore(); + + Event::assertDispatched(LibraryFileRestored::class, function (LibraryFileRestored $event) use ($item): bool { + return $event->libraryItem->is($item); + }); +}); + +test('LibraryFileRestored is not dispatched when a folder is restored', function (): void { + Event::fake([LibraryFileRestored::class]); + + $item = LibraryItem::query()->create([ + 'name' => 'Restored folder', + 'slug' => 'restored-folder-' . uniqid('', true), + 'type' => 'folder', + 'created_by' => 1, + 'updated_by' => 1, + 'general_access' => 'private', + ]); + + $item->delete(); + $item->restore(); + + Event::assertNotDispatched(LibraryFileRestored::class); +});