80 lines
2.7 KiB
PHP
80 lines
2.7 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use Illuminate\Console\Command;
|
||
use Meilisearch\Client as MeilisearchClient;
|
||
|
||
/**
|
||
* Configure the Meilisearch artworks index:
|
||
* – sortable attributes (all fields used in category/discover sorts)
|
||
* – filterable attributes (used in search filters)
|
||
*
|
||
* Run after any schema / toSearchableArray change:
|
||
* php artisan meilisearch:configure-index
|
||
*/
|
||
class ConfigureMeilisearchIndex extends Command
|
||
{
|
||
protected $signature = 'meilisearch:configure-index {--index=artworks : Meilisearch index name}';
|
||
protected $description = 'Push sortable and filterable attribute settings to the Meilisearch artworks index.';
|
||
|
||
/**
|
||
* Fields that can be used as sort targets in Artwork::search()->options(['sort' => …]).
|
||
* Must match keys in Artwork::toSearchableArray().
|
||
*/
|
||
private const SORTABLE_ATTRIBUTES = [
|
||
'created_at',
|
||
'trending_score_24h',
|
||
'trending_score_7d',
|
||
'favorites_count',
|
||
'downloads_count',
|
||
'awards_received_count',
|
||
'views',
|
||
'likes',
|
||
'downloads',
|
||
];
|
||
|
||
/**
|
||
* Fields used in filter expressions (AND category = "…" etc.).
|
||
*/
|
||
private const FILTERABLE_ATTRIBUTES = [
|
||
'is_public',
|
||
'is_approved',
|
||
'category',
|
||
'content_type',
|
||
'tags',
|
||
'author_id',
|
||
'orientation',
|
||
'resolution',
|
||
];
|
||
|
||
public function handle(): int
|
||
{
|
||
$indexName = (string) $this->option('index');
|
||
|
||
/** @var MeilisearchClient $client */
|
||
$client = app(MeilisearchClient::class);
|
||
|
||
$index = $client->index($indexName);
|
||
|
||
$this->info("Configuring Meilisearch index: {$indexName}");
|
||
|
||
// ── Sortable attributes ───────────────────────────────────────────────
|
||
$this->line(' → Updating sortableAttributes…');
|
||
$task = $index->updateSortableAttributes(self::SORTABLE_ATTRIBUTES);
|
||
$this->line(" Task uid: {$task['taskUid']}");
|
||
|
||
// ── Filterable attributes ─────────────────────────────────────────────
|
||
$this->line(' → Updating filterableAttributes…');
|
||
$task2 = $index->updateFilterableAttributes(self::FILTERABLE_ATTRIBUTES);
|
||
$this->line(" Task uid: {$task2['taskUid']}");
|
||
|
||
$this->info('Done. Meilisearch will process these tasks asynchronously.');
|
||
$this->warn('Re-index artworks if sortable attributes changed: php artisan artworks:search-rebuild');
|
||
|
||
return self::SUCCESS;
|
||
}
|
||
}
|