77 lines
2.7 KiB
TypeScript
77 lines
2.7 KiB
TypeScript
// server endpoints file
|
|
import type { RequestHandler } from '@sveltejs/kit';
|
|
import webPush from 'web-push';
|
|
|
|
const VAPID_PUBLIC_KEY = import.meta.env.VITE_VAPID_PUBLIC_KEY;
|
|
const VAPID_PRIVATE_KEY = import.meta.env.VITE_VAPID_PRIVATE_KEY;
|
|
|
|
webPush.setVapidDetails(
|
|
'mailto:contact@stocknear.com',
|
|
VAPID_PUBLIC_KEY,
|
|
VAPID_PRIVATE_KEY
|
|
);
|
|
|
|
export const POST: RequestHandler = async ({ request, locals }) => {
|
|
const { pb, apiKey } = locals;
|
|
const { title, body, key, options = {} } = await request?.json();
|
|
|
|
if (apiKey !== key) {
|
|
console.warn('Invalid API key');
|
|
return new Response(JSON.stringify({ success: false, error: 'Invalid API key' }), { status: 401 });
|
|
}
|
|
|
|
try {
|
|
const subscriptions = await pb.collection('pushSubscription').getFullList({ sort: '-created' });
|
|
|
|
if (!subscriptions.length) {
|
|
console.warn('No subscriptions found.');
|
|
return new Response(JSON.stringify({ success: false, error: 'No subscriptions found' }), { status: 404 });
|
|
}
|
|
|
|
const sendNotifications = subscriptions.map(async (subRecord) => {
|
|
try {
|
|
const subscriptionData = subRecord.subscription?.subscription;
|
|
|
|
if (!subscriptionData || !subscriptionData.endpoint) {
|
|
console.warn(`Skipping invalid subscription: ${subRecord.id}`);
|
|
return;
|
|
}
|
|
|
|
const isApple = subscriptionData.endpoint.includes('web.push.apple.com');
|
|
const payload = JSON.stringify({
|
|
title,
|
|
body,
|
|
options: {
|
|
...options,
|
|
// Additional options specific to the platform
|
|
...(isApple && {
|
|
silent: false, // Ensure notification shows on iOS
|
|
timestamp: Date.now(), // Required for iOS
|
|
})
|
|
}
|
|
});
|
|
|
|
await webPush.sendNotification(subscriptionData, payload);
|
|
console.log(`Notification sent to: ${subscriptionData.endpoint}`);
|
|
|
|
} catch (error: any) {
|
|
console.error(`Error sending notification to ${subRecord.id}:`, error);
|
|
|
|
if (error.statusCode === 410 || error.statusCode === 404) {
|
|
console.warn(`Deleting invalid subscription: ${subRecord.id}`);
|
|
await pb.collection('pushSubscription').delete(subRecord.id);
|
|
}
|
|
}
|
|
});
|
|
|
|
await Promise.all(sendNotifications);
|
|
|
|
return new Response(JSON.stringify({
|
|
success: true,
|
|
message: `Notifications sent to ${subscriptions.length} devices`
|
|
}));
|
|
} catch (error: any) {
|
|
console.error('Error sending notifications:', error);
|
|
return new Response(JSON.stringify({ success: false, error: error.message }), { status: 500 });
|
|
}
|
|
}; |