Update SharePipeline, fix share handling and notification generation

This commit is contained in:
Daniel Supernault 2023-01-31 02:27:23 -07:00
parent df1327f415
commit 83e1e203ce
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7
6 changed files with 63 additions and 77 deletions

View file

@ -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);

View file

@ -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()

View file

@ -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;
}
}

View file

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

View file

@ -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();

View file

@ -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;
}
}
}