frontend/src/routes/api/sendPushSubscription/+server.ts
MuslemRahimi d0111d91d8 bugfixing
2025-02-03 11:06:15 +01:00

63 lines
2.2 KiB
TypeScript

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;
// Extract 'url' from the request body
const { title, body, key, url, userId } = await request?.json();
if (apiKey !== key) {
return new Response(JSON.stringify({ success: false, error: 'Invalid API key' }), { status: 401 });
}
try {
const subscriptions = await pb.collection('pushSubscription').getFullList({ filter: `user="${userId}"`, sort: '-created' });
if (!subscriptions.length) {
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?.endpoint) {
console.warn(`Skipping invalid subscription: ${subRecord.id}`);
return;
}
// Always send JSON payload with title, body, and url
const payload = JSON.stringify({ title, body, url });
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) {
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 });
}
};