mirror of
https://github.com/AnimeThemes/animethemes-server.git
synced 2026-07-11 01:24:46 +02:00
feat(api): add search payload for playlists (#474)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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;
|
||||
+1
-1
@@ -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;
|
||||
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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(),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user