diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c171880..cbed254 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,8 +3,11 @@ namespace App\Providers; use Carbon\CarbonImmutable; +use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Support\Facades\Date; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\RateLimiter; +use Illuminate\Http\Request; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -23,6 +26,13 @@ class AppServiceProvider extends ServiceProvider public function boot(): void { $this->configureDefaults(); + + RateLimiter::for('training', function (Request $request) { + return [ + Limit::perMinute(50), + Limit::perMinute(15)->by($request->ip()), + ]; + }); } /** diff --git a/resources/js/components/PerceptronSetup.vue b/resources/js/components/PerceptronSetup.vue index 99789bb..4de1f94 100644 --- a/resources/js/components/PerceptronSetup.vue +++ b/resources/js/components/PerceptronSetup.vue @@ -109,6 +109,12 @@ function startTraining() { }) .then((response) => { if (!response.ok) { + if (response.status === 429) { + alert('Trop de requêtes pour mon petit serveur. Veuillez réessayer dans une minute.'); + } else { + alert('Erreur lors du lancement de l\'entraînement. Veuillez réessayer.'); + } + throw new Error('Network response was not ok'); } return response.json(); diff --git a/routes/api.php b/routes/api.php index bd12649..722b8f3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,4 +3,6 @@ use App\Http\Controllers\PerceptronController; use Illuminate\Support\Facades\Route; -Route::post('perceptron/run', [PerceptronController::class, 'run'])->name('perceptron.run'); +Route::middleware('throttle:training')->group(function () { + Route::post('perceptron/run', [PerceptronController::class, 'run'])->name('perceptron.run'); +});