Permalink
Branch: master
Find file Copy path
93f03bf Nov 15, 2017
2 contributors

Users who have contributed to this file

@cretueusebiu @danielmorgan
133 lines (111 sloc) 3.57 KB
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Events\NotificationRead;
use App\Events\NotificationReadAll;
use App\Notifications\HelloNotification;
use NotificationChannels\WebPush\PushSubscription;
class NotificationController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth')->except('last', 'dismiss');
}
/**
* Get user's notifications.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$user = $request->user();
// Limit the number of returned notifications, or return all
$query = $user->unreadNotifications();
$limit = (int) $request->input('limit', 0);
if ($limit) {
$query = $query->limit($limit);
}
$notifications = $query->get()->each(function ($n) {
$n->created = $n->created_at->toIso8601String();
});
$total = $user->unreadNotifications->count();
return compact('notifications', 'total');
}
/**
* Create a new notification.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->user()->notify(new HelloNotification);
return response()->json('Notification sent.', 201);
}
/**
* Mark user's notification as read.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function markAsRead(Request $request, $id)
{
$notification = $request->user()
->unreadNotifications()
->where('id', $id)
->first();
if (is_null($notification)) {
return response()->json('Notification not found.', 404);
}
$notification->markAsRead();
event(new NotificationRead($request->user()->id, $id));
}
/**
* Mark all user's notifications as read.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function markAllRead(Request $request)
{
$request->user()
->unreadNotifications()
->get()->each(function ($n) {
$n->markAsRead();
});
event(new NotificationReadAll($request->user()->id));
}
/**
* Mark the notification as read and dismiss it from other devices.
*
* This method will be accessed by the service worker
* so the user is not authenticated and it requires an endpoint.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function dismiss(Request $request, $id)
{
if (empty($request->endpoint)) {
return response()->json('Endpoint missing.', 403);
}
$subscription = PushSubscription::findByEndpoint($request->endpoint);
if (is_null($subscription)) {
return response()->json('Subscription not found.', 404);
}
$notification = $subscription->user->notifications()->where('id', $id)->first();
if (is_null($notification)) {
return response()->json('Notification not found.', 404);
}
$notification->markAsRead();
event(new NotificationRead($subscription->user->id, $id));
}
}