Browse Source

Update SharePipeline, fix share handling and notification generation

Daniel Supernault 2 years ago
parent
commit
83e1e203ce

+ 2 - 4
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);

+ 16 - 31
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();
-
-			$redis = Redis::connection();
-			$key = config('cache.prefix').':user.'.$status->profile_id.'.notifications';
-			$redis->lpush($key, $notification->id);
-		} catch (Exception $e) {
-			Log::error($e);
-		}
+		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()
+			]
+		);
+
+		return $this->remoteAnnounceDeliver();
 	}
 
 	public function remoteAnnounceDeliver()

+ 29 - 22
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) {
-			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($parent->reblogs_count > 0) {
+				$parent->reblogs_count = $parent->reblogs_count - 1;
+				$parent->save();
+				StatusService::del($parent->id);
+			}
 
-		$this->remoteAnnounceDeliver();
+			$notification = Notification::whereProfileId($target)
+				->whereActorId($status->profile_id)
+				->whereAction('share')
+				->whereItemId($status->reblog_of_id)
+				->whereItemType('App\Status')
+				->first();
 
-		if($parent->reblogs_count > 0) {
-			$parent->reblogs_count = $parent->reblogs_count - 1;
-			$parent->save();
-			StatusService::del($parent->id);
+			if($notification) {
+				$notification->forceDelete();
+			}
 		}
 
-		$status->forceDelete();
+		if ($status->uri != null) {
+			return;
+		}
 
-		return 1;
+		if(config_cache('federation.activitypub.enabled') == false) {
+			return $status->delete();
+		} else {
+			return $this->remoteAnnounceDeliver();
+		}
 	}
 
 	public function remoteAnnounceDeliver()
@@ -124,5 +128,8 @@ class UndoSharePipeline implements ShouldQueue
 
 		$promise->wait();
 
+		$status->delete();
+
+		return 1;
 	}
 }

+ 1 - 1
app/Notification.php

@@ -16,7 +16,7 @@ class Notification extends Model
      */
     protected $dates = ['deleted_at'];
 
-    protected $fillable = ['*'];
+    protected $guarded = [];
 
     public function actor()
     {

+ 13 - 14
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();

+ 2 - 5
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;
 	}
-}
+}