Parcourir la source

Merge pull request #2562 from pixelfed/staging

Update DiscoverController, improve trending api performance
daniel il y a 4 ans
Parent
commit
3d8019fa11
3 fichiers modifiés avec 53 ajouts et 24 suppressions
  1. 1 0
      CHANGELOG.md
  2. 34 24
      app/Http/Controllers/DiscoverController.php
  3. 18 0
      app/Services/SnowflakeService.php

+ 1 - 0
CHANGELOG.md

@@ -154,6 +154,7 @@
 - Updated StatusController, fix scope bug. ([7dc3739c](https://github.com/pixelfed/pixelfed/commit/7dc3739c))
 - Updated AP helpers, fixed federation bug. ([a52564f3](https://github.com/pixelfed/pixelfed/commit/a52564f3))
 - Updated Helpers, cache profiles. ([1f672ecf](https://github.com/pixelfed/pixelfed/commit/1f672ecf))
+- Updated DiscoverController, improve trending api performance. ([d8d3331f](https://github.com/pixelfed/pixelfed/commit/d8d3331f))
 
 ## [v0.10.9 (2020-04-17)](https://github.com/pixelfed/pixelfed/compare/v0.10.8...v0.10.9)
 ### Added

+ 34 - 24
app/Http/Controllers/DiscoverController.php

@@ -22,6 +22,8 @@ use League\Fractal;
 use League\Fractal\Serializer\ArraySerializer;
 use League\Fractal\Pagination\IlluminatePaginatorAdapter;
 use App\Services\StatusHashtagService;
+use App\Services\SnowflakeService;
+use App\Services\StatusService;
 
 class DiscoverController extends Controller
 {
@@ -173,33 +175,41 @@ class DiscoverController extends Controller
         'range' => 'nullable|string|in:daily,monthly'
       ]);
 
-      $range = $request->filled('range') ? 
-        $request->input('range') == 'alltime' ? '-1' : 
-        ($request->input('range') == 'daily' ? 1 : 31) : 1;
-
-      $key = ':api:discover:trending:v2.1:range:' . $range;
-      $ttl = now()->addHours(2);
-      $res = Cache::remember($key, $ttl, function() use($range) {
-        if($range == '-1') {
-          $res = Status::whereScope('public')
-          ->whereIn('type', ['photo', 'photo:album', 'video'])
-          ->whereIsNsfw(false)
-          ->orderBy('likes_count','desc')
-          ->take(12)
-          ->get();
-        } else {
-          $res = Status::whereScope('public')
-          ->whereIn('type', ['photo', 'photo:album', 'video'])
+      $range = $request->input('range') == 'monthly' ? 31 : 1;
+
+      $key = ':api:discover:trending:v2.8:range:' . $range;
+      $ttl = now()->addMinutes(15);
+
+      $ids = Cache::remember($key, $ttl, function() use($range) {
+        $days = $range == 1 ? 2 : 31;
+        $min_id = SnowflakeService::byDate(now()->subDays($days));
+        return Status::select(
+            'id', 
+            'scope', 
+            'type', 
+            'is_nsfw', 
+            'likes_count', 
+            'created_at'
+          )
+          ->where('id', '>', $min_id)
+          ->whereNull('uri')
+          ->whereScope('public')
+          ->whereIn('type', [
+            'photo', 
+            'photo:album', 
+            'video'
+          ])
           ->whereIsNsfw(false)
           ->orderBy('likes_count','desc')
-          ->take(12)
-          ->where('created_at', '>', now()->subDays($range))
-          ->get();
-          }
-        $resource = new Fractal\Resource\Collection($res, new StatusStatelessTransformer());
-        return $this->fractal->createData($resource)->toArray();
+          ->take(15)
+          ->pluck('id');
       });
-      return response()->json($res, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
+
+      $res = $ids->map(function($s) {
+        return StatusService::get($s);
+      });
+
+      return response()->json($res);
     }
 
     public function trendingHashtags(Request $request)

+ 18 - 0
app/Services/SnowflakeService.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Services;
+
+use Illuminate\Support\Carbon;
+
+class SnowflakeService {
+
+	public static function byDate(Carbon $ts = null)
+	{
+		$ts = $ts ? now()->parse($ts)->timestamp : microtime(true);
+		return ((round($ts * 1000) - 1549756800000) << 22)
+		| (1 << 17)
+		| (1 << 12)
+		| 0;
+	}
+
+}