mirror of
https://we.phorge.it/source/phorge.git
synced 2025-01-31 08:58:20 +01:00
Conduit user.query method
Summary: also includes a PhabricatorPeopleQuery object Test Plan: queried for various combinations username, realname, id, phid, and email. verified correct results. Reviewers: epriestley Reviewed By: epriestley CC: zeeg, aran, Koolvin Maniphest Tasks: T1075 Differential Revision: https://secure.phabricator.com/D2416
This commit is contained in:
parent
45e9f8e689
commit
c58bd95842
5 changed files with 241 additions and 0 deletions
|
@ -185,6 +185,7 @@ phutil_register_library_map(array(
|
||||||
'ConduitAPI_user_addstatus_Method' => 'applications/conduit/method/user/addstatus',
|
'ConduitAPI_user_addstatus_Method' => 'applications/conduit/method/user/addstatus',
|
||||||
'ConduitAPI_user_find_Method' => 'applications/conduit/method/user/find',
|
'ConduitAPI_user_find_Method' => 'applications/conduit/method/user/find',
|
||||||
'ConduitAPI_user_info_Method' => 'applications/conduit/method/user/info',
|
'ConduitAPI_user_info_Method' => 'applications/conduit/method/user/info',
|
||||||
|
'ConduitAPI_user_query_Method' => 'applications/conduit/method/user/query',
|
||||||
'ConduitAPI_user_removestatus_Method' => 'applications/conduit/method/user/removestatus',
|
'ConduitAPI_user_removestatus_Method' => 'applications/conduit/method/user/removestatus',
|
||||||
'ConduitAPI_user_whoami_Method' => 'applications/conduit/method/user/whoami',
|
'ConduitAPI_user_whoami_Method' => 'applications/conduit/method/user/whoami',
|
||||||
'ConduitException' => 'applications/conduit/protocol/exception',
|
'ConduitException' => 'applications/conduit/protocol/exception',
|
||||||
|
@ -784,6 +785,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorPeopleListController' => 'applications/people/controller/list',
|
'PhabricatorPeopleListController' => 'applications/people/controller/list',
|
||||||
'PhabricatorPeopleLogsController' => 'applications/people/controller/logs',
|
'PhabricatorPeopleLogsController' => 'applications/people/controller/logs',
|
||||||
'PhabricatorPeopleProfileController' => 'applications/people/controller/profile',
|
'PhabricatorPeopleProfileController' => 'applications/people/controller/profile',
|
||||||
|
'PhabricatorPeopleQuery' => 'applications/people/query',
|
||||||
'PhabricatorPolicies' => 'applications/policy/constants/policy',
|
'PhabricatorPolicies' => 'applications/policy/constants/policy',
|
||||||
'PhabricatorPolicyCapability' => 'applications/policy/constants/capability',
|
'PhabricatorPolicyCapability' => 'applications/policy/constants/capability',
|
||||||
'PhabricatorPolicyConstants' => 'applications/policy/constants/base',
|
'PhabricatorPolicyConstants' => 'applications/policy/constants/base',
|
||||||
|
@ -1213,6 +1215,7 @@ phutil_register_library_map(array(
|
||||||
'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method',
|
'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method',
|
||||||
'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method',
|
'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method',
|
||||||
'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method',
|
'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method',
|
||||||
|
'ConduitAPI_user_query_Method' => 'ConduitAPI_user_Method',
|
||||||
'ConduitAPI_user_removestatus_Method' => 'ConduitAPI_user_Method',
|
'ConduitAPI_user_removestatus_Method' => 'ConduitAPI_user_Method',
|
||||||
'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method',
|
'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method',
|
||||||
'DarkConsoleConfigPlugin' => 'DarkConsolePlugin',
|
'DarkConsoleConfigPlugin' => 'DarkConsolePlugin',
|
||||||
|
@ -1689,6 +1692,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorPeopleListController' => 'PhabricatorPeopleController',
|
'PhabricatorPeopleListController' => 'PhabricatorPeopleController',
|
||||||
'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController',
|
'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController',
|
||||||
'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController',
|
'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController',
|
||||||
|
'PhabricatorPeopleQuery' => 'PhabricatorOffsetPagedQuery',
|
||||||
'PhabricatorPolicies' => 'PhabricatorPolicyConstants',
|
'PhabricatorPolicies' => 'PhabricatorPolicyConstants',
|
||||||
'PhabricatorPolicyCapability' => 'PhabricatorPolicyConstants',
|
'PhabricatorPolicyCapability' => 'PhabricatorPolicyConstants',
|
||||||
'PhabricatorPolicyQuery' => 'PhabricatorQuery',
|
'PhabricatorPolicyQuery' => 'PhabricatorQuery',
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2012 Facebook, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group conduit
|
||||||
|
*/
|
||||||
|
final class ConduitAPI_user_query_Method
|
||||||
|
extends ConduitAPI_user_Method {
|
||||||
|
|
||||||
|
public function getMethodDescription() {
|
||||||
|
return "Query users.";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function defineParamTypes() {
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'usernames' => 'optional list<string>',
|
||||||
|
'emails' => 'optional list<string>',
|
||||||
|
'realnames' => 'optional list<string>',
|
||||||
|
'phids' => 'optional list<phid>',
|
||||||
|
'ids' => 'optional list<uint>',
|
||||||
|
'offset' => 'optional int',
|
||||||
|
'limit' => 'optional int (default = 100)',
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function defineReturnType() {
|
||||||
|
return 'list<dict>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function defineErrorTypes() {
|
||||||
|
return array(
|
||||||
|
'ERR-INVALID-PARAMETER' => 'Missing or malformed parameter.',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function execute(ConduitAPIRequest $request) {
|
||||||
|
$usernames = $request->getValue('usernames', array());
|
||||||
|
$emails = $request->getValue('emails', array());
|
||||||
|
$realnames = $request->getValue('realnames', array());
|
||||||
|
$phids = $request->getValue('phids', array());
|
||||||
|
$ids = $request->getValue('ids', array());
|
||||||
|
$offset = $request->getValue('offset', 0);
|
||||||
|
$limit = $request->getValue('limit', 100);
|
||||||
|
|
||||||
|
$query = new PhabricatorPeopleQuery();
|
||||||
|
if ($usernames) {
|
||||||
|
$query->withUsernames($usernames);
|
||||||
|
}
|
||||||
|
if ($emails) {
|
||||||
|
// TODO -- validate emails and maybs
|
||||||
|
// throw new ConduitException('ERR-INVALID-PARAMETER');
|
||||||
|
$query->withEmails($emails);
|
||||||
|
}
|
||||||
|
if ($realnames) {
|
||||||
|
$query->withRealnames($realnames);
|
||||||
|
}
|
||||||
|
if ($phids) {
|
||||||
|
$query->withPHIDs($phids);
|
||||||
|
}
|
||||||
|
if ($ids) {
|
||||||
|
$query->withIDs($ids);
|
||||||
|
}
|
||||||
|
if ($limit) {
|
||||||
|
$query->setLimit($limit);
|
||||||
|
}
|
||||||
|
if ($offset) {
|
||||||
|
$query->setOffset($offset);
|
||||||
|
}
|
||||||
|
$users = $query->execute();
|
||||||
|
|
||||||
|
$results = array();
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$results[] = $this->buildUserInformationDictionary($user);
|
||||||
|
}
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
}
|
13
src/applications/conduit/method/user/query/__init__.php
Normal file
13
src/applications/conduit/method/user/query/__init__.php
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is automatically generated. Lint this module to rebuild it.
|
||||||
|
* @generated
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_module('phabricator', 'applications/conduit/method/user/base');
|
||||||
|
phutil_require_module('phabricator', 'applications/people/query');
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('ConduitAPI_user_query_Method.php');
|
114
src/applications/people/query/PhabricatorPeopleQuery.php
Normal file
114
src/applications/people/query/PhabricatorPeopleQuery.php
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2012 Facebook, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
final class PhabricatorPeopleQuery extends PhabricatorOffsetPagedQuery {
|
||||||
|
private $usernames;
|
||||||
|
private $realnames;
|
||||||
|
private $emails;
|
||||||
|
private $phids;
|
||||||
|
private $ids;
|
||||||
|
|
||||||
|
public function withIds(array $ids) {
|
||||||
|
$this->ids = $ids;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
public function withPhids(array $phids) {
|
||||||
|
$this->phids = $phids;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
public function withEmails(array $emails) {
|
||||||
|
$this->emails = $emails;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
public function withRealnames(array $realnames) {
|
||||||
|
$this->realnames = $realnames;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
public function withUsernames(array $usernames) {
|
||||||
|
$this->usernames = $usernames;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute() {
|
||||||
|
$table = new PhabricatorUser();
|
||||||
|
$conn_r = $table->establishConnection('r');
|
||||||
|
|
||||||
|
$joins_clause = $this->buildJoinsClause($conn_r);
|
||||||
|
$where_clause = $this->buildWhereClause($conn_r);
|
||||||
|
$limit_clause = $this->buildLimitClause($conn_r);
|
||||||
|
|
||||||
|
$data = queryfx_all(
|
||||||
|
$conn_r,
|
||||||
|
'SELECT * FROM %T user %Q %Q %Q',
|
||||||
|
$table->getTableName(),
|
||||||
|
$joins_clause,
|
||||||
|
$where_clause,
|
||||||
|
$limit_clause);
|
||||||
|
|
||||||
|
$users = $table->loadAllFromArray($data);
|
||||||
|
|
||||||
|
return $users;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildJoinsClause($conn_r) {
|
||||||
|
$joins = array();
|
||||||
|
|
||||||
|
if ($this->emails) {
|
||||||
|
$email_table = new PhabricatorUserEmail();
|
||||||
|
$joins[] = qsprintf(
|
||||||
|
$conn_r,
|
||||||
|
'JOIN %T email ON email.userPHID = user.PHID',
|
||||||
|
$email_table->getTableName());
|
||||||
|
}
|
||||||
|
|
||||||
|
$joins = implode(' ', $joins);
|
||||||
|
return $joins;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildWhereClause($conn_r) {
|
||||||
|
$where = array();
|
||||||
|
|
||||||
|
if ($this->usernames) {
|
||||||
|
$where[] = qsprintf($conn_r,
|
||||||
|
'userName IN (%Ls)',
|
||||||
|
$this->usernames);
|
||||||
|
}
|
||||||
|
if ($this->emails) {
|
||||||
|
$where[] = qsprintf($conn_r,
|
||||||
|
'email.address IN (%Ls)',
|
||||||
|
$this->emails);
|
||||||
|
}
|
||||||
|
if ($this->realnames) {
|
||||||
|
$where[] = qsprintf($conn_r,
|
||||||
|
'realName IN (%Ls)',
|
||||||
|
$this->realnames);
|
||||||
|
}
|
||||||
|
if ($this->phids) {
|
||||||
|
$where[] = qsprintf($conn_r,
|
||||||
|
'phid IN (%Ls)',
|
||||||
|
$this->phids);
|
||||||
|
}
|
||||||
|
if ($this->ids) {
|
||||||
|
$where[] = qsprintf($conn_r,
|
||||||
|
'id IN (%Ld)',
|
||||||
|
$this->ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->formatWhereClause($where);
|
||||||
|
}
|
||||||
|
}
|
16
src/applications/people/query/__init__.php
Normal file
16
src/applications/people/query/__init__.php
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is automatically generated. Lint this module to rebuild it.
|
||||||
|
* @generated
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_module('phabricator', 'applications/people/storage/email');
|
||||||
|
phutil_require_module('phabricator', 'applications/people/storage/user');
|
||||||
|
phutil_require_module('phabricator', 'infrastructure/query/offsetpaged');
|
||||||
|
phutil_require_module('phabricator', 'storage/qsprintf');
|
||||||
|
phutil_require_module('phabricator', 'storage/queryfx');
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('PhabricatorPeopleQuery.php');
|
Loading…
Add table
Reference in a new issue