2024-07-12 16:33:26 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Club;
|
|
|
|
|
|
|
|
|
|
use App\Enums\NotificationType;
|
|
|
|
|
use App\Events\NewNotification;
|
|
|
|
|
use App\Http\Controllers\Controller;
|
2024-07-16 10:47:23 +02:00
|
|
|
use App\Http\Requests\Club\Messages\BlockCustomerRequest;
|
|
|
|
|
use App\Http\Requests\Club\Messages\DeleteMessagesRequest;
|
2024-07-18 11:16:10 +02:00
|
|
|
use App\Http\Requests\Club\Messages\MarkAsReadRequest;
|
2024-07-12 16:33:26 +02:00
|
|
|
use App\Http\Requests\Club\Messages\SendMessageRequest;
|
|
|
|
|
use App\Lib\Helpers\ToolboxHelper;
|
2024-07-16 10:47:23 +02:00
|
|
|
use App\Models\BlockList;
|
|
|
|
|
use App\Models\Customer;
|
2024-07-12 16:33:26 +02:00
|
|
|
use App\Models\Message;
|
2024-07-30 16:05:27 +02:00
|
|
|
use App\Models\Notification;
|
|
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
2024-07-12 16:33:26 +02:00
|
|
|
use Illuminate\Support\Facades\Auth;
|
2024-07-16 10:47:23 +02:00
|
|
|
use Illuminate\Support\Facades\DB;
|
2024-07-17 12:45:43 +02:00
|
|
|
use Illuminate\Support\Lottery;
|
2024-07-12 16:33:26 +02:00
|
|
|
|
|
|
|
|
class MessageController extends Controller
|
|
|
|
|
{
|
2024-07-16 10:47:23 +02:00
|
|
|
/**
|
2024-09-12 10:57:56 +02:00
|
|
|
* Show messagerie.
|
2024-07-16 10:47:23 +02:00
|
|
|
*
|
2024-07-29 11:32:50 +02:00
|
|
|
* @return \Illuminate\Contracts\View\View
|
2024-07-16 10:47:23 +02:00
|
|
|
*/
|
2024-07-29 11:32:50 +02:00
|
|
|
public function index(): \Illuminate\Contracts\View\View
|
2024-07-16 10:47:23 +02:00
|
|
|
{
|
2024-07-18 11:40:55 +02:00
|
|
|
return view('club.pages.messages.index');
|
2024-07-16 10:47:23 +02:00
|
|
|
}
|
|
|
|
|
|
2024-07-17 12:45:43 +02:00
|
|
|
/**
|
2024-09-12 10:57:56 +02:00
|
|
|
* Fetch conversations and block list.
|
2024-07-17 12:45:43 +02:00
|
|
|
*
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
|
|
|
|
*/
|
2024-07-29 11:32:50 +02:00
|
|
|
public function conversations(): \Illuminate\Http\JsonResponse
|
2024-07-17 12:45:43 +02:00
|
|
|
{
|
|
|
|
|
/** How many message to keey in a conversation */
|
|
|
|
|
$messagesToKeepInConversations = 25;
|
|
|
|
|
/** @var \App\Models\Customer */
|
|
|
|
|
$customer = Auth::guard('club')->user();
|
|
|
|
|
$conversations = $customer->conversations();
|
|
|
|
|
$ids = collect($conversations)->pluck('to_id');
|
|
|
|
|
$block_list = BlockList::query()
|
2024-10-21 16:57:20 +02:00
|
|
|
->whereHas('customer', fn(Builder $q) => $q->where('id', $customer->getKey()))
|
|
|
|
|
->orWhereHas('blocked', fn(Builder $q) => $q->where('id', $customer->getKey()))
|
2024-07-18 16:36:47 +02:00
|
|
|
->get();
|
2024-07-17 12:45:43 +02:00
|
|
|
|
|
|
|
|
// * Sort In reverse order messages
|
|
|
|
|
$conversations = collect($conversations)
|
|
|
|
|
->map(function (array $conversation) use ($messagesToKeepInConversations) {
|
|
|
|
|
$sortFn = fn (Message $a, Message $b) => $a->created_at->timestamp < $b->created_at->timestamp;
|
|
|
|
|
// * Limit messages per conversations
|
|
|
|
|
Lottery::odds(1, 20)
|
2024-09-03 09:55:12 +02:00
|
|
|
->winner(fn() => collect($conversation['messages'])
|
2024-09-12 10:57:56 +02:00
|
|
|
// @phpstan-ignore-next-line
|
2024-09-03 09:55:12 +02:00
|
|
|
->sort($sortFn)
|
|
|
|
|
->splice($messagesToKeepInConversations)
|
|
|
|
|
->each(fn(Message $message) => $message->delete()))
|
2024-07-17 12:45:43 +02:00
|
|
|
->choose();
|
|
|
|
|
return $conversation;
|
|
|
|
|
})->all();
|
2024-07-18 11:16:10 +02:00
|
|
|
// * Notifications
|
2024-07-30 16:05:27 +02:00
|
|
|
$notifications = Notification::query()
|
2024-10-21 16:57:20 +02:00
|
|
|
->whereHas('customer', fn(Builder $q) => $q->where('id', $customer->getKey()))
|
2024-07-18 11:16:10 +02:00
|
|
|
->where('notifiable_type', Message::class)
|
|
|
|
|
->pluck('notifiable_id', 'id');
|
|
|
|
|
return response()->json(compact('conversations', 'block_list', 'notifications'));
|
2024-07-17 12:45:43 +02:00
|
|
|
}
|
|
|
|
|
|
2024-07-12 16:33:26 +02:00
|
|
|
/**
|
2024-09-12 10:57:56 +02:00
|
|
|
* Send a message to a club customer.
|
2024-07-12 16:33:26 +02:00
|
|
|
*
|
|
|
|
|
* @param \App\Http\Requests\Club\Messages\SendMessageRequest $request
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
|
|
|
|
*/
|
2024-07-29 11:32:50 +02:00
|
|
|
public function send(SendMessageRequest $request): \Illuminate\Http\JsonResponse
|
2024-07-12 16:33:26 +02:00
|
|
|
{
|
|
|
|
|
/** @var \App\Models\Customer */
|
|
|
|
|
$customer = Auth::guard('club')->user();
|
2024-07-16 10:47:23 +02:00
|
|
|
/** @var \App\Models\Customer */
|
|
|
|
|
$toCustomer = Customer::query()->where('username', $request->input('to'))->firstOrFail();
|
|
|
|
|
$message = new Message($request->only('message'));
|
2024-07-12 16:33:26 +02:00
|
|
|
$message->fromCustomer()->associate($customer);
|
2024-07-16 10:47:23 +02:00
|
|
|
$message->toCustomer()->associate($toCustomer);
|
2024-07-12 16:33:26 +02:00
|
|
|
$message->message = ToolboxHelper::censorString($message->message);
|
|
|
|
|
$message->saveOrFail();
|
|
|
|
|
event(new NewNotification(
|
|
|
|
|
NotificationType::message,
|
2024-10-21 16:57:20 +02:00
|
|
|
route('club.messages.index', ['m' => $message->getKey()]),
|
2024-07-12 16:33:26 +02:00
|
|
|
$message,
|
2024-07-16 10:50:29 +02:00
|
|
|
$toCustomer
|
2024-07-12 16:33:26 +02:00
|
|
|
));
|
2024-09-03 09:55:12 +02:00
|
|
|
return response()->json($message->load(['fromCustomer', 'toCustomer']));
|
2024-07-16 10:47:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2024-09-12 10:57:56 +02:00
|
|
|
* Destroy a club customer's message.
|
2024-07-16 10:47:23 +02:00
|
|
|
*
|
|
|
|
|
* @param \App\Http\Requests\Club\Messages\DeleteMessagesRequest $request
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
|
|
|
|
*/
|
2024-07-29 11:32:50 +02:00
|
|
|
public function delete(DeleteMessagesRequest $request): \Illuminate\Http\JsonResponse
|
2024-07-16 10:47:23 +02:00
|
|
|
{
|
|
|
|
|
return DB::transaction(function () use ($request) {
|
|
|
|
|
/** @var \App\Models\Customer */
|
|
|
|
|
$customer = Auth::guard('club')->user();
|
|
|
|
|
$message = Message::findOrFail($request->input('message'));
|
|
|
|
|
$conversations = $customer->conversations();
|
|
|
|
|
foreach ($conversations as $conversation) {
|
2025-06-03 16:13:59 +02:00
|
|
|
$conversation = (object) $conversation;
|
2024-10-21 16:57:20 +02:00
|
|
|
if ($conversation->id != $message->getKey()) {
|
2024-07-16 10:47:23 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
/** @var \App\Models\Message $message */
|
|
|
|
|
foreach ($conversation->messages as $message) {
|
2024-10-21 16:57:20 +02:00
|
|
|
if ($message->from == $customer->getKey()) {
|
2024-07-16 10:47:23 +02:00
|
|
|
$message->hide_from = true;
|
|
|
|
|
}
|
2024-10-21 16:57:20 +02:00
|
|
|
if ($message->to == $customer->getKey()) {
|
2024-07-16 10:47:23 +02:00
|
|
|
$message->hide_to = true;
|
|
|
|
|
}
|
|
|
|
|
if ($message->hide_to && $message->hide_from) {
|
|
|
|
|
$message->delete();
|
|
|
|
|
} else {
|
|
|
|
|
$message->saveOrFail();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return response()->json();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2024-09-12 10:57:56 +02:00
|
|
|
* Block a customer to prevent him sending messages.
|
2024-07-16 10:47:23 +02:00
|
|
|
*
|
|
|
|
|
* @param \App\Http\Requests\Club\Messages\BlockCustomerRequest $request
|
|
|
|
|
* @param boolean $status
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
|
|
|
|
*/
|
2024-07-29 11:32:50 +02:00
|
|
|
public function toggleBlock(BlockCustomerRequest $request, bool $status): \Illuminate\Http\JsonResponse
|
2024-07-16 10:47:23 +02:00
|
|
|
{
|
|
|
|
|
/** @var \App\Models\Customer */
|
|
|
|
|
$customer = Auth::guard('club')->user();
|
|
|
|
|
/** @var \App\Models\Customer */
|
|
|
|
|
$customerToBlock = Customer::query()->where('username', $request->input('username'))->firstOrFail();
|
|
|
|
|
$blockCustomer = BlockList::firstOrNew([
|
2024-10-21 16:57:20 +02:00
|
|
|
'customer_id' => $customer->getKey(),
|
|
|
|
|
'blocked_id' => $customerToBlock->getKey(),
|
2024-07-16 10:47:23 +02:00
|
|
|
]);
|
2024-07-30 16:05:27 +02:00
|
|
|
($status) ? $blockCustomer->saveOrFail() : $blockCustomer->deleteOrFail();
|
2024-07-16 10:47:23 +02:00
|
|
|
return response()->json($blockCustomer);
|
2024-07-12 16:33:26 +02:00
|
|
|
}
|
2024-07-18 11:16:10 +02:00
|
|
|
|
|
|
|
|
/**
|
2024-09-12 10:57:56 +02:00
|
|
|
* Mark notificaiton as read.
|
2024-07-18 11:16:10 +02:00
|
|
|
*
|
|
|
|
|
* @param \App\Http\Requests\Club\Messages\MarkAsReadRequest $request
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
|
|
|
|
*/
|
2024-07-29 11:32:50 +02:00
|
|
|
public function notificationsRead(MarkAsReadRequest $request): \Illuminate\Http\JsonResponse
|
2024-07-18 11:16:10 +02:00
|
|
|
{
|
|
|
|
|
/** @var \App\Models\Customer */
|
|
|
|
|
$customer = Auth::guard('club')->user();
|
2024-07-30 16:05:27 +02:00
|
|
|
Notification::query()
|
2024-07-18 11:16:10 +02:00
|
|
|
->where('notifiable_type', Message::class)
|
|
|
|
|
->whereIn('id', $request->input('messageList'))
|
2024-10-21 16:57:20 +02:00
|
|
|
->whereHas('customer', fn(Builder $q) => $q->where('id', $customer->getKey()))
|
2024-07-18 11:16:10 +02:00
|
|
|
->delete();
|
|
|
|
|
return response()->json([]);
|
|
|
|
|
}
|
2024-07-12 16:33:26 +02:00
|
|
|
}
|