diff --git a/app/Actions/ActivityLogger.php b/app/Actions/ActivityLogger.php index eea5409fb..468bb4705 100644 --- a/app/Actions/ActivityLogger.php +++ b/app/Actions/ActivityLogger.php @@ -3,7 +3,9 @@ namespace BookStack\Actions; use BookStack\Entities\Models\Entity; +use BookStack\Facades\Theme; use BookStack\Interfaces\Loggable; +use BookStack\Theming\ThemeEvents; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Log; @@ -27,8 +29,10 @@ class ActivityLogger } $activity->save(); + $this->setNotification($type); $this->dispatchWebhooks($type, $detail); + Theme::dispatch(ThemeEvents::ACTIVITY_LOGGED, $type, $detail); } /** diff --git a/app/Theming/ThemeEvents.php b/app/Theming/ThemeEvents.php index 300b26f2d..427147146 100644 --- a/app/Theming/ThemeEvents.php +++ b/app/Theming/ThemeEvents.php @@ -15,6 +15,19 @@ namespace BookStack\Theming; */ class ThemeEvents { + /** + * Activity logged event. + * Runs right after an activity is logged by bookstack. + * These are the activities that can be seen in the audit log area of BookStack. + * Activity types can be seen listed in the \BookStack\Actions\ActivityType class. + * The provided $detail can be a string or a loggable type of model. You should check + * the type before making use of this parameter. + * + * @param string $type + * @param string|\BookStack\Interfaces\Loggable $detail + */ + const ACTIVITY_LOGGED = 'activity_logged'; + /** * Application boot-up. * After main services are registered. diff --git a/tests/ThemeTest.php b/tests/ThemeTest.php index 85b8b9d36..76be03567 100644 --- a/tests/ThemeTest.php +++ b/tests/ThemeTest.php @@ -6,6 +6,7 @@ use BookStack\Actions\ActivityType; use BookStack\Actions\DispatchWebhookJob; use BookStack\Actions\Webhook; use BookStack\Auth\User; +use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Page; use BookStack\Entities\Tools\PageContent; use BookStack\Facades\Theme; @@ -196,6 +197,24 @@ class ThemeTest extends TestCase }); } + public function test_event_activity_logged() + { + $book = Book::query()->first(); + $args = []; + $callback = function (...$eventArgs) use (&$args) { + $args = $eventArgs; + }; + + Theme::listen(ThemeEvents::ACTIVITY_LOGGED, $callback); + $this->asEditor()->put($book->getUrl(), ['name' => 'My cool update book!']); + + $this->assertCount(2, $args); + $this->assertEquals(ActivityType::BOOK_UPDATE, $args[0]); + $this->assertTrue($args[1] instanceof Book); + $this->assertEquals($book->id, $args[1]->id); + } + + public function test_add_social_driver() { Theme::addSocialDriver('catnet', [