RemoteStatusDelete.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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\Foundation\Bus\Dispatchable;
  23. use Illuminate\Queue\InteractsWithQueue;
  24. use Illuminate\Queue\SerializesModels;
  25. use League\Fractal;
  26. use Illuminate\Support\Str;
  27. use League\Fractal\Serializer\ArraySerializer;
  28. use App\Transformer\ActivityPub\Verb\DeleteNote;
  29. use App\Util\ActivityPub\Helpers;
  30. use GuzzleHttp\Pool;
  31. use GuzzleHttp\Client;
  32. use GuzzleHttp\Promise;
  33. use App\Util\ActivityPub\HttpSignature;
  34. use App\Services\AccountService;
  35. use App\Services\CollectionService;
  36. use App\Services\StatusService;
  37. use App\Jobs\MediaPipeline\MediaDeletePipeline;
  38. class RemoteStatusDelete implements ShouldQueue
  39. {
  40. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  41. protected $status;
  42. /**
  43. * Delete the job if its models no longer exist.
  44. *
  45. * @var bool
  46. */
  47. public $deleteWhenMissingModels = true;
  48. public $timeout = 90;
  49. public $tries = 2;
  50. public $maxExceptions = 1;
  51. /**
  52. * Create a new job instance.
  53. *
  54. * @return void
  55. */
  56. public function __construct(Status $status)
  57. {
  58. $this->status = $status;
  59. }
  60. /**
  61. * Execute the job.
  62. *
  63. * @return void
  64. */
  65. public function handle()
  66. {
  67. $status = $this->status;
  68. if($status->deleted_at) {
  69. return;
  70. }
  71. $profile = $this->status->profile;
  72. StatusService::del($status->id, true);
  73. if($profile->status_count && $profile->status_count > 0) {
  74. $profile->status_count = $profile->status_count - 1;
  75. $profile->save();
  76. }
  77. return $this->unlinkRemoveMedia($status);
  78. }
  79. public function unlinkRemoveMedia($status)
  80. {
  81. if($status->in_reply_to_id) {
  82. $parent = Status::findOrFail($status->in_reply_to_id);
  83. --$parent->reply_count;
  84. $parent->save();
  85. StatusService::del($parent->id);
  86. }
  87. AccountInterstitial::where('item_type', 'App\Status')
  88. ->where('item_id', $status->id)
  89. ->delete();
  90. Bookmark::whereStatusId($status->id)->delete();
  91. CollectionItem::whereObjectType('App\Status')
  92. ->whereObjectId($status->id)
  93. ->get()
  94. ->each(function($col) {
  95. CollectionService::removeItem($col->collection_id, $col->object_id);
  96. $col->delete();
  97. });
  98. DirectMessage::whereStatusId($status->id)->delete();
  99. Like::whereStatusId($status->id)->forceDelete();
  100. Media::whereStatusId($status->id)
  101. ->get()
  102. ->each(function($media) {
  103. MediaDeletePipeline::dispatch($media)->onQueue('mmo');
  104. });
  105. MediaTag::where('status_id', $status->id)->delete();
  106. Mention::whereStatusId($status->id)->forceDelete();
  107. Notification::whereItemType('App\Status')
  108. ->whereItemId($status->id)
  109. ->forceDelete();
  110. Report::whereObjectType('App\Status')
  111. ->whereObjectId($status->id)
  112. ->delete();
  113. StatusArchived::whereStatusId($status->id)->delete();
  114. StatusHashtag::whereStatusId($status->id)->delete();
  115. StatusView::whereStatusId($status->id)->delete();
  116. Status::whereInReplyToId($status->id)->update(['in_reply_to_id' => null]);
  117. $status->delete();
  118. StatusService::del($status->id, true);
  119. AccountService::del($status->profile_id);
  120. return 1;
  121. }
  122. }