/**
  *
  * @param ProjectModel $projectModel
  * @param string $questionId
  * @param string $answerId
  * @param CommentModel $commentModel
  * @return string activity id
  */
 public static function updateComment($projectModel, $questionId, $answerId, $commentModel, $mode = "update")
 {
     $activity = new ActivityModel($projectModel);
     $question = new QuestionModel($projectModel, $questionId);
     $answer = $question->readAnswer($answerId);
     $text = new TextModel($projectModel, $question->textRef->asString());
     $user = new UserModel($commentModel->userRef->asString());
     $user2 = new UserModel($answer->userRef->asString());
     $activity->action = $mode == 'update' ? ActivityModel::UPDATE_COMMENT : ActivityModel::ADD_COMMENT;
     $activity->userRef->id = $commentModel->userRef->asString();
     $activity->userRef2->id = $answer->userRef->asString();
     $activity->textRef->id = $text->id->asString();
     $activity->questionRef->id = $questionId;
     $activity->addContent(ActivityModel::TEXT, $text->title);
     $activity->addContent(ActivityModel::ANSWER, $answer->content);
     $activity->addContent(ActivityModel::QUESTION, $question->getTitleForDisplay());
     $activity->addContent(ActivityModel::COMMENT, $commentModel->content);
     $activity->addContent(ActivityModel::USER, $user->username);
     $activity->addContent(ActivityModel::USER2, $user2->username);
     $activityId = $activity->write();
     UnreadActivityModel::markUnreadForProjectMembers($activityId, $projectModel);
     UnreadCommentModel::markUnreadForProjectMembers($commentModel->id->asString(), $projectModel, $questionId, $commentModel->userRef->asString());
     return $activityId;
 }
 public function testUpdateAnswerTags_ExistingAnswer_ChangePersists()
 {
     $e = new MongoTestEnvironment();
     $e->clean();
     $project = $e->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $text = new TextModel($project);
     $text->title = "Text 1";
     $usx = MongoTestEnvironment::usxSample();
     $text->content = $usx;
     $textId = $text->write();
     $question = new QuestionModel($project);
     $question->textRef->id = $textId;
     $questionId = $question->write();
     $answer = new AnswerModel();
     $answer->content = "the answer";
     $answer->tags[] = 'originalTag';
     $answerId = $question->writeAnswer($answer);
     $tagsArray = array('updatedTag');
     $dto = QuestionCommands::updateAnswerTags($project->id->asString(), $questionId, $answerId, $tagsArray);
     $question->read($questionId);
     $newAnswer = $question->readAnswer($answerId);
     $this->assertEqual(count($newAnswer->tags), 1);
     $this->assertEqual($newAnswer->tags[0], 'updatedTag');
     $this->assertEqual($dto[$answerId]['tags'][0], 'updatedTag');
 }
 public static function voteDown($userId, $projectId, $questionId, $answerId)
 {
     $projectModel = new ProjectModel($projectId);
     $questionModel = new QuestionModel($projectModel, $questionId);
     // Check the vote lock.
     $vote = new UserVoteModel($userId, $projectId, $questionId);
     if (!$vote->hasVote($answerId)) {
         // Don't throw.  There's no harm in this, just don't decrement the vote.
         return self::encodeAnswer($questionModel->readAnswer($answerId));
     }
     // If ok down vote the question and remove the lock.
     $answerModel = $questionModel->readAnswer($answerId);
     $answerModel->score--;
     $questionModel->writeAnswer($answerModel);
     $vote->removeVote($answerId);
     $vote->write();
     // Return the answer dto.
     return self::encodeAnswer($answerModel);
 }