Files

161 lines
5.3 KiB
PHP
Executable File

<?php
/**
* @author Amasty Team
* @copyright Copyright (c) Amasty (https://www.amasty.com)
* @package Elastic Search Base for Magento 2
*/
namespace Amasty\ElasticSearch\Controller\Adminhtml\Config\Checker;
use Amasty\ElasticSearch\Exception\Missing404Exception;
use Amasty\ElasticSearch\Model\Client\ClientFactory;
use Amasty\ElasticSearch\Model\Client\ClientInterface;
use Amasty\ElasticSearch\Model\Config;
use Amasty\ElasticSearch\Model\GetAmastySearchEngines;
use Amasty\ElasticSearch\Model\Source\CustomAnalyzer;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Filter\StripTags;
class Connection extends Action
{
public const ADMIN_RESOURCE = 'Amasty_ElasticSearch::config';
public const EXCEPTION_PATTERN = '/unknown analyzer/i';
public const IS_READ_ONLY_INDEX = 'amasty_is_read_only_flag';
public const CUSTOM_ANALYZER_TEST_INDEX_NAME = 'amasty_custom_analyzer_test_index';
/**
* @var Config
*/
private $config;
/**
* @var JsonFactory
*/
private $resultJsonFactory;
/**
* @var StripTags
*/
private $tagFilter;
/**
* @var GetAmastySearchEngines
*/
private $getAmastySearchEngines;
/**
* @var ClientFactory
*/
private $clientFactory;
public function __construct(
Context $context,
Config $config,
JsonFactory $resultJsonFactory,
StripTags $tagFilter,
GetAmastySearchEngines $getAmastySearchEngines,
ClientFactory $clientFactory
) {
parent::__construct($context);
$this->resultJsonFactory = $resultJsonFactory;
$this->tagFilter = $tagFilter;
$this->config = $config;
$this->getAmastySearchEngines = $getAmastySearchEngines;
$this->clientFactory = $clientFactory;
}
/**
* @return $this|ResponseInterface|ResultInterface
*/
public function execute()
{
$result = [
'success' => false,
'errorMessage' => '',
];
$options = $this->getRequest()->getParams();
try {
if (empty($options['engine'])
|| !in_array($options['engine'], $this->getAmastySearchEngines->execute(), true)
) {
throw new LocalizedException(
__('Test connection can be applied only for Amasty Elastic Search engine.')
);
}
$connectionData = $this->config->prepareConnectionData($options);
$client = $this->clientFactory->create($options['engine'], $connectionData);
$pingResult = $client->ping();
if ($pingResult) {
$indexPrefix = $connectionData['index'] ?? $this->config->getIndexPrefix();
$this->checkIsReadOnly($client, $indexPrefix);
if (isset($options['customAnalyzer'])
&& $options['customAnalyzer'] != CustomAnalyzer::DISABLED
) {
$customAnalyzerIndexName = $indexPrefix . '_' . self::CUSTOM_ANALYZER_TEST_INDEX_NAME;
$client->createIndex(
$customAnalyzerIndexName,
[
'analysis' => [
'analyzer' => [
'default' => ['type' => $options['customAnalyzer']]
]
]
]
);
try {
$client->deleteIndex($customAnalyzerIndexName);
} catch (Missing404Exception $e) {
;// do nothing
}
}
$result['success'] = $pingResult;
} else {
$result['errorMessage'] = __('It is impossible to perform the search.
Please make sure Elasticsearch Engine is installed on the server and configured properly.');
}
// @codingStandardsIgnoreLine
} catch (LocalizedException $e) {
$result['errorMessage'] = $e->getMessage();
} catch (\Exception $e) {
if (preg_match(self::EXCEPTION_PATTERN, $e->getMessage())) {
$result['errorMessage'] = __('To use custom analyzer you have to install matching plugin');
} else {
$result['errorMessage'] = $this->tagFilter->filter(__($e->getMessage()));
}
}
/** @var \Magento\Framework\Controller\Result\Json $resultJson */
$resultJson = $this->resultJsonFactory->create();
return $resultJson->setData($result);
}
private function checkIsReadOnly(ClientInterface $client, string $indexPrefix)
{
$testIndexName = $indexPrefix . '_' . self::IS_READ_ONLY_INDEX;
try {
$client->createIndex($testIndexName, []);
$client->deleteIndex($testIndexName);
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(
__('Please check the state of read_only_allow_delete setting in Elasticsearch server configuration.')
);
}
}
}