diff --git a/app/Http/Controllers/Api/ApiV2Dot1Controller.php b/app/Http/Controllers/Api/ApiV2Dot1Controller.php index 548be7e2d..d54896732 100644 --- a/app/Http/Controllers/Api/ApiV2Dot1Controller.php +++ b/app/Http/Controllers/Api/ApiV2Dot1Controller.php @@ -3,10 +3,15 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; +use App\Jobs\DeletePipeline\DeleteAccountPipeline; +use App\Models\OauthClient; use App\Models\UserSetting; +use App\Services\AccountService; use App\Services\AppService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\DB; class ApiV2Dot1Controller extends Controller { @@ -27,6 +32,11 @@ class ApiV2Dot1Controller extends Controller return $this->json(app(AppService::class)->getConfig()); } + /** + * GET /api/v2.1/account/timeline/settings + * + * Get timeline settings for non-webUI clients, allowing them to view reblog state + */ public function accountTimelineSettings(Request $request) { abort_if(! $request->user() || ! $request->user()->token(), 403); @@ -69,6 +79,44 @@ class ApiV2Dot1Controller extends Controller return $this->json($this->formatTimelineSettings($userSettings)); } + public function accountPermanentDelete(Request $request) + { + $this->validate($request, [ + 'current_password' => 'required|current_password:api', + ]); + + $user = $request->user(); + abort_if(! config('pixelfed.account_deletion'), 403); + abort_if($user->is_admin, 403); + $profile = $user->profile; + abort_if($profile->status != null, 400); + + $ts = now()->addMonth(); + $user->email = $user->id; + $user->password = ''; + $user->status = 'delete'; + $profile->status = 'delete'; + $user->delete_after = $ts; + $profile->delete_after = $ts; + $user->save(); + $profile->save(); + + Cache::forget('profiles:private'); + AccountService::del($profile->id); + $accessTokenIds = DB::table('oauth_access_tokens') + ->where('user_id', $user->id) + ->pluck('id') + ->all(); + DB::table('oauth_refresh_tokens') + ->whereIn('access_token_id', $accessTokenIds) + ->delete(); + DB::table('oauth_access_tokens')->where('user_id', $user->id)->delete(); + OauthClient::where('user_id', $user->id)->delete(); + DeleteAccountPipeline::dispatch($user)->onQueue('low'); + + return $this->json(['message' => 'Account deleted']); + } + protected function formatTimelineSettings(UserSetting $userSettings): array { $other = is_array($userSettings->other) ? $userSettings->other : []; diff --git a/routes/api.php b/routes/api.php index 14371dcd3..bef9865aa 100644 --- a/routes/api.php +++ b/routes/api.php @@ -372,6 +372,7 @@ Route::prefix('api')->group(function () use ($middleware) { Route::get('account/timeline/settings', [ApiV2Dot1Controller::class, 'accountTimelineSettings'])->middleware($middleware); Route::post('account/timeline/settings', [ApiV2Dot1Controller::class, 'updateAccountTimelineSettings'])->middleware($middleware); + Route::post('account/remove/permanent', [ApiV2Dot1Controller::class, 'accountPermanentDelete'])->middleware($middleware); }); Route::prefix('live')->group(function () {