feat: system tools and admin enhancements
This commit is contained in:
@@ -6,6 +6,7 @@ use App\Models\Forum;
|
||||
use App\Models\Thread;
|
||||
use App\Actions\BbcodeFormatter;
|
||||
use App\Models\Setting;
|
||||
use App\Services\AuditLogger;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -81,6 +82,11 @@ class ThreadController extends Controller
|
||||
'body' => $data['body'],
|
||||
]);
|
||||
|
||||
app(AuditLogger::class)->log($request, 'thread.created', $thread, [
|
||||
'forum_id' => $forum->id,
|
||||
'title' => $thread->title,
|
||||
]);
|
||||
|
||||
$thread->loadMissing([
|
||||
'user' => fn ($query) => $query
|
||||
->withCount(['posts', 'threads', 'thanksGiven', 'thanksReceived'])
|
||||
@@ -96,6 +102,14 @@ class ThreadController extends Controller
|
||||
|
||||
public function destroy(Request $request, Thread $thread): JsonResponse
|
||||
{
|
||||
$reason = $request->input('reason');
|
||||
$reasonText = $request->input('reason_text');
|
||||
app(AuditLogger::class)->log($request, 'thread.deleted', $thread, [
|
||||
'forum_id' => $thread->forum_id,
|
||||
'title' => $thread->title,
|
||||
'reason' => $reason,
|
||||
'reason_text' => $reasonText,
|
||||
]);
|
||||
$thread->deleted_by = $request->user()?->id;
|
||||
$thread->save();
|
||||
$thread->delete();
|
||||
@@ -103,6 +117,51 @@ class ThreadController extends Controller
|
||||
return response()->json(null, 204);
|
||||
}
|
||||
|
||||
public function update(Request $request, Thread $thread): JsonResponse
|
||||
{
|
||||
$user = $request->user();
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'Unauthorized.'], 401);
|
||||
}
|
||||
|
||||
$isAdmin = $user->roles()->where('name', 'ROLE_ADMIN')->exists();
|
||||
if (!$isAdmin && $thread->user_id !== $user->id) {
|
||||
return response()->json(['message' => 'Not authorized to edit threads.'], 403);
|
||||
}
|
||||
|
||||
$data = $request->validate([
|
||||
'title' => ['sometimes', 'required', 'string'],
|
||||
'body' => ['sometimes', 'required', 'string'],
|
||||
]);
|
||||
|
||||
if (array_key_exists('title', $data)) {
|
||||
$thread->title = $data['title'];
|
||||
}
|
||||
if (array_key_exists('body', $data)) {
|
||||
$thread->body = $data['body'];
|
||||
}
|
||||
|
||||
$thread->save();
|
||||
$thread->refresh();
|
||||
|
||||
app(AuditLogger::class)->log($request, 'thread.edited', $thread, [
|
||||
'forum_id' => $thread->forum_id,
|
||||
'title' => $thread->title,
|
||||
]);
|
||||
|
||||
$thread->loadMissing([
|
||||
'user' => fn ($query) => $query
|
||||
->withCount(['posts', 'threads', 'thanksGiven', 'thanksReceived'])
|
||||
->with(['rank', 'roles']),
|
||||
'attachments.extension',
|
||||
'attachments.group',
|
||||
'latestPost.user.rank',
|
||||
'latestPost.user.roles',
|
||||
])->loadCount('posts');
|
||||
|
||||
return response()->json($this->serializeThread($thread));
|
||||
}
|
||||
|
||||
public function updateSolved(Request $request, Thread $thread): JsonResponse
|
||||
{
|
||||
$user = $request->user();
|
||||
@@ -121,6 +180,9 @@ class ThreadController extends Controller
|
||||
|
||||
$thread->solved = $data['solved'];
|
||||
$thread->save();
|
||||
app(AuditLogger::class)->log($request, 'thread.solved_updated', $thread, [
|
||||
'solved' => $thread->solved,
|
||||
]);
|
||||
$thread->refresh();
|
||||
$thread->loadMissing([
|
||||
'user' => fn ($query) => $query
|
||||
@@ -238,6 +300,9 @@ class ThreadController extends Controller
|
||||
$map[$name] = [
|
||||
'url' => "/api/attachments/{$attachment->id}/download",
|
||||
'mime' => $attachment->mime_type ?? '',
|
||||
'thumb' => $attachment->thumbnail_path
|
||||
? "/api/attachments/{$attachment->id}/thumbnail"
|
||||
: null,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -256,6 +321,10 @@ class ThreadController extends Controller
|
||||
$url = $entry['url'];
|
||||
$mime = $entry['mime'] ?? '';
|
||||
if (str_starts_with($mime, 'image/') && $this->displayImagesInline()) {
|
||||
if (!empty($entry['thumb'])) {
|
||||
$thumb = $entry['thumb'];
|
||||
return "[url={$url}][img]{$thumb}[/img][/url]";
|
||||
}
|
||||
return "[img]{$url}[/img]";
|
||||
}
|
||||
return "[url={$url}]{$rawName}[/url]";
|
||||
|
||||
Reference in New Issue
Block a user