Skip to content

Commit 3aa536e

Browse files
committed
feat(search): added routes, controllers and view for OpenSearch
1 parent 402f4de commit 3aa536e

File tree

8 files changed

+154
-0
lines changed

8 files changed

+154
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{% extends '@admin/index.twig' %}
2+
3+
{% block content %}
4+
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 mb-3 border-bottom">
5+
<h1 class="h2">
6+
<i aria-hidden="true" class="bi bi-wrench"></i>
7+
{{ 'msgAdminHeaderOpenSearch' | translate }}
8+
</h1>
9+
<div class="btn-toolbar mb-2 mb-md-0">
10+
<div class="btn-group mr-2">
11+
<button class="btn btn-outline-primary pmf-opensearch" data-action="create">
12+
<i aria-hidden="true" class="bi bi-database-fill-add"></i>
13+
{{ 'msgAdminOpenSearchCreateIndex' | translate }}
14+
</button>
15+
16+
<button class="btn btn-outline-success pmf-opensearch" data-action="import">
17+
<i aria-hidden="true" class="bi bi-database-fill-gear"></i> {{ 'msgAdminOpenSearchImportIndex' | translate }}
18+
</button>
19+
20+
<button class="btn btn-outline-danger pmf-opensearch" data-action="drop">
21+
<i aria-hidden="true" class="bi bi-database-slash"></i> {{ 'msgAdminOpenSearchDropIndex' | translate }}
22+
</button>
23+
</div>
24+
</div>
25+
</div>
26+
27+
<div class="row mb-2">
28+
<div class="col-12">
29+
<div id="pmf-opensearch-result"></div>
30+
</div>
31+
</div>
32+
33+
<div class="row mb-2">
34+
<div class="col-6">
35+
<div class="card shadow">
36+
<h5 class="card-header">
37+
{{ 'msgAdminElasticsearchStats' | translate }}
38+
</h5>
39+
<div class="card-body">
40+
<div id="pmf-opensearch-stats"></div>
41+
</div>
42+
</div>
43+
</div>
44+
</div>
45+
{% endblock %}

