/** * * @param array $users array<UserModel> * @param ProjectSettingsModel $project * @param string $subject * @param string $smsTemplate * @param string $emailTemplate * @param string $htmlEmailTemplate * @param DeliveryInterface|null $delivery * @return string */ public static function communicateToUsers($users, $project, $subject, $smsTemplate, $emailTemplate, $htmlEmailTemplate = '', DeliveryInterface $delivery = null) { // store message in database $messageModel = new MessageModel($project); $messageModel->subject = $subject; $messageModel->content = $emailTemplate; $messageId = $messageModel->write(); foreach ($users as $user) { self::communicateToUser($user, $project, $subject, $smsTemplate, $emailTemplate, $htmlEmailTemplate, $delivery); $unreadModel = new UnreadMessageModel($user->id->asString(), $project->id->asString()); $unreadModel->markUnread($messageId); $unreadModel->write(); } SmsQueue::processQueue($project->databaseName()); return $messageId; }
/** * @param string $projectId * @param string $userId * @returns array - the DTO array * @throws ResourceNotAvailableException */ public static function encode($projectId, $userId) { $user = new UserModel($userId); $project = new SfchecksProjectModel($projectId); if ($project->isArchived && $project->users[$userId]->role != ProjectRoles::MANAGER) { throw new ResourceNotAvailableException("This Project is no longer available. If this is incorrect contact your project manager."); } $textList = new TextListModel($project); $textList->read(); $data = array(); $data['rights'] = RightsHelper::encode($user, $project); $data['project'] = array('name' => $project->projectName, 'id' => $projectId); if ($project->isArchived) { $data['project']['name'] .= " [ARCHIVED]"; } $data['texts'] = array(); foreach ($textList->entries as $entry) { $text = new TextModel($project, $entry['id']); if (!$text->isArchived) { $questionList = $text->listQuestionsWithAnswers(); // Just want count of questions and responses, not whole list $entry['questionCount'] = 0; $responseCount = 0; // "Responses" = answers + comments foreach ($questionList->entries as $q) { $question = new QuestionModel($project, $q['id']); if (!$question->isArchived) { $entry['questionCount']++; foreach ($q['answers'] as $a) { $commentCount = count($a['comments']); $responseCount += $commentCount + 1; // +1 for this answer } } } $entry['responseCount'] = $responseCount; $entry['dateCreated'] = $text->dateCreated->asDateTimeInterface()->format(\DateTime::RFC2822); $data['texts'][] = $entry; } } // sort Texts with newest at the top usort($data['texts'], function ($a, $b) { $sortOn = 'dateCreated'; if (array_key_exists($sortOn, $a) && array_key_exists($sortOn, $b)) { return strtotime($a[$sortOn]) < strtotime($b[$sortOn]) ? 1 : -1; } else { return 0; } }); // future support for members $data['members'] = array(); // unread activity count $unreadActivity = new UnreadActivityModel($userId, $projectId); $unreadItems = $unreadActivity->unreadItems(); $data['activityUnreadCount'] = count($unreadItems); // unread broadcast messages $unreadMessages = new UnreadMessageModel($userId, $projectId); $messageIds = $unreadMessages->unreadItems(); $messages = array(); foreach ($messageIds as $messageId) { $message = new MessageModel($project, $messageId); $messages[] = array('id' => $message->id->asString(), 'subject' => $message->subject, 'content' => $message->content); } $data['broadcastMessages'] = $messages; return $data; }
public static function markMessageRead($projectId, $messageId, $userId) { $unreadModel = new UnreadMessageModel($userId, $projectId); $unreadModel->markRead($messageId); return $unreadModel->write(); }
public function testCommunicateToUsers_SendEmail_BroadcastMessageStoredAndUnread() { self::$environ->clean(); $userId = self::$environ->createUser('User', 'Name', '*****@*****.**'); $user = new UserModel($userId); $user->communicate_via = UserModel::COMMUNICATE_VIA_EMAIL; $project = self::$environ->createProjectSettings(SF_TESTPROJECTCODE); $project->emailSettings->fromAddress = '*****@*****.**'; $project->emailSettings->fromName = 'Scripture Forge ProjectName'; $subject = 'TestSubject'; $smsTemplate = ''; $emailTemplate = 'TestMessage'; $delivery = new MockCommunicateDelivery(); Communicate::communicateToUsers(array($user), $project, $subject, $smsTemplate, $emailTemplate, '', $delivery); $unread = new UnreadMessageModel($userId, $project->id->asString()); $messageIds = $unread->unreadItems(); $this->assertCount(1, $messageIds); $messageId = $messageIds[0]; $message = new MessageModel($project, $messageId); $this->assertEquals($subject, $message->subject); $this->assertEquals($emailTemplate, $message->content); }