Updated "notify-tagged-page-updates" hack for v23.10.4

HTTP Fns Hack update service pi_3OEeE4DUTTfhFsjz3bvEcZwE
This commit is contained in:
Dan Brown 2023-11-20 22:05:19 +00:00
commit c16f41f20c
Signed by: danb
GPG key ID: 46D9F943C24A2EF9

View file

@ -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);
}
});
});

View file

@ -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