website/routes/api/webpush/subscription.ts

41 lines
1 KiB
TypeScript

import { define } from '../../../utils.ts'
import { respondApi } from ':src/utils.ts'
import { sendWebPushNotification, subscriptions } from ':src/webpush/mod.ts'
export const handler = define.handlers({
async POST(ctx) {
const subscription = await ctx.req.json() as PushSubscriptionJSON
try {
await saveSubscription(subscription)
await sendWebPushNotification(
'Notifications desormais disponible sur votre appareil',
{},
(sub) =>
sub.keys !== undefined && sub.keys.auth === subscription.keys?.auth,
)
return respondApi('success', 'ok')
} catch (error) {
console.error('[webpush/subscription]:', error)
return respondApi('error', String(error))
}
},
})
async function saveSubscription(subscription: PushSubscriptionJSON) {
if (subscription.keys === undefined) {
throw new Error('no valid key in webpush subscription')
}
const { ok } = await subscriptions.set(
['subscription', subscription.keys!.auth],
subscription,
)
if (!ok) {
throw new Error('subscription saving failed')
}
}