forked from bookstack/hacks
Updated "notify-tagged-page-updates" hack for v23.10.4
HTTP Fns Hack update service pi_3OEeE4DUTTfhFsjz3bvEcZwE
This commit is contained in:
parent 1963f14e48
commit c16f41f20c
2 changed files with 27 additions and 30 deletions
| @ -1,13 +1,13 @@ | |||
<?php | ||||
| ||||
use BookStack\Actions\ActivityType; | ||||
use BookStack\Actions\Tag; | ||||
use BookStack\Auth\Role; | ||||
use BookStack\Auth\User; | ||||
use BookStack\Activity\ActivityType; | ||||
use BookStack\Activity\Models\Tag; | ||||
use BookStack\Activity\Notifications\Messages\BaseActivityNotification; | ||||
use BookStack\Entities\Models\Page; | ||||
use BookStack\Facades\Theme; | ||||
use BookStack\Notifications\MailNotification; | ||||
use BookStack\Theming\ThemeEvents; | ||||
use BookStack\Users\Models\Role; | ||||
use BookStack\Users\Models\User; | ||||
use Illuminate\Notifications\Messages\MailMessage; | ||||
| ||||
// This customization notifies page updates to users within roles named via a tag on a parent book. | ||||
| @ -20,23 +20,17 @@ use Illuminate\Notifications\Messages\MailMessage; | |||
| ||||
// This notification class represents the notification that'll be sent to users. | ||||
// The text of the notification can be customized within the 'toMail' function. | ||||
class PageUpdatedNotification extends MailNotification { | ||||
| ||||
protected Page $page; | ||||
protected User $updater; | ||||
| ||||
public function __construct(Page $page, User $updater) | ||||
class PageUpdateNotification extends BaseActivityNotification { | ||||
public function toMail(User $notifiable): MailMessage | ||||
{ | ||||
$this->page = $page; | ||||
$this->updater = $updater; | ||||
} | ||||
/** @var Page $page */ | ||||
$page = $this->detail; | ||||
$updater = $this->user; | ||||
| ||||
public function toMail($notifiable) | ||||
{ | ||||
return (new MailMessage()) | ||||
->subject('BookStack page update notification') | ||||
->line("The page \"{$this->page->name}\" has been updated by \"{$this->updater->name}\"") | ||||
->action('View Page', $this->page->getUrl()); | ||||
->line("The page \"{$page->name}\" has been updated by \"{$updater->name}\"") | ||||
->action('View Page', $page->getUrl()); | ||||
} | ||||
} | ||||
| ||||
| @ -56,7 +50,7 @@ function notifyRequiredUsers(Page $page) { | |||
} | ||||
| ||||
// Get the roles named via the tag | ||||
$roleNames = array_filter(array_map(fn($str) => trim($str) , explode(',', $notifyTag->value))); | ||||
$roleNames = array_filter(array_map(fn ($str) => trim($str), explode(',', $notifyTag->value))); | ||||
$roleIds = Role::query()->whereIn('display_name', $roleNames)->pluck('id'); | ||||
if (count($roleNames) === 0 || $roleIds->isEmpty()) { | ||||
return; | ||||
| @ -64,11 +58,11 @@ function notifyRequiredUsers(Page $page) { | |||
| ||||
// Get the users we want to notify, and the user that updated the page | ||||
$usersToNotify = User::query() | ||||
->whereExists(function($query) use ($roleIds) { | ||||
$query->select('user_id') | ||||
->from('role_user') | ||||
->whereColumn('users.id', '=', 'role_user.user_id') | ||||
->whereIn('role_id', $roleIds); | ||||
->whereExists(function ($query) use ($roleIds) { | ||||
$query->select('user_id') | ||||
->from('role_user') | ||||
->whereColumn('users.id', '=', 'role_user.user_id') | ||||
->whereIn('role_id', $roleIds); | ||||
}) | ||||
->where('id', '!=', $page->updated_by) | ||||
->get(); | ||||
| @ -76,14 +70,14 @@ function notifyRequiredUsers(Page $page) { | |||
| ||||
// Send a notification to each of the users we want to notify | ||||
foreach ($usersToNotify as $user) { | ||||
$user->notify(new PageUpdatedNotification($page, $updater)); | ||||
$user->notify(new PageUpdateNotification($page, $updater)); | ||||
usleep(100000); // Slight 0.1s delay to help rate limit abuse | ||||
} | ||||
} | ||||
| ||||
// Listen to page update events and kick-start our notification logic | ||||
Theme::listen(ThemeEvents::ACTIVITY_LOGGED, function(string $type, $detail) { | ||||
Theme::listen(ThemeEvents::ACTIVITY_LOGGED, function (string $type, $detail) { | ||||
if ($type === ActivityType::PAGE_UPDATE && $detail instanceof Page) { | ||||
notifyRequiredUsers($detail); | ||||
} | ||||
}); | ||||
}); | ||||
| |
| @ -2,8 +2,8 @@ | |||
title = "Notify Page Updates for Tagged Books" | ||||
author = "@ssddanbrown" | ||||
date = 2022-12-01T20:00:00Z | ||||
updated = 2022-12-01T20:00:00Z | ||||
tested = "v22.11" | ||||
updated = 2023-11-20T22:00:00Z | ||||
tested = "v23.10.4" | ||||
+++ | ||||
| ||||
| ||||
| @ -14,10 +14,13 @@ For example, if a tag with name `Notify` and value `Admins, Viewers` is applied | |||
| ||||
- The sending of emails may slow down page update actions, and these could be noisy if a user edits a page many times quickly. | ||||
- You may run into email system rate-limits with the amount of emails being sent. | ||||
- By default, languages/translations are not handled in this example. | ||||
- This could be abused to send a mass of emails to user groups. | ||||
- You may prefer to use the in-platform notification system which was added in [BookStack v23.08](/blog/bookstack-release-v23-08/). | ||||
| ||||
#### Options | ||||
| ||||
- You can customize the email message, if desired, by editing the lines of text within the toMail part at around lines 36-39 of the `functions.php` code. | ||||
- You can customize the email message, if desired, by editing the lines of text within the toMail part at around lines 31-34 of the `functions.php` code. | ||||
| ||||
#### Code | ||||
| ||||
| |
Loading…
Add table
Add a link
Reference in a new issue