From 215553c2616d36f8af4c804427fee45da4ed3602 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 27 May 2013 13:41:20 -0700 Subject: [PATCH] Introduce PhabricatorSavedQueryQuery Summary: Same as D6051, but for SavedQueries instead of NamedQueries. These are POLICY_PUBLIC because you need to know the hash to access them, and because we want to let users copy/paste query URLs. Ref T2625. Test Plan: Saved a query, reused a saved query. Reviewers: btrahan, blc Reviewed By: btrahan CC: aran Maniphest Tasks: T2625 Differential Revision: https://secure.phabricator.com/D6054 --- src/__phutil_library_map__.php | 8 ++- .../PhabricatorPasteListController.php | 7 +- .../PhabricatorSearchNameController.php | 13 ++-- .../query/PhabricatorSavedQueryQuery.php | 68 +++++++++++++++++++ .../search/storage/PhabricatorSavedQuery.php | 22 +++++- 5 files changed, 106 insertions(+), 12 deletions(-) create mode 100644 src/applications/search/query/PhabricatorSavedQueryQuery.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index d3cefe96c2..aa152dc968 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1354,6 +1354,7 @@ phutil_register_library_map(array( 'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.php', 'PhabricatorSSHWorkflow' => 'infrastructure/ssh/PhabricatorSSHWorkflow.php', 'PhabricatorSavedQuery' => 'applications/search/storage/PhabricatorSavedQuery.php', + 'PhabricatorSavedQueryQuery' => 'applications/search/query/PhabricatorSavedQueryQuery.php', 'PhabricatorScopedEnv' => 'infrastructure/env/PhabricatorScopedEnv.php', 'PhabricatorSearchAbstractDocument' => 'applications/search/index/PhabricatorSearchAbstractDocument.php', 'PhabricatorSearchAttachController' => 'applications/search/controller/PhabricatorSearchAttachController.php', @@ -3135,7 +3136,12 @@ phutil_register_library_map(array( 'PhabricatorRepositoryTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine', 'PhabricatorSSHWorkflow' => 'PhutilArgumentWorkflow', - 'PhabricatorSavedQuery' => 'PhabricatorSearchDAO', + 'PhabricatorSavedQuery' => + array( + 0 => 'PhabricatorSearchDAO', + 1 => 'PhabricatorPolicyInterface', + ), + 'PhabricatorSavedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchBaseController' => 'PhabricatorController', 'PhabricatorSearchConfigOptions' => 'PhabricatorApplicationConfigOptions', diff --git a/src/applications/paste/controller/PhabricatorPasteListController.php b/src/applications/paste/controller/PhabricatorPasteListController.php index e0f3d15d80..615a346840 100644 --- a/src/applications/paste/controller/PhabricatorPasteListController.php +++ b/src/applications/paste/controller/PhabricatorPasteListController.php @@ -34,9 +34,10 @@ final class PhabricatorPasteListController extends PhabricatorPasteController { ->setPasteSearchUser($request->getUser()); if ($this->queryKey !== null) { - $saved_query = id(new PhabricatorSavedQuery())->loadOneWhere( - 'queryKey = %s', - $this->queryKey); + $saved_query = id(new PhabricatorSavedQueryQuery()) + ->setViewer($user) + ->withQueryKeys(array($this->queryKey)) + ->executeOne(); if (!$saved_query) { return new Aphront404Response(); diff --git a/src/applications/search/controller/PhabricatorSearchNameController.php b/src/applications/search/controller/PhabricatorSearchNameController.php index d529d21db4..b24e0e8fc9 100644 --- a/src/applications/search/controller/PhabricatorSearchNameController.php +++ b/src/applications/search/controller/PhabricatorSearchNameController.php @@ -17,9 +17,10 @@ final class PhabricatorSearchNameController $user = $request->getUser(); if ($this->queryKey) { - $saved_query = id(new PhabricatorSavedQuery())->loadOneWhere( - 'queryKey = %s', - $this->queryKey); + $saved_query = id(new PhabricatorSavedQueryQuery()) + ->setViewer($user) + ->withQueryKeys(array($this->queryKey)) + ->executeOne(); if (!$saved_query) { return new Aphront404Response(); } @@ -28,12 +29,10 @@ final class PhabricatorSearchNameController } if ($request->isFormPost()) { - $request_data = $request->getRequestData(); - $named_query = id(new PhabricatorNamedQuery()) ->setUserPHID($user->getPHID()) ->setQueryKey($saved_query->getQueryKey()) - ->setQueryName($request_data["set_name"]) + ->setQueryName($request->getStr('name')) ->setEngineClassName($saved_query->getEngineClassName()); try { @@ -51,7 +50,7 @@ final class PhabricatorSearchNameController $form->appendChild( id(new AphrontFormTextControl()) - ->setName('set_name') + ->setName('name') ->setLabel(pht('Query Name'))); $form->appendChild( diff --git a/src/applications/search/query/PhabricatorSavedQueryQuery.php b/src/applications/search/query/PhabricatorSavedQueryQuery.php new file mode 100644 index 0000000000..929da82a24 --- /dev/null +++ b/src/applications/search/query/PhabricatorSavedQueryQuery.php @@ -0,0 +1,68 @@ +ids = $ids; + return $this; + } + + public function withEngineClassNames(array $engine_class_names) { + $this->engineClassNames = $engine_class_names; + return $this; + } + + public function withQueryKeys(array $query_keys) { + $this->queryKeys = $query_keys; + return $this; + } + + protected function loadPage() { + $table = new PhabricatorSavedQuery(); + $conn_r = $table->establishConnection('r'); + + $data = queryfx_all( + $conn_r, + 'SELECT * FROM %T %Q %Q %Q', + $table->getTableName(), + $this->buildWhereClause($conn_r), + $this->buildOrderClause($conn_r), + $this->buildLimitClause($conn_r)); + + return $table->loadAllFromArray($data); + } + + private function buildWhereClause($conn_r) { + $where = array(); + + if ($this->ids) { + $where[] = qsprintf( + $conn_r, + 'id IN (%Ld)', + $this->ids); + } + + if ($this->engineClassNames) { + $where[] = qsprintf( + $conn_r, + 'engineClassName IN (%Ls)', + $this->engineClassNames); + } + + if ($this->queryKeys) { + $where[] = qsprintf( + $conn_r, + 'queryKey IN (%Ls)', + $this->queryKeys); + } + + $where[] = $this->buildPagingClause($conn_r); + + return $this->formatWhereClause($where); + } +} diff --git a/src/applications/search/storage/PhabricatorSavedQuery.php b/src/applications/search/storage/PhabricatorSavedQuery.php index 097a1b94b6..460dc504d2 100644 --- a/src/applications/search/storage/PhabricatorSavedQuery.php +++ b/src/applications/search/storage/PhabricatorSavedQuery.php @@ -3,7 +3,8 @@ /** * @group search */ -final class PhabricatorSavedQuery extends PhabricatorSearchDAO { +final class PhabricatorSavedQuery extends PhabricatorSearchDAO + implements PhabricatorPolicyInterface { protected $parameters = array(); protected $queryKey = ""; @@ -35,4 +36,23 @@ final class PhabricatorSavedQuery extends PhabricatorSearchDAO { return parent::save(); } + + +/* -( PhabricatorPolicyInterface )----------------------------------------- */ + + + public function getCapabilities() { + return array( + PhabricatorPolicyCapability::CAN_VIEW, + ); + } + + public function getPolicy($capability) { + return PhabricatorPolicies::POLICY_PUBLIC; + } + + public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { + return false; + } + }