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);
|
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\Models\Wiki\Anime\AnimeSynonym;
|
||||||
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
|
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
|
||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
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\Models\Wiki\Anime\Theme\AnimeThemeEntry;
|
||||||
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
|
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
|
||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
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\Models\Wiki\Anime\AnimeTheme;
|
||||||
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
|
use App\Scout\Elasticsearch\Api\Query\ElasticQueryPayload;
|
||||||
+2
-1
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Scout\Elasticsearch\Api\Query;
|
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
|
||||||
|
|
||||||
use App\Models\Wiki\Anime;
|
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\Schema;
|
||||||
use App\Scout\Elasticsearch\Api\Schema\Wiki\AnimeSchema;
|
use App\Scout\Elasticsearch\Api\Schema\Wiki\AnimeSchema;
|
||||||
use Elastic\ScoutDriverPlus\Builders\SearchParametersBuilder;
|
use Elastic\ScoutDriverPlus\Builders\SearchParametersBuilder;
|
||||||
+2
-1
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Scout\Elasticsearch\Api\Query;
|
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
|
||||||
|
|
||||||
use App\Models\Wiki\Artist;
|
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\Schema;
|
||||||
use App\Scout\Elasticsearch\Api\Schema\Wiki\ArtistSchema;
|
use App\Scout\Elasticsearch\Api\Schema\Wiki\ArtistSchema;
|
||||||
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
||||||
+2
-1
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Scout\Elasticsearch\Api\Query;
|
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
|
||||||
|
|
||||||
use App\Models\Wiki\Series;
|
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\Schema;
|
||||||
use App\Scout\Elasticsearch\Api\Schema\Wiki\SeriesSchema;
|
use App\Scout\Elasticsearch\Api\Schema\Wiki\SeriesSchema;
|
||||||
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
||||||
+2
-1
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Scout\Elasticsearch\Api\Query;
|
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
|
||||||
|
|
||||||
use App\Models\Wiki\Song;
|
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\Schema;
|
||||||
use App\Scout\Elasticsearch\Api\Schema\Wiki\SongSchema;
|
use App\Scout\Elasticsearch\Api\Schema\Wiki\SongSchema;
|
||||||
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
||||||
+2
-1
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Scout\Elasticsearch\Api\Query;
|
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
|
||||||
|
|
||||||
use App\Models\Wiki\Studio;
|
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\Schema;
|
||||||
use App\Scout\Elasticsearch\Api\Schema\Wiki\StudioSchema;
|
use App\Scout\Elasticsearch\Api\Schema\Wiki\StudioSchema;
|
||||||
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
||||||
+2
-1
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Scout\Elasticsearch\Api\Query;
|
namespace App\Scout\Elasticsearch\Api\Query\Wiki;
|
||||||
|
|
||||||
use App\Models\Wiki\Video;
|
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\Schema;
|
||||||
use App\Scout\Elasticsearch\Api\Schema\Wiki\VideoSchema;
|
use App\Scout\Elasticsearch\Api\Schema\Wiki\VideoSchema;
|
||||||
use Elastic\ScoutDriverPlus\Builders\MatchPhraseQueryBuilder;
|
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