PluginProbe
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration / trunk
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration vtrunk
2.0.15 2.0.12 2.0.10 2.0.4 2.0.1 2.0.0 1.95.3 1.95.2 1.95 1.91.6 trunk 1.11 1.12 1.13 1.20 1.21 1.22 1.23 1.30 1.31 1.32 1.35 1.40 1.41 1.45 All 41 releases
← All changes | app/Services/NotificationService.php +71 -9 2.0.10trunk View file →
@@ -258,8 +258,33 @@
258 258
259 259 return $wathersToSendEmail;
260 260 }
261 261
262 + /**
263 + * Get comment notification recipients as revocable user IDs for async delivery.
264 + *
265 + * @param int $taskId
266 + * @return array
267 + */
268 + public function getCommentRecipientUserIds($taskId)
269 + {
270 + $task = Task::findOrFail(absint($taskId));
271 + $currentUserId = get_current_user_id();
272 + $recipientUserIds = [];
273 +
274 + foreach ($task->watchers as $watcher) {
275 + $watcherId = absint($watcher->ID);
276 + if (
277 + $watcherId !== $currentUserId &&
278 + $this->checkIfEmailEnable($watcherId, Constant::BOARD_EMAIL_COMMENT, $task->board_id)
279 + ) {
280 + $recipientUserIds[] = $watcherId;
281 + }
282 + }
283 +
284 + return array_values(array_unique($recipientUserIds));
285 + }
286 +
262 287 public function checkIfEmailEnable($userId, $emailPurpose, $boardId)
263 288 {
264 289 if(
265 290 $this->checkIfEmailEnabled($boardId, $userId, $emailPurpose)
@@ -287,31 +312,68 @@
287 312
288 313 return false;
289 314 }
290 315
316 + /**
317 + * Return the supplied user IDs that currently belong to a board.
318 + *
319 + * Mention recipients are board-scoped because comment content is private to
320 + * the board, even when a caller supplies a valid WordPress user ID.
321 + *
322 + * @param int $boardId
323 + * @param array $mentionedUserIds
324 + * @return array
325 + */
326 + public function resolveBoardMentionUserIds($boardId, $mentionedUserIds)
327 + {
328 + $boardId = absint($boardId);
329 + $mentionedUserIds = array_values(array_unique(array_filter(array_map('absint', (array) $mentionedUserIds))));
330 +
331 + if (!$boardId || !$mentionedUserIds) {
332 + return [];
333 + }
334 +
335 + $boardMemberIdLookup = [];
336 + $boardRelations = Relation::where('object_type', Constant::OBJECT_TYPE_BOARD_USER)
337 + ->where('object_id', $boardId)
338 + ->whereIn('foreign_id', $mentionedUserIds)
339 + ->get(['foreign_id']);
340 +
341 + foreach ($boardRelations as $boardRelation) {
342 + $boardMemberIdLookup[absint($boardRelation->foreign_id)] = true;
343 + }
344 +
345 + return array_values(array_filter($mentionedUserIds, function ($mentionedUserId) use ($boardMemberIdLookup) {
346 + return isset($boardMemberIdLookup[$mentionedUserId]);
347 + }));
348 + }
349 +
291 350 public function mentionInComment($comment, $mentionedUserIds)
292 351 {
293 - $uniqueIds = array_unique($mentionedUserIds);
352 + $currentUserId = get_current_user_id();
353 + $uniqueIds = array_values(array_unique(array_filter(array_map('absint', (array) $mentionedUserIds))));
354 + $uniqueIds = array_values(array_filter($uniqueIds, function ($mentionedUserId) use ($currentUserId) {
355 + return $mentionedUserId !== $currentUserId;
356 + }));
294 357
295 - $uniqueIds = array_filter($uniqueIds, function($value) {
296 - return (int)$value !== get_current_user_id();
297 - });
358 + if (!$uniqueIds) {
359 + return;
360 + }
298 361
299 - //sending emails to mentioned users
300 - $mentionedUserEmails = User::whereIn('ID', $uniqueIds)->pluck('user_email');
301 - $this->sendMailAfterMention($comment->id, $mentionedUserEmails);
362 + // Queued delivery revalidates membership and preferences before sending.
363 + $this->sendMailAfterMention($comment->id, $uniqueIds);
302 364
303 365 //sending desktop notifications
304 366 do_action('fluent_boards/mention_comment_notification', $comment, $uniqueIds);
305 367 }
306 368
307 - public function sendMailAfterMention($commentId, $usersToSendEmail)
369 + public function sendMailAfterMention($commentId, $recipientUserIds)
308 370 {
309 371 $current_user_id = get_current_user_id();
310 372
311 373 /* this will run in background as soon as possible */
312 374 /* sending Model or Model Instance won't work here */
313 - as_enqueue_async_action('fluent_boards/one_time_schedule_send_email_for_mention', [$commentId, $usersToSendEmail, $current_user_id], 'fluent-boards');
375 + as_enqueue_async_action('fluent_boards/one_time_schedule_send_email_for_mention', [$commentId, $recipientUserIds, $current_user_id], 'fluent-boards');
314 376 }
315 377
316 378 public function getUnreadNotificationsOfTasks($task)
317 379 {