phpmyfaq/src/admin-api-routes.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use phpMyFAQ\Controller\Administration\Api\MarkdownController;
3333
use phpMyFAQ\Controller\Administration\Api\MediaBrowserController;
3434
use phpMyFAQ\Controller\Administration\Api\NewsController;
35+
use phpMyFAQ\Controller\Administration\Api\OpenSearchController;
3536
use phpMyFAQ\Controller\Administration\Api\QuestionController;
3637
use phpMyFAQ\Controller\Administration\Api\SearchController;
3738
use phpMyFAQ\Controller\Administration\Api\SessionController;
@@ -247,6 +248,27 @@
247248
'controller' => [ElasticsearchController::class, 'statistics'],
248249
'methods' => 'GET'
249250
],
251+
// OpenSearch API
252+
'admin.api.opensearch.create' => [
253+
'path' => '/opensearch/create',
254+
'controller' => [OpenSearchController::class, 'create'],
255+
'methods' => 'POST'
256+
],
257+
'admin.api.opensearch.drop' => [
258+
'path' => '/opensearch/drop',
259+
'controller' => [OpenSearchController::class, 'drop'],
260+
'methods' => 'POST'
261+
],
262+
'admin.api.opensearch.import' => [
263+
'path' => '/opensearch/import',
264+
'controller' => [OpenSearchController::class, 'import'],
265+
'methods' => 'POST'
266+
],
267+
'admin.api.opensearch.statistics' => [
268+
'path' => '/opensearch/statistics',
269+
'controller' => [OpenSearchController::class, 'statistics'],
270+
'methods' => 'GET'
271+
],
250272
// Export API
251273
'admin.api.export.file' => [
252274
'path' => '/export/file',

phpmyfaq/src/admin-routes.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use phpMyFAQ\Controller\Administration\InstanceController;
3434
use phpMyFAQ\Controller\Administration\NewsController;
3535
use phpMyFAQ\Controller\Administration\OpenQuestionsController;
36+
use phpMyFAQ\Controller\Administration\OpenSearchController;
3637
use phpMyFAQ\Controller\Administration\OrphanedFaqsController;
3738
use phpMyFAQ\Controller\Administration\PasswordChangeController;
3839
use phpMyFAQ\Controller\Administration\PluginController;
@@ -214,6 +215,11 @@
214215
'controller' => [ElasticsearchController::class, 'index'],
215216
'methods' => 'GET'
216217
],
218+
'admin.opensearch' => [
219+
'path' => '/opensearch',
220+
'controller' => [OpenSearchController::class, 'index'],
221+
'methods' => 'GET'
222+
],
217223
'admin.export' => [
218224
'path' => '/export',
219225
'controller' => [ExportController::class, 'index'],

phpmyfaq/src/phpMyFAQ/Controller/Administration/AbstractAdministrationController.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,13 @@ private function getSecondLevelEntries(Helper $adminHelper): array
240240
'elasticsearch'
241241
);
242242
}
243+
if ($this->configuration->get('search.enableOpenSearch')) {
244+
$secLevelEntries['config'] .= $adminHelper->addMenuEntry(
245+
PermissionType::CONFIGURATION_EDIT->value,
246+
'msgAdminHeaderOpenSearch',
247+
'opensearch'
248+
);
249+
}
243250
$secLevelEntries['config'] .= $adminHelper->addMenuEntry(
244251
PermissionType::CONFIGURATION_EDIT->value,
245252
'ad_system_info',
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace phpMyFAQ\Controller\Administration\Api;
4+
5+
use phpMyFAQ\Controller\AbstractController;
6+
7+
class OpenSearchController extends AbstractController
8+
{
9+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/**
4+
* The Administration Elasticsearch Controller
5+
*
6+
* This Source Code Form is subject to the terms of the Mozilla Public License,
7+
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
8+
* obtain one at https://mozilla.org/MPL/2.0/.
9+
*
10+
* @package phpMyFAQ
11+
* @author Thorsten Rinne <[email protected]>
12+
* @copyright 2025 phpMyFAQ Team
13+
* @license https://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
14+
* @link https://www.phpmyfaq.de
15+
* @since 2025-05-09
16+
*/
17+
18+
namespace phpMyFAQ\Controller\Administration;
19+
20+
use phpMyFAQ\Core\Exception;
21+
use phpMyFAQ\Enums\PermissionType;
22+
use Symfony\Component\HttpFoundation\Request;
23+
use Symfony\Component\HttpFoundation\Response;
24+
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
25+
use Symfony\Component\Routing\Attribute\Route;
26+
use Twig\Error\LoaderError;
27+
28+
class OpenSearchController extends AbstractAdministrationController
29+
{
30+
/**
31+
* @throws LoaderError
32+
* @throws Exception
33+
*/
34+
#[Route('/opensearch', name: 'admin.opensearch', methods: ['GET'])]
35+
public function index(Request $request): Response
36+
{
37+
$this->userHasPermission(PermissionType::CONFIGURATION_EDIT);
38+
39+
if (!$this->configuration->get('search.enableOpenSearch')) {
40+
throw new UnauthorizedHttpException('You are not allowed to access this page.');
41+
}
42+
43+
return $this->render(
44+
'@admin/configuration/opensearch.twig',
45+
[
46+
... $this->getHeader($request),
47+
... $this->getFooter(),
48+
]
49+
);
50+
}
51+
}

phpmyfaq/translations/language_de.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,5 +1480,12 @@
14801480
$PMF_LANG['msgAuthenticationAborted'] = 'Die Authentifizierung wurde abgebrochen.';
14811481
$LANG_CONF['security.enableAdminSessionTimeoutCounter'] = ['checkbox', 'Aktiviere den Session-Timeout-Zähler im Adminbereich', 'Standard: aktiviert'];
14821482
$LANG_CONF['search.enableOpenSearch'] = ['checkbox', 'Aktiviere OpenSearch Unterstützung', 'Standard: deaktiviert'];
1483+
$PMF_LANG['msgAdminHeaderOpenSearch'] = 'OpenSearch Konfiguration';
1484+
$PMF_LANG['msgAdminOpenSearchCreateIndex'] = 'Erstelle Suchindex';
1485+
$PMF_LANG['msgAdminOpenSearchDropIndex'] = 'Lösche Suchindex';
1486+
$PMF_LANG['msgAdminOpenSearchImportIndex'] = 'Komplett-Import';
1487+
$PMF_LANG['msgAdminOpenSearchCreateIndex_success'] = 'Der OpenSearch Suchindex erfolgreich erstellt.';
1488+
$PMF_LANG['ad_os_create_import_success'] = 'Der OpenSearch Import war erfolgreich.';
1489+
$PMF_LANG['msgAdminOpenSearchDropIndex_success'] = 'Der OpenSearch Suchindex erfolgreich gelöscht.';
14831490

14841491
return $PMF_LANG;

phpmyfaq/translations/language_en.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,5 +1499,12 @@
14991499
$PMF_LANG['msgAuthenticationAborted'] = 'Authentication aborted by user.';
15001500
$LANG_CONF['security.enableAdminSessionTimeoutCounter'] = ['checkbox', 'Activate admin session timeout counter', 'Default: enabled'];
15011501
$LANG_CONF['search.enableOpenSearch'] = ['checkbox', 'Enable OpenSearch support', 'Standard: disabled'];
1502+
$PMF_LANG['msgAdminHeaderOpenSearch'] = 'OpenSearch Configuration';
1503+
$PMF_LANG['msgAdminOpenSearchCreateIndex'] = 'Create Search Index';
1504+
$PMF_LANG['msgAdminOpenSearchDropIndex'] = 'Delete Search Index';
1505+
$PMF_LANG['msgAdminOpenSearchImportIndex'] = 'Complete Import';
1506+
$PMF_LANG['msgAdminOpenSearchCreateIndex_success'] = 'The OpenSearch search index was successfully created.';
1507+
$PMF_LANG['ad_os_create_import_success'] = 'The OpenSearch import was successful.';
1508+
$PMF_LANG['msgAdminOpenSearchDropIndex_success'] = 'The OpenSearch search index was successfully deleted.';
15021509

15031510
return $PMF_LANG;

0 commit comments

Comments
 (0)