repod/lib/Service/SearchProvider.php
Michel Roux c951a93b8c
All checks were successful
repod / xml (push) Successful in 16s
repod / php (push) Successful in 57s
repod / nodejs (push) Successful in 2m8s
repod / release (push) Has been skipped
feat: add unified search integration
2024-01-18 11:43:58 +01:00

66 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace OCA\RePod\Service;
use OCA\RePod\AppInfo\Application;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\Search\IProvider;
use OCP\Search\ISearchQuery;
use OCP\Search\SearchResult;
use OCP\Search\SearchResultEntry;
class SearchProvider implements IProvider
{
public function __construct(
private IL10N $l10n,
private IURLGenerator $urlGenerator,
private MultiPodService $multiPodService
) {}
public function getId(): string {
return Application::APP_ID;
}
public function getName(): string {
return $this->l10n->t('Podcasts');
}
public function getOrder(string $route, array $routeParameters): ?int {
if (0 === strpos($route, Application::APP_ID.'.')) {
// Active app, prefer my results
return -1;
}
return 25;
}
public function search(IUser $user, ISearchQuery $query): SearchResult {
$podcasts = $this->multiPodService->search($query->getTerm());
$searchResults = [];
foreach ($podcasts as $podcast) {
$title = $podcast->getTitle();
$link = $podcast->getLink();
if ($title && $link) {
$searchResults[] = new SearchResultEntry(
$podcast->getImageUrl() ?? $this->urlGenerator->linkTo(Application::APP_ID, 'img/app.svg'),
$title,
$podcast->getAuthor() ?? '',
$this->urlGenerator->linkToRoute('repod.page.index').'/#/'.urlencode(base64_encode($link)),
$this->urlGenerator->linkTo(Application::APP_ID, 'img/app.svg')
);
}
}
return SearchResult::complete(
$this->l10n->t('Podcasts'),
$searchResults
);
}
}