RemoteStatusDelete.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace App\Jobs\StatusPipeline;
  3. use DB, Cache, Storage;
  4. use App\{
  5. AccountInterstitial,
  6. Bookmark,
  7. CollectionItem,
  8. DirectMessage,
  9. Like,
  10. Media,
  11. MediaTag,
  12. Mention,
  13. Notification,
  14. Report,
  15. Status,
  16. StatusArchived,
  17. StatusHashtag,
  18. StatusView
  19. };
  20. use Illuminate\Bus\Queueable;
  21. use Illuminate\Contracts\Queue\ShouldQueue;
  22. use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing;
  23. use Illuminate\Foundation\Bus\Dispatchable;
  24. use Illuminate\Queue\InteractsWithQueue;
  25. use Illuminate\Queue\SerializesModels;
  26. use Illuminate\Queue\Middleware\WithoutOverlapping;
  27. use League\Fractal;
  28. use Illuminate\Support\Str;
  29. use League\Fractal\Serializer\ArraySerializer;
  30. use App\Transformer\ActivityPub\Verb\DeleteNote;
  31. use App\Util\ActivityPub\Helpers;
  32. use GuzzleHttp\Pool;
  33. use GuzzleHttp\Client;
  34. use GuzzleHttp\Promise;
  35. use App\Util\ActivityPub\HttpSignature;
  36. use App\Services\AccountService;
  37. use App\Services\CollectionService;
  38. use App\Services\StatusService;
  39. use App\Jobs\MediaPipeline\MediaDeletePipeline;
  40. use App\Jobs\ProfilePipeline\DecrementPostCount;
  41. class RemoteStatusDelete implements ShouldQueue, ShouldBeUniqueUntilProcessing
  42. {
  43. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  44. protected $status;
  45. /**
  46. * Delete the job if its models no longer exist.
  47. *
  48. * @var bool
  49. */
  50. public $deleteWhenMissingModels = true;
  51. public $tries = 3;
  52. public $maxExceptions = 3;
  53. public $timeout = 180;
  54. public $failOnTimeout = true;
  55. /**
  56. * The number of seconds after which the job's unique lock will be released.
  57. *
  58. * @var int
  59. */
  60. public $uniqueFor = 3600;
  61. /**
  62. * Get the unique ID for the job.
  63. */
  64. public function uniqueId(): string
  65. {
  66. return 'status:remote:delete:' . $this->status->id;
  67. }
  68. /**
  69. * Get the middleware the job should pass through.
  70. *
  71. * @return array<int, object>
  72. */
  73. public function middleware(): array
  74. {
  75. return [(new WithoutOverlapping("status-remote-delete-{$this->status->id}"))->shared()->dontRelease()];
  76. }
  77. /**
  78. * Create a new job instance.
  79. *
  80. * @return void
  81. */
  82. public function __construct(Status $status)
  83. {
  84. $this->status = $status->withoutRelations();
  85. }
  86. /**
  87. * Execute the job.
  88. *
  89. * @return void
  90. */
  91. public function handle()
  92. {
  93. $status = $this->status;
  94. if($status->deleted_at) {
  95. return;
  96. }
  97. StatusService::del($status->id, true);
  98. DecrementPostCount::dispatch($status->profile_id)->onQueue('inbox');
  99. return $this->unlinkRemoveMedia($status);
  100. }
  101. public function unlinkRemoveMedia($status)
  102. {
  103. if($status->in_reply_to_id) {
  104. $parent = Status::find($status->in_reply_to_id);
  105. if($parent) {
  106. --$parent->reply_count;
  107. $parent->save();
  108. StatusService::del($parent->id);
  109. }
  110. }
  111. AccountInterstitial::where('item_type', 'App\Status')
  112. ->where('item_id', $status->id)
  113. ->delete();
  114. Bookmark::whereStatusId($status->id)->delete();
  115. CollectionItem::whereObjectType('App\Status')
  116. ->whereObjectId($status->id)
  117. ->get()
  118. ->each(function($col) {
  119. CollectionService::removeItem($col->collection_id, $col->object_id);
  120. $col->delete();
  121. });
  122. DirectMessage::whereStatusId($status->id)->delete();
  123. Like::whereStatusId($status->id)->forceDelete();
  124. Media::whereStatusId($status->id)
  125. ->get()
  126. ->each(function($media) {
  127. MediaDeletePipeline::dispatch($media)->onQueue('mmo');
  128. });
  129. MediaTag::where('status_id', $status->id)->delete();
  130. Mention::whereStatusId($status->id)->forceDelete();
  131. Notification::whereItemType('App\Status')
  132. ->whereItemId($status->id)
  133. ->forceDelete();
  134. Report::whereObjectType('App\Status')
  135. ->whereObjectId($status->id)
  136. ->delete();
  137. StatusArchived::whereStatusId($status->id)->delete();
  138. $statusHashtags = StatusHashtag::whereStatusId($status->id)->get();
  139. foreach($statusHashtags as $stag) {
  140. $stag->delete();
  141. }
  142. StatusView::whereStatusId($status->id)->delete();
  143. Status::whereInReplyToId($status->id)->update(['in_reply_to_id' => null]);
  144. $status->delete();
  145. StatusService::del($status->id, true);
  146. AccountService::del($status->profile_id);
  147. return 1;
  148. }
  149. }