1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-07-30 04:23:11 +03:00

Notifications: Got core notification logic working for new pages

Also rolled out watch UI to chapter and page views
This commit is contained in:
Dan Brown
2023-08-04 16:51:29 +01:00
parent 9779c1a357
commit 18ae67a138
8 changed files with 60 additions and 14 deletions

View File

@ -10,7 +10,14 @@ use Illuminate\Database\Eloquent\Builder;
class EntityWatchers
{
/**
* @var int[]
*/
protected array $watchers = [];
/**
* @var int[]
*/
protected array $ignorers = [];
public function __construct(
@ -20,16 +27,35 @@ class EntityWatchers
$this->build();
}
public function getWatcherUserIds(): array
{
return $this->watchers;
}
protected function build(): void
{
$watches = $this->getRelevantWatches();
// TODO - De-dupe down watches per-user across entity types
// so we end up with [user_id => status] values
// then filter to current watch level, considering ignores,
// then populate the class watchers/ignores with ids.
// Sort before de-duping, so that the order looped below follows book -> chapter -> page ordering
usort($watches, function (Watch $watchA, Watch $watchB) {
$entityTypeDiff = $watchA->watchable_type <=> $watchB->watchable_type;
return $entityTypeDiff === 0 ? ($watchA->user_id <=> $watchB->user_id) : $entityTypeDiff;
});
// De-dupe by user id to get their most relevant level
$levelByUserId = [];
foreach ($watches as $watch) {
$levelByUserId[$watch->user_id] = $watch->level;
}
// Populate the class arrays
$this->watchers = array_keys(array_filter($levelByUserId, fn(int $level) => $level >= $this->watchLevel));
$this->ignorers = array_keys(array_filter($levelByUserId, fn(int $level) => $level === 0));
}
/**
* @return Watch[]
*/
protected function getRelevantWatches(): array
{
/** @var Entity[] $entitiesInvolved */
@ -49,7 +75,7 @@ class EntityWatchers
});
return $query->get([
'level', 'watchable_id', 'watchable_type', 'user_id'
'level', 'watchable_id', 'watchable_type', 'user_id'
])->all();
}
}