Page MenuHomePhabricator

D14889.diff
No OneTemporary

D14889.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
@@ -3747,6 +3747,7 @@
'ProjectRemarkupRule' => 'applications/project/remarkup/ProjectRemarkupRule.php',
'ProjectRemarkupRuleTestCase' => 'applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php',
'ProjectReplyHandler' => 'applications/project/mail/ProjectReplyHandler.php',
+ 'ProjectSearchConduitAPIMethod' => 'applications/project/conduit/ProjectSearchConduitAPIMethod.php',
'QueryFormattingTestCase' => 'infrastructure/storage/__tests__/QueryFormattingTestCase.php',
'ReleephAuthorFieldSpecification' => 'applications/releeph/field/specification/ReleephAuthorFieldSpecification.php',
'ReleephBranch' => 'applications/releeph/storage/ReleephBranch.php',
@@ -7146,6 +7147,7 @@
'PhabricatorCustomFieldInterface',
'PhabricatorDestructibleInterface',
'PhabricatorFulltextInterface',
+ 'PhabricatorConduitResultInterface',
),
'PhabricatorProjectAddHeraldAction' => 'PhabricatorProjectHeraldAction',
'PhabricatorProjectApplication' => 'PhabricatorApplication',
@@ -8296,6 +8298,7 @@
'ProjectRemarkupRule' => 'PhabricatorObjectRemarkupRule',
'ProjectRemarkupRuleTestCase' => 'PhabricatorTestCase',
'ProjectReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
+ 'ProjectSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
'QueryFormattingTestCase' => 'PhabricatorTestCase',
'ReleephAuthorFieldSpecification' => 'ReleephFieldSpecification',
'ReleephBranch' => array(
diff --git a/src/applications/project/conduit/ProjectSearchConduitAPIMethod.php b/src/applications/project/conduit/ProjectSearchConduitAPIMethod.php
new file mode 100644
--- /dev/null
+++ b/src/applications/project/conduit/ProjectSearchConduitAPIMethod.php
@@ -0,0 +1,24 @@
+<?php
+
+final class ProjectSearchConduitAPIMethod
+ extends PhabricatorSearchEngineAPIMethod {
+
+ public function getAPIMethodName() {
+ return 'project.search';
+ }
+
+ public function newSearchEngine() {
+ return new PhabricatorProjectSearchEngine();
+ }
+
+ public function getMethodSummary() {
+ return pht('Read information about projects.');
+ }
+
+ protected function getCustomQueryMaps($query) {
+ return array(
+ 'slugMap' => $query->getSlugMap(),
+ );
+ }
+
+}
diff --git a/src/applications/project/storage/PhabricatorProject.php b/src/applications/project/storage/PhabricatorProject.php
--- a/src/applications/project/storage/PhabricatorProject.php
+++ b/src/applications/project/storage/PhabricatorProject.php
@@ -9,7 +9,8 @@
PhabricatorSubscribableInterface,
PhabricatorCustomFieldInterface,
PhabricatorDestructibleInterface,
- PhabricatorFulltextInterface {
+ PhabricatorFulltextInterface,
+ PhabricatorConduitResultInterface {
protected $name;
protected $status = PhabricatorProjectStatus::STATUS_ACTIVE;
@@ -525,4 +526,32 @@
return new PhabricatorProjectFulltextEngine();
}
+
+/* -( PhabricatorConduitResultInterface )---------------------------------- */
+
+
+ public function getFieldSpecificationsForConduit() {
+ return array(
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('name')
+ ->setType('string')
+ ->setDescription(pht('The name of the project.')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('slug')
+ ->setType('string')
+ ->setDescription(pht('Primary slug/hashtag.')),
+ );
+ }
+
+ public function getFieldValuesForConduit() {
+ return array(
+ 'name' => $this->getName(),
+ 'slug' => $this->getPrimarySlug(),
+ );
+ }
+
+ public function getConduitSearchAttachments() {
+ return array();
+ }
+
}
diff --git a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
--- a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
+++ b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
@@ -1081,7 +1081,9 @@
return $fields;
}
- public function buildConduitResponse(ConduitAPIRequest $request) {
+ public function buildConduitResponse(
+ ConduitAPIRequest $request,
+ ConduitAPIMethod $method) {
$viewer = $this->requireViewer();
$query_key = $request->getValue('queryKey');
@@ -1172,6 +1174,12 @@
$attachment_specs[$key]);
}
+ // If this is empty, we still want to emit a JSON object, not a
+ // JSON list.
+ if (!$attachment_map) {
+ $attachment_map = (object)$attachment_map;
+ }
+
$id = (int)$object->getID();
$phid = $object->getPHID();
@@ -1187,6 +1195,7 @@
return array(
'data' => $data,
+ 'maps' => $method->getQueryMaps($query),
'query' => array(
'queryKey' => $saved_query->getQueryKey(),
),
diff --git a/src/applications/search/engine/PhabricatorSearchEngineAPIMethod.php b/src/applications/search/engine/PhabricatorSearchEngineAPIMethod.php
--- a/src/applications/search/engine/PhabricatorSearchEngineAPIMethod.php
+++ b/src/applications/search/engine/PhabricatorSearchEngineAPIMethod.php
@@ -5,6 +5,23 @@
abstract public function newSearchEngine();
+ final public function getQueryMaps($query) {
+ $maps = $this->getCustomQueryMaps($query);
+
+ // Make sure we emit empty maps as objects, not lists.
+ foreach ($maps as $key => $map) {
+ if (!$map) {
+ $maps[$key] = (object)$map;
+ }
+ }
+
+ return $maps;
+ }
+
+ protected function getCustomQueryMaps($query) {
+ return array();
+ }
+
public function getApplication() {
$engine = $this->newSearchEngine();
$class = $engine->getApplicationClassName();
@@ -36,7 +53,7 @@
$engine = $this->newSearchEngine()
->setViewer($request->getUser());
- return $engine->buildConduitResponse($request);
+ return $engine->buildConduitResponse($request, $this);
}
final public function getMethodDescription() {

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 24, 12:16 PM (1 d, 5 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7716981
Default Alt Text
D14889.diff (6 KB)

Event Timeline