feat(api): add search payload for playlists (#474)

This commit is contained in:
paranarimasu
2022-10-24 23:40:36 -05:00
committed by GitHub
parent 963a291d42
commit 52bd044cf2
13 changed files with 231 additions and 9 deletions
@@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Field\List\Playlist;
use App\Models\List\Playlist;
use App\Scout\Elasticsearch\Api\Field\StringField;
/**
* Class PlaylistNameField.
*/
class PlaylistNameField extends StringField
{
/**
* Create a new field instance.
*/
public function __construct()
{
parent::__construct(Playlist::ATTRIBUTE_NAME);
}
}
@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Field\List\Playlist;
use App\Enums\Models\List\PlaylistVisibility;
use App\Models\List\Playlist;
use App\Scout\Elasticsearch\Api\Field\EnumField;
/**
* Class PlaylistVisibilityField.
*/
class PlaylistVisibilityField extends EnumField
{
/**
* Create a new field instance.
*/
public function __construct()
{
parent::__construct(Playlist::ATTRIBUTE_VISIBILITY, PlaylistVisibility::class);
}
}
@@ -0,0 +1,95 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query\List;
use App\Models\List\Playlist;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
use App\Scout\Elasticsearch\Api\Schema\List\PlaylistSchema;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use Elastic\ScoutDriverPlus\Builders\SearchParametersBuilder;
use Elastic\ScoutDriverPlus\Support\Query;
/**
* Class PlaylistQueryPayload.
*/
class PlaylistQueryPayload extends ElasticQueryPayload
{
/**
* The model this payload is searching.
*
* @return string
*/
public static function model(): string
{
return Playlist::class;
}
/**
* The schema this payload is searching.
*
* @return Schema
*/
public function schema(): Schema
{
return new PlaylistSchema();
}
/**
* Build Elasticsearch query.
*
* @return SearchParametersBuilder
*/
public function buildQuery(): SearchParametersBuilder
{
$query = Query::bool()
->mustRaw([
// Pick the score of the best performing sub-query.
'dis_max' => [
'queries' => [
[
// The more sub-queries match the better the score will be.
'bool' => [
'should' => [
[
'match_phrase' => [
'name' => [
'query' => $this->criteria->getTerm(),
],
],
],
[
'match' => [
'name' => [
'query' => $this->criteria->getTerm(),
'operator' => 'AND',
],
],
],
[
'match' => [
'name' => [
'query' => $this->criteria->getTerm(),
'boost' => 0.6,
],
],
],
[
'fuzzy' => [
'name' => [
'value' => $this->criteria->getTerm(),
'boost' => 0.4,
],
],
],
],
],
],
],
],
]);
return Playlist::searchQuery($query);
}
}
@@ -2,7 +2,7 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query\Anime;
namespace App\Scout\Elasticsearch\Api\Query\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeSynonym;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
@@ -2,7 +2,7 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query\Anime\Theme;
namespace App\Scout\Elasticsearch\Api\Query\Wiki\Anime\Theme;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
@@ -2,7 +2,7 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query\Anime;
namespace App\Scout\Elasticsearch\Api\Query\Wiki\Anime;
use App\Models\Wiki\Anime\AnimeTheme;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
@@ -2,9 +2,10 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query;
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
use App\Models\Wiki\Anime;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\AnimeSchema;
use Elastic\ScoutDriverPlus\Builders\SearchParametersBuilder;
@@ -2,9 +2,10 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query;
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
use App\Models\Wiki\Artist;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\ArtistSchema;
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
@@ -2,9 +2,10 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query;
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
use App\Models\Wiki\Series;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\SeriesSchema;
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
@@ -2,9 +2,10 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query;
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
use App\Models\Wiki\Song;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\SongSchema;
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
@@ -2,9 +2,10 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query;
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
use App\Models\Wiki\Studio;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\StudioSchema;
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
@@ -2,9 +2,10 @@
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Query;
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
use App\Models\Wiki\Video;
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
use App\Scout\Elasticsearch\Api\Schema\Schema;
use App\Scout\Elasticsearch\Api\Schema\Wiki\VideoSchema;
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
@@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
namespace App\Scout\Elasticsearch\Api\Schema\List;
use App\Http\Api\Include\AllowedInclude;
use App\Http\Api\Schema\Auth\UserSchema;
use App\Http\Api\Schema\List\Playlist\TrackSchema;
use App\Http\Api\Schema\Wiki\ImageSchema;
use App\Http\Resources\List\Resource\PlaylistResource;
use App\Models\List\Playlist;
use App\Scout\Elasticsearch\Api\Field\Base\IdField;
use App\Scout\Elasticsearch\Api\Field\Field;
use App\Scout\Elasticsearch\Api\Field\List\Playlist\PlaylistNameField;
use App\Scout\Elasticsearch\Api\Field\List\Playlist\PlaylistVisibilityField;
use App\Scout\Elasticsearch\Api\Schema\Schema;
/**
* Class PlaylistSchema.
*/
class PlaylistSchema extends Schema
{
/**
* The model this schema represents.
*
* @return string
*/
public function model(): string
{
return Playlist::class;
}
/**
* Get the type of the resource.
*
* @return string
*/
public function type(): string
{
return PlaylistResource::$wrap;
}
/**
* Get the allowed includes.
*
* @return AllowedInclude[]
*/
public function allowedIncludes(): array
{
return [
new AllowedInclude(new ImageSchema(), Playlist::RELATION_IMAGES),
new AllowedInclude(new TrackSchema(), Playlist::RELATION_FIRST),
new AllowedInclude(new TrackSchema(), Playlist::RELATION_LAST),
new AllowedInclude(new TrackSchema(), Playlist::RELATION_TRACKS),
new AllowedInclude(new UserSchema(), Playlist::RELATION_USER),
];
}
/**
* Get the direct fields of the resource.
*
* @return Field[]
*/
public function fields(): array
{
return array_merge(
parent::fields(),
[
new IdField(Playlist::ATTRIBUTE_ID),
new PlaylistNameField(),
new PlaylistVisibilityField(),
],
);
}
}