frontend/src/routes/api/sendPushSubscription/+server.ts
MuslemRahimi abb2d58ed5 bugfixing
2025-02-02 23:05:54 +01:00

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