freescout/freescout-dist/app/Notifications/BroadcastNotification.php

128 lines
4.0 KiB
PHP

<?php
/**
* Used to display website notifications in the menu and browser push notifications.
*/
namespace App\Notifications;
use App\Conversation;
use App\Subscription;
use App\Thread;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\BroadcastMessage;
use Illuminate\Notifications\Notification;
class BroadcastNotification extends Notification implements ShouldQueue
{
use Queueable;
public $conversation;
public $thread;
public $mediums;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($conversation, $thread, $mediums)
{
$this->conversation = $conversation;
$this->thread = $thread;
$this->mediums = $mediums;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $user
*
* @return array
*/
public function via($user)
{
return [\App\Channels\RealtimeBroadcastChannel::class];
// Standard "broadcast" channel creates a queuable event which runs broadcast for the broadcaster.
//return ['broadcast'];
}
/**
* Get the broadcastable representation of the notification.
*
* @param mixed $notifiable
*
* @return BroadcastMessage
*/
public function toBroadcast($user)
{
return new BroadcastMessage([
'thread_id' => $this->thread->id,
'number' => $this->conversation->number,
'mediums' => $this->mediums,
]);
}
public static function fetchPayloadData($payload)
{
$data = [];
if (empty($payload->thread_id) || empty($payload->mediums)) {
return $data;
}
// Try to convert to array.
$mediums = (array)$payload->mediums;
$thread = Thread::find($payload->thread_id);
if (empty($thread)) {
return $data;
}
// Dummy DB notification to pass to the template
$db_notification = new \Illuminate\Notifications\DatabaseNotification();
// HTML for the menu notification (uses same medium as for email)
if (in_array(Subscription::MEDIUM_EMAIL, $mediums)) {
$web_notifications_info = [];
// Get last reply or note of the conversation to display it's text
$last_thread_body = '';
$last_thread = Thread::where('conversation_id', $thread->conversation_id)
// Select must contain all fields from orderBy() to avoid:
// General error: 3065 Expression #1 of ORDER BY clause is not in SELECT
->select(['body', 'created_at'])
->whereIn('type', [Thread::TYPE_CUSTOMER, Thread::TYPE_MESSAGE, Thread::TYPE_NOTE])
->orderBy('created_at')
->first();
if ($last_thread) {
$last_thread_body = $last_thread->body;
}
//$db_notification->id = 'dummy';
$web_notifications_info['notification'] = $db_notification;
$web_notifications_info['created_at'] = \Carbon\Carbon::now();
// ['notification']->read_at
// ['notification']->id
$web_notifications_info['conversation'] = $thread->conversation;
$web_notifications_info['thread'] = $thread;
$web_notifications_info['last_thread_body'] = $last_thread_body;
$data['web']['html'] = view('users/partials/web_notifications', [
'web_notifications_info_data' => [$web_notifications_info],
])->render();
}
// Text and url for the browser push notification
if (in_array(Subscription::MEDIUM_BROWSER, $mediums)) {
$data['browser']['text'] = strip_tags($thread->getActionDescription($thread->conversation->number));
$data['browser']['url'] = $thread->conversation->url(null, $thread->id, ['mark_as_read' => $db_notification->id]);
}
return $data;
}
}