mirror of
https://github.com/jikan-me/jikan-rest.git
synced 2025-02-20 11:23:35 +08:00
fixed sfw and unapproved filters for random anime and manga endpoint
This commit is contained in:
parent
7dd9625588
commit
c628007729
@ -6,6 +6,7 @@ use App\Anime;
|
|||||||
use App\Contracts\RequestHandler;
|
use App\Contracts\RequestHandler;
|
||||||
use App\Dto\QueryRandomAnimeCommand;
|
use App\Dto\QueryRandomAnimeCommand;
|
||||||
use App\Http\Resources\V4\AnimeResource;
|
use App\Http\Resources\V4\AnimeResource;
|
||||||
|
use Spatie\LaravelData\Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @implements RequestHandler<QueryRandomAnimeCommand, AnimeResource>
|
* @implements RequestHandler<QueryRandomAnimeCommand, AnimeResource>
|
||||||
@ -18,12 +19,13 @@ final class QueryRandomAnimeHandler implements RequestHandler
|
|||||||
public function handle($request): AnimeResource
|
public function handle($request): AnimeResource
|
||||||
{
|
{
|
||||||
$queryable = Anime::query();
|
$queryable = Anime::query();
|
||||||
// apply sfw, kids and unapproved filters
|
|
||||||
/** @noinspection PhpUndefinedMethodInspection */
|
$o = Optional::create();
|
||||||
$queryable = $queryable->filter(collect($request->all()));
|
$sfwParam = $request->sfw === $o ? false : $request->sfw;
|
||||||
|
$unapprovedParam = $request->unapproved === $o ? false : $request->unapproved;
|
||||||
|
|
||||||
return new AnimeResource(
|
return new AnimeResource(
|
||||||
$queryable->random()->first()
|
$queryable->random(1, $sfwParam, $unapprovedParam)->first()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ use App\Contracts\RequestHandler;
|
|||||||
use App\Dto\QueryRandomMangaCommand;
|
use App\Dto\QueryRandomMangaCommand;
|
||||||
use App\Http\Resources\V4\MangaResource;
|
use App\Http\Resources\V4\MangaResource;
|
||||||
use App\Manga;
|
use App\Manga;
|
||||||
|
use Spatie\LaravelData\Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @implements RequestHandler<QueryRandomMangaCommand, MangaResource>
|
* @implements RequestHandler<QueryRandomMangaCommand, MangaResource>
|
||||||
@ -18,12 +19,13 @@ final class QueryRandomMangaHandler implements RequestHandler
|
|||||||
public function handle($request)
|
public function handle($request)
|
||||||
{
|
{
|
||||||
$queryable = Manga::query();
|
$queryable = Manga::query();
|
||||||
// apply sfw, kids and unapproved filters
|
|
||||||
/** @noinspection PhpUndefinedMethodInspection */
|
$o = Optional::create();
|
||||||
$queryable = $queryable->filter(collect($request->all()));
|
$sfwParam = $request->sfw === $o ? false : $request->sfw;
|
||||||
|
$unapprovedParam = $request->unapproved === $o ? false : $request->unapproved;
|
||||||
|
|
||||||
return new MangaResource(
|
return new MangaResource(
|
||||||
$queryable->random()->first()
|
$queryable->random(1, $sfwParam, $unapprovedParam)->first()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,9 +2,12 @@
|
|||||||
|
|
||||||
namespace App;
|
namespace App;
|
||||||
|
|
||||||
|
use App\Enums\AnimeRatingEnum;
|
||||||
|
use App\Enums\MangaTypeEnum;
|
||||||
use App\Filters\FilterQueryString;
|
use App\Filters\FilterQueryString;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Jenssegers\Mongodb\Eloquent\Builder;
|
use Jenssegers\Mongodb\Eloquent\Builder;
|
||||||
|
use Jikan\Helper\Constants;
|
||||||
|
|
||||||
class JikanApiModel extends \Jenssegers\Mongodb\Eloquent\Model
|
class JikanApiModel extends \Jenssegers\Mongodb\Eloquent\Model
|
||||||
{
|
{
|
||||||
@ -19,10 +22,44 @@ class JikanApiModel extends \Jenssegers\Mongodb\Eloquent\Model
|
|||||||
protected array $filters = [];
|
protected array $filters = [];
|
||||||
|
|
||||||
/** @noinspection PhpUnused */
|
/** @noinspection PhpUnused */
|
||||||
public function scopeRandom(Builder $query, int $numberOfRandomItems = 1): Collection
|
public function scopeRandom(Builder $query, int $numberOfRandomItems = 1, bool $sfw = false, bool $unapproved = false): Collection
|
||||||
{
|
{
|
||||||
return $query->raw(fn(\Jenssegers\Mongodb\Collection $collection) => $collection->aggregate([
|
return $query->raw(function(\Jenssegers\Mongodb\Collection $collection) use ($numberOfRandomItems, $sfw, $unapproved) {
|
||||||
['$sample' => ['size' => $numberOfRandomItems]]
|
$sfwFilter = [
|
||||||
]));
|
'demographics.mal_id' => [
|
||||||
|
'$nin' => [
|
||||||
|
Constants::GENRE_ANIME_HENTAI,
|
||||||
|
Constants::GENRE_ANIME_EROTICA,
|
||||||
|
Constants::GENRE_MANGA_HENTAI,
|
||||||
|
Constants::GENRE_MANGA_EROTICA
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'rating' => ['$ne' => AnimeRatingEnum::rx()->label],
|
||||||
|
'type' => ['$ne' => MangaTypeEnum::doujin()->label],
|
||||||
|
'genres.mal_id' => ['$nin' => [
|
||||||
|
Constants::GENRE_ANIME_HENTAI,
|
||||||
|
Constants::GENRE_MANGA_HENTAI
|
||||||
|
]]
|
||||||
|
];
|
||||||
|
|
||||||
|
$pipelineParams = [
|
||||||
|
['$sample' => ['size' => $numberOfRandomItems]]
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($sfw && $unapproved) {
|
||||||
|
array_unshift($pipelineParams, [
|
||||||
|
'$match' => [
|
||||||
|
...$sfwFilter,
|
||||||
|
'approved' => false
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
} else if ($sfw) {
|
||||||
|
array_unshift($pipelineParams, ['$match' => $sfwFilter]);
|
||||||
|
} else if ($unapproved) {
|
||||||
|
array_unshift($pipelineParams, ['$match' => ['approved' => false]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $collection->aggregate($pipelineParams);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user