diff --git a/be/app/Exceptions/Handler.php b/be/app/Exceptions/Handler.php index 1cdfb319..15fa26e5 100644 --- a/be/app/Exceptions/Handler.php +++ b/be/app/Exceptions/Handler.php @@ -19,7 +19,7 @@ protected function convertValidationExceptionToResponse(\Illuminate\Validation\V return $e->response; } - return \Response::json([ + return response()->json([ 'errorCode' => 40000, 'errorInfo' => $e->validator->getMessageBag()->getMessages() ], 400); diff --git a/be/app/Helper.php b/be/app/Helper.php index 8a425b6c..60d140a5 100644 --- a/be/app/Helper.php +++ b/be/app/Helper.php @@ -68,7 +68,6 @@ public static function abortAPI(int $errorCode): never 40003 => '部分查询参数与查询帖子类型要求不匹配', 40004 => '排序方式与查询帖子类型要求不匹配', 40005 => '提供了多个唯一查询参数', - 40006 => '指定查询的贴吧不存在', ], 401 => [ 40101 => 'Google reCAPTCHA 验证未通过 请刷新页面/更换设备/网络环境后重试', @@ -77,6 +76,7 @@ public static function abortAPI(int $errorCode): never 40401 => '帖子查询结果为空', 40402 => '用户查询结果为空', 40403 => '吧帖量统计查询结果为空', + 40406 => '指定查询的贴吧不存在', ], 500 => [ 50001 => '数据库中存在多个贴吧表存储了该 ID 的帖子', @@ -94,10 +94,7 @@ public static function abortAPI(int $errorCode): never if ($errorInfo === null) { throw new \InvalidArgumentException('Given error code doesn\'t existed'); } - \Response::json([ - 'errorCode' => $errorCode, - 'errorInfo' => $errorInfo - ], $statusCode)->send(); + response()->json(compact('errorCode', 'errorInfo'), $statusCode)->throwResponse(); exit; } diff --git a/be/app/Http/Controllers/ThreadsIDQuery.php b/be/app/Http/Controllers/ThreadsIDQuery.php new file mode 100644 index 00000000..949ed061 --- /dev/null +++ b/be/app/Http/Controllers/ThreadsIDQuery.php @@ -0,0 +1,30 @@ + $cursor] = $request->validate([ + 'cursor' => 'integer' + ]) + ['cursor' => 0]; + Helper::abortAPIIfNot(40406, (new Forum())->fid($fid)->exists()); + $thread = PostFactory::newThread($fid); + $primaryKey = $thread->getTable() . '.tid'; + $paginators = $thread->cursorPaginate(1000, columns: 'tid', cursor: new Cursor([$primaryKey => $cursor])); + + return [ + 'pages' => [ + 'currentCursor' => $paginators->cursor()->parameter($primaryKey), + 'nextCursor' => $paginators->nextCursor()->parameter($primaryKey) + ], + 'tid' => array_column($paginators->items(), 'tid') + ]; + } +} diff --git a/be/app/Http/PostsQuery/IndexQuery.php b/be/app/Http/PostsQuery/IndexQuery.php index a2511063..a478cac0 100644 --- a/be/app/Http/PostsQuery/IndexQuery.php +++ b/be/app/Http/PostsQuery/IndexQuery.php @@ -64,7 +64,7 @@ public function query(QueryParams $params, ?string $cursor): self $fid = $getFidByPostIDParam($postIDParamName, $postIDParamValue); $queries = $getQueryBuilders($fid); } else { - Helper::abortAPI(40006); + Helper::abortAPI(40406); } } elseif ($hasPostIDParam) { // query by post ID only $fid = $getFidByPostIDParam($postIDParamName, $postIDParamValue); diff --git a/be/routes/api.php b/be/routes/api.php index 471eb549..9193861f 100644 --- a/be/routes/api.php +++ b/be/routes/api.php @@ -1,13 +1,12 @@ \App\Eloquent\Model\Forum::all()->toArray()); - +Route::get('/forums/{fid}/threads/tid', [Controllers\ThreadsIDQuery::class, 'query']); Route::middleware(ReCAPTCHACheck::class)->group(static function () { - Route::get('/posts', [PostsQuery::class, 'query']); - Route::get('/users', [UsersQuery::class, 'query']); + Route::get('/posts', [Controllers\PostsQuery::class, 'query']); + Route::get('/users', [Controllers\UsersQuery::class, 'query']); });