浏览代码

Fix regression in comment mutes/blocks

Daniel Supernault 6 年之前
父节点
当前提交
60e9d547ae

+ 11 - 0
app/Http/Controllers/CommentController.php

@@ -13,6 +13,7 @@ use App\Jobs\StatusPipeline\NewStatusPipeline;
 use App\Util\Lexer\Autolink;
 use App\Profile;
 use App\Status;
+use App\UserFilter;
 use League\Fractal;
 use App\Transformer\Api\StatusTransformer;
 use League\Fractal\Serializer\ArraySerializer;
@@ -57,6 +58,16 @@ class CommentController extends Controller
             return;
         }
 
+        $filtered = UserFilter::whereUserId($status->profile_id)
+            ->whereFilterableType('App\Profile')
+            ->whereIn('filter_type', ['mute', 'block'])
+            ->whereFilterableId($profile->id)
+            ->exists();
+
+        if($filtered == true) {
+            return;
+        }
+
         $reply = DB::transaction(function() use($comment, $status, $profile) {
             $autolink = Autolink::create()->autolink($comment);
             $reply = new Status();

+ 14 - 0
app/Http/Controllers/PublicApiController.php

@@ -113,10 +113,22 @@ class PublicApiController extends Controller
         $profile = Profile::whereUsername($username)->whereNull('status')->firstOrFail();
         $status = Status::whereProfileId($profile->id)->whereCommentsDisabled(false)->findOrFail($postId);
         $this->scopeCheck($profile, $status);
+
+        if(Auth::check()) {
+            $pid = Auth::user()->profile->id;
+            $filtered = UserFilter::whereUserId($pid)
+            ->whereFilterableType('App\Profile')
+            ->whereIn('filter_type', ['mute', 'block'])
+            ->pluck('filterable_id')->toArray();
+        } else {
+            $filtered = [];
+        }
+
         if($request->filled('min_id') || $request->filled('max_id')) {
             if($request->filled('min_id')) {
                 $replies = $status->comments()
                 ->whereNull('reblog_of_id')
+                ->whereNotIn('profile_id', $filtered)
                 ->select('id', 'caption', 'is_nsfw', 'rendered', 'profile_id', 'in_reply_to_id', 'type', 'reply_count', 'created_at')
                 ->where('id', '>=', $request->min_id)
                 ->orderBy('id', 'desc')
@@ -125,6 +137,7 @@ class PublicApiController extends Controller
             if($request->filled('max_id')) {
                 $replies = $status->comments()
                 ->whereNull('reblog_of_id')
+                ->whereNotIn('profile_id', $filtered)
                 ->select('id', 'caption', 'is_nsfw', 'rendered', 'profile_id', 'in_reply_to_id', 'type', 'reply_count', 'created_at')
                 ->where('id', '<=', $request->max_id)
                 ->orderBy('id', 'desc')
@@ -133,6 +146,7 @@ class PublicApiController extends Controller
         } else {
             $replies = $status->comments()
             ->whereNull('reblog_of_id')
+            ->whereNotIn('profile_id', $filtered)
             ->select('id', 'caption', 'is_nsfw', 'rendered', 'profile_id', 'in_reply_to_id', 'type', 'reply_count', 'created_at')
             ->orderBy('id', 'desc')
             ->paginate($limit);

+ 11 - 1
app/Jobs/CommentPipeline/CommentPipeline.php

@@ -4,7 +4,8 @@ namespace App\Jobs\CommentPipeline;
 
 use App\{
     Notification,
-    Status
+    Status,
+    UserFilter
 };
 use App\Services\NotificationService;
 use DB, Cache, Log, Redis;
@@ -56,6 +57,15 @@ class CommentPipeline implements ShouldQueue
         if ($actor->id === $target->id || $status->comments_disabled == true) {
             return true;
         }
+        $filtered = UserFilter::whereUserId($target->id)
+            ->whereFilterableType('App\Profile')
+            ->whereIn('filter_type', ['mute', 'block'])
+            ->whereFilterableId($actor->id)
+            ->exists();
+
+        if($filtered == true) {
+            return;
+        }
 
         DB::transaction(function() use($target, $actor, $comment) {
             $notification = new Notification();