Browse Source

Update RemoteStatusDelete pipeline

Daniel Supernault 1 year ago
parent
commit
ed87ddb923

+ 2 - 2
app/Http/Controllers/Admin/AdminReportController.php

@@ -27,8 +27,8 @@ use App\Services\StoryService;
 use App\Services\ModLogService;
 use App\Jobs\DeletePipeline\DeleteAccountPipeline;
 use App\Jobs\DeletePipeline\DeleteRemoteProfilePipeline;
-use App\Jobs\DeletePipeline\DeleteRemoteStatusPipeline;
 use App\Jobs\StatusPipeline\StatusDelete;
+use App\Jobs\StatusPipeline\RemoteStatusDelete;
 use App\Http\Resources\AdminReport;
 use App\Http\Resources\AdminSpamReport;
 use App\Services\NotificationService;
@@ -1049,7 +1049,7 @@ trait AdminReportController
     				StatusDelete::dispatch($status)->onQueue('high');
     			} else {
     				NetworkTimelineService::del($status->id);
-    				DeleteRemoteStatusPipeline::dispatch($status)->onQueue('high');
+    				RemoteStatusDelete::dispatch($status)->onQueue('high');
     			}
 
     			Report::whereObjectId($report->object_id)

+ 2 - 1
app/Http/Controllers/Api/ApiV1Dot1Controller.php

@@ -34,6 +34,7 @@ use App\Mail\PasswordChange;
 use App\Mail\ConfirmAppEmail;
 use App\Http\Resources\StatusStateless;
 use App\Jobs\StatusPipeline\StatusDelete;
+use App\Jobs\StatusPipeline\RemoteStatusDelete;
 use App\Jobs\ReportPipeline\ReportNotifyAdminViaEmail;
 use Illuminate\Support\Facades\RateLimiter;
 
@@ -838,7 +839,7 @@ class ApiV1Dot1Controller extends Controller
 			Cache::forget('profile:embed:' . $status->profile_id);
 			StatusService::del($status->id, true);
 			Cache::forget('profile:status_count:'.$status->profile_id);
-			StatusDelete::dispatch($status);
+			$status->uri ? RemoteStatusDelete::dispatch($status) : StatusDelete::dispatch($status);
 			return [];
 		}
 

+ 3 - 2
app/Http/Controllers/StatusController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Jobs\ImageOptimizePipeline\ImageOptimize;
 use App\Jobs\StatusPipeline\NewStatusPipeline;
 use App\Jobs\StatusPipeline\StatusDelete;
+use App\Jobs\StatusPipeline\RemoteStatusDelete;
 use App\Jobs\SharePipeline\SharePipeline;
 use App\Jobs\SharePipeline\UndoSharePipeline;
 use App\AccountInterstitial;
@@ -242,7 +243,7 @@ class StatusController extends Controller
 				Cache::forget('profile:embed:' . $status->profile_id);
 				StatusService::del($status->id, true);
 				Cache::forget('profile:status_count:'.$status->profile_id);
