limit = $limit; return $this; } public function setUserPHID($user_phid) { $this->userPHID = $user_phid; return $this; } public function execute() { if (!$this->userPHID) { throw new Exception("Call setUser() before executing the query"); } //TODO throw an exception if no user $story_table = new PhabricatorFeedStoryData(); $notification_table = new PhabricatorFeedStoryNotification(); $conn = $story_table->establishConnection('r'); $data = queryfx_all( $conn, "SELECT story.*, notif.hasViewed FROM %T notif JOIN %T story ON notif.chronologicalKey = story.chronologicalKey WHERE notif.userPHID = %s ORDER BY notif.chronologicalKey desc LIMIT %d", $notification_table->getTableName(), $story_table->getTableName(), $this->userPHID, $this->limit); $viewed_map = ipull($data, 'hasViewed', 'chronologicalKey'); $data = $story_table->loadAllFromArray($data); $stories = array(); foreach ($data as $story_data) { $class = $story_data->getStoryType(); try { if (!class_exists($class) || !is_subclass_of($class, 'PhabricatorFeedStory')) { $class = 'PhabricatorFeedStoryUnknown'; } } catch (PhutilMissingSymbolException $ex) { $class = 'PhabricatorFeedStoryUnknown'; } $story = newv($class, array($story_data)); $story->setHasViewed($viewed_map[$story->getChronologicalKey()]); $stories[] = $story; } return $stories; } }