@model IEnumerable @{ ViewData["Title"] = "Push Subscriptions"; }

Push Subscriptions

Manage browser push notification subscriptions for admins and customers

@Html.AntiForgeryToken()
Total Subscriptions

@Model.Count()

Active

@Model.Count(s => s.IsActive)

Admin Users

@Model.Count(s => s.UserId.HasValue)

Customers

@Model.Count(s => s.CustomerId.HasValue)

@if (Model.Any()) {
Subscription List
@foreach (var subscription in Model) { var daysInactive = subscription.LastUsedAt.HasValue ? (DateTime.UtcNow - subscription.LastUsedAt.Value).Days : (DateTime.UtcNow - subscription.SubscribedAt).Days; var statusClass = subscription.IsActive ? (daysInactive > 90 ? "warning" : "success") : "danger"; }
ID Type Endpoint Subscribed Last Used Browser/Device Status Actions
@subscription.Id @if (subscription.UserId.HasValue) { Admin User @if (subscription.User != null) {
@subscription.User.Username } } else if (subscription.CustomerId.HasValue) { Customer @if (subscription.Customer != null) {
@subscription.Customer.TelegramDisplayName } } else { Unknown }
@(subscription.Endpoint.Length > 40 ? subscription.Endpoint.Substring(0, 40) + "..." : subscription.Endpoint) @if (!string.IsNullOrEmpty(subscription.IpAddress)) {
@subscription.IpAddress }
@subscription.SubscribedAt.ToString("MMM dd, yyyy")
@subscription.SubscribedAt.ToString("HH:mm")
@if (subscription.LastUsedAt.HasValue) { @subscription.LastUsedAt.Value.ToString("MMM dd, yyyy")
@subscription.LastUsedAt.Value.ToString("HH:mm") @if (daysInactive > 0) {
30 ? "warning" : "info")"> @daysInactive days ago } } else { Never }
@if (!string.IsNullOrEmpty(subscription.UserAgent)) { var ua = subscription.UserAgent; var browser = ua.Contains("Chrome") ? "Chrome" : ua.Contains("Firefox") ? "Firefox" : ua.Contains("Safari") ? "Safari" : ua.Contains("Edge") ? "Edge" : "Unknown"; var os = ua.Contains("Windows") ? "Windows" : ua.Contains("Mac") ? "macOS" : ua.Contains("Linux") ? "Linux" : ua.Contains("Android") ? "Android" : ua.Contains("iOS") ? "iOS" : "Unknown"; @browser @os
@(ua.Length > 30 ? ua.Substring(0, 30) + "..." : ua) } else { Not available }
@if (subscription.IsActive) { Active } else { Inactive }
@Html.AntiForgeryToken()
} else {
No push subscriptions yet

Push notification subscriptions will appear here when users enable browser notifications.

}
About Push Subscriptions
  • Active Status: Subscriptions marked as active can receive push notifications
  • IP Address Storage: IP addresses are stored for security and duplicate detection purposes
  • Cleanup: Expired subscriptions (inactive for >90 days) can be removed using the cleanup button
  • User Agent: Browser and device information helps identify subscription sources
  • Privacy: Subscription data contains encryption keys required for Web Push API
@section Scripts { }