Skip to content

Commit

Permalink
make Forms available in unified search
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Hartmann <[email protected]>
  • Loading branch information
Chartman123 committed Jan 4, 2025
1 parent 7afb7e2 commit 470810c
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 2 deletions.
2 changes: 2 additions & 0 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use OCA\Forms\FormsMigrator;
use OCA\Forms\Listener\AnalyticsDatasourceListener;
use OCA\Forms\Listener\UserDeletedListener;
use OCA\Forms\Search\SearchProvider;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
Expand Down Expand Up @@ -42,6 +43,7 @@ public function register(IRegistrationContext $context): void {
$context->registerCapability(Capabilities::class);
$context->registerEventListener(UserDeletedEvent::class, UserDeletedListener::class);
$context->registerEventListener(DatasourceEvent::class, AnalyticsDatasourceListener::class);
$context->registerSearchProvider(SearchProvider::class);

Check warning on line 46 in lib/AppInfo/Application.php

View check run for this annotation

Codecov / codecov/patch

lib/AppInfo/Application.php#L46

Added line #L46 was not covered by tests
$context->registerUserMigrator(FormsMigrator::class);
}

Expand Down
16 changes: 14 additions & 2 deletions lib/Db/FormMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,10 @@ public function findByHash(string $hash): Form {
* @param string[] $groups IDs of groups the user is memeber of
* @param string[] $teams IDs of teams the user is memeber of
* @param bool $filterShown Set to false to also include forms shared but not visible on sidebar
* @param string $queryTerm optional: The search query for universal search
* @return Form[]
*/
public function findSharedForms(string $userId, array $groups = [], array $teams = [], bool $filterShown = true): array {
public function findSharedForms(string $userId, array $groups = [], array $teams = [], bool $filterShown = true, ?string $queryTerm = null): array {
$qbShares = $this->db->getQueryBuilder();
$qbForms = $this->db->getQueryBuilder();

Expand Down Expand Up @@ -156,16 +157,22 @@ public function findSharedForms(string $userId, array $groups = [], array $teams
->addOrderBy('last_updated', 'DESC')
->addOrderBy('created', 'DESC');

if ($queryTerm) {
$qbForms->andWhere($qbForms->expr()->like('title', $qbForms->createNamedParameter('%' . $queryTerm . '%')) .
' OR ' . $qbForms->expr()->like('description', $qbForms->createNamedParameter('%' . $queryTerm . '%')));

Check warning on line 162 in lib/Db/FormMapper.php

View check run for this annotation

Codecov / codecov/patch

lib/Db/FormMapper.php#L161-L162

Added lines #L161 - L162 were not covered by tests
}

// We need to add the parameters from the shared forms IDs select to the final select query
$qbForms->setParameters($qbShares->getParameters(), $qbShares->getParameterTypes());

return $this->findEntities($qbForms);
}

/**
* @param string $queryTerm optional: The search query for universal search
* @return Form[]
*/
public function findAllByOwnerId(string $ownerId): array {
public function findAllByOwnerId(string $ownerId, ?string $queryTerm = null): array {

Check warning on line 175 in lib/Db/FormMapper.php

View check run for this annotation

Codecov / codecov/patch

lib/Db/FormMapper.php#L175

Added line #L175 was not covered by tests
$qb = $this->db->getQueryBuilder();

$qb->select('*')
Expand All @@ -177,6 +184,11 @@ public function findAllByOwnerId(string $ownerId): array {
->addOrderBy('last_updated', 'DESC')
->addOrderBy('created', 'DESC');

if ($queryTerm) {
$qb->andWhere($qb->expr()->like('title', $qb->createNamedParameter('%' . $queryTerm . '%')) .
' OR ' . $qb->expr()->like('description', $qb->createNamedParameter('%' . $queryTerm . '%')));

Check warning on line 189 in lib/Db/FormMapper.php

View check run for this annotation

Codecov / codecov/patch

lib/Db/FormMapper.php#L187-L189

Added lines #L187 - L189 were not covered by tests
}

return $this->findEntities($qb);
}

Expand Down
18 changes: 18 additions & 0 deletions lib/Search/FormsSearchResultEntry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

namespace OCA\Forms\Search;

use OCA\Forms\Db\Form;
use OCP\Search\SearchResultEntry;

class FormsSearchResultEntry extends SearchResultEntry {
public function __construct(Form $form, string $formUrl) {
parent::__construct('', $form->getTitle(), $form->getDescription(), $formUrl, 'forms-dark');

Check warning on line 16 in lib/Search/FormsSearchResultEntry.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/FormsSearchResultEntry.php#L15-L16

Added lines #L15 - L16 were not covered by tests
}
}
68 changes: 68 additions & 0 deletions lib/Search/SearchProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

namespace OCA\Forms\Search;

use OCA\Forms\AppInfo\Application;
use OCA\Forms\Db\Form;
use OCA\Forms\Service\FormsService;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\Search\IProvider;
use OCP\Search\ISearchQuery;
use OCP\Search\SearchResult;

class SearchProvider implements IProvider {
/**
* @psalm-suppress PossiblyUnusedMethod
*/
public function __construct(

Check warning on line 25 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L25

Added line #L25 was not covered by tests
private IL10N $l10n,
private IURLGenerator $urlGenerator,
private FormsService $formsService,
) {
}

Check warning on line 30 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L30

Added line #L30 was not covered by tests

public function getId(): string {
return 'forms';

Check warning on line 33 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L32-L33

Added lines #L32 - L33 were not covered by tests
}

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

Check warning on line 37 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L36-L37

Added lines #L36 - L37 were not covered by tests
}

public function search(IUser $user, ISearchQuery $query): SearchResult {
$forms = $this->formsService->search($query);

Check warning on line 41 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L40-L41

Added lines #L40 - L41 were not covered by tests

$results = array_map(function (Form $form) {
$formUrl = $this->urlGenerator->linkToRoute('forms.page.views', ['hash' => $form->getHash(), 'view' => 'submit']);
return [
'object' => $form,
'entry' => new FormsSearchResultEntry($form, $formUrl)
];
}, $forms);

Check warning on line 49 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L43-L49

Added lines #L43 - L49 were not covered by tests

$resultEntries = array_map(function (array $result) {
return $result['entry'];
}, $results);

Check warning on line 53 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L51-L53

Added lines #L51 - L53 were not covered by tests

return SearchResult::complete(
$this->l10n->t('Forms'),
$resultEntries
);

Check warning on line 58 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L55-L58

Added lines #L55 - L58 were not covered by tests
}

public function getOrder(string $route, array $routeParameters): int {
if (str_contains($route, Application::APP_ID)) {

Check warning on line 62 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L61-L62

Added lines #L61 - L62 were not covered by tests
// Active app, prefer my results
return -1;

Check warning on line 64 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L64

Added line #L64 was not covered by tests
}
return 77;

Check warning on line 66 in lib/Search/SearchProvider.php

View check run for this annotation

Codecov / codecov/patch

lib/Search/SearchProvider.php#L66

Added line #L66 was not covered by tests
}
}
28 changes: 28 additions & 0 deletions lib/Service/FormsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Search\ISearchQuery;
use OCP\Security\ISecureRandom;
use OCP\Share\IShare;

Expand Down Expand Up @@ -698,6 +699,33 @@ public function areExtraSettingsValid(array $extraSettings, string $questionType
return true;
}

/**
* Get list of forms
*
* @param ISearchQuery $query the query to search the forms
* @return Form[] list of forms that match the query
*/
public function search(ISearchQuery $query): array {
$formsList = [];
$groups = $this->groupManager->getUserGroupIds($this->currentUser);
$teams = $this->circlesService->getUserTeamIds($this->currentUser->getUID());

Check warning on line 711 in lib/Service/FormsService.php

View check run for this annotation

Codecov / codecov/patch

lib/Service/FormsService.php#L708-L711

Added lines #L708 - L711 were not covered by tests

try {
$ownedForms = $this->formMapper->findAllByOwnerId($this->currentUser->getUID(), $query->getTerm());
$sharedForms = $this->formMapper->findSharedForms(
$this->currentUser->getUID(),
$groups,
$teams,
true,
$query->getTerm()
);
$formsList = array_merge($ownedForms, $sharedForms);
} catch (DoesNotExistException $e) {

Check warning on line 723 in lib/Service/FormsService.php

View check run for this annotation

Codecov / codecov/patch

lib/Service/FormsService.php#L714-L723

Added lines #L714 - L723 were not covered by tests
// silent catch
}
return $formsList;

Check warning on line 726 in lib/Service/FormsService.php

View check run for this annotation

Codecov / codecov/patch

lib/Service/FormsService.php#L726

Added line #L726 was not covered by tests
}

public function getFilePath(Form $form): ?string {
$fileId = $form->getFileId();

Expand Down

0 comments on commit 470810c

Please sign in to comment.