mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-11-04 13:31:45 +03:00 
			
		
		
		
	Added test and changed logic to properly check the view permissions for the notification receiver before sending. Required change to permissions applicator to allow the user to be manually determined, and a service provider update to provide the class as a singleton without a specific user, so it checks the current logged in user on demand.
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace BookStack\Activity\Notifications;
 | 
						|
 | 
						|
use BookStack\Activity\ActivityType;
 | 
						|
use BookStack\Activity\Models\Activity;
 | 
						|
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;
 | 
						|
use BookStack\Users\Models\User;
 | 
						|
 | 
						|
class NotificationManager
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var class-string<NotificationHandler>[]
 | 
						|
     */
 | 
						|
    protected array $handlers = [];
 | 
						|
 | 
						|
    public function handle(Activity $activity, string|Loggable $detail, User $user): void
 | 
						|
    {
 | 
						|
        $activityType = $activity->type;
 | 
						|
        $handlersToRun = $this->handlers[$activityType] ?? [];
 | 
						|
        foreach ($handlersToRun as $handlerClass) {
 | 
						|
            /** @var NotificationHandler $handler */
 | 
						|
            $handler = new $handlerClass();
 | 
						|
            $handler->handle($activity, $detail, $user);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @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);
 | 
						|
    }
 | 
						|
}
 |