override api client on the backend to retrieve discussions from elastic always, this prevents all hits to the MySQL db

This commit is contained in:
Daniel Klabbers 2021-11-10 12:40:32 +01:00
parent a03de74f0b
commit 8111c214cc
2 changed files with 36 additions and 3 deletions

View File

@ -2,6 +2,15 @@
namespace Blomstra\Search\Api;
class Client
use Illuminate\Support\Arr;
use Psr\Http\Message\ResponseInterface;
class Client extends \Flarum\Api\Client
{
public function get(string $path): ResponseInterface
{
if ($path === '/discussions' && Arr::has($this->queryParams, 'filter.q')) return parent::get("/blomstra$path");
return parent::get($path);
}
}

View File

@ -6,14 +6,17 @@ use Blomstra\Search\Jobs\DeletingJob;
use Blomstra\Search\Jobs\Job;
use Blomstra\Search\Jobs\SavingJob;
use Blomstra\Search\Seeders;
use Elasticsearch\Client;
use Elasticsearch\Client as Elastic;
use Elasticsearch\ClientBuilder;
use Flarum\Api\Client;
use Flarum\Foundation\AbstractServiceProvider;
use Flarum\Http\Middleware\ExecuteRoute;
use Flarum\Settings\SettingsRepositoryInterface;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Contracts\Queue\Queue;
use Illuminate\Support\Collection;
use Laminas\Stratigility\MiddlewarePipe;
use Psr\Log\LoggerInterface;
class Provider extends AbstractServiceProvider
@ -28,7 +31,7 @@ class Provider extends AbstractServiceProvider
/** @var SettingsRepositoryInterface $settings */
$settings = $this->container->make(SettingsRepositoryInterface::class);
$this->container->singleton(Client::class, function (Container $container) use ($settings) {
$this->container->singleton(Elastic::class, function (Container $container) use ($settings) {
$builder = ClientBuilder::create()
->setHosts([$settings->get('blomstra-search.elastic-endpoint')])
->setLogger($container->make(LoggerInterface::class));
@ -48,6 +51,27 @@ class Provider extends AbstractServiceProvider
'blomstra.search.elastic_index',
$settings->get('blomstra-search.elastic-index', 'flarum')
);
$this->container->extend(
Client::class,
function () {
$pipe = new MiddlewarePipe;
$exclude = resolve('flarum.api_client.exclude_middleware');
$middlewareStack = array_filter(resolve('flarum.api.middleware'), function ($middlewareClass) use ($exclude) {
return ! in_array($middlewareClass, $exclude);
});
foreach ($middlewareStack as $middleware) {
$pipe->pipe(resolve($middleware));
}
$pipe->pipe(new ExecuteRoute);
return new Api\Client($pipe);
}
);
}
public function boot()