1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-23 22:10:55 +01:00

Add user.info and phid.info Conduit methods

Summary: Allow user and arbitrary object lookup by PHID.

Test Plan: Executed user.whoami, user.info, user.find and phid.info via Conduit
console.

Reviewers: jungejason, tuomaspelkonen, aran, nh

Reviewed By: nh

CC: skrul, aran, nh, jungejason, epriestley

Differential Revision: 870
This commit is contained in:
epriestley 2011-08-30 12:03:58 -07:00
parent f7e136ecd2
commit 39ca1e7e39
15 changed files with 299 additions and 13 deletions

View file

@ -120,8 +120,12 @@ phutil_register_library_map(array(
'ConduitAPI_paste_create_Method' => 'applications/conduit/method/paste/create', 'ConduitAPI_paste_create_Method' => 'applications/conduit/method/paste/create',
'ConduitAPI_paste_info_Method' => 'applications/conduit/method/paste/info', 'ConduitAPI_paste_info_Method' => 'applications/conduit/method/paste/info',
'ConduitAPI_path_getowners_Method' => 'applications/conduit/method/path/getowners', 'ConduitAPI_path_getowners_Method' => 'applications/conduit/method/path/getowners',
'ConduitAPI_phid_Method' => 'applications/conduit/method/phid/base',
'ConduitAPI_phid_info_Method' => 'applications/conduit/method/phid/info',
'ConduitAPI_slowvote_info_Method' => 'applications/conduit/method/slowvote/info', 'ConduitAPI_slowvote_info_Method' => 'applications/conduit/method/slowvote/info',
'ConduitAPI_user_Method' => 'applications/conduit/method/user/base',
'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_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',
'DarkConsole' => 'aphront/console/api', 'DarkConsole' => 'aphront/console/api',
@ -795,9 +799,13 @@ phutil_register_library_map(array(
'ConduitAPI_paste_create_Method' => 'ConduitAPI_paste_Method', 'ConduitAPI_paste_create_Method' => 'ConduitAPI_paste_Method',
'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method', 'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method',
'ConduitAPI_path_getowners_Method' => 'ConduitAPIMethod', 'ConduitAPI_path_getowners_Method' => 'ConduitAPIMethod',
'ConduitAPI_phid_Method' => 'ConduitAPIMethod',
'ConduitAPI_phid_info_Method' => 'ConduitAPI_phid_Method',
'ConduitAPI_slowvote_info_Method' => 'ConduitAPIMethod', 'ConduitAPI_slowvote_info_Method' => 'ConduitAPIMethod',
'ConduitAPI_user_find_Method' => 'ConduitAPIMethod', 'ConduitAPI_user_Method' => 'ConduitAPIMethod',
'ConduitAPI_user_whoami_Method' => 'ConduitAPIMethod', 'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method',
'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method',
'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method',
'DarkConsoleConfigPlugin' => 'DarkConsolePlugin', 'DarkConsoleConfigPlugin' => 'DarkConsolePlugin',
'DarkConsoleController' => 'PhabricatorController', 'DarkConsoleController' => 'PhabricatorController',
'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin', 'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin',

View file

@ -0,0 +1,41 @@
<?php
/*
* Copyright 2011 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
*/
abstract class ConduitAPI_phid_Method extends ConduitAPIMethod {
protected function buildHandleInformationDictionary(
PhabricatorObjectHandle $handle) {
return array(
'phid' => $handle->getPHID(),
'uri' => PhabricatorEnv::getProductionURI($handle->getURI()),
'typeName' => $handle->getTypeName(),
'type' => $handle->getType(),
'name' => $handle->getName(),
'fullName' => $handle->getFullName(),
'status' => $handle->getStatus(),
);
}
}

View 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/base');
phutil_require_module('phabricator', 'infrastructure/env');
phutil_require_source('ConduitAPI_phid_Method.php');

View file

@ -0,0 +1,60 @@
<?php
/*
* Copyright 2011 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_phid_info_Method
extends ConduitAPI_phid_Method {
public function getMethodDescription() {
return "Retrieve information about an arbitrary PHID.";
}
public function defineParamTypes() {
return array(
'phid' => 'required phid',
);
}
public function defineReturnType() {
return 'nonempty dict<string, wild>';
}
public function defineErrorTypes() {
return array(
'ERR-BAD-PHID' => 'No such object exists.',
);
}
protected function execute(ConduitAPIRequest $request) {
$phid = $request->getValue('phid');
$handles = id(new PhabricatorObjectHandleData(array($phid)))
->loadHandles();
$handle = $handles[$phid];
if (!$handle->isComplete()) {
throw new ConduitException('ERR-BAD-PHID');
}
return $this->buildHandleInformationDictionary($handle);
}
}

View file

@ -0,0 +1,16 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/conduit/method/phid/base');
phutil_require_module('phabricator', 'applications/conduit/protocol/exception');
phutil_require_module('phabricator', 'applications/phid/handle/data');
phutil_require_module('phutil', 'utils');
phutil_require_source('ConduitAPI_phid_info_Method.php');

View file

@ -0,0 +1,32 @@
<?php
/*
* Copyright 2011 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
*/
abstract class ConduitAPI_user_Method extends ConduitAPIMethod {
protected function buildUserInformationDictionary(PhabricatorUser $user) {
return array(
'phid' => $user->getPHID(),
'userName' => $user->getUserName(),
'realName' => $user->getRealName(),
);
}
}

View file

@ -0,0 +1,12 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/conduit/method/base');
phutil_require_source('ConduitAPI_user_Method.php');

View file

@ -19,7 +19,8 @@
/** /**
* @group conduit * @group conduit
*/ */
class ConduitAPI_user_find_Method extends ConduitAPIMethod { final class ConduitAPI_user_find_Method
extends ConduitAPI_user_Method {
public function getMethodDescription() { public function getMethodDescription() {
return "Find user PHIDs which correspond to provided user aliases. ". return "Find user PHIDs which correspond to provided user aliases. ".

View file

@ -6,7 +6,7 @@
phutil_require_module('phabricator', 'applications/conduit/method/base'); phutil_require_module('phabricator', 'applications/conduit/method/user/base');
phutil_require_module('phabricator', 'applications/people/storage/user'); phutil_require_module('phabricator', 'applications/people/storage/user');
phutil_require_module('phutil', 'utils'); phutil_require_module('phutil', 'utils');

View file

@ -0,0 +1,58 @@
<?php
/*
* Copyright 2011 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_info_Method
extends ConduitAPI_user_Method {
public function getMethodDescription() {
return "Retrieve information about a user by PHID.";
}
public function defineParamTypes() {
return array(
'phid' => 'required phid',
);
}
public function defineReturnType() {
return 'nonempty dict<string, wild>';
}
public function defineErrorTypes() {
return array(
'ERR-BAD-USER' => 'No such user exists.',
);
}
protected function execute(ConduitAPIRequest $request) {
$user = id(new PhabricatorUser())->loadOneWhere(
'phid = %s',
$request->getValue('phid'));
if (!$user) {
throw new ConduitException('ERR-BAD-USER');
}
return $this->buildUserInformationDictionary($user);
}
}

View file

@ -0,0 +1,16 @@
<?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/conduit/protocol/exception');
phutil_require_module('phabricator', 'applications/people/storage/user');
phutil_require_module('phutil', 'utils');
phutil_require_source('ConduitAPI_user_info_Method.php');

View file

@ -19,7 +19,8 @@
/** /**
* @group conduit * @group conduit
*/ */
class ConduitAPI_user_whoami_Method extends ConduitAPIMethod { final class ConduitAPI_user_whoami_Method
extends ConduitAPI_user_Method {
public function getMethodDescription() { public function getMethodDescription() {
return "Retrieve information about the logged-in user."; return "Retrieve information about the logged-in user.";
@ -40,12 +41,7 @@ class ConduitAPI_user_whoami_Method extends ConduitAPIMethod {
} }
protected function execute(ConduitAPIRequest $request) { protected function execute(ConduitAPIRequest $request) {
$user = $request->getUser(); return $this->buildUserInformationDictionary($request->getUser());
return array(
'phid' => $user->getPHID(),
'userName' => $user->getUserName(),
'realName' => $user->getRealName(),
);
} }
} }

View file

@ -6,7 +6,7 @@
phutil_require_module('phabricator', 'applications/conduit/method/base'); phutil_require_module('phabricator', 'applications/conduit/method/user/base');
phutil_require_source('ConduitAPI_user_whoami_Method.php'); phutil_require_source('ConduitAPI_user_whoami_Method.php');

View file

@ -28,7 +28,7 @@ class PhabricatorObjectHandle {
private $timestamp; private $timestamp;
private $alternateID; private $alternateID;
private $status = 'open'; private $status = 'open';
private $complete;
public function setURI($uri) { public function setURI($uri) {
$this->uri = $uri; $this->uri = $uri;
@ -135,6 +135,27 @@ class PhabricatorObjectHandle {
return idx($map, $this->getType()); return idx($map, $this->getType());
} }
public function setComplete($complete) {
$this->complete = $complete;
return $this;
}
/**
* Determine if the handle represents an object which was completely loaded
* (i.e., the underlying object exists) vs an object which could not be
* completely loaded (e.g., the type or data for the PHID could not be
* identified or located).
*
* Basically, @{class:PhabricatorObjectHandleData} gives you back a handle for
* any PHID you give it, but it gives you a complete handle only for valid
* PHIDs.
*
* @return bool True if the handle represents a complete object.
*/
public function isComplete() {
return $this->complete;
}
public function renderLink() { public function renderLink() {
switch ($this->getType()) { switch ($this->getType()) {

View file

@ -115,6 +115,7 @@ class PhabricatorObjectHandleData {
case ManiphestTaskOwner::OWNER_UP_FOR_GRABS: case ManiphestTaskOwner::OWNER_UP_FOR_GRABS:
$handle->setName('Up For Grabs'); $handle->setName('Up For Grabs');
$handle->setFullName('upforgrabs (Up For Grabs)'); $handle->setFullName('upforgrabs (Up For Grabs)');
$handle->setComplete(true);
break; break;
default: default:
$handle->setName('Foul Magicks'); $handle->setName('Foul Magicks');
@ -145,6 +146,7 @@ class PhabricatorObjectHandleData {
$handle->setFullName( $handle->setFullName(
$user->getUsername().' ('.$user->getRealName().')'); $user->getUsername().' ('.$user->getRealName().')');
$handle->setAlternateID($user->getID()); $handle->setAlternateID($user->getID());
$handle->setComplete(true);
$img_phid = $user->getProfileImagePHID(); $img_phid = $user->getProfileImagePHID();
if ($img_phid) { if ($img_phid) {
@ -176,6 +178,7 @@ class PhabricatorObjectHandleData {
$handle->setName($list->getName()); $handle->setName($list->getName());
$handle->setURI($list->getURI()); $handle->setURI($list->getURI());
$handle->setFullName($list->getName()); $handle->setFullName($list->getName());
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }
@ -199,6 +202,7 @@ class PhabricatorObjectHandleData {
$handle->setName($rev->getTitle()); $handle->setName($rev->getTitle());
$handle->setURI('/D'.$rev->getID()); $handle->setURI('/D'.$rev->getID());
$handle->setFullName('D'.$rev->getID().': '.$rev->getTitle()); $handle->setFullName('D'.$rev->getID().': '.$rev->getTitle());
$handle->setComplete(true);
$status = $rev->getStatus(); $status = $rev->getStatus();
if (($status == DifferentialRevisionStatus::COMMITTED) || if (($status == DifferentialRevisionStatus::COMMITTED) ||
@ -256,6 +260,7 @@ class PhabricatorObjectHandleData {
$handle->setURI('/r'.$callsign.$commit_identifier); $handle->setURI('/r'.$callsign.$commit_identifier);
$handle->setFullName('r'.$callsign.$commit_identifier); $handle->setFullName('r'.$callsign.$commit_identifier);
$handle->setTimestamp($commit->getEpoch()); $handle->setTimestamp($commit->getEpoch());
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }
@ -279,6 +284,7 @@ class PhabricatorObjectHandleData {
$handle->setName($task->getTitle()); $handle->setName($task->getTitle());
$handle->setURI('/T'.$task->getID()); $handle->setURI('/T'.$task->getID());
$handle->setFullName('T'.$task->getID().': '.$task->getTitle()); $handle->setFullName('T'.$task->getID().': '.$task->getTitle());
$handle->setComplete(true);
if ($task->getStatus() != ManiphestTaskStatus::STATUS_OPEN) { if ($task->getStatus() != ManiphestTaskStatus::STATUS_OPEN) {
$closed = PhabricatorObjectHandleStatus::STATUS_CLOSED; $closed = PhabricatorObjectHandleStatus::STATUS_CLOSED;
$handle->setStatus($closed); $handle->setStatus($closed);
@ -305,6 +311,7 @@ class PhabricatorObjectHandleData {
$file = $files[$phid]; $file = $files[$phid];
$handle->setName($file->getName()); $handle->setName($file->getName());
$handle->setURI($file->getViewURI()); $handle->setURI($file->getViewURI());
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }
@ -327,6 +334,7 @@ class PhabricatorObjectHandleData {
$project = $projects[$phid]; $project = $projects[$phid];
$handle->setName($project->getName()); $handle->setName($project->getName());
$handle->setURI('/project/view/'.$project->getID().'/'); $handle->setURI('/project/view/'.$project->getID().'/');
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }
@ -349,6 +357,7 @@ class PhabricatorObjectHandleData {
$repository = $repositories[$phid]; $repository = $repositories[$phid];
$handle->setName($repository->getCallsign()); $handle->setName($repository->getCallsign());
$handle->setURI('/diffusion/'.$repository->getCallsign().'/'); $handle->setURI('/diffusion/'.$repository->getCallsign().'/');
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }
@ -371,6 +380,7 @@ class PhabricatorObjectHandleData {
$package = $packages[$phid]; $package = $packages[$phid];
$handle->setName($package->getName()); $handle->setName($package->getName());
$handle->setURI('/owners/package/'.$package->getID().'/'); $handle->setURI('/owners/package/'.$package->getID().'/');
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }
@ -391,6 +401,7 @@ class PhabricatorObjectHandleData {
} else { } else {
$project = $projects[$phid]; $project = $projects[$phid];
$handle->setName($project->getName()); $handle->setName($project->getName());
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }
@ -420,6 +431,7 @@ class PhabricatorObjectHandleData {
$info = $documents[$phid]; $info = $documents[$phid];
$handle->setName($info['title']); $handle->setName($info['title']);
$handle->setURI(PhrictionDocument::getSlugURI($info['slug'])); $handle->setURI(PhrictionDocument::getSlugURI($info['slug']));
$handle->setComplete(true);
} }
$handles[$phid] = $handle; $handles[$phid] = $handle;
} }