setup download counting

This commit is contained in:
IsWaffle 2024-09-20 10:37:16 -04:00
parent 2cca45bcea
commit 6d6670e246
6 changed files with 48 additions and 3 deletions

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers;
use App\Models\ModVersion;
use Illuminate\Http\RedirectResponse;
class ModVersionController extends Controller
{
public function show(int $modId, string $version): RedirectResponse
{
$modVersion = ModVersion::where("mod_id", $modId)->where("version", $version)->first();
if ($modVersion == null) {
abort(404);
}
$modVersion->downloads++;
$modVersion->save();
return redirect($modVersion->link);
}
}

View File

@ -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.
*

View File

@ -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";
}
}

View File

@ -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());
});
}
/**

View File

@ -54,7 +54,7 @@
</div>
{{-- Mobile Download Button --}}
<a href="{{ $mod->latestVersion->link }}" class="block lg:hidden">
<a href="{{ $mod->downloadUrl() }}" class="block lg:hidden">
<button class="text-lg font-extrabold hover:bg-cyan-400 dark:hover:bg-cyan-600 shadow-md dark:shadow-gray-950 drop-shadow-2xl bg-cyan-500 dark:bg-cyan-700 rounded-xl w-full h-20">{{ __('Download Latest Version') }} ({{ $mod->latestVersion->version }})</button>
</a>
@ -102,7 +102,7 @@
<div class="p-4 mb-4 sm:p-6 bg-white dark:bg-gray-950 rounded-xl shadow-md dark:shadow-gray-950 drop-shadow-2xl">
<div class="pb-6 border-b-2 border-gray-200 dark:border-gray-800">
<div class="flex items-center justify-between">
<a class="text-2xl font-extrabold" href="{{ $version->link }}">
<a class="text-2xl font-extrabold" href="{{ $version->downloadUrl() }}">
{{ __('Version') }} {{ $version->version }}
</a>
<p class="text-gray-700 dark:text-gray-300" title="{{ __('Exactly') }} {{ $version->downloads }}">{{ Number::downloads($version->downloads) }} {{ __('Downloads') }}</p>
@ -147,7 +147,7 @@
<div class="col-span-1 flex flex-col gap-6">
{{-- Desktop Download Button --}}
<a href="{{ $mod->latestVersion->link }}" class="hidden lg:block">
<a href="{{ $mod->downloadUrl() }}" class="hidden lg:block">
<button class="text-lg font-extrabold hover:bg-cyan-400 dark:hover:bg-cyan-600 shadow-md dark:shadow-gray-950 drop-shadow-2xl bg-cyan-500 dark:bg-cyan-700 rounded-xl w-full h-20">{{ __('Download Latest Version') }} ({{ $mod->latestVersion->version }})</button>
</a>

View File

@ -1,6 +1,7 @@
<?php
use App\Http\Controllers\ModController;
use App\Http\Controllers\ModVersionController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
@ -15,6 +16,10 @@ Route::middleware(['auth.banned'])->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');
});