import webpush from 'web-push'; import { prisma } from '@/lib/prisma'; if (process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY && process.env.VAPID_PRIVATE_KEY) { webpush.setVapidDetails( process.env.VAPID_SUBJECT || 'mailto:example@yourdomain.org', process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY, process.env.VAPID_PRIVATE_KEY ); } export async function sendWebPush(message: string) { if (!process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY || !process.env.VAPID_PRIVATE_KEY) { console.warn('VAPID keys not configured, skipping web push'); return; } const subscriptions = await prisma.pushSubscription.findMany(); const notificationPayload = JSON.stringify({ title: 'WinUpdate Notification', body: message, icon: '/icons/icon-192x192.png', // Assuming you have icons }); const promises = subscriptions.map((sub) => { const pushSubscription = { endpoint: sub.endpoint, keys: { p256dh: sub.p256dh, auth: sub.auth, }, }; return webpush.sendNotification(pushSubscription, notificationPayload) .catch((err) => { if (err.statusCode === 410 || err.statusCode === 404) { // Subscription has expired or is no longer valid console.log(`Subscription expired, deleting: ${sub.endpoint}`); return prisma.pushSubscription.delete({ where: { endpoint: sub.endpoint }, }); } console.error('Error sending web push:', err); }); }); await Promise.all(promises); }