2023-07-26 00:06:48 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace BookStack\Activity\Notifications;
|
|
|
|
|
|
|
|
use BookStack\Activity\ActivityType;
|
2023-08-15 21:39:39 +08:00
|
|
|
use BookStack\Activity\Models\Activity;
|
2023-07-26 00:06:48 +08:00
|
|
|
use BookStack\Activity\Models\Loggable;
|
|
|
|
use BookStack\Activity\Notifications\Handlers\CommentCreationNotificationHandler;
|
|
|
|
use BookStack\Activity\Notifications\Handlers\NotificationHandler;
|
|
|
|
use BookStack\Activity\Notifications\Handlers\PageCreationNotificationHandler;
|
|
|
|
use BookStack\Activity\Notifications\Handlers\PageUpdateNotificationHandler;
|
2023-08-04 19:27:29 +08:00
|
|
|
use BookStack\Users\Models\User;
|
2023-07-26 00:06:48 +08:00
|
|
|
|
|
|
|
class NotificationManager
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @var class-string<NotificationHandler>[]
|
|
|
|
*/
|
|
|
|
protected array $handlers = [];
|
|
|
|
|
2023-08-15 21:39:39 +08:00
|
|
|
public function handle(Activity $activity, string|Loggable $detail, User $user): void
|
2023-07-26 00:06:48 +08:00
|
|
|
{
|
2023-08-15 21:39:39 +08:00
|
|
|
$activityType = $activity->type;
|
2023-07-26 00:06:48 +08:00
|
|
|
$handlersToRun = $this->handlers[$activityType] ?? [];
|
|
|
|
foreach ($handlersToRun as $handlerClass) {
|
|
|
|
/** @var NotificationHandler $handler */
|
|
|
|
$handler = app()->make($handlerClass);
|
2023-08-15 21:39:39 +08:00
|
|
|
$handler->handle($activity, $detail, $user);
|
2023-07-26 00:06:48 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param class-string<NotificationHandler> $handlerClass
|
|
|
|
*/
|
|
|
|
public function registerHandler(string $activityType, string $handlerClass): void
|
|
|
|
{
|
|
|
|
if (!isset($this->handlers[$activityType])) {
|
|
|
|
$this->handlers[$activityType] = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!in_array($handlerClass, $this->handlers[$activityType])) {
|
|
|
|
$this->handlers[$activityType][] = $handlerClass;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function loadDefaultHandlers(): void
|
|
|
|
{
|
|
|
|
$this->registerHandler(ActivityType::PAGE_CREATE, PageCreationNotificationHandler::class);
|
|
|
|
$this->registerHandler(ActivityType::PAGE_UPDATE, PageUpdateNotificationHandler::class);
|
|
|
|
$this->registerHandler(ActivityType::COMMENT_CREATE, CommentCreationNotificationHandler::class);
|
|
|
|
}
|
|
|
|
}
|