From 749339f33180c0002a0bbec185ae8af32dff32ae Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Tue, 19 Mar 2019 15:19:33 +0800 Subject: [PATCH] Process `likes` in a special method --- app/Http/Controllers/SkinlibController.php | 19 +++++++++++++------ tests/SkinlibControllerTest.php | 12 ++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/SkinlibController.php b/app/Http/Controllers/SkinlibController.php index e9c23972..4a40e9e1 100644 --- a/app/Http/Controllers/SkinlibController.php +++ b/app/Http/Controllers/SkinlibController.php @@ -55,10 +55,6 @@ class SkinlibController extends Controller // Filter result by uploader's uid $uploader = intval($request->input('uploader', 0)); - // Available sorting methods: time, likes - $sort = $request->input('sort', 'time'); - $sortBy = ($sort == 'time') ? 'upload_at' : $sort; - // Current page $page = $request->input('page', 1); $currentPage = ($page <= 0) ? 1 : $page; @@ -101,11 +97,22 @@ class SkinlibController extends Controller $totalPages = ceil($query->count() / $itemsPerPage); - $textures = $query->orderBy($sortBy, 'desc') - ->skip(($currentPage - 1) * $itemsPerPage) + // Available sorting methods: time + $sort = $request->input('sort', 'time'); + $sortBy = ($sort == 'time') ? 'upload_at' : $sort; + // `likes` property is not actually existed in database. + if ($sortBy != 'likes') { + $query = $query->orderBy($sortBy, 'desc'); + } + + $textures = $query->skip(($currentPage - 1) * $itemsPerPage) ->take($itemsPerPage) ->get(); + if ($sortBy == 'likes') { + $textures = $textures->sortByDesc('likes')->values(); + } + if ($user) { $closet = $user->closet()->get(); foreach ($textures as $item) { diff --git a/tests/SkinlibControllerTest.php b/tests/SkinlibControllerTest.php index bfd43c83..c2bfe6a9 100644 --- a/tests/SkinlibControllerTest.php +++ b/tests/SkinlibControllerTest.php @@ -109,6 +109,18 @@ class SkinlibControllerTest extends TestCase }, $items); $this->assertArraySubset($ordered, $items); + // Sort by `likes` + $user = factory(User::class)->create(); + $user->closet()->attach($skins->random()->tid, ['item_name' => 'name']); + $items = $this->getJson('/skinlib/data?sort=likes') + ->assertJson([ + 'current_uid' => 0, + 'total_pages' => 1, + ]) + ->decodeResponseJson('items'); + $this->assertEquals(1, $items[0]['likes']); + $this->assertEquals(0, $items[1]['likes']); + // Search $keyword = Str::limit($skins->random()->name, 1, ''); $keyworded = $skins