Skip to content

Commit

Permalink
Merge pull request #285 from jikan-me/feature/new-reviews
Browse files Browse the repository at this point in the history
Feature+Fix: Update Reviews API
  • Loading branch information
irfan-dahir authored Nov 25, 2022
2 parents a2247b1 + b5b2c48 commit 0d714d7
Show file tree
Hide file tree
Showing 17 changed files with 3,447 additions and 1,029 deletions.
22 changes: 22 additions & 0 deletions app/Exceptions/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Laravel\Lumen\Exceptions\Handler as ExceptionHandler;
use Predis\Connection\ConnectionException;
use Symfony\Component\HttpClient\Exception\TimeoutException;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;

Expand Down Expand Up @@ -95,6 +96,27 @@ public function render($request, \Throwable $e): JsonResponse|Response
], 500);
}

// BadRequestException from Controllers
if ($e instanceof BadRequestException) {
return response()
->json([
'status' => 400,
'type' => 'BadRequestException',
'message' => $e->getMessage(),
'error' => null
], 400);
}

if ($e instanceof ValidationException) {
return response()
->json([
'status' => 400,
'type' => 'BadRequestException',
'message' => $e->getMessage(),
'error' => null
], 400);
}

// BadResponseException from Jikan PHP API
// This is basically the response MyAnimeList returns to Jikan
if ($e instanceof BadResponseException) {
Expand Down
22 changes: 22 additions & 0 deletions app/Helpers/ScraperHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace App\Helpers;

use App\Providers\SerializerFactory;

class ScraperHelper
{

/**
* @param object|array $response
* @return array
*/
public static function getSerializedJSON(object|array $response): array
{
return \json_decode(
SerializerFactory::createV4()
->serialize($response, 'json'),
true
);
}
}
24 changes: 22 additions & 2 deletions app/Http/Controllers/V4DB/AnimeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use App\Http\Resources\V4\ForumResource;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Jikan\Helper\Constants;
use Jikan\Request\Anime\AnimeCharactersAndStaffRequest;
use Jikan\Request\Anime\AnimeEpisodeRequest;
use Jikan\Request\Anime\AnimeEpisodesRequest;
Expand All @@ -38,6 +39,7 @@
use Jikan\Request\Anime\AnimeVideosRequest;
use Laravel\Lumen\Http\ResponseFactory;
use MongoDB\BSON\UTCDateTime;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class AnimeController extends Controller
Expand Down Expand Up @@ -1110,9 +1112,27 @@ public function reviews(Request $request, int $id)
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = $this->jikan->getAnimeReviews(new AnimeReviewsRequest($id, $page));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$sort = $request->get('sort') ?? Constants::REVIEWS_SORT_MOST_VOTED;

if (!in_array($sort, [Constants::REVIEWS_SORT_MOST_VOTED, Constants::REVIEWS_SORT_NEWEST, Constants::REVIEWS_SORT_OLDEST])) {
throw new BadRequestException('Invalid sort for reviews. Please refer to the documentation: https://docs.api.jikan.moe/');
}

$spoilers = $request->get('spoilers') ?? false;
$preliminary = $request->get('preliminary') ?? false;

$anime = $this->jikan
->getAnimeReviews(
new AnimeReviewsRequest(
$id,
$page,
$sort,
$spoilers,
$preliminary
)
);

$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}

