mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 17:02:41 +01:00
Move slowvote loading logic into Query class
Summary: Mostly straightforward. Also fixed a couple of error/darkconsole things. Test Plan: - Created poll; - viewed poll; - voted in poll; - used `V6` and `{V6}` markup styles in poll. Reviewers: btrahan Reviewed By: btrahan CC: aran Differential Revision: https://secure.phabricator.com/D6458
This commit is contained in:
parent
d2f8c5b5e7
commit
a65e3812cb
7 changed files with 158 additions and 23 deletions
|
@ -121,6 +121,10 @@ class AphrontDefaultApplicationConfiguration
|
||||||
|
|
||||||
// For non-workflow requests, return a Ajax response.
|
// For non-workflow requests, return a Ajax response.
|
||||||
if ($request->isAjax() && !$request->isJavelinWorkflow()) {
|
if ($request->isAjax() && !$request->isJavelinWorkflow()) {
|
||||||
|
// Log these; they don't get shown on the client and can be difficult
|
||||||
|
// to debug.
|
||||||
|
phlog($ex);
|
||||||
|
|
||||||
$response = new AphrontAjaxResponse();
|
$response = new AphrontAjaxResponse();
|
||||||
$response->setError(
|
$response->setError(
|
||||||
array(
|
array(
|
||||||
|
|
|
@ -58,7 +58,7 @@ final class DarkConsoleCore {
|
||||||
'name' => $plugin->getName(),
|
'name' => $plugin->getName(),
|
||||||
'color' => $plugin->getColor(),
|
'color' => $plugin->getColor(),
|
||||||
);
|
);
|
||||||
$data[$class] = $plugin->getData();
|
$data[$class] = $this->sanitizeForJSON($plugin->getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
$storage = array(
|
$storage = array(
|
||||||
|
@ -107,5 +107,21 @@ final class DarkConsoleCore {
|
||||||
'');
|
'');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sometimes, tab data includes binary information (like INSERT queries which
|
||||||
|
* write file data into the database). To successfully JSON encode it, we
|
||||||
|
* need to convert it to UTF-8.
|
||||||
|
*/
|
||||||
|
private function sanitizeForJSON($data) {
|
||||||
|
if (is_array($data)) {
|
||||||
|
foreach ($data as $key => $value) {
|
||||||
|
$data[$key] = $this->sanitizeForJSON($value);
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
} else {
|
||||||
|
return phutil_utf8ize($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,17 +21,15 @@ final class PhabricatorSlowvotePollController
|
||||||
$poll = id(new PhabricatorSlowvoteQuery())
|
$poll = id(new PhabricatorSlowvoteQuery())
|
||||||
->setViewer($user)
|
->setViewer($user)
|
||||||
->withIDs(array($this->id))
|
->withIDs(array($this->id))
|
||||||
|
->needOptions(true)
|
||||||
|
->needChoices(true)
|
||||||
->executeOne();
|
->executeOne();
|
||||||
if (!$poll) {
|
if (!$poll) {
|
||||||
return new Aphront404Response();
|
return new Aphront404Response();
|
||||||
}
|
}
|
||||||
|
|
||||||
$options = id(new PhabricatorSlowvoteOption())->loadAllWhere(
|
$options = $poll->getOptions();
|
||||||
'pollID = %d',
|
$choices = $poll->getChoices();
|
||||||
$poll->getID());
|
|
||||||
$choices = id(new PhabricatorSlowvoteChoice())->loadAllWhere(
|
|
||||||
'pollID = %d',
|
|
||||||
$poll->getID());
|
|
||||||
|
|
||||||
$choices_by_option = mgroup($choices, 'getOptionID');
|
$choices_by_option = mgroup($choices, 'getOptionID');
|
||||||
$choices_by_user = mgroup($choices, 'getAuthorPHID');
|
$choices_by_user = mgroup($choices, 'getAuthorPHID');
|
||||||
|
|
|
@ -19,18 +19,15 @@ final class PhabricatorSlowvoteVoteController
|
||||||
$poll = id(new PhabricatorSlowvoteQuery())
|
$poll = id(new PhabricatorSlowvoteQuery())
|
||||||
->setViewer($user)
|
->setViewer($user)
|
||||||
->withIDs(array($this->id))
|
->withIDs(array($this->id))
|
||||||
|
->needOptions(true)
|
||||||
|
->needViewerChoices(true)
|
||||||
->executeOne();
|
->executeOne();
|
||||||
if (!$poll) {
|
if (!$poll) {
|
||||||
return new Aphront404Response();
|
return new Aphront404Response();
|
||||||
}
|
}
|
||||||
|
|
||||||
$options = id(new PhabricatorSlowvoteOption())->loadAllWhere(
|
$options = $poll->getOptions();
|
||||||
'pollID = %d',
|
$user_choices = $poll->getViewerChoices($user);
|
||||||
$poll->getID());
|
|
||||||
$user_choices = id(new PhabricatorSlowvoteChoice())->loadAllWhere(
|
|
||||||
'pollID = %d AND authorPHID = %s',
|
|
||||||
$poll->getID(),
|
|
||||||
$user->getPHID());
|
|
||||||
|
|
||||||
$old_votes = mpull($user_choices, null, 'getOptionID');
|
$old_votes = mpull($user_choices, null, 'getOptionID');
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,10 @@ final class PhabricatorSlowvoteQuery
|
||||||
private $authorPHIDs;
|
private $authorPHIDs;
|
||||||
private $withVotesByViewer;
|
private $withVotesByViewer;
|
||||||
|
|
||||||
|
private $needOptions;
|
||||||
|
private $needChoices;
|
||||||
|
private $needViewerChoices;
|
||||||
|
|
||||||
public function withIDs($ids) {
|
public function withIDs($ids) {
|
||||||
$this->ids = $ids;
|
$this->ids = $ids;
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -31,6 +35,21 @@ final class PhabricatorSlowvoteQuery
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function needOptions($need_options) {
|
||||||
|
$this->needOptions = $need_options;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function needChoices($need_choices) {
|
||||||
|
$this->needChoices = $need_choices;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function needViewerChoices($need_viewer_choices) {
|
||||||
|
$this->needViewerChoices = $need_viewer_choices;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function loadPage() {
|
public function loadPage() {
|
||||||
$table = new PhabricatorSlowvotePoll();
|
$table = new PhabricatorSlowvotePoll();
|
||||||
$conn_r = $table->establishConnection('r');
|
$conn_r = $table->establishConnection('r');
|
||||||
|
@ -47,6 +66,66 @@ final class PhabricatorSlowvoteQuery
|
||||||
return $table->loadAllFromArray($data);
|
return $table->loadAllFromArray($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function willFilterPage(array $polls) {
|
||||||
|
assert_instances_of($polls, 'PhabricatorSlowvotePoll');
|
||||||
|
|
||||||
|
if (!$polls) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$ids = mpull($polls, 'getID');
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
|
||||||
|
if ($this->needOptions) {
|
||||||
|
$options = id(new PhabricatorSlowvoteOption())->loadAllWhere(
|
||||||
|
'pollID IN (%Ld)',
|
||||||
|
$ids);
|
||||||
|
|
||||||
|
$options = mgroup($options, 'getPollID');
|
||||||
|
foreach ($polls as $poll) {
|
||||||
|
$poll->attachOptions(idx($options, $poll->getID(), array()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->needChoices) {
|
||||||
|
$choices = id(new PhabricatorSlowvoteChoice())->loadAllWhere(
|
||||||
|
'pollID IN (%Ld)',
|
||||||
|
$ids);
|
||||||
|
|
||||||
|
$choices = mgroup($choices, 'getPollID');
|
||||||
|
foreach ($polls as $poll) {
|
||||||
|
$poll->attachChoices(idx($choices, $poll->getID(), array()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we need the viewer's choices, we can just fill them from the data
|
||||||
|
// we already loaded.
|
||||||
|
if ($this->needViewerChoices) {
|
||||||
|
foreach ($polls as $poll) {
|
||||||
|
$poll->attachViewerChoices(
|
||||||
|
$viewer,
|
||||||
|
idx(
|
||||||
|
mgroup($poll->getChoices(), 'getAuthorPHID'),
|
||||||
|
$viewer->getPHID(),
|
||||||
|
array()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ($this->needViewerChoices) {
|
||||||
|
$choices = id(new PhabricatorSlowvoteChoice())->loadAllWhere(
|
||||||
|
'pollID IN (%Ld) AND authorPHID = %s',
|
||||||
|
$ids,
|
||||||
|
$viewer->getPHID());
|
||||||
|
|
||||||
|
$choices = mgroup($choices, 'getPollID');
|
||||||
|
foreach ($polls as $poll) {
|
||||||
|
$poll->attachViewerChoices(
|
||||||
|
$viewer,
|
||||||
|
idx($choices, $poll->getID(), array()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $polls;
|
||||||
|
}
|
||||||
|
|
||||||
private function buildWhereClause(AphrontDatabaseConnection $conn_r) {
|
private function buildWhereClause(AphrontDatabaseConnection $conn_r) {
|
||||||
$where = array();
|
$where = array();
|
||||||
|
|
||||||
|
|
|
@ -16,21 +16,18 @@ final class SlowvoteRemarkupRule
|
||||||
return id(new PhabricatorSlowvoteQuery())
|
return id(new PhabricatorSlowvoteQuery())
|
||||||
->setViewer($viewer)
|
->setViewer($viewer)
|
||||||
->withIDs($ids)
|
->withIDs($ids)
|
||||||
|
->needOptions(true)
|
||||||
|
->needChoices(true)
|
||||||
|
->needViewerChoices(true)
|
||||||
->execute();
|
->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function renderObjectEmbed($object, $handle, $options) {
|
protected function renderObjectEmbed($object, $handle, $options) {
|
||||||
$viewer = $this->getEngine()->getConfig('viewer');
|
$viewer = $this->getEngine()->getConfig('viewer');
|
||||||
|
|
||||||
$options = id(new PhabricatorSlowvoteOption())->loadAllWhere(
|
$options = $object->getOptions();
|
||||||
'pollID = %d',
|
$choices = $object->getChoices();
|
||||||
$object->getID());
|
$viewer_choices = $object->getViewerChoices($viewer);
|
||||||
$choices = id(new PhabricatorSlowvoteChoice())->loadAllWhere(
|
|
||||||
'pollID = %d',
|
|
||||||
$object->getID());
|
|
||||||
$choices_by_user = mgroup($choices, 'getAuthorPHID');
|
|
||||||
|
|
||||||
$viewer_choices = idx($choices_by_user, $viewer->getPHID(), array());
|
|
||||||
|
|
||||||
$embed = id(new SlowvoteEmbedView())
|
$embed = id(new SlowvoteEmbedView())
|
||||||
->setPoll($object)
|
->setPoll($object)
|
||||||
|
|
|
@ -23,6 +23,10 @@ final class PhabricatorSlowvotePoll extends PhabricatorSlowvoteDAO
|
||||||
protected $method;
|
protected $method;
|
||||||
protected $viewPolicy;
|
protected $viewPolicy;
|
||||||
|
|
||||||
|
private $options;
|
||||||
|
private $choices;
|
||||||
|
private $viewerChoices = array();
|
||||||
|
|
||||||
public function getConfiguration() {
|
public function getConfiguration() {
|
||||||
return array(
|
return array(
|
||||||
self::CONFIG_AUX_PHID => true,
|
self::CONFIG_AUX_PHID => true,
|
||||||
|
@ -34,6 +38,46 @@ final class PhabricatorSlowvotePoll extends PhabricatorSlowvoteDAO
|
||||||
PhabricatorPHIDConstants::PHID_TYPE_POLL);
|
PhabricatorPHIDConstants::PHID_TYPE_POLL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getOptions() {
|
||||||
|
if ($this->options === null) {
|
||||||
|
throw new Exception("Call attachOptions() before getOptions()!");
|
||||||
|
}
|
||||||
|
return $this->options;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function attachOptions(array $options) {
|
||||||
|
assert_instances_of($options, 'PhabricatorSlowvoteOption');
|
||||||
|
$this->options = $options;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getChoices() {
|
||||||
|
if ($this->choices === null) {
|
||||||
|
throw new Exception("Call attachChoices() before getChoices()!");
|
||||||
|
}
|
||||||
|
return $this->choices;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function attachChoices(array $choices) {
|
||||||
|
assert_instances_of($choices, 'PhabricatorSlowvoteChoice');
|
||||||
|
$this->choices = $choices;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getViewerChoices(PhabricatorUser $viewer) {
|
||||||
|
if (idx($this->viewerChoices, $viewer->getPHID()) === null) {
|
||||||
|
throw new Exception(
|
||||||
|
"Call attachViewerChoices() before getViewerChoices()!");
|
||||||
|
}
|
||||||
|
return idx($this->viewerChoices, $viewer->getPHID());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function attachViewerChoices(PhabricatorUser $viewer, array $choices) {
|
||||||
|
assert_instances_of($choices, 'PhabricatorSlowvoteOption');
|
||||||
|
$this->viewerChoices[$viewer->getPHID()] = $choices;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue