From 6d6670e24676d82cdd1780a2ea359afa526ee172 Mon Sep 17 00:00:00 2001 From: "waffle.lord" Date: Fri, 20 Sep 2024 10:37:16 -0400 Subject: [PATCH 1/2] setup download counting --- app/Http/Controllers/ModVersionController.php | 23 +++++++++++++++++++ app/Models/Mod.php | 5 ++++ app/Models/ModVersion.php | 5 ++++ app/Providers/AppServiceProvider.php | 7 ++++++ resources/views/mod/show.blade.php | 6 ++--- routes/web.php | 5 ++++ 6 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/ModVersionController.php 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'); }); From 8a156d8a43f8ceb044ad387c6db602e01d190cd0 Mon Sep 17 00:00:00 2001 From: "waffle.lord" Date: Fri, 20 Sep 2024 10:46:26 -0400 Subject: [PATCH 2/2] update controller to recalculate downloads and return 307 specifically --- app/Http/Controllers/ModVersionController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ModVersionController.php b/app/Http/Controllers/ModVersionController.php index 95f471c..abee2c7 100644 --- a/app/Http/Controllers/ModVersionController.php +++ b/app/Http/Controllers/ModVersionController.php @@ -17,7 +17,8 @@ class ModVersionController extends Controller $modVersion->downloads++; $modVersion->save(); + $modVersion->mod->calculateDownloads(); - return redirect($modVersion->link); + return redirect($modVersion->link, 307); } }