public async Task <SubscriptionUsers> Subscribe(SubscriptionUsers subscription) { // We're storing at most one subscription per user, so delete old ones. // Alternatively, you could let the user register multiple subscriptions from different browsers/devices. var userId = GetUserId(); var oldSubscriptions = _context.SubscriptionUsers.Where(e => e.UserId == userId); _context.SubscriptionUsers.RemoveRange(oldSubscriptions); // Store new subscription subscription.UserId = userId; _context.SubscriptionUsers.Attach(subscription); await _context.SaveChangesAsync(); return(subscription); }
public async Task SubscribeToNotifications(SubscriptionUsers subscription) { var response = await httpClient.PutAsJsonAsync("subscriptions/subscribe", subscription); response.EnsureSuccessStatusCode(); }
private static async Task TrackAndSendNotificationsAsync(NotificationUsers notification, SubscriptionUsers subscription) { // In a realistic case, some other backend process would track // order delivery progress and send us notifications when it // changes. Since we don't have any such process here, fake it. await Task.Delay(NotificationWithStatus.PreparationDuration); await SendNotificationAsync(notification, subscription, "Your notification has been dispatched!"); await Task.Delay(NotificationWithStatus.DeliveryDuration); await SendNotificationAsync(notification, subscription, "Your notification is now delivered. Enjoy!"); }
private static async Task SendNotificationAsync(NotificationUsers notification, SubscriptionUsers subscription, string message) { // For a real application, generate your own var publicKey = "BNJd4yM_aOPtUZqI7IG8XWJNIHcg3iHHdmrWgv-6jLxMXySWeX7fRsl-xZcwj59GjYDWAwf4oc8UevQuViWgyPg"; var privateKey = "W4Y49mec2mx6KoJ2I1yHgl0GoButX25SX1Sr2-GDl1I"; var pushSubscription = new PushSubscription(subscription.Url, subscription.P256dh, subscription.Auth); var vapidDetails = new VapidDetails("mailto:<*****@*****.**>", publicKey, privateKey); var webPushClient = new WebPushClient(); try { var payload = JsonSerializer.Serialize(new { message, url = $"mynotifications/{notification.NotificationId}", }); await webPushClient.SendNotificationAsync(pushSubscription, payload, vapidDetails); } catch (Exception ex) { Console.Error.WriteLine("Error sending push notification: " + ex.Message); } }