diff --git a/app/Jobs/FollowPipeline/UnfollowPipeline.php b/app/Jobs/FollowPipeline/UnfollowPipeline.php index c00246e2f..99f763f5c 100644 --- a/app/Jobs/FollowPipeline/UnfollowPipeline.php +++ b/app/Jobs/FollowPipeline/UnfollowPipeline.php @@ -17,6 +17,7 @@ use Illuminate\Support\Facades\Redis; use App\Services\AccountService; use App\Services\FollowerService; use App\Services\NotificationService; +use App\Jobs\HomeFeedPipeline\FeedUnfollowPipeline; class UnfollowPipeline implements ShouldQueue { @@ -55,6 +56,8 @@ class UnfollowPipeline implements ShouldQueue return; } + FeedUnfollowPipeline::dispatch($actor, $target)->onQueue('follow'); + FollowerService::remove($actor, $target); $actorProfileSync = Cache::get(FollowerService::FOLLOWING_SYNC_KEY . $actor); diff --git a/app/Jobs/HomeFeedPipeline/FeedFollowPipeline.php b/app/Jobs/HomeFeedPipeline/FeedFollowPipeline.php new file mode 100644 index 000000000..841409b6f --- /dev/null +++ b/app/Jobs/HomeFeedPipeline/FeedFollowPipeline.php @@ -0,0 +1,83 @@ +actorId . ':fid:' . $this->followingId; + } + + /** + * Get the middleware the job should pass through. + * + * @return array + */ + public function middleware(): array + { + return [(new WithoutOverlapping("hts:feed:insert:follows:aid:{$this->actorId}:fid:{$this->followingId}"))->shared()->dontRelease()]; + } + + /** + * Create a new job instance. + */ + public function __construct($actorId, $followingId) + { + $this->actorId = $actorId; + $this->followingId = $followingId; + } + + /** + * Execute the job. + */ + public function handle(): void + { + $actorId = $this->actorId; + $followingId = $this->followingId; + + $ids = Status::where('profile_id', $followingId) + ->whereNull(['in_reply_to_id', 'reblog_of_id']) + ->whereIn('type', ['photo', 'photo:album', 'video', 'video:album', 'photo:video:album']) + ->whereIn('visibility',['public', 'unlisted', 'private']) + ->orderByDesc('id') + ->limit(HomeTimelineService::FOLLOWER_FEED_POST_LIMIT) + ->pluck('id'); + + foreach($ids as $id) { + HomeTimelineService::add($actorId, $id); + } + } +} diff --git a/app/Jobs/HomeFeedPipeline/FeedUnfollowPipeline.php b/app/Jobs/HomeFeedPipeline/FeedUnfollowPipeline.php new file mode 100644 index 000000000..996e74c10 --- /dev/null +++ b/app/Jobs/HomeFeedPipeline/FeedUnfollowPipeline.php @@ -0,0 +1,81 @@ +actorId . ':fid:' . $this->followingId; + } + + /** + * Get the middleware the job should pass through. + * + * @return array + */ + public function middleware(): array + { + return [(new WithoutOverlapping("hts:feed:remove:follows:aid:{$this->actorId}:fid:{$this->followingId}"))->shared()->dontRelease()]; + } + + /** + * Create a new job instance. + */ + public function __construct($actorId, $followingId) + { + $this->actorId = $actorId; + $this->followingId = $followingId; + } + + /** + * Execute the job. + */ + public function handle(): void + { + $actorId = $this->actorId; + $followingId = $this->followingId; + + $ids = HomeTimelineService::get($actorId, 0, -1); + foreach($ids as $id) { + $status = StatusService::get($id, false); + if($status && isset($status['account'], $status['account']['id'])) { + if($status['account']['id'] == $followingId) { + HomeTimelineService::rem($actorId, $id); + } + } + } + } +} diff --git a/app/Observers/FollowerObserver.php b/app/Observers/FollowerObserver.php index f230bb79f..bc85e48a0 100644 --- a/app/Observers/FollowerObserver.php +++ b/app/Observers/FollowerObserver.php @@ -5,6 +5,8 @@ namespace App\Observers; use App\Follower; use App\Services\FollowerService; use Cache; +use App\Jobs\HomeFeedPipeline\FeedFollowPipeline; +use App\Jobs\HomeFeedPipeline\FeedUnfollowPipeline; class FollowerObserver { @@ -21,6 +23,7 @@ class FollowerObserver } FollowerService::add($follower->profile_id, $follower->following_id); + FeedFollowPipeline::dispatch($follower->profile_id, $follower->following_id)->onQueue('follow'); } /**