fixed sfw and unapproved filters for random anime and manga endpoint

This commit is contained in:
pushrbx 2024-06-23 21:29:05 +01:00
parent 7dd9625588
commit c628007729
No known key found for this signature in database
GPG Key ID: A16A474BBC2C91D9
3 changed files with 53 additions and 12 deletions

View File

@ -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()
);
}

View File

@ -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()
);
}

View File

@ -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);
});
}
}