瀏覽代碼

Add WIP account delete job

Daniel Supernault 6 年之前
父節點
當前提交
13a5b0e12d
共有 1 個文件被更改,包括 165 次插入0 次删除
  1. 165 0
      app/Jobs/DeletePipeline/DeleteAccountPipeline.php

+ 165 - 0
app/Jobs/DeletePipeline/DeleteAccountPipeline.php

@@ -0,0 +1,165 @@
+<?php
+
+namespace App\Jobs\DeletePipeline;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use App\{
+    AccountLog,
+    Activity,
+    Avatar,
+    Bookmark,
+    Collection,
+    DirectMessage,
+    EmailVerification,
+    Follower,
+    FollowRequest,
+    Hashtag,
+    Like,
+    Media,
+    Mention,
+    Notification,
+    Profile,
+    Report,
+    ReportComment,
+    ReportLog,
+    StatusHashtag,
+    Status,
+    User,
+    UserFilter,
+    UserSetting,
+};
+
+class DeleteAccountPipeline implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $user;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(User $user)
+    {
+        $this->user = $user;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $user = $this->user;
+        $this->deleteAccountLogs($user);
+        $this->deleteActivities($user);
+        $this->deleteAvatar($user);
+        $this->deleteBookmarks($user);
+        $this->deleteEmailVerification($user);
+        $this->deleteFollowRequests($user);
+        $this->deleteFollowers($user);
+        $this->deleteLikes($user);
+        $this->deleteMedia($user);
+        $this->deleteMentions($user);
+        $this->deleteNotifications($user);
+
+        // todo send Delete to every known instance sharedInbox   
+    }
+
+    public function deleteAccountLogs($user)
+    {
+        AccountLog::chunk(200, function($logs) use ($user) {
+            foreach($logs as $log) {
+                if($log->user_id == $user->id) {
+                    $log->delete();
+                }
+            }
+        });
+    }
+
+    public function deleteActivities($user)
+    {
+        // todo after AP
+    }
+
+    public function deleteAvatar($user)
+    {
+        $avatar = $user->profile->avatar;
+
+        if(is_file($avatar->media_path)) {
+            unlink($avatar->media_path);
+        }
+
+        if(is_file($avatar->thumb_path)) {
+            unlink($avatar->thumb_path);
+        }
+
+        $avatar->delete();
+    }
+
+    public function deleteBookmarks($user)
+    {
+        Bookmark::whereProfileId($user->profile->id)->delete();
+    }
+
+    public function deleteEmailVerification($user)
+    {
+        EmailVerification::whereUserId($user->id)->delete();
+    }
+
+    public function deleteFollowRequests($user)
+    {
+        $id = $user->profile->id;
+        FollowRequest::whereFollowingId($id)->orWhere('follower_id', $id)->delete();
+    }
+
+    public function deleteFollowers($user)
+    {
+        $id = $user->profile->id;
+        Follower::whereProfileId($id)->orWhere('following_id', $id)->delete();
+    }
+
+    public function deleteLikes($user)
+    {
+        $id = $user->profile->id;
+        Like::whereProfileId($id)->delete();
+    }
+
+    public function deleteMedia($user)
+    {
+        $medias = Media::whereUserId($user->id)->get();
+        foreach($medias as $media) {
+            $path = $media->media_path;
+            $thumb = $media->thumbnail_path;
+            if(is_file($path)) {
+                unlink($path);
+            }
+            if(is_file($thumb)) {
+                unlink($thumb);
+            }
+            $media->delete();
+        }
+    }
+
+    public function deleteMentions($user)
+    {
+        Mention::whereProfileId($user->profile->id)->delete();
+    }
+
+    public function deleteNotifications($user)
+    {
+        $id = $user->profile->id;
+        Notification::whereProfileId($id)->orWhere('actor_id', $id)->delete();
+    }
+
+    public function deleteProfile($user) {}
+    public function deleteReports($user) {}
+    public function deleteStatuses($user) {}
+    public function deleteUser($user) {}
+}