From 81f7d1726329be007f0c2585b195e353617272cd Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Dec 2022 02:50:13 -0700 Subject: [PATCH] Update FollowerService, improve cache invalidation --- app/Http/Controllers/Api/ApiV1Controller.php | 6 ++- app/Observers/FollowerObserver.php | 42 ++++++++++++++++++++ app/Providers/AppServiceProvider.php | 3 ++ app/Services/FollowerService.php | 9 +++-- 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 app/Observers/FollowerObserver.php diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index d2c8b2028..a90989978 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/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); } diff --git a/app/Observers/FollowerObserver.php b/app/Observers/FollowerObserver.php new file mode 100644 index 000000000..fd5f00880 --- /dev/null +++ b/app/Observers/FollowerObserver.php @@ -0,0 +1,42 @@ +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); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index a5af9daf8..774177758 100644 --- a/app/Providers/AppServiceProvider.php +++ b/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); diff --git a/app/Services/FollowerService.php b/app/Services/FollowerService.php index b95af0803..457819654 100644 --- a/app/Services/FollowerService.php +++ b/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)