Skip to content

Commit

Permalink
add provider for Nextcloud's unified search
Browse files Browse the repository at this point in the history
  • Loading branch information
korelstar committed Oct 1, 2020
1 parent 4ff70c7 commit 46a6bd1
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 0 deletions.
1 change: 1 addition & 0 deletions css/global.scss
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
@include icon-black-white('notes', 'notes', 1);
@include icon-black-white('notes-trans', 'notes', 1);
1 change: 1 addition & 0 deletions img/notes-trans.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public function __construct(array $urlParams = []) {

public function register(IRegistrationContext $context): void {
$context->registerCapability(Capabilities::class);
$context->registerSearchProvider(SearchProvider::class);
$context->registerDashboardWidget(DashboardWidget::class);
$context->registerEventListener(
BeforeTemplateRenderedEvent::class,
Expand Down
84 changes: 84 additions & 0 deletions lib/AppInfo/SearchProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?php

declare(strict_types=1);

namespace OCA\Notes\AppInfo;

use OCA\Notes\Service\Note;
use OCA\Notes\Service\NotesService;
use OCA\Notes\Service\Util;

use OCP\IUser;
use OCP\IURLGenerator;
use OCP\Search\IProvider;
use OCP\Search\ISearchQuery;
use OCP\Search\SearchResult;
use OCP\Search\SearchResultEntry;

class SearchProvider implements IProvider {

/** @var Util */
private $util;
/** @var NotesService */
private $notesService;
/** @var IURLGenerator */
private $url;

public function __construct(
Util $util,
NotesService $notesService,
IURLGenerator $url
) {
$this->util = $util;
$this->notesService = $notesService;
$this->url = $url;
}


public function getId(): string {
return Application::APP_ID;
}

public function getName(): string {
return $this->util->l10n->t('Notes');
}

public function getOrder(string $route, array $routeParameters): int {
if (strpos($route, 'files' . '.') === 0) {
return 25;
} elseif (strpos($route, Application::APP_ID . '.') === 0) {
return -1;
}
return 4;
}

public function search(IUser $user, ISearchQuery $query): SearchResult {
$notes = $this->notesService->search($user->getUID(), $query->getTerm());
// sort by modified time
usort($notes, function (Note $a, Note $b) {
return $b->getModified() - $a->getModified();
});
// create SearchResultEntry from Note
$result = array_map(
function (Note $note) : SearchResultEntry {
$excerpt = $note->getCategory();
try {
$excerpt = $note->getExcerpt();
} catch (\Throwable $e) {
}
return new SearchResultEntry(
'',
$note->getTitle(),
$excerpt,
$this->url->linkToRouteAbsolute('notes.page.index') . 'note/'.$note->getId(),
'icon-notes-trans'
);
},
$notes
);
return SearchResult::complete(
$this->getName(),
$result
);
}
}
33 changes: 33 additions & 0 deletions lib/Service/NotesService.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,39 @@ public function get(string $userId, int $id) : Note {
return $note;
}

public function search(string $userId, string $search) : array {
$terms = preg_split('/\s+/', $search);
$notes = $this->getAll($userId)['notes'];
return array_values(array_filter(
$notes,
function (Note $note) use ($terms) : bool {
return $this->searchTermsInNote($note, $terms);
}
));
}
private function searchTermsInNote(Note $note, array $terms) : bool {
try {
$d = $note->getData();
$strings = [ $d['title'], $d['category'], $d['content'] ];
foreach ($terms as $term) {
if (!$this->searchTermInData($strings, $term)) {
return false;
}
}
return true;
} catch (\Throwable $e) {
return false;
}
}
private function searchTermInData(array $strings, string $term) : bool {
foreach ($strings as $str) {
if (stripos($str, $term) !== false) {
return true;
}
}
return false;
}


/**
* @throws \OCP\Files\NotPermittedException
Expand Down

0 comments on commit 46a6bd1

Please sign in to comment.