mirror of
https://github.com/jikan-me/jikan-rest.git
synced 2025-02-20 11:23:35 +08:00
add internal search
This commit is contained in:
parent
74906bd46a
commit
77d3b78705
@ -3,6 +3,8 @@
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Anime\AnimeCharactersAndStaffRequest;
|
||||
use Jikan\Request\Anime\AnimeEpisodesRequest;
|
||||
use Jikan\Request\Anime\AnimeForumRequest;
|
||||
@ -20,6 +22,7 @@ class AnimeController extends Controller
|
||||
{
|
||||
public function main(int $id)
|
||||
{
|
||||
|
||||
$anime = $this->jikan->getAnime(new AnimeRequest($id));
|
||||
return response($this->serializer->serialize($anime, 'json'));
|
||||
}
|
||||
|
@ -2,6 +2,10 @@
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Jikan;
|
||||
use Jikan\MyAnimeList\MalClient;
|
||||
use Jikan\Request\Search\AnimeSearchRequest;
|
||||
@ -11,12 +15,44 @@ use Jikan\Request\Search\PersonSearchRequest;
|
||||
use Jikan\Helper\Constants as JikanConstants;
|
||||
use App\Providers\SearchQueryBuilder;
|
||||
use JMS\Serializer\Serializer;
|
||||
use MongoDB\BSON\UTCDateTime;
|
||||
use phpDocumentor\Reflection\Types\Object_;
|
||||
|
||||
class SearchController extends Controller
|
||||
{
|
||||
public function anime(int $page = 1)
|
||||
|
||||
private $request;
|
||||
|
||||
public function anime(Request $request, int $page = 1)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
$query = $request->get('q');
|
||||
$limit = 50;
|
||||
$offset = $page*$limit;
|
||||
|
||||
$results = DB::table('anime')
|
||||
// ->where([
|
||||
// ['title', 'like', "%${$query}%"],
|
||||
// ['title_english', 'like', "%${$query}%"],
|
||||
// ['title_japanese', 'like', "%${$query}%"],
|
||||
// ])
|
||||
->where('title', 'like', "%$query%")
|
||||
// ->orWhere('title_english', 'like', "%$query%")
|
||||
// ->orWhere('title_japanese', 'like', "%$query%")
|
||||
// ->offset($offset)
|
||||
// ->limit($limit)
|
||||
->select('mal_id', 'url', 'image_url', 'title', 'airing', 'synopsis', 'type', 'episodes', 'score', 'start_date', 'end_date', 'members', 'rated')
|
||||
->paginate(50);
|
||||
|
||||
// var_dump($results->items());
|
||||
// die;
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results);
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
|
||||
$search = $this->jikan->getAnimeSearch(
|
||||
SearchQueryBuilder::create(
|
||||
(new AnimeSearchRequest())->setPage($page)
|
||||
@ -76,4 +112,25 @@ class SearchController extends Controller
|
||||
$data
|
||||
);
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
'last_page' => $data->lastPage()
|
||||
];
|
||||
|
||||
$items = $data->items() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt']);
|
||||
}
|
||||
$items = ['results' => $items];
|
||||
|
||||
return $meta+$items;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -40,6 +40,10 @@ class DatabaseResolver
|
||||
|
||||
private $table;
|
||||
|
||||
public const SKIP = [
|
||||
'SearchController@anime'
|
||||
];
|
||||
|
||||
private const NON_QUEUEABLE = [
|
||||
'UserController@profile',
|
||||
'UserController@history',
|
||||
@ -79,6 +83,10 @@ class DatabaseResolver
|
||||
$this->route = explode('\\', $request->route()[1]['uses']);
|
||||
$this->route = end($this->route);
|
||||
|
||||
if (\in_array($this->route, self::SKIP)) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
$db = new DatabaseHandler();
|
||||
$this->table = $db::getMappedTableName($this->route);
|
||||
$this->requestCached = DB::table($this->table)->where('request_hash', $this->fingerprint)->exists();
|
||||
|
@ -70,15 +70,15 @@ $app->singleton(
|
||||
*/
|
||||
|
||||
$app->routeMiddleware([
|
||||
'blacklist' => App\Http\Middleware\Blacklist::class,
|
||||
'slave-auth' => App\Http\Middleware\SlaveAuthentication::class,
|
||||
'meta' => App\Http\Middleware\Meta::class,
|
||||
'cache-resolver' => App\Http\Middleware\CacheResolver::class,
|
||||
'throttle' => App\Http\Middleware\Throttle::class,
|
||||
'etag' => \App\Http\Middleware\EtagMiddleware::class,
|
||||
'microcaching' => \App\Http\Middleware\MicroCaching::class,
|
||||
// 'blacklist' => App\Http\Middleware\Blacklist::class,
|
||||
// 'slave-auth' => App\Http\Middleware\SlaveAuthentication::class,
|
||||
// 'meta' => App\Http\Middleware\Meta::class,
|
||||
// 'cache-resolver' => App\Http\Middleware\CacheResolver::class,
|
||||
// 'throttle' => App\Http\Middleware\Throttle::class,
|
||||
// 'etag' => \App\Http\Middleware\EtagMiddleware::class,
|
||||
// 'microcaching' => \App\Http\Middleware\MicroCaching::class,
|
||||
'database-resolver' => \App\Http\Middleware\DatabaseResolver::class,
|
||||
'source-health-monitor' => \App\Http\Middleware\SourceHealthMonitor::class
|
||||
// 'source-health-monitor' => \App\Http\Middleware\SourceHealthMonitor::class
|
||||
]);
|
||||
|
||||
/*
|
||||
@ -139,19 +139,19 @@ $commonMiddleware = [
|
||||
// 'microcaching',
|
||||
// 'cache-resolver',
|
||||
// 'throttle'
|
||||
'source-health-monitor'
|
||||
// 'source-health-monitor'
|
||||
];
|
||||
|
||||
$app->router->group(
|
||||
[
|
||||
'prefix' => 'v4',
|
||||
'namespace' => 'App\Http\Controllers\V4',
|
||||
'middleware' => $commonMiddleware
|
||||
],
|
||||
function ($router) {
|
||||
require __DIR__.'/../routes/web.v4.php';
|
||||
}
|
||||
);
|
||||
//$app->router->group(
|
||||
// [
|
||||
// 'prefix' => 'v4',
|
||||
// 'namespace' => 'App\Http\Controllers\V4',
|
||||
// 'middleware' => $commonMiddleware
|
||||
// ],
|
||||
// function ($router) {
|
||||
// require __DIR__.'/../routes/web.v4.php';
|
||||
// }
|
||||
//);
|
||||
|
||||
$app->router->group(
|
||||
[
|
||||
@ -175,7 +175,7 @@ $app->router->group(
|
||||
return response()->json([
|
||||
'author_url' => 'http://irfan.dahir.co',
|
||||
'discord_url' => 'https://discord.gg/4tvCr36',
|
||||
'version' => '4.0',
|
||||
'version' => '3.4',
|
||||
'parser_version' => JIKAN_PARSER_VERSION,
|
||||
'website_url' => 'https://jikan.moe',
|
||||
'documentation_url' => 'https://jikan.docs.apiary.io',
|
||||
|
@ -14,7 +14,7 @@
|
||||
"flipbox/lumen-generator": "^6",
|
||||
"illuminate/redis": "^7",
|
||||
"jenssegers/mongodb": "^4.0",
|
||||
"jikan-me/jikan": "^3.0",
|
||||
"jikan-me/jikan": "^2.0",
|
||||
"jms/serializer": "^1.13",
|
||||
"laravel/lumen-framework": "^7.0",
|
||||
"league/flysystem": "^1.0",
|
||||
|
12
composer.lock
generated
12
composer.lock
generated
@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "14c8c6eb422e03b6838bba397af565ff",
|
||||
"content-hash": "6dac559829ae30049fe10c9eb747ee3e",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
@ -2210,16 +2210,16 @@
|
||||
},
|
||||
{
|
||||
"name": "jikan-me/jikan",
|
||||
"version": "v3.0.0-alpha.6",
|
||||
"version": "v2.16.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jikan-me/jikan.git",
|
||||
"reference": "0c9075c63711ae61239ae987b1f94f7d510591f5"
|
||||
"reference": "f471981223b98ef5b69ebced45247687661777ca"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/jikan-me/jikan/zipball/0c9075c63711ae61239ae987b1f94f7d510591f5",
|
||||
"reference": "0c9075c63711ae61239ae987b1f94f7d510591f5",
|
||||
"url": "https://api.github.com/repos/jikan-me/jikan/zipball/f471981223b98ef5b69ebced45247687661777ca",
|
||||
"reference": "f471981223b98ef5b69ebced45247687661777ca",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2256,7 +2256,7 @@
|
||||
}
|
||||
],
|
||||
"description": "Jikan is an unofficial MyAnimeList API",
|
||||
"time": "2020-05-29T08:55:44+00:00"
|
||||
"time": "2020-05-01T03:38:12+00:00"
|
||||
},
|
||||
{
|
||||
"name": "jms/metadata",
|
||||
|
@ -16,8 +16,8 @@ return [
|
||||
]
|
||||
*/
|
||||
'driver' => 'mongodb',
|
||||
'dsn'=> "mongodb+srv://".env('DB_USERNAME', 'jikan').":".env('DB_PASSWORD', '')."@".env('MONGODB_DSN', ''),
|
||||
'database' => env('DB_DATABASE', ''),
|
||||
'dsn'=> "mongodb://".env('DB_USERNAME', 'jikan').":".env('DB_PASSWORD', '')."@".env('MONGODB_DSN', ''),
|
||||
'database' => env('DB_DATABASE', 'jikan'),
|
||||
]
|
||||
],
|
||||
|
||||
|
@ -23,17 +23,6 @@ class CreateQueueIndex extends Migration
|
||||
$table->unsignedInteger('available_at');
|
||||
$table->unsignedInteger('created_at');
|
||||
});
|
||||
|
||||
Schema::create(env('QUEUE_TABLE', 'jobs'), function (Blueprint $table) {
|
||||
$table->index(['queue', 'reserved_at']);
|
||||
$table->bigIncrements('id');
|
||||
$table->string('queue');
|
||||
$table->longText('payload');
|
||||
$table->tinyInteger('attempts')->unsigned();
|
||||
$table->unsignedInteger('reserved_at')->nullable();
|
||||
$table->unsignedInteger('available_at');
|
||||
$table->unsignedInteger('created_at');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
38
database/migrations/2020_06_07_230022_create_anime_table.php
Normal file
38
database/migrations/2020_06_07_230022_create_anime_table.php
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateAnimeTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('anime', function (Blueprint $table) {
|
||||
$table->unique(['request_hash' => 1], 'request_hash');
|
||||
$table->unique(['mal_id' => 1], 'mal_id');
|
||||
$table->index('title');
|
||||
$table->index('title_english');
|
||||
$table->index('title_japanese');
|
||||
$table->index('type');
|
||||
$table->index('source');
|
||||
$table->index(['score' => 1], 'score');
|
||||
$table->index(['rank' => 1], 'rank');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('anime');
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user