designtopack/public/site/plugins/notifications/user-methods/send.php

52 lines
No EOL
1.9 KiB
PHP

<?php
/**
* Send a notification to all users who manage a specific project, excluding the user sending the notification.
*
* This function retrieves all users managing the project specified by `$projectUri` (excluding the current user)
* and adds a new notification to their `notifications` field, stored as a YAML-encoded array.
* If the `notifications` field is empty, an empty array is initialized before appending the new notification.
* In case of an error during update, an exception is thrown with the error message and line number.
*
* @param array $notificationData An associative array containing the notification data to be added.
* @param string $projectUri The URI of the project associated with this notification.
* @throws Exception If an error occurs while updating a user's notifications.
*/
return function ($project, $notificationData) {
$recipients = kirby()->users()->filter(function($user) use ($project) {
if ($user === $this || $user->projects()->isEmpty()) {
return false;
}
throw new Exception(json_encode($user->name()), 1);
$projects = $user->projects();
if ($projects && ($user->role() == 'admin' || $projects->has($project))) {
return false;
}
return false;
});
// $recipients = page($projectUri)->managers()->toUsers()->not($this);
if (!$recipients) return;
$notificationData['isRead'];
foreach ($recipients as $otherUser) {
try {
$notifications = $otherUser->notifications()->isNotEmpty()
? Yaml::decode($otherUser->notifications()->value())
: [];
$notifications[] = $notificationData;
$otherUser->update([
'notifications' => $notifications
]);
} catch (\Throwable $th) {
throw new Exception("Error updating notifications: " . $th->getMessage() . ' line ' . $th->getLine(), 1);
}
}
};