/**
  * 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();
 }