/** * Returns the ancestors of a message (the message itself is also returned). * * @param Message $message * * @return array[Message] */ public function findAncestors(Message $message, User $user) { $dql = "\n SELECT m\n FROM Claroline\\MessageBundle\\Entity\\Message m\n JOIN m.userMessages um\n JOIN um.user u\n WHERE m.lft BETWEEN m.lft AND m.rgt\n AND m.root = {$message->getRoot()}\n AND m.lvl <= {$message->getLvl()}\n AND (\n u.id = :userid\n OR m.user = :userid\n )\n "; $query = $this->_em->createQuery($dql); $query->setParameter('userid', $user->getId()); return $query->getResult(); }
/** * @param \Claroline\MessageBundle\Entity\Message $message * @param bool setAsSent * * @return \Claroline\MessageBundle\Entity\Message */ public function send(Message $message, $setAsSent = true, $sendMail = true) { if (substr($receiversString = $message->getTo(), -1, 1) === ';') { $receiversString = substr_replace($receiversString, '', -1); } $receiversNames = explode(';', $receiversString); $usernames = array(); $groupNames = array(); $workspaceCodes = array(); $userReceivers = array(); $groupReceivers = array(); $workspaceReceivers = array(); //split the string of target into different array. foreach ($receiversNames as $receiverName) { if (substr($receiverName, 0, 1) === '{') { $groupNames[] = trim($receiverName, '{}'); } else { if (substr($receiverName, 0, 1) === '[') { $workspaceCodes[] = trim($receiverName, '[]'); } else { $usernames[] = $receiverName; } } } //get the different entities from the freshly created array. if (count($usernames) > 0) { $userReceivers = $this->userRepo->findByUsernames($usernames); } if (count($groupNames) > 0) { $groupReceivers = $this->groupRepo->findGroupsByNames($groupNames); } if (count($workspaceCodes) > 0) { $workspaceReceivers = $this->workspaceRepo->findWorkspacesByCode($workspaceCodes); } if (null !== $message->getParent()) { $message->setParent($message->getParent()); } $this->om->persist($message); if ($setAsSent && $message->getSender()) { $userMessage = $this->om->factory('Claroline\\MessageBundle\\Entity\\UserMessage'); $userMessage->setIsSent(true); $userMessage->setUser($message->getSender()); $userMessage->setMessage($message); $this->om->persist($userMessage); } $mailNotifiedUsers = array(); //get every users which are going to be notified foreach ($groupReceivers as $groupReceiver) { $users = $this->userRepo->findByGroup($groupReceiver); foreach ($users as $user) { $userReceivers[] = $user; } } //workspaces are going to be notified foreach ($workspaceReceivers as $workspaceReceiver) { $users = $this->userRepo->findByWorkspaceWithUsersFromGroup($workspaceReceiver); foreach ($users as $user) { $userReceivers[] = $user; } } $ids = []; $filteredUsers = array_filter($userReceivers, function ($user) use(&$ids) { if (!in_array($user->getId(), $ids)) { $ids[] = $user->getId(); return true; } }); foreach ($filteredUsers as $filteredUser) { $userMessage = $this->om->factory('Claroline\\MessageBundle\\Entity\\UserMessage'); $userMessage->setUser($filteredUser); $userMessage->setMessage($message); $this->om->persist($userMessage); if ($filteredUser->isMailNotified()) { $mailNotifiedUsers[] = $filteredUser; } } if ($sendMail) { $this->mailManager->send($message->getObject(), $message->getContent(), $mailNotifiedUsers, $message->getSender()); } $this->om->flush(); return $message; }
/** * Returns the ancestors of a message (the message itself is also returned). * * @param Message $message * * @return array[Message] */ public function findAncestors(Message $message) { $dql = "\n SELECT m\n FROM Claroline\\MessageBundle\\Entity\\Message m\n WHERE m.lft BETWEEN m.lft AND m.rgt\n AND m.root = {$message->getRoot()}\n AND m.lvl <= {$message->getLvl()}\n "; $query = $this->_em->createQuery($dql); return $query->getResult(); }
protected static function createMessage($alias, User $sender, array $receivers, $object, $content, Message $parent = null, $removed = false) { $message = new Message(); $message->setSender($sender); $message->setObject($object); $message->setContent($content); $message->setDate(self::$time); $message->setTo('x1;x2;x3'); if ($parent) { $message->setParent($parent); } self::$om->startFlushSuite(); self::create($alias, $message); $userMessage = new UserMessage(); $userMessage->setIsSent(true); $userMessage->setUser($sender); $userMessage->setMessage($message); if ($removed) { $userMessage->markAsRemoved($removed); } self::create($alias . '/' . $sender->getUsername(), $userMessage); foreach ($receivers as $receiver) { $userMessage = new UserMessage(); $userMessage->setUser($receiver); $userMessage->setMessage($message); self::create($alias . '/' . $receiver->getUsername(), $userMessage); } self::$om->endFlushSuite(); }
public function checkAccess(Message $message, User $user) { if ($message->getSenderUsername() === $user->getUsername()) { return true; } $userMessage = $this->messageManager->getOneUserMessageByUserAndMessage($user, $message); if (!is_null($userMessage)) { return true; } $receiverString = $message->getTo(); $names = explode(';', $receiverString); $usernames = []; $groupNames = []; $workspaceCodes = []; foreach ($names as $name) { if (substr($name, 0, 1) === '{') { $groupNames[] = trim($name, '{}'); } elseif (substr($name, 0, 1) === '[') { $workspaceCodes[] = trim($name, '[]'); } else { $usernames[] = trim($name); } } if (in_array($user->getUsername(), $usernames)) { return true; } foreach ($user->getGroups() as $group) { if (in_array($group->getName(), $groupNames)) { return true; } } foreach ($this->workspaceManager->getWorkspacesByUser($user) as $workspace) { if (in_array($workspace->getCode(), $workspaceCodes)) { return true; } } throw new AccessDeniedException(); }