Skip to content

Commit

Permalink
Merge pull request #543 from jikan-me/bugfix/pack1
Browse files Browse the repository at this point in the history
✅ Fixed broadcast adapter func and random anime/manga endpoint
  • Loading branch information
irfan-dahir committed Jun 27, 2024
2 parents 9470beb + 896c68f commit 1b46890
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 13 deletions.
7 changes: 6 additions & 1 deletion app/Anime.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Jikan\Jikan;
use Jikan\Request\Anime\AnimeRequest;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use MongoDB\Model\BSONDocument;

class Anime extends JikanApiSearchableModel
{
Expand Down Expand Up @@ -407,7 +408,7 @@ public function getSearchIndexSortBy(): array|null
];
}

private function adaptBroadcastValue(array|string|null $broadcast): array
private function adaptBroadcastValue(array|string|null|BSONDocument $broadcast): array
{
$null_value = [
'day' => null,
Expand All @@ -423,6 +424,10 @@ private function adaptBroadcastValue(array|string|null $broadcast): array
return $broadcast;
}

if ($broadcast instanceof BSONDocument) {
return $broadcast->getArrayCopy();
}

if (!preg_match('~(.*) at (.*) \(~', $broadcast, $matches)) {
return [
'day' => null,
Expand Down
10 changes: 6 additions & 4 deletions app/Features/QueryRandomAnimeHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Contracts\RequestHandler;
use App\Dto\QueryRandomAnimeCommand;
use App\Http\Resources\V4\AnimeResource;
use Spatie\LaravelData\Optional;

/**
* @implements RequestHandler<QueryRandomAnimeCommand, AnimeResource>
Expand All @@ -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()
);
}

Expand Down
10 changes: 6 additions & 4 deletions app/Features/QueryRandomMangaHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Dto\QueryRandomMangaCommand;
use App\Http\Resources\V4\MangaResource;
use App\Manga;
use Spatie\LaravelData\Optional;

/**
* @implements RequestHandler<QueryRandomMangaCommand, MangaResource>
Expand All @@ -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()
);
}

Expand Down
45 changes: 41 additions & 4 deletions app/JikanApiModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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([
['$sample' => ['size' => $numberOfRandomItems]]
]));
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);
});
}
}

0 comments on commit 1b46890

Please sign in to comment.