258 lines
7.2 KiB
PHP
258 lines
7.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\ForumCategory;
|
|
use App\Models\ForumThread;
|
|
use App\Models\ForumPost;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Carbon\Carbon;
|
|
|
|
class ForumController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware('auth');
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$categories = ForumCategory::orderBy('priority', 'desc')->take(50)->get();
|
|
|
|
return view('forum.index')->with('categories', $categories);
|
|
}
|
|
|
|
public function getcategory(Request $request, $id)
|
|
{
|
|
$category = ForumCategory::findOrFail($id);
|
|
$posts = ForumThread::where('category_id', $id)->orderBy('stickied', 'desc')->orderBy('updated_at', 'desc');
|
|
|
|
return view('forum.category')->with(['posts' => $posts->paginate(15), 'category' => $category]);
|
|
}
|
|
|
|
public function createthread(Request $request, $id)
|
|
{
|
|
$category = ForumCategory::findOrFail($id);
|
|
|
|
if ($category->admin_only) {
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
}
|
|
|
|
return view('forum.newpost')->with('category', $category);
|
|
}
|
|
|
|
public function docreatethread(Request $request, $id)
|
|
{
|
|
$category = ForumCategory::findOrFail($id);
|
|
|
|
if ($category->admin_only) {
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
}
|
|
|
|
if (Cache::has('user-posted' . $request->user()->id)) {
|
|
return redirect(route('forum.createthread', $category->id))->with('error', 'Posts can only be made every ' . config('app.posting_cooldown') . ' seconds.');
|
|
}
|
|
|
|
$request->validate([
|
|
'title' => ['required', 'string', 'max:100'],
|
|
'body' => ['required', 'string', 'min:3', 'max:2000']
|
|
]);
|
|
|
|
Cache::put('user-posted' . $request->user()->id, true, Carbon::now()->addSeconds(config('app.posting_cooldown')));
|
|
|
|
$thread = ForumThread::create([
|
|
'category_id' => $category->id,
|
|
'user_id' => $request->user()->id,
|
|
'title' => $request->title,
|
|
'body' => $request->body,
|
|
'stickied' => false,
|
|
'locked' => false
|
|
]);
|
|
|
|
$category->touch();
|
|
|
|
return redirect(route('forum.getthread', $thread->id))->with('message', 'Successfully posted thread.');
|
|
}
|
|
|
|
public function getthread(Request $request, $id)
|
|
{
|
|
$thread = ForumThread::findOrFail($id);
|
|
$replies = ForumPost::where('thread_id', $thread->id)->orderBy('created_at', 'asc');
|
|
$category = $thread->category;
|
|
|
|
return view('forum.post', ['post' => $thread, 'replies' => $replies->paginate(14), 'category' => $category]);
|
|
}
|
|
|
|
public function editthread(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$thread = ForumThread::findOrFail($id);
|
|
|
|
return view('forum.editpost')->with('post', $thread);
|
|
}
|
|
|
|
public function doeditthread(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$thread = ForumThread::findOrFail($id);
|
|
|
|
$request->validate([
|
|
'title' => ['required', 'string', 'max:100'],
|
|
'body' => ['required', 'string', 'min:3', 'max:2000']
|
|
]);
|
|
|
|
$thread->title = $request->title;
|
|
$thread->body = $request->body;
|
|
$thread->save();
|
|
|
|
$thread->category->touch();
|
|
|
|
return redirect(route('forum.getthread', $thread->id))->with('message', 'Successfully edited thread.');
|
|
}
|
|
|
|
public function deletethread(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$thread = ForumThread::findOrFail($id);
|
|
$category = $thread->category;
|
|
|
|
foreach ($thread->replies as $reply) {
|
|
$reply->delete();
|
|
}
|
|
|
|
$thread->delete();
|
|
|
|
return redirect(route('forum.category', $category->id))->with('message', 'Successfully deleted thread.');
|
|
}
|
|
|
|
public function togglestickythread(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$thread = ForumThread::findOrFail($id);
|
|
|
|
$thread->stickied = !$thread->stickied;
|
|
$thread->save();
|
|
|
|
return redirect(route('forum.getthread', $thread->id))->with('message', 'Successfully toggled thread sticky.');
|
|
}
|
|
|
|
public function togglelock(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$thread = ForumThread::findOrFail($id);
|
|
|
|
$thread->locked = !$thread->locked;
|
|
$thread->save();
|
|
|
|
return redirect(route('forum.getthread', $thread->id))->with('message', 'Successfully toggled thread lock.');
|
|
}
|
|
|
|
public function createreply(Request $request, $id)
|
|
{
|
|
$thread = ForumThread::findOrFail($id);
|
|
|
|
if ($thread->locked) {
|
|
abort(403);
|
|
}
|
|
|
|
return view('forum.newreply')->with('post', $thread);
|
|
}
|
|
|
|
public function docreatereply(Request $request, $id)
|
|
{
|
|
$thread = ForumThread::findOrFail($id);
|
|
|
|
if ($thread->locked) {
|
|
abort(403);
|
|
}
|
|
|
|
if (Cache::has('user-posted' . $request->user()->id)) {
|
|
return redirect(route('forum.createreply', $thread->id))->with('error', 'Posts can only be made every ' . config('app.posting_cooldown') . ' seconds.');
|
|
}
|
|
|
|
$request->validate([
|
|
'body' => ['required', 'string', 'min:3', 'max:2000']
|
|
]);
|
|
|
|
Cache::put('user-posted' . $request->user()->id, true, Carbon::now()->addSeconds(config('app.posting_cooldown')));
|
|
|
|
$reply = ForumPost::create([
|
|
'thread_id' => $thread->id,
|
|
'category_id' => $thread->category->id,
|
|
'user_id' => $request->user()->id,
|
|
'body' => $request->body,
|
|
'stickied' => false
|
|
]);
|
|
|
|
$thread->touch();
|
|
$thread->category->touch();
|
|
|
|
return redirect(route('forum.getthread', $thread->id))->with('message', 'Successfully posted reply.');
|
|
}
|
|
|
|
public function editreply(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$reply = ForumPost::findOrFail($id);
|
|
|
|
return view('forum.editreply')->with('reply', $reply);
|
|
}
|
|
|
|
public function doeditreply(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$reply = ForumPost::findOrFail($id);
|
|
|
|
$request->validate([
|
|
'body' => ['required', 'string', 'min:3', 'max:2000']
|
|
]);
|
|
|
|
$reply->body = $request->body;
|
|
$reply->save();
|
|
|
|
$reply->category->touch();
|
|
|
|
return redirect(route('forum.getthread', $reply->thread->id))->with('message', 'Successfully edited reply.');
|
|
}
|
|
|
|
public function deletereply(Request $request, $id)
|
|
{
|
|
if (!$request->user()->admin) {
|
|
abort(404);
|
|
}
|
|
|
|
$reply = ForumPost::findOrFail($id);
|
|
$thread = $reply->thread;
|
|
|
|
$reply->delete();
|
|
|
|
return redirect(route('forum.getthread', $thread->id))->with('message', 'Successfully deleted reply.');
|
|
}
|
|
}
|