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);
}
}