Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15368316
D10862.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
D10862.id.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -19,6 +19,7 @@
'AlmanacBindingTransaction' => 'applications/almanac/storage/AlmanacBindingTransaction.php',
'AlmanacBindingTransactionQuery' => 'applications/almanac/query/AlmanacBindingTransactionQuery.php',
'AlmanacBindingViewController' => 'applications/almanac/controller/AlmanacBindingViewController.php',
+ 'AlmanacConduitAPIMethod' => 'applications/almanac/conduit/AlmanacConduitAPIMethod.php',
'AlmanacConduitUtil' => 'applications/almanac/util/AlmanacConduitUtil.php',
'AlmanacConsoleController' => 'applications/almanac/controller/AlmanacConsoleController.php',
'AlmanacController' => 'applications/almanac/controller/AlmanacController.php',
@@ -66,6 +67,7 @@
'AlmanacPropertyInterface' => 'applications/almanac/property/AlmanacPropertyInterface.php',
'AlmanacPropertyQuery' => 'applications/almanac/query/AlmanacPropertyQuery.php',
'AlmanacQuery' => 'applications/almanac/query/AlmanacQuery.php',
+ 'AlmanacQueryServicesConduitAPIMethod' => 'applications/almanac/conduit/AlmanacQueryServicesConduitAPIMethod.php',
'AlmanacSchemaSpec' => 'applications/almanac/storage/AlmanacSchemaSpec.php',
'AlmanacService' => 'applications/almanac/storage/AlmanacService.php',
'AlmanacServiceController' => 'applications/almanac/controller/AlmanacServiceController.php',
@@ -2996,6 +2998,7 @@
'AlmanacBindingTransaction' => 'PhabricatorApplicationTransaction',
'AlmanacBindingTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'AlmanacBindingViewController' => 'AlmanacServiceController',
+ 'AlmanacConduitAPIMethod' => 'ConduitAPIMethod',
'AlmanacConduitUtil' => 'Phobject',
'AlmanacConsoleController' => 'AlmanacController',
'AlmanacController' => 'PhabricatorController',
@@ -3062,6 +3065,7 @@
'AlmanacPropertyEditController' => 'AlmanacDeviceController',
'AlmanacPropertyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'AlmanacQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'AlmanacQueryServicesConduitAPIMethod' => 'AlmanacConduitAPIMethod',
'AlmanacSchemaSpec' => 'PhabricatorConfigSchemaSpec',
'AlmanacService' => array(
'AlmanacDAO',
diff --git a/src/applications/almanac/conduit/AlmanacConduitAPIMethod.php b/src/applications/almanac/conduit/AlmanacConduitAPIMethod.php
new file mode 100644
--- /dev/null
+++ b/src/applications/almanac/conduit/AlmanacConduitAPIMethod.php
@@ -0,0 +1,20 @@
+<?php
+
+abstract class AlmanacConduitAPIMethod extends ConduitAPIMethod {
+
+ final public function getApplication() {
+ return PhabricatorApplication::getByClass(
+ 'PhabricatorAlmanacApplication');
+ }
+
+ public function getMethodStatus() {
+ return self::METHOD_STATUS_UNSTABLE;
+ }
+
+ public function getMethodStatusDescription() {
+ return pht(
+ 'Almanac is a prototype application and its APIs are '.
+ 'subject to change.');
+ }
+
+}
diff --git a/src/applications/almanac/conduit/AlmanacQueryServicesConduitAPIMethod.php b/src/applications/almanac/conduit/AlmanacQueryServicesConduitAPIMethod.php
new file mode 100644
--- /dev/null
+++ b/src/applications/almanac/conduit/AlmanacQueryServicesConduitAPIMethod.php
@@ -0,0 +1,138 @@
+<?php
+
+final class AlmanacQueryServicesConduitAPIMethod
+ extends AlmanacConduitAPIMethod {
+
+ public function getAPIMethodName() {
+ return 'almanac.queryservices';
+ }
+
+ public function getMethodDescription() {
+ return pht('Query Almanac services.');
+ }
+
+ public function defineParamTypes() {
+ return array(
+ 'ids' => 'optional list<id>',
+ 'phids' => 'optional list<phid>',
+ 'names' => 'optional list<phid>',
+ ) + self::getPagerParamTypes();
+ }
+
+ public function defineReturnType() {
+ return 'list<wild>';
+ }
+
+ public function defineErrorTypes() {
+ return array();
+ }
+
+ protected function execute(ConduitAPIRequest $request) {
+ $viewer = $request->getUser();
+
+ $query = id(new AlmanacServiceQuery())
+ ->setViewer($viewer);
+
+ $ids = $request->getValue('ids');
+ if ($ids !== null) {
+ $query->withIDs($ids);
+ }
+
+ $phids = $request->getValue('phids');
+ if ($phids !== null) {
+ $query->withPHIDs($phids);
+ }
+
+ $names = $request->getValue('names');
+ if ($names !== null) {
+ $query->withNames($names);
+ }
+
+ $pager = $this->newPager($request);
+
+ $services = $query->executeWithCursorPager($pager);
+
+ $bindings = id(new AlmanacBindingQuery())
+ ->setViewer($viewer)
+ ->withServicePHIDs(mpull($services, 'getPHID'))
+ ->execute();
+ $bindings = mgroup($bindings, 'getServicePHID');
+
+ $data = array();
+ foreach ($services as $service) {
+ $phid = $service->getPHID();
+
+ $properties = $service->getAlmanacProperties();
+ $properties = mpull($properties, 'getFieldValue', 'getFieldName');
+
+ $service_bindings = idx($bindings, $phid, array());
+ $service_bindings = array_values($service_bindings);
+ foreach ($service_bindings as $key => $service_binding) {
+ $service_bindings[$key] = $this->getBindingDictionary($service_binding);
+ }
+
+ $data[] = $this->getServiceDictionary($service) + array(
+ 'bindings' => $service_bindings,
+ );
+ }
+
+ $results = array(
+ 'data' => $data,
+ );
+
+ return $this->addPagerResults($results, $pager);
+ }
+
+ private function getServiceDictionary(AlmanacService $service) {
+ return array(
+ 'id' => (int)$service->getID(),
+ 'phid' => $service->getPHID(),
+ 'name' => $service->getName(),
+ 'uri' => PhabricatorEnv::getProductionURI($service->getURI()),
+ 'properties' => $this->getPropertiesDictionary($service),
+ );
+ }
+
+ private function getBindingDictionary(AlmanacBinding $binding) {
+ return array(
+ 'id' => (int)$binding->getID(),
+ 'phid' => $binding->getPHID(),
+ 'properties' => $this->getPropertiesDictionary($binding),
+ 'interface' => $this->getInterfaceDictionary($binding->getInterface()),
+ );
+ }
+
+ private function getPropertiesDictionary(AlmanacPropertyInterface $obj) {
+ $properties = $obj->getAlmanacProperties();
+ return (object)mpull($properties, 'getFieldValue', 'getFieldName');
+ }
+
+ private function getInterfaceDictionary(AlmanacInterface $interface) {
+ return array(
+ 'id' => (int)$interface->getID(),
+ 'phid' => $interface->getPHID(),
+ 'address' => $interface->getAddress(),
+ 'port' => (int)$interface->getPort(),
+ 'device' => $this->getDeviceDictionary($interface->getDevice()),
+ 'network' => $this->getNetworkDictionary($interface->getNetwork()),
+ );
+ }
+
+ private function getDeviceDictionary(AlmanacDevice $device) {
+ return array(
+ 'id' => (int)$device->getID(),
+ 'phid' => $device->getPHID(),
+ 'name' => $device->getName(),
+ 'properties' => $this->getPropertiesDictionary($device),
+ );
+ }
+
+ private function getNetworkDictionary(AlmanacNetwork $network) {
+ return array(
+ 'id' => (int)$network->getID(),
+ 'phid' => $network->getPHID(),
+ 'name' => $network->getName(),
+ );
+ }
+
+}
diff --git a/src/applications/almanac/storage/AlmanacBinding.php b/src/applications/almanac/storage/AlmanacBinding.php
--- a/src/applications/almanac/storage/AlmanacBinding.php
+++ b/src/applications/almanac/storage/AlmanacBinding.php
@@ -21,7 +21,8 @@
public static function initializeNewBinding(AlmanacService $service) {
return id(new AlmanacBinding())
- ->setServicePHID($service->getPHID());
+ ->setServicePHID($service->getPHID())
+ ->attachAlmanacProperties(array());
}
public function getConfiguration() {
diff --git a/src/applications/almanac/storage/AlmanacDevice.php b/src/applications/almanac/storage/AlmanacDevice.php
--- a/src/applications/almanac/storage/AlmanacDevice.php
+++ b/src/applications/almanac/storage/AlmanacDevice.php
@@ -22,7 +22,8 @@
public static function initializeNewDevice() {
return id(new AlmanacDevice())
->setViewPolicy(PhabricatorPolicies::POLICY_USER)
- ->setEditPolicy(PhabricatorPolicies::POLICY_ADMIN);
+ ->setEditPolicy(PhabricatorPolicies::POLICY_ADMIN)
+ ->attachAlmanacProperties(array());
}
public function getConfiguration() {
diff --git a/src/applications/almanac/storage/AlmanacService.php b/src/applications/almanac/storage/AlmanacService.php
--- a/src/applications/almanac/storage/AlmanacService.php
+++ b/src/applications/almanac/storage/AlmanacService.php
@@ -21,7 +21,8 @@
public static function initializeNewService() {
return id(new AlmanacService())
->setViewPolicy(PhabricatorPolicies::POLICY_USER)
- ->setEditPolicy(PhabricatorPolicies::POLICY_ADMIN);
+ ->setEditPolicy(PhabricatorPolicies::POLICY_ADMIN)
+ ->attachAlmanacProperties(array());
}
public function getConfiguration() {
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Mar 13, 1:28 AM (1 w, 6 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7339957
Default Alt Text
D10862.id.diff (8 KB)
Attached To
Mode
D10862: Add almanac.queryservices Conduit API method
Attached
Detach File
Event Timeline
Log In to Comment