DeleteAccountPipeline.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace App\Jobs\DeletePipeline;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Queue\SerializesModels;
  5. use Illuminate\Queue\InteractsWithQueue;
  6. use Illuminate\Contracts\Queue\ShouldQueue;
  7. use Illuminate\Foundation\Bus\Dispatchable;
  8. use DB;
  9. use App\{
  10. AccountLog,
  11. Activity,
  12. Avatar,
  13. Bookmark,
  14. Collection,
  15. DirectMessage,
  16. EmailVerification,
  17. Follower,
  18. FollowRequest,
  19. Hashtag,
  20. Like,
  21. Media,
  22. Mention,
  23. Notification,
  24. Profile,
  25. Report,
  26. ReportComment,
  27. ReportLog,
  28. StatusHashtag,
  29. Status,
  30. User,
  31. UserDevice,
  32. UserFilter,
  33. UserSetting,
  34. };
  35. class DeleteAccountPipeline implements ShouldQueue
  36. {
  37. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  38. protected $user;
  39. /**
  40. * Create a new job instance.
  41. *
  42. * @return void
  43. */
  44. public function __construct(User $user)
  45. {
  46. $this->user = $user;
  47. }
  48. /**
  49. * Execute the job.
  50. *
  51. * @return void
  52. */
  53. public function handle()
  54. {
  55. $user = $this->user;
  56. DB::transaction(function() use ($user) {
  57. AccountLog::chunk(200, function($logs) use ($user) {
  58. foreach($logs as $log) {
  59. if($log->user_id == $user->id) {
  60. $log->forceDelete();
  61. }
  62. }
  63. });
  64. });
  65. DB::transaction(function() use ($user) {
  66. if($user->profile) {
  67. $avatar = $user->profile->avatar;
  68. if(is_file($avatar->media_path)) {
  69. unlink($avatar->media_path);
  70. }
  71. if(is_file($avatar->thumb_path)) {
  72. unlink($avatar->thumb_path);
  73. }
  74. $avatar->forceDelete();
  75. }
  76. Bookmark::whereProfileId($user->profile->id)->forceDelete();
  77. EmailVerification::whereUserId($user->id)->forceDelete();
  78. $id = $user->profile->id;
  79. FollowRequest::whereFollowingId($id)->orWhere('follower_id', $id)->forceDelete();
  80. Follower::whereProfileId($id)->orWhere('following_id', $id)->forceDelete();
  81. Like::whereProfileId($id)->forceDelete();
  82. });
  83. DB::transaction(function() use ($user) {
  84. $medias = Media::whereUserId($user->id)->get();
  85. foreach($medias as $media) {
  86. $path = $media->media_path;
  87. $thumb = $media->thumbnail_path;
  88. if(is_file($path)) {
  89. unlink($path);
  90. }
  91. if(is_file($thumb)) {
  92. unlink($thumb);
  93. }
  94. $media->forceDelete();
  95. }
  96. });
  97. DB::transaction(function() use ($user) {
  98. Mention::whereProfileId($user->profile->id)->forceDelete();
  99. Notification::whereProfileId($user->profile->id)->orWhere('actor_id', $user->profile->id)->forceDelete();
  100. });
  101. DB::transaction(function() use ($user) {
  102. Status::whereProfileId($user->profile->id)->forceDelete();
  103. Report::whereUserId($user->id)->forceDelete();
  104. $this->deleteProfile($user);
  105. });
  106. }
  107. protected function deleteProfile($user) {
  108. DB::transaction(function() use ($user) {
  109. Profile::whereUserId($user->id)->delete();
  110. $this->deleteUserSettings($user);
  111. });
  112. }
  113. protected function deleteUserSettings($user) {
  114. DB::transaction(function() use ($user) {
  115. UserDevice::whereUserId($user->id)->forceDelete();
  116. UserFilter::whereUserId($user->id)->forceDelete();
  117. UserSetting::whereUserId($user->id)->forceDelete();
  118. $this->deleteUserColumns($user);
  119. });
  120. }
  121. protected function deleteUserColumns($user)
  122. {
  123. DB::transaction(function() use ($user) {
  124. $user->status = 'deleted';
  125. $user->name = 'deleted';
  126. $user->email = $user->id;
  127. $user->password = '';
  128. $user->remember_token = null;
  129. $user->is_admin = false;
  130. $user->{'2fa_enabled'} = false;
  131. $user->{'2fa_secret'} = null;
  132. $user->{'2fa_backup_codes'} = null;
  133. $user->{'2fa_setup_at'} = null;
  134. $user->save();
  135. });
  136. }
  137. }