瀏覽代碼

Update FollowerService, improve cache invalidation

Daniel Supernault 2 年之前
父節點
當前提交
81f7d17263

+ 5 - 1
app/Http/Controllers/Api/ApiV1Controller.php

@@ -650,7 +650,6 @@ class ApiV1Controller extends Controller
 			->whereNull('status')
 			->findOrFail($id);
 
-
 		$private = (bool) $target->is_private;
 		$remote = (bool) $target->domain;
 		$blocked = UserFilter::whereUserId($target->id)
@@ -701,6 +700,7 @@ class ApiV1Controller extends Controller
 				(new FollowerController())->sendFollow($user->profile, $target);
 			}
 			FollowPipeline::dispatch($follower);
+			$target->increment('followers_count');
 		}
 
 		RelationshipService::refresh($user->profile_id, $target->id);
@@ -778,6 +778,10 @@ class ApiV1Controller extends Controller
 			->whereFollowingId($target->id)
 			->delete();
 
+		FollowerService::remove($user->profile_id, $target->id);
+
+		$target->decrement('followers_count');
+
 		if($remote == true && config('federation.activitypub.remoteFollow') == true) {
 			(new FollowerController())->sendUndoFollow($user->profile, $target);
 		}

+ 42 - 0
app/Observers/FollowerObserver.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Observers;
+
+use App\Follower;
+use App\Services\FollowerService;
+
+class FollowerObserver
+{
+    /**
+     * Handle the Follower "created" event.
+     *
+     * @param  \App\Follower  $follower
+     * @return void
+     */
+    public function created(Follower $follower)
+    {
+        FollowerService::add($follower->profile_id, $follower->following_id);
+    }
+
+    /**
+     * Handle the Follower "deleted" event.
+     *
+     * @param  \App\Follower  $follower
+     * @return void
+     */
+    public function deleted(Follower $follower)
+    {
+        FollowerService::remove($follower->profile_id, (string) $follower->following_id);
+    }
+
+    /**
+     * Handle the Follower "force deleted" event.
+     *
+     * @param  \App\Follower  $follower
+     * @return void
+     */
+    public function forceDeleted(Follower $follower)
+    {
+        FollowerService::remove($follower->profile_id, (string) $follower->following_id);
+    }
+}

+ 3 - 0
app/Providers/AppServiceProvider.php

@@ -4,6 +4,7 @@ namespace App\Providers;
 
 use App\Observers\{
 	AvatarObserver,
+	FollowerObserver,
 	LikeObserver,
 	NotificationObserver,
 	ModLogObserver,
@@ -15,6 +16,7 @@ use App\Observers\{
 };
 use App\{
 	Avatar,
+	Follower,
 	Like,
 	Notification,
 	ModLog,
@@ -47,6 +49,7 @@ class AppServiceProvider extends ServiceProvider
 		Schema::defaultStringLength(191);
 		Paginator::useBootstrap();
 		Avatar::observe(AvatarObserver::class);
+		Follower::observe(FollowerObserver::class);
 		Like::observe(LikeObserver::class);
 		Notification::observe(NotificationObserver::class);
 		ModLog::observe(ModLogObserver::class);

+ 6 - 3
app/Services/FollowerService.php

@@ -23,18 +23,21 @@ class FollowerService
 
 	public static function add($actor, $target)
 	{
+		$ts = (int) microtime(true);
 		RelationshipService::refresh($actor, $target);
-		Redis::zadd(self::FOLLOWING_KEY . $actor, $target, $target);
-		Redis::zadd(self::FOLLOWERS_KEY . $target, $actor, $actor);
+		Redis::zadd(self::FOLLOWING_KEY . $actor, $ts, $target);
+		Redis::zadd(self::FOLLOWERS_KEY . $target, $ts, $actor);
 	}
 
 	public static function remove($actor, $target)
 	{
-		RelationshipService::refresh($actor, $target);
 		Redis::zrem(self::FOLLOWING_KEY . $actor, $target);
 		Redis::zrem(self::FOLLOWERS_KEY . $target, $actor);
 		Cache::forget('pf:services:follow:audience:' . $actor);
 		Cache::forget('pf:services:follow:audience:' . $target);
+		AccountService::del($actor);
+		AccountService::del($target);
+		RelationshipService::refresh($actor, $target);
 	}
 
 	public static function followers($id, $start = 0, $stop = 10)