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\Dto\QueryRandomAnimeCommand;
|
||||
use App\Http\Resources\V4\AnimeResource;
|
||||
use Spatie\LaravelData\Optional;
|
||||
|
||||
/**
|
||||
* @implements RequestHandler<QueryRandomAnimeCommand, AnimeResource>
|
||||
@ -18,12 +19,13 @@ final class QueryRandomAnimeHandler implements RequestHandler
|
||||
public function handle($request): AnimeResource
|
||||
{
|
||||
$queryable = Anime::query();
|
||||
// apply sfw, kids and unapproved filters
|
||||
/** @noinspection PhpUndefinedMethodInspection */
|
||||
$queryable = $queryable->filter(collect($request->all()));
|
||||
|
||||
$o = Optional::create();
|
||||
$sfwParam = $request->sfw === $o ? false : $request->sfw;
|
||||
$unapprovedParam = $request->unapproved === $o ? false : $request->unapproved;
|
||||
|
||||
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\Http\Resources\V4\MangaResource;
|
||||
use App\Manga;
|
||||
use Spatie\LaravelData\Optional;
|
||||
|
||||
/**
|
||||
* @implements RequestHandler<QueryRandomMangaCommand, MangaResource>
|
||||
@ -18,12 +19,13 @@ final class QueryRandomMangaHandler implements RequestHandler
|
||||
public function handle($request)
|
||||
{
|
||||
$queryable = Manga::query();
|
||||
// apply sfw, kids and unapproved filters
|
||||
/** @noinspection PhpUndefinedMethodInspection */
|
||||
$queryable = $queryable->filter(collect($request->all()));
|
||||
|
||||
$o = Optional::create();
|
||||
$sfwParam = $request->sfw === $o ? false : $request->sfw;
|
||||
$unapprovedParam = $request->unapproved === $o ? false : $request->unapproved;
|
||||
|
||||
return new MangaResource(
|
||||
$queryable->random()->first()
|
||||
$queryable->random(1, $sfwParam, $unapprovedParam)->first()
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -2,9 +2,12 @@
|
||||
|
||||
namespace App;
|
||||
|
||||
use App\Enums\AnimeRatingEnum;
|
||||
use App\Enums\MangaTypeEnum;
|
||||
use App\Filters\FilterQueryString;
|
||||
use Illuminate\Support\Collection;
|
||||
use Jenssegers\Mongodb\Eloquent\Builder;
|
||||
use Jikan\Helper\Constants;
|
||||
|
||||
class JikanApiModel extends \Jenssegers\Mongodb\Eloquent\Model
|
||||
{
|
||||
@ -19,10 +22,44 @@ class JikanApiModel extends \Jenssegers\Mongodb\Eloquent\Model
|
||||
protected array $filters = [];
|
||||
|
||||
/** @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) {
|
||||
$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