From f73d0d2ac9daee5eaa03a7b89c639678fec46467 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Thu, 1 Dec 2016 22:52:58 -0500 Subject: Make user mentions great again --- app/Job/CommentEventJob.php | 4 +-- app/Job/TaskEventJob.php | 3 +- app/Job/UserMentionJob.php | 71 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 app/Job/UserMentionJob.php (limited to 'app/Job') diff --git a/app/Job/CommentEventJob.php b/app/Job/CommentEventJob.php index 47cf8020..62fae40a 100644 --- a/app/Job/CommentEventJob.php +++ b/app/Job/CommentEventJob.php @@ -31,7 +31,6 @@ class CommentEventJob extends BaseJob * * @param int $commentId * @param string $eventName - * @return $this */ public function execute($commentId, $eventName) { @@ -43,7 +42,8 @@ class CommentEventJob extends BaseJob $this->dispatcher->dispatch($eventName, $event); if ($eventName === CommentModel::EVENT_CREATE) { - $this->userMentionModel->fireEvents($event['comment']['comment'], CommentModel::EVENT_USER_MENTION, $event); + $userMentionJob = $this->userMentionJob->withParams($event['comment']['comment'], CommentModel::EVENT_USER_MENTION, $event); + $this->queueManager->push($userMentionJob); } } } diff --git a/app/Job/TaskEventJob.php b/app/Job/TaskEventJob.php index 7d026a68..acc7fca3 100644 --- a/app/Job/TaskEventJob.php +++ b/app/Job/TaskEventJob.php @@ -69,7 +69,8 @@ class TaskEventJob extends BaseJob $this->dispatcher->dispatch($eventName, $event); if ($eventName === TaskModel::EVENT_CREATE) { - $this->userMentionModel->fireEvents($event['task']['description'], TaskModel::EVENT_USER_MENTION, $event); + $userMentionJob = $this->userMentionJob->withParams($event['task']['description'], TaskModel::EVENT_USER_MENTION, $event); + $this->queueManager->push($userMentionJob); } } } diff --git a/app/Job/UserMentionJob.php b/app/Job/UserMentionJob.php new file mode 100644 index 00000000..ebb69094 --- /dev/null +++ b/app/Job/UserMentionJob.php @@ -0,0 +1,71 @@ +jobParams = array($text, $eventName, $event); + return $this; + } + + /** + * Execute job + * + * @param string $text + * @param string $eventName + * @param GenericEvent $event + */ + public function execute($text, $eventName, GenericEvent $event) + { + $users = $this->getMentionedUsers($text); + + foreach ($users as $user) { + if ($this->projectPermissionModel->isMember($event->getProjectId(), $user['id'])) { + $event['mention'] = $user; + $this->dispatcher->dispatch($eventName, $event); + } + } + } + + /** + * Get list of mentioned users + * + * @access public + * @param string $text + * @return array + */ + public function getMentionedUsers($text) + { + $users = array(); + + if (preg_match_all('/@([^\s,!.:?]+)/', $text, $matches)) { + $users = $this->db->table(UserModel::TABLE) + ->columns('id', 'username', 'name', 'email', 'language') + ->eq('notifications_enabled', 1) + ->neq('id', $this->userSession->getId()) + ->in('username', array_unique($matches[1])) + ->findAll(); + } + + return $users; + } +} -- cgit v1.2.3