mirror of
https://github.com/sp-tarkov/forge.git
synced 2025-02-13 04:30:41 -05:00
Merge pull request 'Implement Download Counting' (#53) from waffle.lord/forge:impl/download-tracking into download-tracking
Reviewed-on: SPT/forge#53
This commit is contained in:
commit
d8a88d26ff
24
app/Http/Controllers/ModVersionController.php
Normal file
24
app/Http/Controllers/ModVersionController.php
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?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();
|
||||||
|
$modVersion->mod->calculateDownloads();
|
||||||
|
|
||||||
|
return redirect($modVersion->link, 307);
|
||||||
|
}
|
||||||
|
}
|
@ -46,6 +46,11 @@ class Mod extends Model
|
|||||||
$this->saveQuietly();
|
$this->saveQuietly();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function downloadUrl(): string
|
||||||
|
{
|
||||||
|
return "/mod/download/$this->id/{$this->latestVersion->version}";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The relationship between a mod and its users.
|
* The relationship between a mod and its users.
|
||||||
*
|
*
|
||||||
|
@ -130,4 +130,9 @@ class ModVersion extends Model
|
|||||||
->orderByDesc('version_patch')
|
->orderByDesc('version_patch')
|
||||||
->orderByDesc('version_pre_release');
|
->orderByDesc('version_pre_release');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function downloadUrl(): string
|
||||||
|
{
|
||||||
|
return "/mod/download/$this->mod_id/$this->version";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,11 @@ use App\Observers\ModObserver;
|
|||||||
use App\Observers\ModVersionObserver;
|
use App\Observers\ModVersionObserver;
|
||||||
use App\Observers\SptVersionObserver;
|
use App\Observers\SptVersionObserver;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Cache\RateLimiting\Limit;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
|
use Illuminate\Support\Facades\RateLimiter;
|
||||||
use Illuminate\Support\Number;
|
use Illuminate\Support\Number;
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
|
||||||
@ -44,6 +47,10 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
Gate::define('viewPulse', function (User $user) {
|
Gate::define('viewPulse', function (User $user) {
|
||||||
return $user->isAdmin();
|
return $user->isAdmin();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
RateLimiter::for('modDownloads', function (Request $request) {
|
||||||
|
return Limit::perMinute(3)->by($request->user()?->id ?: $request->ip());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -61,7 +61,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{-- Mobile Download Button --}}
|
{{-- 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>
|
<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>
|
</a>
|
||||||
|
|
||||||
@ -100,7 +100,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="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="pb-6 border-b-2 border-gray-200 dark:border-gray-800">
|
||||||
<div class="flex items-center justify-between">
|
<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 }}
|
{{ __('Version') }} {{ $version->version }}
|
||||||
</a>
|
</a>
|
||||||
<p class="text-gray-700 dark:text-gray-300" title="{{ __('Exactly') }} {{ $version->downloads }}">{{ Number::downloads($version->downloads) }} {{ __('Downloads') }}</p>
|
<p class="text-gray-700 dark:text-gray-300" title="{{ __('Exactly') }} {{ $version->downloads }}">{{ Number::downloads($version->downloads) }} {{ __('Downloads') }}</p>
|
||||||
@ -151,7 +151,7 @@
|
|||||||
<div class="col-span-1 flex flex-col gap-6">
|
<div class="col-span-1 flex flex-col gap-6">
|
||||||
|
|
||||||
{{-- Desktop Download Button --}}
|
{{-- 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>
|
<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>
|
</a>
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Http\Controllers\ModController;
|
use App\Http\Controllers\ModController;
|
||||||
|
use App\Http\Controllers\ModVersionController;
|
||||||
use App\Http\Controllers\UserController;
|
use App\Http\Controllers\UserController;
|
||||||
use Illuminate\Support\Facades\Route;
|
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::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::controller(UserController::class)->group(function () {
|
||||||
Route::get('/user/{user}/{username}', 'show')->where(['user' => '[0-9]+'])->name('user.show');
|
Route::get('/user/{user}/{username}', 'show')->where(['user' => '[0-9]+'])->name('user.show');
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user