-				StatusDelete::dispatch($status);
+				$status->uri ? RemoteStatusDelete::dispatch($status) : StatusDelete::dispatch($status);
 			}
 		} else if ($status->profile_id == $user->profile_id || $user->is_admin == true) {
 			Cache::forget('_api:statuses:recent_9:' . $status->profile_id);
@@ -250,7 +251,7 @@ class StatusController extends Controller
 			Cache::forget('profile:embed:' . $status->profile_id);
 			StatusService::del($status->id, true);
 			Cache::forget('profile:status_count:'.$status->profile_id);
-			StatusDelete::dispatch($status);
+			$status->uri ? RemoteStatusDelete::dispatch($status) : StatusDelete::dispatch($status);
 		}
 
 		if($request->wantsJson()) {

+ 2 - 1
app/Jobs/DeletePipeline/DeleteRemoteProfilePipeline.php

@@ -51,6 +51,7 @@ use App\Models\Conversation;
 use App\Models\Poll;
 use App\Models\PollVote;
 use App\Services\AccountService;
+use App\Jobs\StatusPipeline\RemoteStatusDelete;
 
 class DeleteRemoteProfilePipeline implements ShouldQueue
 {
@@ -86,7 +87,7 @@ class DeleteRemoteProfilePipeline implements ShouldQueue
 		Status::whereProfileId($pid)
 			->chunk(50, function($statuses) {
 				foreach($statuses as $status) {
-					DeleteRemoteStatusPipeline::dispatch($status)->onQueue('delete');
+					RemoteStatusDelete::dispatch($status)->onQueue('delete');
 				}
 		});
 

+ 144 - 0
app/Jobs/StatusPipeline/RemoteStatusDelete.php

@@ -0,0 +1,144 @@
+<?php
+
+namespace App\Jobs\StatusPipeline;
+
+use DB, Cache, Storage;
+use App\{
+    AccountInterstitial,
+    Bookmark,
+    CollectionItem,
+    DirectMessage,
+    Like,
+    Media,
+    MediaTag,
+    Mention,
+    Notification,
+    Report,
+    Status,
+    StatusArchived,
+    StatusHashtag,
+    StatusView
+};
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use League\Fractal;
+use Illuminate\Support\Str;
+use League\Fractal\Serializer\ArraySerializer;
+use App\Transformer\ActivityPub\Verb\DeleteNote;
+use App\Util\ActivityPub\Helpers;
+use GuzzleHttp\Pool;
+use GuzzleHttp\Client;
+use GuzzleHttp\Promise;
+use App\Util\ActivityPub\HttpSignature;
+use App\Services\AccountService;
+use App\Services\CollectionService;
+use App\Services\StatusService;
+use App\Jobs\MediaPipeline\MediaDeletePipeline;
+
+class RemoteStatusDelete implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $status;
+
+    /**
+     * Delete the job if its models no longer exist.
+     *
+     * @var bool
+     */
+    public $deleteWhenMissingModels = true;
+
+    public $timeout = 900;
+    public $tries = 2;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(Status $status)
+    {
+        $this->status = $status;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $status = $this->status;
+        $profile = $this->status->profile;
+
+        StatusService::del($status->id, true);
+
+        if($profile->status_count && $profile->status_count > 0) {
+            $profile->status_count = $profile->status_count - 1;
+            $profile->save();
+        }
+
+        return $this->unlinkRemoveMedia($status);
+    }
+
+    public function unlinkRemoveMedia($status)
+    {
+        Media::whereStatusId($status->id)
+        ->get()
+        ->each(function($media) {
+            MediaDeletePipeline::dispatch($media);
+        });
+
+        if($status->in_reply_to_id) {
+            $parent = Status::findOrFail($status->in_reply_to_id);
+            --$parent->reply_count;
+            $parent->save();
+            StatusService::del($parent->id);
+        }
+
+        Bookmark::whereStatusId($status->id)->delete();
+
+        CollectionItem::whereObjectType('App\Status')
+            ->whereObjectId($status->id)
+            ->get()
+            ->each(function($col) {
+                CollectionService::removeItem($col->collection_id, $col->object_id);
+                $col->delete();
+        });
+
+        DirectMessage::whereStatusId($status->id)->delete();
+
+        Like::whereStatusId($status->id)->delete();
+
+        MediaTag::where('status_id', $status->id)->delete();
+
+        Mention::whereStatusId($status->id)->forceDelete();
+
+        Notification::whereItemType('App\Status')
+            ->whereItemId($status->id)
+            ->forceDelete();
+
+        Report::whereObjectType('App\Status')
+            ->whereObjectId($status->id)
+            ->delete();
+
+        StatusArchived::whereStatusId($status->id)->delete();
+        StatusHashtag::whereStatusId($status->id)->delete();
+        StatusView::whereStatusId($status->id)->delete();
+        Status::whereInReplyToId($status->id)->update(['in_reply_to_id' => null]);
+
+        AccountInterstitial::where('item_type', 'App\Status')
+            ->where('item_id', $status->id)
+            ->delete();
+
+        $status->delete();
+
+        StatusService::del($status->id, true);
+        AccountService::del($status->profile_id);
+
+        return 1;
+    }
+}

+ 2 - 2
app/Util/ActivityPub/Inbox.php

@@ -25,7 +25,7 @@ use Illuminate\Support\Str;
 use App\Jobs\LikePipeline\LikePipeline;
 use App\Jobs\FollowPipeline\FollowPipeline;
 use App\Jobs\DeletePipeline\DeleteRemoteProfilePipeline;
-use App\Jobs\DeletePipeline\DeleteRemoteStatusPipeline;
+use App\Jobs\StatusPipeline\RemoteStatusDelete;
 use App\Jobs\StoryPipeline\StoryExpire;
 use App\Jobs\StoryPipeline\StoryFetch;
 use App\Jobs\StatusPipeline\StatusRemoteUpdatePipeline;
@@ -707,7 +707,7 @@ class Inbox
 						if(!$status) {
 							return;
 						}
-						DeleteRemoteStatusPipeline::dispatch($status)->onQueue('high');
+						RemoteStatusDelete::dispatch($status)->onQueue('high');
 						return;
 					break;