mirror of
https://github.com/jikan-me/jikan-rest.git
synced 2025-02-20 11:23:35 +08:00
58 lines
1.7 KiB
PHP
58 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Features;
|
|
|
|
use App\Contracts\CachedScraperService;
|
|
use App\Contracts\RequestHandler;
|
|
use App\Contracts\DataRequest;
|
|
use App\Http\Resources\V4\ResultsResource;
|
|
use App\Support\CachedData;
|
|
use Illuminate\Http\Resources\Json\JsonResource;
|
|
use Illuminate\Http\Resources\Json\ResourceCollection;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Support\Collection;
|
|
|
|
/**
|
|
* @template TRequest of DataRequest<TResponse>
|
|
* @template TResponse of ResourceCollection|JsonResource|Response
|
|
* @implements RequestHandler<TRequest, TResponse>
|
|
*/
|
|
abstract class RequestHandlerWithScraperCache implements RequestHandler
|
|
{
|
|
public function __construct(protected readonly CachedScraperService $scraperService)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function handle($request)
|
|
{
|
|
$requestParams = collect($request->all());
|
|
$requestFingerPrint = $request->getFingerPrint();
|
|
$results = $this->getScraperData($requestFingerPrint, $requestParams);
|
|
|
|
return $this->renderResponse($requestFingerPrint, $results);
|
|
}
|
|
|
|
protected abstract function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData;
|
|
|
|
protected function resource(CachedData $results): JsonResource
|
|
{
|
|
return new ResultsResource(
|
|
$results->isEmpty() ? ["results" => []] : $results->toArray()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param string $requestFingerPrint
|
|
* @param CachedData $results
|
|
* @return TResponse
|
|
*/
|
|
protected function renderResponse(string $requestFingerPrint, CachedData $results)
|
|
{
|
|
$response = $this->resource($results)->response();
|
|
return $response->addJikanCacheFlags($requestFingerPrint, $results);
|
|
}
|
|
}
|