refactor: inline some single-use chat repository methods into chat api

This commit is contained in:
Roardom
2025-08-21 08:08:01 +00:00
parent 3f36412e35
commit 6ff6c1a9bf
3 changed files with 39 additions and 122 deletions
+1 -2
View File
@@ -1,6 +1,5 @@
asciify
dontBackupDatabases
dontBackupFilesystem
htmlify
lexify
swal
swal
+37 -24
View File
@@ -19,6 +19,7 @@ namespace App\Http\Controllers\API;
use App\Bots\NerdBot;
use App\Bots\SystemBot;
use App\Events\Chatter;
use App\Events\MessageDeleted;
use App\Http\Controllers\Controller;
use App\Http\Resources\BotResource;
use App\Http\Resources\ChatMessageResource;
@@ -26,6 +27,8 @@ use App\Http\Resources\ChatRoomResource;
use App\Http\Resources\UserAudibleResource;
use App\Http\Resources\UserEchoResource;
use App\Models\Bot;
use App\Models\Chatroom;
use App\Models\ChatStatus;
use App\Models\Message;
use App\Models\User;
use App\Models\UserAudible;
@@ -49,55 +52,63 @@ class ChatController extends Controller
/* STATUSES */
public function statuses(): \Illuminate\Http\JsonResponse
{
return response()->json($this->chatRepository->statuses());
return response()->json(ChatStatus::all());
}
/* ECHOES */
public function echoes(Request $request): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
{
$user = $request->user()->load(['echoes']);
$echoes = UserEcho::query()
->whereBelongsTo($request->user())
->with(['bot', 'user', 'target', 'room'])
->oldest('id')
->get();
if ($user->echoes->isEmpty()) {
$userEcho = new UserEcho();
$userEcho->user_id = $request->user()->id;
$userEcho->room_id = 1;
$userEcho->save();
if ($echoes->isEmpty()) {
$echoes->push(UserEcho::create([
'user_id' => $request->user()->id,
'room_id' => 1,
]));
}
return UserEchoResource::collection($this->chatRepository->echoes($request->user()->id));
return UserEchoResource::collection($echoes);
}
/* AUDIBLES */
public function audibles(Request $request): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
{
$user = $request->user()->load(['audibles']);
$audibles = UserAudible::query()
->whereBelongsTo($request->user())
->with(['bot', 'user', 'target', 'room'])
->latest()
->get();
if ($user->audibles->isEmpty()) {
$userAudible = new UserAudible();
$userAudible->user_id = $request->user()->id;
$userAudible->room_id = 1;
$userAudible->status = true;
$userAudible->save();
if ($audibles->isEmpty()) {
$audibles->prepend(UserAudible::create([
'user_id' => $request->user()->id,
'room_id' => 1,
'status' => true,
]));
}
return UserAudibleResource::collection($this->chatRepository->audibles($request->user()->id));
return UserAudibleResource::collection($audibles);
}
/* BOTS */
public function bots(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
{
return BotResource::collection($this->chatRepository->bots());
return BotResource::collection(Bot::all());
}
/* ROOMS */
public function rooms(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
{
return ChatRoomResource::collection($this->chatRepository->rooms());
return ChatRoomResource::collection(Chatroom::all());
}
public function config(): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
{
return response($this->chatRepository->config());
return response(config('chat'));
}
/* MESSAGES */
@@ -303,7 +314,9 @@ class ChatController extends Controller
abort_if($changedByStaff && !$request->user()->group->is_owner && $request->user()->group->level <= $message->user->group->level, 403);
$this->chatRepository->deleteMessage($id);
broadcast(new MessageDeleted($message));
$message->delete();
return response('success');
}
@@ -311,10 +324,10 @@ class ChatController extends Controller
public function deleteRoomEcho(Request $request): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
{
$user = $request->user();
UserEcho::where('user_id', '=', $user->id)->where('room_id', '=', $request->input('room_id'))->delete();
UserEcho::where('user_id', '=', $user->id)->where('room_id', '=', $request->integer('room_id'))->delete();
$user->load(['chatStatus', 'chatroom', 'group', 'echoes']);
$room = $this->chatRepository->roomFindOrFail($request->input('room_id'));
$room = Chatroom::findOrFail($request->integer('room_id'));
$user->chatroom()->dissociate();
$user->chatroom()->associate($room);
@@ -424,7 +437,7 @@ class ChatController extends Controller
{
$user = $request->user();
$user->load(['chatStatus', 'chatroom', 'group', 'echoes']);
$status = $this->chatRepository->statusFindOrFail($request->input('status_id'));
$status = ChatStatus::findOrFail($request->integer('status_id'));
$this->chatRepository->systemMessage('[url=/users/'.$user->username.']'.$user->username.'[/url] has updated their status to [b]'.$status->name.'[/b]');
@@ -439,7 +452,7 @@ class ChatController extends Controller
{
$user = $request->user();
$user->load(['chatStatus', 'chatroom', 'group', 'echoes']);
$room = $this->chatRepository->roomFindOrFail($request->input('room_id'));
$room = Chatroom::findOrFail($request->integer('room_id'));
$user->chatroom()->dissociate();
$user->chatroom()->associate($room);
+1 -96
View File
@@ -17,7 +17,6 @@ declare(strict_types=1);
namespace App\Repositories;
use App\Events\Chatter;
use App\Events\MessageDeleted;
use App\Events\MessageSent;
use App\Http\Resources\ChatMessageResource;
use App\Models\Bot;
@@ -25,8 +24,6 @@ use App\Models\Chatroom;
use App\Models\ChatStatus;
use App\Models\Message;
use App\Models\User;
use App\Models\UserAudible;
use App\Models\UserEcho;
use Illuminate\Support\Str;
class ChatRepository
@@ -34,76 +31,16 @@ class ChatRepository
/**
* ChatRepository Constructor.
*/
public function __construct(private readonly Message $message, private readonly Chatroom $chatroom, private readonly ChatStatus $chatStatus, private readonly User $user, private readonly Bot $bot, private readonly UserEcho $userEcho, private readonly UserAudible $userAudible)
public function __construct(private readonly Message $message, private readonly Chatroom $chatroom, private readonly ChatStatus $chatStatus, private readonly User $user)
{
}
public function config(): mixed
{
return config('chat');
}
/**
* @return \Illuminate\Database\Eloquent\Collection<int, Bot>
*/
public function bots(): \Illuminate\Database\Eloquent\Collection
{
return $this->bot->all();
}
/**
* @return \Illuminate\Database\Eloquent\Collection<int, UserEcho>
*/
public function echoes(int $userId): \Illuminate\Database\Eloquent\Collection
{
return $this->userEcho->with([
'bot',
'user',
'target',
'room',
])
->where('user_id', '=', $userId)
->oldest('id')
->get();
}
/**
* @return \Illuminate\Database\Eloquent\Collection<int, UserAudible>
*/
public function audibles(int $userId): \Illuminate\Database\Eloquent\Collection
{
return $this->userAudible->with([
'bot',
'user',
'target',
'room',
])
->where('user_id', '=', $userId)
->latest()
->get();
}
/**
* @return \Illuminate\Database\Eloquent\Collection<int, Chatroom>
*/
public function rooms(): \Illuminate\Database\Eloquent\Collection
{
return $this->chatroom->all();
}
public function roomFindOrFail(int $id): Chatroom
{
return $this->chatroom->findOrFail($id);
}
public function message(int $userId, int $roomId, string $message, ?int $receiver = null, ?int $bot = null): Message
{
if ($this->user->find($userId)->settings->censor) {
$message = $this->censorMessage($message);
}
$message = $this->htmlifyMessage($message);
$message = $this->message->create([
'user_id' => $userId,
'chatroom_id' => $roomId,
@@ -127,7 +64,6 @@ class ChatRepository
$message = $this->censorMessage($message);
}
$message = $this->htmlifyMessage($message);
$save = $this->message->create([
'bot_id' => $botId,
'user_id' => 1,
@@ -155,8 +91,6 @@ class ChatRepository
$message = $this->censorMessage($message);
}
$message = $this->htmlifyMessage($message);
$save = $this->message->create([
'user_id' => $userId,
'chatroom_id' => 0,
@@ -186,17 +120,6 @@ class ChatRepository
return $message;
}
public function deleteMessage(int $id): void
{
$message = $this->message->find($id);
if ($message) {
broadcast(new MessageDeleted($message));
$message->delete();
}
}
/**
* @return \Illuminate\Database\Eloquent\Collection<int, Message>
*/
@@ -315,14 +238,6 @@ class ChatRepository
return $room;
}
/**
* @return \Illuminate\Database\Eloquent\Collection<int, ChatStatus>
*/
public function statuses(): \Illuminate\Database\Eloquent\Collection
{
return $this->chatStatus->all();
}
public function status(int|User $user): ?ChatStatus
{
$status = null;
@@ -338,11 +253,6 @@ class ChatRepository
return $status;
}
public function statusFindOrFail(int $id): ChatStatus
{
return $this->chatStatus->findOrFail($id);
}
protected function censorMessage(string $message): string
{
foreach (config('censor.redact') as $word) {
@@ -359,9 +269,4 @@ class ChatRepository
return $message;
}
protected function htmlifyMessage(string $message): string
{
return $message;
}
}