41 lines
1.3 KiB
PHP
41 lines
1.3 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Enums\CacheTag;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
final readonly class DocumentationVersion
|
|
{
|
|
public function handle(Request $request, \Closure $next): Response
|
|
{
|
|
$project = $request->get('project');
|
|
$versionSlug = $request->route()?->parameter('version');
|
|
if ($versionSlug === null || $project === null) {
|
|
\abort(Response::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
$seconds = 3600;
|
|
$version = CacheTag::DocumantationVersion->getCache()->remember(self::class . $project->id . '-' . $versionSlug, $seconds, function () use ($project, $versionSlug) {
|
|
return $project->documentationVersions()->where('slug', $versionSlug)->first() ?? false;
|
|
});
|
|
if ($version === false) {
|
|
\abort(Response::HTTP_NOT_FOUND);
|
|
}
|
|
|
|
unset($request->route()->parameters['version']);
|
|
|
|
$request->attributes->set('version', $version);
|
|
|
|
if (
|
|
$version->is_public === false
|
|
&& ( $request->user() === null || $request->user()->cannot('view', $version) )
|
|
) {
|
|
\abort(Response::HTTP_FORBIDDEN);
|
|
}
|
|
|
|
return $next($request);
|
|
}
|
|
}
|