mirror of
https://github.com/rico-vz/HeimerdingerLoL.git
synced 2026-02-04 11:43:13 +01:00
feat: add logic for related and sequential posts
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user