Files
Phraseanet/lib/Alchemy/Phrasea/WorkerManager/Controller/AdminConfigurationController.php
2020-05-12 18:06:45 +03:00

169 lines
5.4 KiB
PHP

<?php
namespace Alchemy\Phrasea\WorkerManager\Controller;
use Alchemy\Phrasea\Application as PhraseaApplication;
use Alchemy\Phrasea\Controller\Controller;
use Alchemy\Phrasea\SearchEngine\Elastic\ElasticsearchOptions;
use Alchemy\Phrasea\WorkerManager\Event\PopulateIndexEvent;
use Alchemy\Phrasea\WorkerManager\Event\WorkerEvents;
use Alchemy\Phrasea\WorkerManager\Form\WorkerConfigurationType;
use Alchemy\Phrasea\WorkerManager\Form\WorkerPullAssetsType;
use Alchemy\Phrasea\WorkerManager\Form\WorkerSearchengineType;
use Alchemy\Phrasea\WorkerManager\Model\DBManipulator;
use Alchemy\Phrasea\WorkerManager\Queue\AMQPConnection;
use Alchemy\Phrasea\WorkerManager\Queue\MessagePublisher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
class AdminConfigurationController extends Controller
{
public function indexAction(PhraseaApplication $app, Request $request)
{
return $this->render('admin/worker-manager/index.html.twig');
}
/**
* @param PhraseaApplication $app
* @param Request $request
* @return mixed
*/
public function configurationAction(PhraseaApplication $app, Request $request)
{
$retryQueueConfig = $this->getRetryQueueConfiguration();
$form = $app->form(new WorkerConfigurationType(), $retryQueueConfig);
$form->handleRequest($request);
if ($form->isValid()) {
// save config in file
$app['conf']->set(['workers', 'retry_queue'], $form->getData());
$queues = array_intersect_key(AMQPConnection::$defaultQueues, $retryQueueConfig);
$retryQueuesToReset = array_intersect_key(AMQPConnection::$defaultRetryQueues, array_flip($queues));
/** @var AMQPConnection $serverConnection */
$serverConnection = $this->app['alchemy_worker.amqp.connection'];
// change the queue TTL
$serverConnection->reinitializeQueue($retryQueuesToReset);
return $app->redirectPath('worker_admin');
}
return $this->render('admin/worker-manager/worker_configuration.html.twig', [
'form' => $form->createView()
]);
}
public function searchengineAction(PhraseaApplication $app, Request $request)
{
$options = $this->getElasticsearchOptions();
$form = $app->form(new WorkerSearchengineType(), $options);
$form->handleRequest($request);
if ($form->isValid()) {
$populateInfo = $this->getData($form);
$this->getDispatcher()->dispatch(WorkerEvents::POPULATE_INDEX, new PopulateIndexEvent($populateInfo));
return $app->redirectPath('worker_admin');
}
return $this->render('admin/worker-manager/worker_searchengine.html.twig', [
'form' => $form->createView()
]);
}
public function subviewAction(PhraseaApplication $app)
{
return $this->render('admin/worker-manager/worker_subview.html.twig', [
]);
}
public function metadataAction(PhraseaApplication $app)
{
return $this->render('admin/worker-manager/worker_metadata.html.twig', [
]);
}
public function populateStatusAction(PhraseaApplication $app, Request $request)
{
$databoxIds = $request->get('sbasIds');
return DBManipulator::checkPopulateIndexStatusByDataboxId($databoxIds);
}
public function pullAssetsAction(PhraseaApplication $app, Request $request)
{
$pullAssetsConfig = $this->getPullAssetsConfiguration();
$form = $app->form(new WorkerPullAssetsType(), $pullAssetsConfig);
$form->handleRequest($request);
if ($form->isValid()) {
/** @var AMQPConnection $serverConnection */
$serverConnection = $this->app['alchemy_worker.amqp.connection'];
$serverConnection->setQueue(MessagePublisher::PULL_QUEUE);
// save new pull config
$app['conf']->set(['workers', 'pull_assets'], array_merge($pullAssetsConfig, $form->getData()));
// reinitialize the pull queues
$serverConnection->reinitializeQueue([MessagePublisher::PULL_QUEUE]);
$this->app['alchemy_worker.message.publisher']->initializePullAssets();
return $app->redirectPath('worker_admin');
}
return $this->render('admin/worker-manager/worker_pull_assets.html.twig', [
'form' => $form->createView()
]);
}
/**
* @return EventDispatcherInterface
*/
private function getDispatcher()
{
return $this->app['dispatcher'];
}
/**
* @return ElasticsearchOptions
*/
private function getElasticsearchOptions()
{
return $this->app['elasticsearch.options'];
}
/**
* @param FormInterface $form
* @return array
*/
private function getData(FormInterface $form)
{
/** @var ElasticsearchOptions $options */
$options = $form->getData();
$data['host'] = $options->getHost();
$data['port'] = $options->getPort();
$data['indexName'] = $options->getIndexName();
$data['databoxIds'] = $form->getExtraData()['sbas'];
return $data;
}
private function getPullAssetsConfiguration()
{
return $this->app['conf']->get(['workers', 'pull_assets'], []);
}
private function getRetryQueueConfiguration()
{
return $this->app['conf']->get(['workers', 'retry_queue'], []);
}
}