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 @@ + 'optional list', + 'phids' => 'optional list', + 'names' => 'optional list', + ) + self::getPagerParamTypes(); + } + + public function defineReturnType() { + return 'list'; + } + + 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() {