ip(); if (RateLimiter::tooManyAttempts($key, 10)) { return response()->json([ 'ok' => false, 'error' => 'Too many requests. Try again in a minute.', 'csrfHash' => csrf_token(), ], 429); } RateLimiter::hit($key, 60); $text = (string) ($request->input('text') ?? ''); if ($text === '' || mb_strlen($text) > 20000) { return response()->json([ 'ok' => false, 'error' => 'Invalid text (empty or too long).', 'csrfHash' => csrf_token(), ], 422); } try { $resp = Http::timeout(10) ->asForm() ->post('https://api.languagetool.org/v2/check', [ 'text' => $text, 'language' => 'en-US', ]); if (! $resp->successful()) { return response()->json([ 'ok' => false, 'error' => 'Proofread service unavailable.', 'csrfHash' => csrf_token(), ], 502); } return response()->json([ 'ok' => true, 'result' => $resp->json(), 'csrfHash' => csrf_token(), ]); } catch (\Throwable $e) { return response()->json([ 'ok' => false, 'error' => 'Proofread service unavailable.', 'csrfHash' => csrf_token(), ], 502); } } }