diff --git a/app/Jobs/AdminPipeline/AdminProfileActionPipeline.php b/app/Jobs/AdminPipeline/AdminProfileActionPipeline.php new file mode 100644 index 000000000..24b24ba6e --- /dev/null +++ b/app/Jobs/AdminPipeline/AdminProfileActionPipeline.php @@ -0,0 +1,139 @@ +profile = $profile; + $this->action = $action; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $profile = $this->profile; + $action = $this->action; + + switch($action) { + case 'mark-all-cw': + return $this->markAllPostsWithContentWarnings(); + break; + case 'unlist-all': + return $this->unlistAllPosts(); + break; + case 'purge': + return $this->purgeAllPosts(); + break; + case 'refetch': + return $this->refetchAllPosts(); + break; + } + } + + protected function markAllPostsWithContentWarnings() + { + $profile = $this->profile; + + foreach(Status::whereProfileId($profile->id)->lazyById(10, 'id') as $status) { + if($status->scope == 'direct') { + continue; + } + $status->is_nsfw = true; + $status->save(); + StatusService::del($status->id); + } + } + + protected function unlistAllPosts() + { + $profile = $this->profile; + + foreach(Status::whereProfileId($profile->id)->lazyById(10, 'id') as $status) { + if($status->scope != 'public') { + continue; + } + $status->scope = 'unlisted'; + $status->visibility = 'unlisted'; + $status->save(); + StatusService::del($status->id); + } + } + + protected function purgeAllPosts() + { + $profile = $this->profile; + + foreach(Status::withTrashed()->whereProfileId($profile->id)->lazyById(10, 'id') as $status) { + RemoteStatusDelete::dispatch($status)->onQueue('delete'); + } + } + + protected function refetchAllPosts() + { + $profile = $this->profile; + $res = ActivityPubFetchService::get($profile->remote_url, false); + if(!$res) { + return; + } + $res = json_decode($res, true); + $profile->following_count = Follower::whereProfileId($profile->id)->count(); + $profile->followers_count = Follower::whereFollowingId($profile->id)->count(); + $profile->name = isset($res['name']) ? Purify::clean($res['name']) : $profile->username; + $profile->bio = isset($res['summary']) ? Purify::clean($res['summary']) : null; + if(isset($res['publicKey'])) { + $profile->public_key = $res['publicKey']['publicKeyPem']; + } + if( + isset($res['icon']) && + isset( + $res['icon']['type'], + $res['icon']['mediaType'], + $res['icon']['url']) && $res['icon']['type'] == 'Image' + ) { + if(in_array($res['icon']['mediaType'], ['image/jpeg', 'image/png'])) { + $profile->avatar->remote_url = $res['icon']['url']; + $profile->push(); + MediaStorageService::avatar($profile->avatar); + } + } + $profile->save(); + AccountService::del($profile->id); + } +}