From ff517d68c3063708eb81ae4422e8fe0d9b96795f Mon Sep 17 00:00:00 2001 From: Rico Date: Wed, 7 Jan 2026 19:50:26 +0100 Subject: [PATCH] feat: add logic for related and sequential posts --- app/Http/Controllers/PostsController.php | 44 +++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/PostsController.php b/app/Http/Controllers/PostsController.php index 3efd004..4092a01 100644 --- a/app/Http/Controllers/PostsController.php +++ b/app/Http/Controllers/PostsController.php @@ -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)); } }