/** * Given a user get the count of conversations that have unread comments. * @param object $user User */ public static function getUnreadCountByUser(User $user) { $searchAttributeData = array(); $searchAttributeData['clauses'] = array(1 => array('attributeName' => 'ownerHasReadLatest', 'operatorType' => 'doesNotEqual', 'value' => (bool) 1), 2 => array('attributeName' => 'owner', 'operatorType' => 'equals', 'value' => $user->id), 3 => array('attributeName' => 'conversationParticipants', 'relatedAttributeName' => 'person', 'operatorType' => 'equals', 'value' => $user->getClassId('Item')), 4 => array('attributeName' => 'conversationParticipants', 'relatedAttributeName' => 'hasReadLatest', 'operatorType' => 'doesNotEqual', 'value' => (bool) 1)); $searchAttributeData['structure'] = '((1 and 2) or (3 and 4))'; $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Conversation'); $where = RedBeanModelDataProvider::makeWhere('Conversation', $searchAttributeData, $joinTablesAdapter); return self::getCount($joinTablesAdapter, $where, null, true); }
/** * Given a Conversation and User, determine if the user is already a conversationParticipant. * @param Conversation $model * @param User $user * @return boolean */ public static function isUserAParticipant(Conversation $model, User $user) { if ($model->conversationParticipants->count() > 0) { foreach ($model->conversationParticipants as $participant) { if ($participant->person->getClassId('Item') == $user->getClassId('Item')) { return true; } } } return false; }
/** * @param User $user * @param array $mungeIds */ public static function cacheMungeIdsByUser(User $user, array $mungeIds) { if ($user->getClassId('Permitable') == 0) { return; } $userModelIdentifier = $user->getModelIdentifier(); if (static::supportsAndAllowsPhpCaching()) { static::$mungeIdsByUser[$user->id] = $mungeIds; } if (static::supportsAndAllowsMemcache()) { $prefix = static::getCachePrefix($userModelIdentifier) . static::$mungeIdsCachePrefix; static::cacheValueAndChecksum($prefix . $userModelIdentifier, $mungeIds); } }
/** * Gets notification subscribers * @param Task $task * @param $action * @param User $relatedUser * @return array */ public static function resolvePeopleToSendNotification(Task $task, $action, User $relatedUser = null) { assert('is_string($action)'); $peopleToSendNotification = array(); if ($action == self::TASK_NEW || $action == self::TASK_OWNER_CHANGE || $action == self::TASK_STATUS_BECOMES_REJECTED) { $peopleToSendNotification[] = $task->owner; } elseif ($action == self::TASK_STATUS_BECOMES_AWAITING_ACCEPTANCE) { $peopleToSendNotification[] = $task->requestedByUser; } elseif ($action == self::TASK_STATUS_BECOMES_COMPLETED || $action == self::TASK_NEW_COMMENT) { $peopleToSendNotification = TasksUtil::getTaskSubscribers($task); if ($action == self::TASK_NEW_COMMENT && $relatedUser != null) { foreach ($peopleToSendNotification as $key => $person) { if ($person->getClassId('Item') == $relatedUser->getClassId('Item')) { unset($peopleToSendNotification[$key]); } } } if ($action == self::TASK_STATUS_BECOMES_COMPLETED && Yii::app()->user->userModel->id == $task->owner->id) { foreach ($peopleToSendNotification as $key => $person) { if ($person->getClassId('Item') == $task->owner->getClassId('Item')) { unset($peopleToSendNotification[$key]); } } } } return $peopleToSendNotification; }
/** * Performance function to grab all summation data by type for a given user. * @param User $user * @return array of summation points indexed by the level type */ public static function getSummationPointsDataByUserIndexedByLevelType(User $user) { assert('$user->id > 0'); $sql = "select type, sum(value) sum from gamepoint where person_item_id = " . $user->getClassId('Item') . " group by type"; $rows = R::getAll($sql); $indexedData = array(); foreach ($rows as $row) { $indexedData[$row['type']] = $row['sum']; } return $indexedData; }
/** * @param Conversation $conversation * @param User $user * @return A|bool */ public static function hasUserReadConversationLatest(Conversation $conversation, User $user) { assert('$conversation->id > 0'); assert('$user->id > 0'); if ($user->isSame($conversation->owner)) { return $conversation->ownerHasReadLatest; } else { foreach ($conversation->conversationParticipants as $position => $participant) { if ($participant->person->getClassId('Item') == $user->getClassId('Item')) { return $participant->hasReadLatest; } } } return false; }
/** * Given a Mission and the User that created the new comment * return the people on the mission to send new notification to * @param Mission $mission * @param User $user * @return Array $peopleToSendNotification */ public static function resolvePeopleToSendNotificationToOnNewComment(Mission $mission, User $user) { $usersToSendNotification = User::getAll(); $peopleToSendNotification = array(); foreach ($usersToSendNotification as $userToSendNotification) { if ($userToSendNotification->getClassId('Item') != $user->getClassId('Item')) { if ($mission->takenByUser->id > 0) { if ($userToSendNotification->getClassId('Item') == $mission->owner->getClassId('Item') || $userToSendNotification->getClassId('Item') == $mission->takenByUser->getClassId('Item')) { $peopleToSendNotification[] = $userToSendNotification; } } else { $peopleToSendNotification[] = $userToSendNotification; } } } return $peopleToSendNotification; }
/** * @param $model * @param User $user */ public function markUserAsHavingReadLatestModel($model, User $user) { $haveNotReadRelationName = $this->getHaveNotReadRelationName(); foreach ($model->{$haveNotReadRelationName} as $existingPersonWhoHaveNotReadLatest) { if ($existingPersonWhoHaveNotReadLatest->person->getClassId('Item') == $user->getClassId('Item')) { $this->removePersonWhoHasNotReadLatestToModel($model, $existingPersonWhoHaveNotReadLatest); } } $model->save(); }
/** * @param User $user * @param array $mungeIds */ public static function cacheMungeIdsByUser(User $user, array $mungeIds) { if ($user->getClassId('Permitable') == 0) { return; } $userModelIdentifier = $user->getModelIdentifier(); if (static::supportsAndAllowsPhpCaching()) { static::$mungeIdsByUser[$user->id] = $mungeIds; } if (static::supportsAndAllowsMemcache()) { $prefix = static::getCachePrefix($userModelIdentifier) . static::$mungeIdsCachePrefix; Yii::app()->cache->set($prefix . $userModelIdentifier, serialize($mungeIds)); } }
/** * Given a task and a user, mark that the user has read or not read the latest changes as a task * owner, requested by user or subscriber * @param Task $task * @param User $user * @param Boolean $hasReadLatest */ public static function markUserHasReadLatest(Task $task, User $user, $hasReadLatest = true) { assert('$task->id > 0'); assert('$user->id > 0'); assert('is_bool($hasReadLatest)'); $save = false; foreach ($task->notificationSubscribers as $position => $subscriber) { if ($subscriber->person->getClassId('Item') == $user->getClassId('Item') && $subscriber->hasReadLatest != $hasReadLatest) { $task->notificationSubscribers[$position]->hasReadLatest = $hasReadLatest; $save = true; } } if ($save) { $task->save(); } }