Expand Down
14 changes: 7 additions & 7 deletions app/Http/Controllers/V4DB/Controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class Controller extends BaseController
* )
* ),
* @OA\Server(
* description="Jikan REST API Beta",
* description="Jikan REST API",
* url="https://api.jikan.moe/v4",
* ),
* @OA\ExternalDocumentation(
Expand All @@ -49,12 +49,12 @@ class Controller extends BaseController
/**
* @var Serializer
*/
protected $serializer;
protected Serializer $serializer;

/**
* @var MalClient
*/
protected $jikan;
protected MalClient $jikan;

/**
* @var Request
Expand All @@ -64,16 +64,16 @@ class Controller extends BaseController
/**
* @var array
*/
private $response;
private array $response;

protected $expired = false;
protected bool $expired = false;

protected $fingerprint;
protected string $fingerprint;

/**
* AnimeController constructor.
*
* @param Serializer $serializer
* @param Request $request
* @param MalClient $jikan
*/
public function __construct(Request $request, MalClient $jikan)
Expand Down
58 changes: 34 additions & 24 deletions app/Http/Controllers/V4DB/MangaController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,39 @@

namespace App\Http\Controllers\V4DB;

use App\Anime;
use App\Helpers\ScraperHelper;
use App\Http\HttpHelper;
use App\Http\HttpResponse;
use App\Http\Resources\V4\AnimeCharactersResource;
use App\Http\Resources\V4\AnimeForumResource;
use App\Http\QueryBuilder\Scraper\Query;
use App\Http\QueryBuilder\Scraper\QueryResolver;
use App\Http\QueryBuilder\Scraper\ScraperHandler;
use App\Http\Resources\V4\ExternalLinksResource;
use App\Http\Resources\V4\MangaRelationsResource;
use App\Http\Resources\V4\ResultsResource;
use App\Http\Resources\V4\ReviewsResource;
use App\Http\Resources\V4\UserUpdatesResource;
use App\Http\Resources\V4\RecommendationsResource;
use App\Http\Resources\V4\MoreInfoResource;
use App\Http\Resources\V4\AnimeNewsResource;
use App\Http\Resources\V4\AnimeStatisticsResource;
use App\Http\Resources\V4\ForumResource;
use App\Http\Resources\V4\MangaCharactersResource;
use App\Http\Resources\V4\MangaStatisticsResource;
use App\Http\Resources\V4\NewsResource;
use App\Http\Resources\V4\PicturesResource;
use App\Http\Validation\ValidationTypeEnum;
use App\Manga;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\DB;
use Jikan\Request\Anime\AnimeCharactersAndStaffRequest;
use Jikan\Request\Anime\AnimeForumRequest;
use Jikan\Request\Anime\AnimeMoreInfoRequest;
use Jikan\Request\Anime\AnimeNewsRequest;
use Jikan\Request\Anime\AnimePicturesRequest;
use Jikan\Request\Anime\AnimeRecentlyUpdatedByUsersRequest;
use Jikan\Request\Anime\AnimeRecommendationsRequest;
use Jikan\Request\Anime\AnimeReviewsRequest;
use Jikan\Request\Anime\AnimeStatsRequest;
use Jikan\Exception\BadResponseException;
use Jikan\Helper\Constants;
use Jikan\Request\Manga\MangaCharactersRequest;
use Jikan\Request\Manga\MangaForumRequest;
use Jikan\Request\Manga\MangaMoreInfoRequest;
use Jikan\Request\Manga\MangaNewsRequest;
use Jikan\Request\Manga\MangaPicturesRequest;
use Jikan\Request\Manga\MangaRecentlyUpdatedByUsersRequest;
use Jikan\Request\Manga\MangaRecommendationsRequest;
use Jikan\Request\Manga\MangaRequest;
use Jikan\Request\Manga\MangaReviewsRequest;
use Jikan\Request\Manga\MangaStatsRequest;
use MongoDB\BSON\UTCDateTime;
use mysql_xdevapi\Result;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;

class MangaController extends Controller
{
Expand Down Expand Up @@ -442,7 +431,7 @@ public function forum(Request $request, int $id)
* @OA\Property(
* property="data",
* type="array",
*
*
* @OA\Items(
* type="object",
* ref="#/components/schemas/manga_images"
Expand Down Expand Up @@ -693,7 +682,7 @@ public function userupdates(Request $request, int $id)
}

/**
* @OA\Get(
* @OA\Get(
* path="/manga/{id}/reviews",
* operationId="getMangaReviews",
* tags={"manga"},
Expand All @@ -719,9 +708,20 @@ public function userupdates(Request $request, int $id)
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* )
* @throws \Exception
*/
public function reviews(Request $request, int $id)
{
$validation = $this->validate($request, [
'page' => 'nullable|numeric',
'sort' => 'nullable|string'
]);

$page = $request->get('page') ?? 1;
$spoilers = $request->get('spoilers') ?? false;
$preliminary = $request->get('preliminary') ?? false;
$sort = $request->get('sort');

$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
Expand All @@ -730,9 +730,19 @@ public function reviews(Request $request, int $id)
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$manga = $this->jikan->getMangaReviews(new MangaReviewsRequest($id, $page));
$response = \json_decode($this->serializer->serialize($manga, 'json'), true);

$response = ScraperHelper::getSerializedJSON(
app('JikanParser')
->getMangaReviews(
new MangaReviewsRequest(
$id,
$page,
in_array($sort, [Constants::REVIEWS_SORT_MOST_VOTED, Constants::REVIEWS_SORT_NEWEST, Constants::REVIEWS_SORT_OLDEST]) ? $sort : Constants::REVIEWS_SORT_MOST_VOTED,
$spoilers,
$preliminary
)
)
);

$results = $this->updateCache($request, $results, $response);
}
Expand Down
45 changes: 42 additions & 3 deletions app/Http/Controllers/V4DB/ReviewsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
use Illuminate\Support\Facades\DB;
use Jikan\Helper\Constants;
use Jikan\Request\Reviews\RecentReviewsRequest;
use Jikan\Request\Reviews\ReviewsRequest;
use MongoDB\BSON\UTCDateTime;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;

class ReviewsController extends Controller
{
Expand Down Expand Up @@ -73,7 +75,26 @@ public function anime(Request $request)
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = $this->jikan->getRecentReviews(new RecentReviewsRequest(Constants::RECENT_REVIEW_ANIME, $page));
$sort = $request->get('sort') ?? Constants::REVIEWS_SORT_MOST_VOTED;

if (!in_array($sort, [Constants::REVIEWS_SORT_MOST_VOTED, Constants::REVIEWS_SORT_NEWEST, Constants::REVIEWS_SORT_OLDEST])) {
throw new BadRequestException('Invalid sort for reviews. Please refer to the documentation: https://docs.api.jikan.moe/');
}

$spoilers = $request->get('spoilers') ?? false;
$preliminary = $request->get('preliminary') ?? false;

$anime = $this->jikan
->getReviews(
new ReviewsRequest(
Constants::ANIME,
$page,
$sort,
$spoilers,
$preliminary
)
);

$response = \json_decode($this->serializer->serialize($anime, 'json'), true);

$results = $this->updateCache($request, $results, $response);
Expand Down Expand Up @@ -149,9 +170,27 @@ public function manga(Request $request)
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = $this->jikan->getRecentReviews(new RecentReviewsRequest(Constants::RECENT_REVIEW_MANGA, $page));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$sort = $request->get('sort') ?? Constants::REVIEWS_SORT_MOST_VOTED;

if (!in_array($sort, [Constants::REVIEWS_SORT_MOST_VOTED, Constants::REVIEWS_SORT_NEWEST, Constants::REVIEWS_SORT_OLDEST])) {
throw new BadRequestException('Invalid sort for reviews. Please refer to the documentation: https://docs.api.jikan.moe/');
}

$spoilers = $request->get('spoilers') ?? false;
$preliminary = $request->get('preliminary') ?? false;

$anime = $this->jikan
->getReviews(
new ReviewsRequest(
Constants::MANGA,
$page,
$sort,
$spoilers,
$preliminary
)
);

$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}

Expand Down
8 changes: 8 additions & 0 deletions app/Http/Controllers/V4DB/SearchController.php
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,14 @@ public function clubs(Request $request)
}

/**
*
* @OA\Schema(
* schema="producers_query_orderby",
* description="Producers Search Query Order By",
* type="string",
* enum={"mal_id", "count", "favorites", "established"}
* )
*
* @OA\Get(
* path="/producers",
* operationId="getProducers",
Expand Down
13 changes: 11 additions & 2 deletions app/Http/Controllers/V4DB/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use App\Profile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Jikan\Helper\Constants;
use Jikan\Request\User\RecentlyOnlineUsersRequest;
use Jikan\Request\User\UserAnimeListRequest;
use Jikan\Request\User\UserClubsRequest;
Expand All @@ -23,6 +24,7 @@
use Jikan\Request\User\UserRecommendationsRequest;
use Jikan\Request\User\UserReviewsRequest;
use MongoDB\BSON\UTCDateTime;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;

/**
* Class Controller
Expand Down Expand Up @@ -964,9 +966,16 @@ public function reviews(Request $request, string $username)
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$data = $this->jikan->getUserReviews(new UserReviewsRequest($username, $page));
$response = \json_decode($this->serializer->serialize($data, 'json'), true);

$data = $this->jikan
->getUserReviews(
new UserReviewsRequest(
$username,
$page,
)
);

$response = \json_decode($this->serializer->serialize($data, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}

Expand Down
Loading

0 comments on commit 0d714d7

Please sign in to comment.