From 2fb67537df8f5b5929c4f04001b08f4bc38b3afb Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Mon, 8 Jun 2020 09:51:35 +0800 Subject: [PATCH] optimize querying reports --- app/Http/Controllers/ReportController.php | 20 +++-------- app/Models/Report.php | 5 +++ .../admin/ReportsManagement/ImageBox.tsx | 4 +-- .../views/admin/ReportsManagement/types.ts | 6 ++-- .../views/admin/ReportsManagement.test.tsx | 35 +++++++++++++++++-- 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 6967796c..c53514c3 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -20,6 +20,7 @@ class ReportController extends Controller 'tid' => 'required|exists:textures', 'reason' => 'required', ]); + /** @var User */ $reporter = auth()->user(); $tid = $data['tid']; $reason = $data['reason']; @@ -68,22 +69,9 @@ class ReportController extends Controller { $q = $request->input('q'); - $pagination = Report::usingSearchString($q)->paginate(9); - $collection = $pagination->getCollection()->map(function ($report) { - $uploader = User::find($report->uploader); - if ($uploader) { - $report->uploaderName = $uploader->nickname; - } - if ($report->informer) { - $report->reporterName = $report->informer->nickname; - } - $report->getAttribute('texture'); - - return $report; - }); - $pagination->setCollection($collection); - - return $pagination; + return Report::usingSearchString($q) + ->with(['texture', 'textureUploader', 'informer']) + ->paginate(9); } public function review( diff --git a/app/Models/Report.php b/app/Models/Report.php index d6658804..5d28799f 100644 --- a/app/Models/Report.php +++ b/app/Models/Report.php @@ -51,6 +51,11 @@ class Report extends Model return $this->belongsTo(Texture::class, 'tid', 'tid'); } + public function textureUploader() + { + return $this->belongsTo(User::class, 'uploader', 'uid'); + } + public function informer() { return $this->belongsTo(User::class, 'reporter', 'uid'); diff --git a/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx b/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx index 339ff341..6c5491a4 100644 --- a/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx +++ b/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx @@ -49,7 +49,7 @@ const ImageBox: React.FC = (props) => { {t('skinlib.show.uploader')} {': '} - {report.uploaderName} + {report.texture_uploader?.nickname} (UID: {report.uploader})
@@ -114,7 +114,7 @@ const ImageBox: React.FC = (props) => { {t('report.reporter')} {': '} - {report.reporterName} + {report.informer?.nickname} (UID: {report.reporter})
diff --git a/resources/assets/src/views/admin/ReportsManagement/types.ts b/resources/assets/src/views/admin/ReportsManagement/types.ts index b6edba80..694f2162 100644 --- a/resources/assets/src/views/admin/ReportsManagement/types.ts +++ b/resources/assets/src/views/admin/ReportsManagement/types.ts @@ -1,4 +1,4 @@ -import { Texture } from '@/scripts/types' +import { Texture, User } from '@/scripts/types' export const enum Status { Pending = 0, @@ -11,9 +11,9 @@ export type Report = { tid: number texture: Texture | null uploader: number - uploaderName: string + texture_uploader: User | null reporter: number - reporterName: string + informer: User | null reason: string status: Status report_at: string diff --git a/resources/assets/tests/views/admin/ReportsManagement.test.tsx b/resources/assets/tests/views/admin/ReportsManagement.test.tsx index 3f43cd06..bf9ad3a6 100644 --- a/resources/assets/tests/views/admin/ReportsManagement.test.tsx +++ b/resources/assets/tests/views/admin/ReportsManagement.test.tsx @@ -3,7 +3,7 @@ import { render, waitFor, fireEvent } from '@testing-library/react' import { createPaginator } from '../../utils' import { t } from '@/scripts/i18n' import * as fetch from '@/scripts/net' -import { Texture, TextureType } from '@/scripts/types' +import { Texture, TextureType, User, UserPermission } from '@/scripts/types' import ReportsManagement from '@/views/admin/ReportsManagement' import { Report, Status } from '@/views/admin/ReportsManagement/types' @@ -14,9 +14,31 @@ const fixture: Readonly = Object.freeze({ tid: 1, texture: null, uploader: 1, - uploaderName: 'xx', + texture_uploader: Object.freeze>({ + uid: 1, + email: 'a@b.c', + nickname: 'abc', + score: 1000, + avatar: 0, + permission: UserPermission.Normal, + ip: '::1', + last_sign_at: new Date().toString(), + register_at: new Date().toString(), + verified: true, + }), reporter: 2, - reporterName: 'yy', + informer: Object.freeze>({ + uid: 1, + email: 'a@b.c', + nickname: 'abc', + score: 1000, + avatar: 0, + permission: UserPermission.Normal, + ip: '::1', + last_sign_at: new Date().toString(), + register_at: new Date().toString(), + verified: true, + }), reason: 'nsfw', status: Status.Pending, report_at: new Date().toString(), @@ -45,6 +67,13 @@ test('search reports', async () => { ) }) +test('empty reporter or texture uploader', async () => { + const report = { ...fixture, texture_uploader: null, informer: null } + fetch.get.mockResolvedValue(createPaginator([report])) + + render() +}) + test('preview texture', async () => { const texture: Texture = { tid: fixture.tid,