diff --git a/app/Http/Controllers/ModVersionController.php b/app/Http/Controllers/ModVersionController.php new file mode 100644 index 0000000..95f471c --- /dev/null +++ b/app/Http/Controllers/ModVersionController.php @@ -0,0 +1,23 @@ +where("version", $version)->first(); + + if ($modVersion == null) { + abort(404); + } + + $modVersion->downloads++; + $modVersion->save(); + + return redirect($modVersion->link); + } +} diff --git a/app/Models/Mod.php b/app/Models/Mod.php index 292a49c..f173c33 100644 --- a/app/Models/Mod.php +++ b/app/Models/Mod.php @@ -46,6 +46,11 @@ class Mod extends Model $this->saveQuietly(); } + public function downloadUrl(): string + { + return "/mod/download/$this->id/{$this->latestVersion->version}"; + } + /** * The relationship between a mod and its users. * diff --git a/app/Models/ModVersion.php b/app/Models/ModVersion.php index 15d867b..43938ff 100644 --- a/app/Models/ModVersion.php +++ b/app/Models/ModVersion.php @@ -130,4 +130,9 @@ class ModVersion extends Model ->orderByDesc('version_patch') ->orderByDesc('version_pre_release'); } + + public function downloadUrl(): string + { + return "/mod/download/$this->mod_id/$this->version"; + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0b307fd..87dcd48 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -12,8 +12,11 @@ use App\Observers\ModObserver; use App\Observers\ModVersionObserver; use App\Observers\SptVersionObserver; use Carbon\Carbon; +use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\Number; use Illuminate\Support\ServiceProvider; @@ -44,6 +47,10 @@ class AppServiceProvider extends ServiceProvider Gate::define('viewPulse', function (User $user) { return $user->isAdmin(); }); + + RateLimiter::for('modDownloads', function (Request $request) { + return Limit::perMinute(3)->by($request->user()?->id ?: $request->ip()); + }); } /** diff --git a/resources/views/mod/show.blade.php b/resources/views/mod/show.blade.php index e6350d5..935d1a0 100644 --- a/resources/views/mod/show.blade.php +++ b/resources/views/mod/show.blade.php @@ -54,7 +54,7 @@ {{-- Mobile Download Button --}} - + @@ -102,7 +102,7 @@
- + {{ __('Version') }} {{ $version->version }}

{{ Number::downloads($version->downloads) }} {{ __('Downloads') }}

@@ -147,7 +147,7 @@
{{-- Desktop Download Button --}} - diff --git a/routes/web.php b/routes/web.php index 4641d92..3c355df 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,6 +1,7 @@ group(function () { Route::get('/mod/{mod}/{slug}', 'show')->where(['mod' => '[0-9]+'])->name('mod.show'); }); + Route::middleware(['throttle:modDownloads'])->controller(ModVersionController::class)->group(function () { + Route::get('/mod/download/{mod}/{version}', 'show')->where(['mod' => '[0-9]+']); + }); + Route::controller(UserController::class)->group(function () { Route::get('/user/{user}/{username}', 'show')->where(['user' => '[0-9]+'])->name('user.show'); });