3 final class DifferentialQueryConduitAPIMethod
4 extends DifferentialConduitAPIMethod
{
6 public function getAPIMethodName() {
7 return 'differential.query';
10 public function getMethodDescription() {
11 return pht('Query Differential revisions which match certain criteria.');
14 public function getMethodStatus() {
15 return self
::METHOD_STATUS_FROZEN
;
18 public function getMethodStatusDescription() {
20 'This method is frozen and will eventually be deprecated. New code '.
21 'should use "differential.revision.search" instead.');
24 protected function defineParamTypes() {
25 $hash_types = ArcanistDifferentialRevisionHash
::getTypes();
26 $hash_const = $this->formatStringConstants($hash_types);
28 $status_types = DifferentialLegacyQuery
::getAllConstants();
29 $status_const = $this->formatStringConstants($status_types);
32 DifferentialRevisionQuery
::ORDER_MODIFIED
,
33 DifferentialRevisionQuery
::ORDER_CREATED
,
35 $order_const = $this->formatStringConstants($order_types);
38 'authors' => 'optional list<phid>',
39 'ccs' => 'optional list<phid>',
40 'reviewers' => 'optional list<phid>',
41 'paths' => 'unsupported',
42 'commitHashes' => 'optional list<pair<'.$hash_const.', string>>',
43 'status' => 'optional '.$status_const,
44 'order' => 'optional '.$order_const,
45 'limit' => 'optional uint',
46 'offset' => 'optional uint',
47 'ids' => 'optional list<uint>',
48 'phids' => 'optional list<phid>',
49 'subscribers' => 'optional list<phid>',
50 'responsibleUsers' => 'optional list<phid>',
51 'branches' => 'optional list<string>',
55 protected function defineReturnType() {
59 protected function defineErrorTypes() {
61 'ERR-INVALID-PARAMETER' => pht('Missing or malformed parameter.'),
65 protected function execute(ConduitAPIRequest
$request) {
66 $authors = $request->getValue('authors');
67 $ccs = $request->getValue('ccs');
68 $reviewers = $request->getValue('reviewers');
69 $status = $request->getValue('status');
70 $order = $request->getValue('order');
71 $path_pairs = $request->getValue('paths');
72 $commit_hashes = $request->getValue('commitHashes');
73 $limit = $request->getValue('limit');
74 $offset = $request->getValue('offset');
75 $ids = $request->getValue('ids');
76 $phids = $request->getValue('phids');
77 $subscribers = $request->getValue('subscribers');
78 $responsible_users = $request->getValue('responsibleUsers');
79 $branches = $request->getValue('branches');
81 $query = id(new DifferentialRevisionQuery())
82 ->setViewer($request->getUser());
85 $query->withAuthors($authors);
88 $query->withCCs($ccs);
91 $query->withReviewers($reviewers);
97 'Parameter "paths" to Conduit API method "differential.query" is '.
98 'no longer supported. Use the "paths" constraint to '.
99 '"differential.revision.search" instead. See T13639.'));
102 if ($commit_hashes) {
103 $hash_types = ArcanistDifferentialRevisionHash
::getTypes();
104 foreach ($commit_hashes as $info) {
105 list($type, $hash) = $info;
107 !in_array($type, $hash_types) ||
109 throw new ConduitException('ERR-INVALID-PARAMETER');
112 $query->withCommitHashes($commit_hashes);
116 $statuses = DifferentialLegacyQuery
::getModernValues($status);
118 $query->withStatuses($statuses);
122 $query->setOrder($order);
125 $query->setLimit($limit);
128 $query->setOffset($offset);
131 $query->withIDs($ids);
134 $query->withPHIDs($phids);
136 if ($responsible_users) {
137 $query->withResponsibleUsers($responsible_users);
140 $query->withCCs($subscribers);
143 $query->withBranches($branches);
146 $query->needReviewers(true);
147 $query->needCommitPHIDs(true);
148 $query->needDiffIDs(true);
149 $query->needActiveDiffs(true);
150 $query->needHashes(true);
152 $revisions = $query->execute();
154 $field_data = $this->loadCustomFieldsForRevisions(
159 $ccs = id(new PhabricatorSubscribersQuery())
160 ->withObjectPHIDs(mpull($revisions, 'getPHID'))
167 foreach ($revisions as $revision) {
168 $diff = $revision->getActiveDiff();
173 $id = $revision->getID();
174 $phid = $revision->getPHID();
179 'title' => $revision->getTitle(),
180 'uri' => PhabricatorEnv
::getProductionURI('/D'.$id),
181 'dateCreated' => $revision->getDateCreated(),
182 'dateModified' => $revision->getDateModified(),
183 'authorPHID' => $revision->getAuthorPHID(),
185 // NOTE: For backward compatibility this is explicitly a string, like
186 // "2", even though the value of the string is an integer. See PHI14.
187 'status' => (string)$revision->getLegacyRevisionStatus(),
189 'statusName' => $revision->getStatusDisplayName(),
190 'properties' => $revision->getProperties(),
191 'branch' => $diff->getBranch(),
192 'summary' => $revision->getSummary(),
193 'testPlan' => $revision->getTestPlan(),
194 'lineCount' => $revision->getLineCount(),
195 'activeDiffPHID' => $diff->getPHID(),
196 'diffs' => $revision->getDiffIDs(),
197 'commits' => $revision->getCommitPHIDs(),
198 'reviewers' => $revision->getReviewerPHIDs(),
199 'ccs' => idx($ccs, $phid, array()),
200 'hashes' => $revision->getHashes(),
201 'auxiliary' => idx($field_data, $phid, array()),
202 'repositoryPHID' => $diff->getRepositoryPHID(),
205 // TODO: This is a hacky way to put permissions on this field until we
206 // have first-class support, see T838.
207 if ($revision->getAuthorPHID() == $request->getUser()->getPHID()) {
208 $result['sourcePath'] = $diff->getSourcePath();
211 $results[] = $result;