Make Index a separate class.
This commit is contained in:
parent
97c8b32d66
commit
0bf0bcdb02
|
@ -4,9 +4,10 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Service;
|
namespace App\Service;
|
||||||
|
|
||||||
use App\Entity\Repository\CustomFieldRepository;
|
|
||||||
use App\Entity\StorageLocation;
|
use App\Entity\StorageLocation;
|
||||||
use App\Environment;
|
use App\Environment;
|
||||||
|
use App\Service\Meilisearch\Index;
|
||||||
|
use DI\FactoryInterface;
|
||||||
use GuzzleHttp\Client as GuzzleClient;
|
use GuzzleHttp\Client as GuzzleClient;
|
||||||
use GuzzleHttp\Psr7\HttpFactory;
|
use GuzzleHttp\Psr7\HttpFactory;
|
||||||
use Meilisearch\Client;
|
use Meilisearch\Client;
|
||||||
|
@ -18,7 +19,7 @@ final class Meilisearch
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private readonly Environment $environment,
|
private readonly Environment $environment,
|
||||||
private readonly GuzzleClient $httpClient,
|
private readonly GuzzleClient $httpClient,
|
||||||
private readonly CustomFieldRepository $customFieldRepo,
|
private readonly FactoryInterface $factory
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,47 +50,20 @@ final class Meilisearch
|
||||||
return $client;
|
return $client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setupIndex(StorageLocation $storageLocation): void
|
public function getIndex(StorageLocation $storageLocation): Index
|
||||||
{
|
{
|
||||||
$indexSettings = [
|
return $this->factory->make(
|
||||||
'primaryKey' => 'id',
|
Index::class,
|
||||||
'filterableAttributes' => [
|
[
|
||||||
'playlists',
|
'storageLocation' => $storageLocation,
|
||||||
'is_requestable',
|
'indexUid' => self::getIndexUid($storageLocation),
|
||||||
'is_on_demand'
|
'client' => $this->getClient(),
|
||||||
],
|
]
|
||||||
'sortableAttributes' => [
|
|
||||||
'path',
|
|
||||||
'mtime',
|
|
||||||
'length',
|
|
||||||
'title',
|
|
||||||
'artist',
|
|
||||||
'album',
|
|
||||||
'genre',
|
|
||||||
'isrc',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach($this->customFieldRepo->getFieldIds() as $fieldId => $fieldShortCode) {
|
|
||||||
$indexSettings['sortableAttributes'][] = 'custom_field_'.$fieldId;
|
|
||||||
}
|
|
||||||
|
|
||||||
$client = $this->getClient();
|
|
||||||
$client->updateIndex(
|
|
||||||
self::getIndexId($storageLocation),
|
|
||||||
$indexSettings
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addToIndex(
|
public static function getIndexUid(StorageLocation $storageLocation): string
|
||||||
StorageLocation $storageLocation,
|
|
||||||
array $ids
|
|
||||||
): void {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getIndexId(StorageLocation $storageLocation): string
|
|
||||||
{
|
{
|
||||||
return 'media_'.$storageLocation->getIdRequired();
|
return 'media_' . $storageLocation->getIdRequired();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Service\Meilisearch;
|
||||||
|
|
||||||
|
use App\Doctrine\ReloadableEntityManagerInterface;
|
||||||
|
use App\Entity\Repository\CustomFieldRepository;
|
||||||
|
use App\Entity\Station;
|
||||||
|
use App\Entity\StorageLocation;
|
||||||
|
use Meilisearch\Client;
|
||||||
|
|
||||||
|
final class Index
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly ReloadableEntityManagerInterface $em,
|
||||||
|
private readonly CustomFieldRepository $customFieldRepo,
|
||||||
|
private readonly Client $client,
|
||||||
|
private readonly StorageLocation $storageLocation,
|
||||||
|
private readonly string $indexUid
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function configure(): void
|
||||||
|
{
|
||||||
|
$indexSettings = [
|
||||||
|
'primaryKey' => 'id',
|
||||||
|
'filterableAttributes' => [
|
||||||
|
'playlists',
|
||||||
|
'is_requestable',
|
||||||
|
'is_on_demand',
|
||||||
|
],
|
||||||
|
'sortableAttributes' => [
|
||||||
|
'path',
|
||||||
|
'mtime',
|
||||||
|
'length',
|
||||||
|
'title',
|
||||||
|
'artist',
|
||||||
|
'album',
|
||||||
|
'genre',
|
||||||
|
'isrc',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($this->customFieldRepo->getFieldIds() as $fieldId => $fieldShortCode) {
|
||||||
|
$indexSettings['sortableAttributes'][] = 'custom_field_' . $fieldId;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->client->updateIndex(
|
||||||
|
$this->indexUid,
|
||||||
|
$indexSettings
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return Station[] */
|
||||||
|
private function iterateStations(): iterable
|
||||||
|
{
|
||||||
|
return $this->em->createQuery(
|
||||||
|
<<<'DQL'
|
||||||
|
SELECT s FROM App\Entity\Station s
|
||||||
|
WHERE s.media_storage_location = :storageLocation
|
||||||
|
DQL
|
||||||
|
)->setParameter('storageLocation', $this->storageLocation)
|
||||||
|
->toIterable();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue