add internal search

This commit is contained in:
Irfan 2020-06-08 02:35:30 +05:00
parent 74906bd46a
commit 77d3b78705
9 changed files with 136 additions and 41 deletions

View File

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

View File

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

View File

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

View File

@ -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',

View File

@ -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
View File

@ -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",

View File

@ -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'),
]
],

View File

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

View 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');
}
}