feat: delete account

This commit is contained in:
2026-05-18 12:41:02 +02:00
parent fd3d3959bd
commit 5c436fd65b
3 changed files with 123 additions and 0 deletions
+41
View File
@@ -8,9 +8,12 @@ use App\Http\Requests\UpdateUserRequest;
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class AuthController extends Controller
{
@@ -108,4 +111,42 @@ class AuthController extends Controller
return new UserResource($user->fresh());
}
public function destroy(Request $request): JsonResponse
{
$user = $request->user();
$storagePaths = collect([$user->avatar_url])
->merge($user->mealPosts()->withTrashed()->pluck('image_url'))
->filter(fn (?string $path): bool => $this->isPublicStoragePath($path))
->values()
->all();
DB::transaction(function () use ($user): void {
$user->tokens()->delete();
$user->notifications()->delete();
DB::table('sessions')
->where('user_id', $user->getKey())
->delete();
DB::table('password_reset_tokens')
->where('email', $user->email)
->delete();
$user->delete();
});
if (! empty($storagePaths)) {
Storage::disk('public')->delete($storagePaths);
}
return response()->json([
'message' => 'Compte supprimé avec succès',
])->withoutCookie('token');
}
private function isPublicStoragePath(?string $path): bool
{
return filled($path) && ! Str::startsWith($path, ['http://', 'https://']);
}
}