Permalink
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up<?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)); | |
} | |
} |