Page MenuHomePhabricator

D10862.id.diff
No OneTemporary

D10862.id.diff

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

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)

Event Timeline