From 83e1e203cedd7484a7841e3c93e6452dd3ee9840 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Tue, 31 Jan 2023 02:27:23 -0700 Subject: [PATCH] Update SharePipeline, fix share handling and notification generation --- app/Http/Controllers/Api/ApiV1Controller.php | 6 +-- app/Jobs/SharePipeline/SharePipeline.php | 45 ++++++----------- app/Jobs/SharePipeline/UndoSharePipeline.php | 53 +++++++++++--------- app/Notification.php | 2 +- app/Util/ActivityPub/Inbox.php | 27 +++++----- app/Util/ActivityPub/Validator/Announce.php | 7 +-- 6 files changed, 63 insertions(+), 77 deletions(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index 0c44fd47f..cd999318d 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -2814,9 +2814,7 @@ class ApiV1Controller extends Controller 'visibility' => 'public' ]); - if($share->wasRecentlyCreated == true) { - SharePipeline::dispatch($share); - } + SharePipeline::dispatch($share)->onQueue('low'); StatusService::del($status->id); ReblogService::add($user->profile_id, $status->id); @@ -2858,7 +2856,7 @@ class ApiV1Controller extends Controller return $this->json($res); } - UndoSharePipeline::dispatch($reblog); + UndoSharePipeline::dispatch($reblog)->onQueue('low'); ReblogService::del($user->profile_id, $status->id); $res = StatusService::getMastodon($status->id); diff --git a/app/Jobs/SharePipeline/SharePipeline.php b/app/Jobs/SharePipeline/SharePipeline.php index cd54b90eb..2cc807acb 100644 --- a/app/Jobs/SharePipeline/SharePipeline.php +++ b/app/Jobs/SharePipeline/SharePipeline.php @@ -58,47 +58,32 @@ class SharePipeline implements ShouldQueue return; } - $exists = Notification::whereProfileId($target->id) - ->whereActorId($status->profile_id) - ->whereAction('share') - ->whereItemId($status->reblog_of_id) - ->whereItemType('App\Status') - ->exists(); - if($target->id === $status->profile_id) { $this->remoteAnnounceDeliver(); return true; } - if($exists === true) { - return true; - } - - $this->remoteAnnounceDeliver(); - ReblogService::addPostReblog($parent->id, $status->id); - $parent->reblogs_count = $parent->shares()->count(); + $parent->reblogs_count = $parent->reblogs_count + 1; $parent->save(); StatusService::del($parent->id); - try { - $notification = new Notification; - $notification->profile_id = $target->id; - $notification->actor_id = $actor->id; - $notification->action = 'share'; - $notification->message = $status->shareToText(); - $notification->rendered = $status->shareToHtml(); - $notification->item_id = $status->reblog_of_id ?? $status->id; - $notification->item_type = "App\Status"; - $notification->save(); + Notification::firstOrCreate( + [ + 'profile_id' => $target->id, + 'actor_id' => $actor->id, + 'action' => 'share', + 'item_type' => 'App\Status', + 'item_id' => $status->reblog_of_id ?? $status->id, + ], + [ + 'message' => $status->shareToText(), + 'rendered' => $status->shareToHtml() + ] + ); - $redis = Redis::connection(); - $key = config('cache.prefix').':user.'.$status->profile_id.'.notifications'; - $redis->lpush($key, $notification->id); - } catch (Exception $e) { - Log::error($e); - } + return $this->remoteAnnounceDeliver(); } public function remoteAnnounceDeliver() diff --git a/app/Jobs/SharePipeline/UndoSharePipeline.php b/app/Jobs/SharePipeline/UndoSharePipeline.php index 596d4d2da..d63f909b3 100644 --- a/app/Jobs/SharePipeline/UndoSharePipeline.php +++ b/app/Jobs/SharePipeline/UndoSharePipeline.php @@ -33,35 +33,39 @@ class UndoSharePipeline implements ShouldQueue { $status = $this->status; $actor = $status->profile; - $parent = $status->parent(); - $target = $status->parent()->profile; + $parent = Status::find($status->reblog_of_id); - ReblogService::removePostReblog($parent->id, $status->id); + if($parent) { + $target = $parent->profile_id; + ReblogService::removePostReblog($parent->id, $status->id); - if ($status->uri !== null) { + if($parent->reblogs_count > 0) { + $parent->reblogs_count = $parent->reblogs_count - 1; + $parent->save(); + StatusService::del($parent->id); + } + + $notification = Notification::whereProfileId($target) + ->whereActorId($status->profile_id) + ->whereAction('share') + ->whereItemId($status->reblog_of_id) + ->whereItemType('App\Status') + ->first(); + + if($notification) { + $notification->forceDelete(); + } + } + + if ($status->uri != null) { return; } - if($target->domain === null) { - Notification::whereProfileId($target->id) - ->whereActorId($status->profile_id) - ->whereAction('share') - ->whereItemId($status->reblog_of_id) - ->whereItemType('App\Status') - ->delete(); + if(config_cache('federation.activitypub.enabled') == false) { + return $status->delete(); + } else { + return $this->remoteAnnounceDeliver(); } - - $this->remoteAnnounceDeliver(); - - if($parent->reblogs_count > 0) { - $parent->reblogs_count = $parent->reblogs_count - 1; - $parent->save(); - StatusService::del($parent->id); - } - - $status->forceDelete(); - - return 1; } public function remoteAnnounceDeliver() @@ -124,5 +128,8 @@ class UndoSharePipeline implements ShouldQueue $promise->wait(); + $status->delete(); + + return 1; } } diff --git a/app/Notification.php b/app/Notification.php index ebd6f6415..b0877978f 100644 --- a/app/Notification.php +++ b/app/Notification.php @@ -16,7 +16,7 @@ class Notification extends Model */ protected $dates = ['deleted_at']; - protected $fillable = ['*']; + protected $guarded = []; public function actor() { diff --git a/app/Util/ActivityPub/Inbox.php b/app/Util/ActivityPub/Inbox.php index c8fa9500b..6b6586433 100644 --- a/app/Util/ActivityPub/Inbox.php +++ b/app/Util/ActivityPub/Inbox.php @@ -569,13 +569,9 @@ class Inbox return; } - if(Helpers::validateLocalUrl($activity) == false) { - return; - } - $parent = Helpers::statusFetch($activity); - if(empty($parent)) { + if(!$parent || empty($parent)) { return; } @@ -590,15 +586,18 @@ class Inbox 'type' => 'share' ]); - Notification::firstOrCreate([ - 'profile_id' => $parent->profile->id, - 'actor_id' => $actor->id, - 'action' => 'share', - 'message' => $status->replyToText(), - 'rendered' => $status->replyToHtml(), - 'item_id' => $parent->id, - 'item_type' => 'App\Status' - ]); + Notification::firstOrCreate( + [ + 'profile_id' => $parent->profile_id, + 'actor_id' => $actor->id, + 'action' => 'share', + 'item_id' => $parent->id, + 'item_type' => 'App\Status', + ], [ + 'message' => $status->replyToText(), + 'rendered' => $status->replyToHtml(), + ] + ); $parent->reblogs_count = $parent->reblogs_count + 1; $parent->save(); diff --git a/app/Util/ActivityPub/Validator/Announce.php b/app/Util/ActivityPub/Validator/Announce.php index b6f89eec9..d862fe9d7 100644 --- a/app/Util/ActivityPub/Validator/Announce.php +++ b/app/Util/ActivityPub/Validator/Announce.php @@ -11,18 +11,15 @@ class Announce { { $valid = Validator::make($payload, [ '@context' => 'required', - 'id' => 'required|string', + 'id' => 'required|url', 'type' => [ 'required', Rule::in(['Announce']) ], 'actor' => 'required|url', - 'published' => 'required|date', - 'to' => 'required', - 'cc' => 'required', 'object' => 'required|url' ])->passes(); return $valid; } -} \ No newline at end of file +}