Exemplo n.º 1
0
 /**
  * @NoAdminRequired
  * @NoCSRFRequired
  */
 public function index()
 {
     $key = Helper::post('key');
     $data = Helper::post('data', false);
     $pid = Helper::post('pid');
     $uid = Helper::post('uid');
     if (method_exists($this, $key)) {
         return $this->{$key}($data);
     } else {
         return new DataResponse();
     }
 }
Exemplo n.º 2
0
 /**
  * @PublicPage
  * @NoAdminRequired
  * @NoCSRFRequired
  * @return DataResponse
  */
 public function parseManager()
 {
     $returned = ['to' => null, 'from' => null, 'type' => 'fail', 'error' => null];
     $shareUIds = [];
     $insertResult = false;
     if (!$this->mailDomain) {
         $returned['error'] = 'mailDomain not find!';
         return new DataResponse($returned);
     }
     $params = Helper::post();
     $to = explode('@', $params['to']);
     $idhash = explode('+', $to[0]);
     $userDataFrom = $this->connect->users()->getByEmail(trim($params['from']));
     if (!is_array($userDataFrom)) {
         $returned['error'] = "User with email '{$params['from']}' not find!";
         return new DataResponse($returned);
     }
     $shareUIds[] = $params['author'] = $userDataFrom['userid'];
     // Work with static mail name and groups
     if (count($idhash) == 1) {
         // Groups emails
         if (strpos($to[0], '-group') !== false) {
             $group = trim(explode('-group', $to[0])[0]);
             $usersGroup = false;
             $usersGroupList = $this->connect->users()->getGroupsUsersList();
             foreach ($usersGroupList as $_group => $_users) {
                 if (strtolower($_group) == strtolower($group)) {
                     $usersGroup = $_users;
                     break;
                 }
             }
             if (is_array($usersGroup)) {
                 $users = array_map(function ($item) {
                     return $item['uid'];
                 }, $usersGroup);
                 $shareUIds = array_merge($shareUIds, $users);
                 $subscribers = ['groups' => [$group], 'users' => $users];
                 if (!empty($users)) {
                     $builder = $this->saveTalkBuilder($params, $subscribers, $group . '-group');
                     if ($builder === true) {
                         $returned['type'] = 'ok';
                     } else {
                         $returned['error'] = 'Save task failed!';
                     }
                 } else {
                     $returned['error'] = "Users in group '{$group}' not find.";
                 }
             } else {
                 $returned['error'] = "Group {$group} not find!";
             }
         } else {
             // Static emails
             switch ($idhash[0]) {
                 case 'team':
                     $saved = $this->saveTalkTeam($params);
                     $users = $this->connect->users()->getAll();
                     $shareUIds = array_merge($shareUIds, array_map(function ($item) {
                         return $item['uid'];
                     }, $users));
                     if (!$saved) {
                         $returned['type'] = 'ok';
                     } else {
                         $returned['type'] = 'error_team';
                     }
                     break;
                 case 'support':
                     // for the future realization
                     break;
             }
         }
     } else {
         // Users emails
         $uid = $idhash[0];
         $hash = $idhash[1];
         // checked message by hash key
         if ($message = $this->connect->messages()->getByHash(trim($hash))) {
             // added users for shared file
             if (!empty($message['subscribers'])) {
                 try {
                     $subscribers = json_decode($message['subscribers'], true);
                     if ($subscribers['groups']) {
                         $users = [];
                         $_groupsUsers = $this->connect->users()->getGroupsUsers();
                         foreach ($subscribers['groups'] as $group) {
                             if (!empty($_groupsUsers[$group])) {
                                 $users = array_merge($users, array_map(function ($item) {
                                     return $item['uid'];
                                 }, $_groupsUsers[$group]));
                             }
                         }
                         $shareUIds = array_merge($shareUIds, $users);
                     }
                     if ($subscribers['users']) {
                         $shareUIds = array_merge($shareUIds, $subscribers['users']);
                     }
                 } catch (\Exception $e) {
                 }
             }
             $userSender = $this->connect->users()->getByEmail($params['from']);
             if ($userSender) {
                 $data['rid'] = $message['id'];
                 $data['date'] = date("Y-m-d H:i:s", time());
                 $data['title'] = 'RE: ' . $message['title'];
                 $data['text'] = $params['content'];
                 $data['attachements'] = '';
                 $data['author'] = $userSender['userid'];
                 $data['subscribers'] = $message['subscribers'];
                 $data['hash'] = TalkMail::createHash($data['date']);
                 $data['status'] = TalkMail::SEND_STATUS_REPLY;
                 $insertResult = $this->connect->messages()->insertTask($data);
                 if ($insertResult) {
                     $returned['type'] = 'ok';
                 }
             } else {
                 $returned['error'] = "User sender '{$userSender}' not find.";
             }
         }
     }
     //mail to
     if (!empty($idhash[1]) && !empty($shareUIds) && is_array($shareUIds)) {
         $message = $this->connect->messages()->getByHash($idhash[1]);
         $mailUser = $message['author'];
         if ($message['rid'] > 0) {
             $parentMessage = $this->connect->messages()->getById($message['rid']);
             if ($parentMessage) {
                 array_push($shareUIds, $parentMessage['author']);
             }
         }
         $shareUIds = array_unique($shareUIds);
         foreach ($shareUIds as $uId) {
             if ($userDataFrom['userid'] == $uId) {
                 continue;
             }
             $_userData = $this->connect->users()->getUserData($uId);
             if (!empty($_userData['email'])) {
                 $subject = 'RE: ' . $message['title'];
                 $body = Helper::renderPartial($this->appName, 'emails/answer_from_post', ['userName' => $mailUser, 'messageTitle' => 'Answer, RE: ' . $message['title'], 'messageAuthor' => $userDataFrom['userid'], 'messageBody' => $params['content'], 'mailDomain' => $this->mailDomain]);
                 $error = TalkMail::send(['address' => $mailUser . '@' . $this->mailDomain, 'name' => $mailUser], ['address' => $mailUser . '+' . $idhash[1] . '@' . $this->mailDomain, 'name' => $mailUser], ['address' => $_userData['email'], 'name' => $_userData['displayname']], $subject, $body);
             }
         }
     }
     // Work with files
     if (isset($params['files']) && is_array($params['files']) && !empty($shareUIds) && $insertResult) {
         $saveFiles = $this->parserFileHandler($params['files'], $shareUIds);
         if (!empty($saveFiles)) {
             $returned['shared_with'] = $saveFiles['shared_with'];
             $returned['file_fileid'] = $saveFiles['file_fileid'];
             if (!empty($saveFiles['file_fileid'])) {
                 $this->connect->update('*PREFIX*collab_messages', ['attachements' => json_encode($saveFiles['file_fileid'])], 'id = ?', [$insertResult]);
             }
         } else {
             $returned['shared'] = 'failed';
         }
     }
     return new DataResponse($returned);
 }