forge/app/Http/Controllers/ModVersionController.php

41 lines
1.2 KiB
PHP
Raw Permalink Normal View History

2024-09-20 10:37:16 -04:00
<?php
2025-01-30 00:23:55 -05:00
declare(strict_types=1);
2024-09-20 10:37:16 -04:00
namespace App\Http\Controllers;
use App\Models\ModVersion;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
2024-09-20 10:37:16 -04:00
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
2024-09-20 10:37:16 -04:00
class ModVersionController extends Controller
{
use AuthorizesRequests;
public function show(Request $request, int $modId, string $slug, string $version): RedirectResponse
2024-09-20 10:37:16 -04:00
{
$modVersion = ModVersion::whereModId($modId)
->whereVersion($version)
->firstOrFail();
2024-09-20 10:37:16 -04:00
2025-01-30 00:50:28 -05:00
abort_if($modVersion->mod->slug !== $slug, 404);
2024-09-20 10:37:16 -04:00
$this->authorize('view', $modVersion);
// Rate limit the downloads.
$rateKey = 'mod-download:'.($request->user()?->id ?: $request->ip());
2025-01-30 00:50:28 -05:00
abort_if(RateLimiter::tooManyAttempts($rateKey, maxAttempts: 5), 429);
// Increment downloads counts in the background.
defer(fn () => $modVersion->incrementDownloads());
// Increment the rate limiter.
RateLimiter::increment($rateKey);
2024-09-20 10:37:16 -04:00
// Redirect to the download link, using a 307 status code to prevent browsers from caching.
return redirect($modVersion->link, 307);
2024-09-20 10:37:16 -04:00
}
}