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);
            }
        }