feat: add logic for related and sequential posts

This commit is contained in:
Rico
2026-01-07 19:50:26 +01:00
parent 7438b25003
commit ff517d68c3

View File

@@ -3,6 +3,8 @@
namespace App\Http\Controllers;
use CreativeCrafts\Paginate\Facades\Paginate;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
use Spatie\Sheets\Facades\Sheets;
use Spatie\Sheets\Sheet;
@@ -20,6 +22,46 @@ class PostsController extends Controller
public function show(Sheet $post)
{
return view('posts.show', ['post' => $post]);
$data = Cache::remember("post_context_{$post->slug}", now()->addHours(24), function () use ($post) {
$allPosts = Sheets::all()
->filter(fn($p) => ! $p->hidden)
->sortByDesc('date')
->values();
$index = $allPosts->search(fn($p) => $p->slug === $post->slug);
$next = $index !== false && $index > 0 ? $allPosts[$index - 1] : null;
$previous = $index !== false && $index < $allPosts->count() - 1 ? $allPosts[$index + 1] : null;
$related = $allPosts
->reject(fn($p) => $p->slug === $post->slug)
->map(function ($p) use ($post) {
$commonTags = array_intersect($post->tags ?? [], $p->tags ?? []);
$p->relevance = count($commonTags);
return $p;
})
->filter(fn($p) => $p->relevance > 0)
->sortBy([
['relevance', 'desc'],
['date', 'desc'],
])
->take(3);
if ($related->count() < 3) {
$needed = 3 - $related->count();
$recent = $allPosts
->reject(fn($p) => $p->slug === $post->slug || $related->contains('slug', $p->slug))
->take($needed);
$related = $related->merge($recent);
}
return [
'previous' => $previous,
'next' => $next,
'related' => $related,
];
});
return view('posts.show', array_merge(['post' => $post], $data));
}
}