*/ class PostController extends Controller { /** * Finds the topic a post is associated with. * @param int $id * @return string */ public function find(int $id = 0): string { $post = new Post($id); $topic = new Topic($post->topic); $forum = new Forum($topic->forum); // Check if the forum exists if ($post->id === 0 || $topic->id === 0 || !$forum->perms->view) { throw new HttpRouteNotFoundException(); } $topicLink = route('forums.topic', $topic->id); // Get all post ids from the database $postIds = DB::table('posts') ->where('topic_id', $topic->id) ->get(['post_id']); $postIds = array_column($postIds, 'post_id'); // Find in array $postAt = ceil(array_search($post->id, $postIds) / 10); // Only append the page variable if it's more than 1 if ($postAt > 1) { $topicLink .= "?page={$postAt}"; } return redirect("{$topicLink}#p{$post->id}"); } /** * Gets the raw contents of a post. * @param int $id * @return string */ public function raw(int $id = 0): string { $post = new Post($id); $topic = new Topic($post->topic); $forum = new Forum($topic->forum); // Check if the forum exists if ($post->id === 0 || $topic->id === 0 || !$forum->perms->view) { return ""; } return $post->text; } /** * Edit a post. * @param int $id * @return string */ public function edit(int $id = 0): string { $title = $_POST['title'] ?? null; $text = $_POST['text'] ?? null; $post = new Post($id); $topic = new Topic($post->topic); $forum = new Forum($topic->forum); // Check permissions $noAccess = $post->id === 0 || $topic->id === 0 || !$forum->perms->view; $noEdit = ( $post->poster->id === CurrentSession::$user->id ? !$forum->perms->edit : !$forum->perms->editAny ) || ( $topic->status === 1 && !$forum->perms->changeStatus ); // Check if the forum exists if ($noAccess || $noEdit) { throw new HttpMethodNotAllowedException(); } $titleLength = strlen($title); $textLength = strlen($text); $titleMin = config('forum.min_title_length'); $titleMax = config('forum.max_title_length'); $textMin = config('forum.min_post_length'); $textMax = config('forum.max_post_length'); // Checks $titleTooShort = $title !== null && $post->id === $topic->firstPost()->id && $titleLength < $titleMin; $titleTooLong = $title !== null && $post->id === $topic->firstPost()->id && $titleLength > $titleMax; $textTooShort = $textLength < $textMin; $textTooLong = $textLength > $textMax; // Check requirments if ($titleTooShort || $titleTooLong || $textTooShort || $textTooLong) { $error = ""; if ($titleTooShort) { $error = "This title is too short!"; } elseif ($titleTooLong) { $error = "This title is too long!"; } elseif ($textTooShort) { $error = "Please make your post a little bit longer!"; } elseif ($textTooLong) { $error = "Your post is too long, you're gonna have to cut a little!"; } if (!isset($_SESSION['replyText'])) { $_SESSION['replyText'] = []; } $_SESSION['replyText']["t{$forum->id}"] = $text; return $this->json(compact('error')); } unset($_SESSION['replyText']["t{$forum->id}"]); if ($post->id !== $topic->firstPost()->id || $title === null) { $title = "Re: {$topic->title}"; } else { $topic->title = $title; $topic->update(); } // Create the post $post->subject = $title; $post->text = $text; $post->editTime = time(); $post->editReason = ''; $post->editUser = CurrentSession::$user; $post = $post->update(); return $this->json([ 'id' => $post->id, 'title' => $post->subject, 'text' => $post->parsed, ]); } /** * Deletes a post. * @param int $id * @throws HttpMethodNotAllowedException */ public function delete(int $id = 0): void { $post = new Post($id); $topic = new Topic($post->topic); $forum = new Forum($topic->forum); // Check permissions $noAccess = $post->id === 0 || $topic->id === 0 || !$forum->perms->view; $replies = $topic->replyCount(); $noDelete = ( $post->poster->id === CurrentSession::$user->id ? !$forum->perms->delete : !$forum->perms->deleteAny ) || ( $topic->status === 1 && !$forum->perms->changeStatus ) || ( $replies === 1 && !$forum->perms->topicDelete ); // Check if the forum exists if ($noAccess || $noDelete) { throw new HttpMethodNotAllowedException; } // Check if the topic only has 1 post if ($replies === 1) { // Delete the entire topic $topic->delete(); } else { // Just delete the post (replace this with soft deleting) $post->purge(); } } }