public function show($id)
{
$postStartId = Request::input('start');
$postEndId = get_int(Request::input('end'));
$nthPost = get_int(Request::input('n'));
$skipLayout = Request::input('skip_layout') === '1';
$jumpTo = null;
$topic = Topic::with(['forum.cover', 'pollOptions.votes', 'pollOptions.post'])->findOrFail($id);
priv_check('ForumView', $topic->forum)->ensureCan();
$posts = $topic->posts();
if ($postStartId === 'unread') {
$postStartId = Post::lastUnreadByUser($topic, Auth::user());
} else {
$postStartId = get_int($postStartId);
}
if ($nthPost !== null) {
$post = $topic->nthPost($nthPost);
if ($post) {
$postStartId = $post->post_id;
}
}
if (!$skipLayout) {
foreach ([$postStartId, $postEndId, 0] as $jumpPoint) {
if ($jumpPoint === null) {
continue;
}
$jumpTo = $jumpPoint;
break;
}
}
if ($postStartId !== null && !$skipLayout) {
// move starting post up by ten to avoid hitting
// page autoloader right after loading the page.
$postPosition = $topic->postPosition($postStartId);
$post = $topic->nthPost($postPosition - 10);
$postStartId = $post->post_id;
}
if ($postStartId !== null) {
$posts = $posts->where('post_id', '>=', $postStartId);
} elseif ($postEndId !== null) {
$posts = $posts->where('post_id', '<=', $postEndId)->orderBy('post_id', 'desc');
}
$posts = $posts->take(20)->with('topic')->with('user.rank')->with('user.country')->with('user.supports')->get()->sortBy('post_id');
if ($posts->count() === 0) {
abort($skipLayout ? 204 : 404);
}
$postsPosition = $topic->postsPosition($posts);
$pollSummary = PollOption::summary($topic, Auth::user());
Event::fire(new TopicWasViewed($topic, $posts->last(), Auth::user()));
$template = $skipLayout ? '_posts' : 'show';
$cover = json_item($topic->cover()->firstOrNew([]), new TopicCoverTransformer());
$isWatching = TopicWatch::check($topic, Auth::user());
return view("forum.topics.{$template}", compact('cover', 'isWatching', 'jumpTo', 'pollSummary', 'posts', 'postsPosition', 'topic'));
}