Changeset View
Changeset View
Standalone View
Standalone View
src/applications/conduit/controller/PhabricatorConduitController.php
| Show All 18 Lines | protected function buildSideNavView() { | ||||
| return $nav; | return $nav; | ||||
| } | } | ||||
| public function buildApplicationMenu() { | public function buildApplicationMenu() { | ||||
| return $this->buildSideNavView()->getMenu(); | return $this->buildSideNavView()->getMenu(); | ||||
| } | } | ||||
| protected function renderExampleBox(ConduitAPIMethod $method, $params) { | |||||
| $arc_example = id(new PHUIPropertyListView()) | |||||
| ->addRawContent($this->renderExample($method, 'arc', $params)); | |||||
| $curl_example = id(new PHUIPropertyListView()) | |||||
| ->addRawContent($this->renderExample($method, 'curl', $params)); | |||||
| $php_example = id(new PHUIPropertyListView()) | |||||
| ->addRawContent($this->renderExample($method, 'php', $params)); | |||||
| $panel_link = phutil_tag( | |||||
| 'a', | |||||
| array( | |||||
| 'href' => '/settings/panel/apitokens/', | |||||
| ), | |||||
| pht('Conduit API Tokens')); | |||||
| $panel_link = phutil_tag('strong', array(), $panel_link); | |||||
| $messages = array( | |||||
| pht( | |||||
| 'Use the %s panel in Settings to generate or manage API tokens.', | |||||
| $panel_link), | |||||
| ); | |||||
| $info_view = id(new PHUIInfoView()) | |||||
| ->setErrors($messages) | |||||
| ->setSeverity(PHUIInfoView::SEVERITY_NOTICE); | |||||
| return id(new PHUIObjectBoxView()) | |||||
| ->setHeaderText(pht('Examples')) | |||||
| ->setInfoView($info_view) | |||||
| ->addPropertyList($arc_example, pht('arc call-conduit')) | |||||
| ->addPropertyList($curl_example, pht('cURL')) | |||||
| ->addPropertyList($php_example, pht('PHP')); | |||||
| } | |||||
| private function renderExample( | |||||
| ConduitAPIMethod $method, | |||||
| $kind, | |||||
| $params) { | |||||
| switch ($kind) { | |||||
| case 'arc': | |||||
| $example = $this->buildArcanistExample($method, $params); | |||||
| break; | |||||
| case 'php': | |||||
| $example = $this->buildPHPExample($method, $params); | |||||
| break; | |||||
| case 'curl': | |||||
| $example = $this->buildCURLExample($method, $params); | |||||
| break; | |||||
| default: | |||||
| throw new Exception(pht('Conduit client "%s" is not known.', $kind)); | |||||
| } | |||||
| return $example; | |||||
| } | |||||
| private function buildArcanistExample( | |||||
| ConduitAPIMethod $method, | |||||
| $params) { | |||||
| $parts = array(); | |||||
| $parts[] = '$ echo '; | |||||
| if ($params === null) { | |||||
| $parts[] = phutil_tag('strong', array(), '<json-parameters>'); | |||||
| } else { | |||||
| $params = $this->simplifyParams($params); | |||||
| $params = id(new PhutilJSON())->encodeFormatted($params); | |||||
| $params = trim($params); | |||||
| $params = csprintf('%s', $params); | |||||
| $parts[] = phutil_tag('strong', array('class' => 'real'), $params); | |||||
| } | |||||
| $parts[] = ' | '; | |||||
| $parts[] = 'arc call-conduit '; | |||||
| $parts[] = '--conduit-uri '; | |||||
| $parts[] = phutil_tag( | |||||
| 'strong', | |||||
| array('class' => 'real'), | |||||
| PhabricatorEnv::getURI('/')); | |||||
| $parts[] = ' '; | |||||
| $parts[] = '--conduit-token '; | |||||
| $parts[] = phutil_tag('strong', array(), '<conduit-token>'); | |||||
| $parts[] = ' '; | |||||
| $parts[] = $method->getAPIMethodName(); | |||||
| return $this->renderExampleCode($parts); | |||||
| } | |||||
| private function buildPHPExample( | |||||
| ConduitAPIMethod $method, | |||||
| $params) { | |||||
| $parts = array(); | |||||
| $libphutil_path = 'path/to/libphutil/src/__phutil_library_init__.php'; | |||||
| $parts[] = '<?php'; | |||||
| $parts[] = "\n\n"; | |||||
| $parts[] = 'require_once '; | |||||
| $parts[] = phutil_var_export($libphutil_path, true); | |||||
| $parts[] = ";\n\n"; | |||||
| $parts[] = '$api_token = "'; | |||||
| $parts[] = phutil_tag('strong', array(), pht('<api-token>')); | |||||
| $parts[] = "\";\n"; | |||||
| $parts[] = '$api_parameters = '; | |||||
| if ($params === null) { | |||||
| $parts[] = 'array('; | |||||
| $parts[] = phutil_tag('strong', array(), pht('<parameters>')); | |||||
| $parts[] = ');'; | |||||
| } else { | |||||
| $params = $this->simplifyParams($params); | |||||
| $params = phutil_var_export($params, true); | |||||
| $parts[] = phutil_tag('strong', array('class' => 'real'), $params); | |||||
| $parts[] = ';'; | |||||
| } | |||||
| $parts[] = "\n\n"; | |||||
| $parts[] = '$client = new ConduitClient('; | |||||
| $parts[] = phutil_tag( | |||||
| 'strong', | |||||
| array('class' => 'real'), | |||||
| phutil_var_export(PhabricatorEnv::getURI('/'), true)); | |||||
| $parts[] = ");\n"; | |||||
| $parts[] = '$client->setConduitToken($api_token);'; | |||||
| $parts[] = "\n\n"; | |||||
| $parts[] = '$result = $client->callMethodSynchronous('; | |||||
| $parts[] = phutil_tag( | |||||
| 'strong', | |||||
| array('class' => 'real'), | |||||
| phutil_var_export($method->getAPIMethodName(), true)); | |||||
| $parts[] = ', '; | |||||
| $parts[] = '$api_parameters'; | |||||
| $parts[] = ");\n"; | |||||
| $parts[] = 'print_r($result);'; | |||||
| return $this->renderExampleCode($parts); | |||||
| } | |||||
| private function buildCURLExample( | |||||
| ConduitAPIMethod $method, | |||||
| $params) { | |||||
| $call_uri = '/api/'.$method->getAPIMethodName(); | |||||
| $parts = array(); | |||||
| $linebreak = array('\\', phutil_tag('br'), ' '); | |||||
| $parts[] = '$ curl '; | |||||
| $parts[] = phutil_tag( | |||||
| 'strong', | |||||
| array('class' => 'real'), | |||||
| csprintf('%R', PhabricatorEnv::getURI($call_uri))); | |||||
| $parts[] = ' '; | |||||
| $parts[] = $linebreak; | |||||
| $parts[] = '-d api.token='; | |||||
| $parts[] = phutil_tag('strong', array(), 'api-token'); | |||||
| $parts[] = ' '; | |||||
| $parts[] = $linebreak; | |||||
| if ($params === null) { | |||||
| $parts[] = '-d '; | |||||
| $parts[] = phutil_tag('strong', array(), 'param'); | |||||
| $parts[] = '='; | |||||
| $parts[] = phutil_tag('strong', array(), 'value'); | |||||
| $parts[] = ' '; | |||||
| $parts[] = $linebreak; | |||||
| $parts[] = phutil_tag('strong', array(), '...'); | |||||
| } else { | |||||
| $lines = array(); | |||||
| $params = $this->simplifyParams($params); | |||||
| foreach ($params as $key => $value) { | |||||
| $pieces = $this->getQueryStringParts(null, $key, $value); | |||||
| foreach ($pieces as $piece) { | |||||
| $lines[] = array( | |||||
| '-d ', | |||||
| phutil_tag('strong', array('class' => 'real'), $piece), | |||||
| ); | |||||
| } | |||||
| } | |||||
| $parts[] = phutil_implode_html(array(' ', $linebreak), $lines); | |||||
| } | |||||
| return $this->renderExampleCode($parts); | |||||
| } | |||||
| private function renderExampleCode($example) { | |||||
| require_celerity_resource('conduit-api-css'); | |||||
| return phutil_tag( | |||||
| 'div', | |||||
| array( | |||||
| 'class' => 'PhabricatorMonospaced conduit-api-example-code', | |||||
| ), | |||||
| $example); | |||||
| } | |||||
| private function simplifyParams(array $params) { | |||||
| foreach ($params as $key => $value) { | |||||
| if ($value === null) { | |||||
| unset($params[$key]); | |||||
| } | |||||
| } | |||||
| return $params; | |||||
| } | |||||
| private function getQueryStringParts($prefix, $key, $value) { | |||||
| if ($prefix === null) { | |||||
| $head = phutil_escape_uri($key); | |||||
| } else { | |||||
| $head = $prefix.'['.phutil_escape_uri($key).']'; | |||||
| } | |||||
| if (!is_array($value)) { | |||||
| return array( | |||||
| $head.'='.phutil_escape_uri($value), | |||||
| ); | |||||
| } | |||||
| $results = array(); | |||||
| foreach ($value as $subkey => $subvalue) { | |||||
| $subparts = $this->getQueryStringParts($head, $subkey, $subvalue); | |||||
| foreach ($subparts as $subpart) { | |||||
| $results[] = $subpart; | |||||
| } | |||||
| } | |||||
| return $results; | |||||
| } | |||||
| } | } | ||||