From 1d5053feb4a5f9b2ea477676f437aef5c7fb7c5d Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 19 Oct 2024 08:09:59 -0700 Subject: subscriptions --- lib/notifications.ts | 89 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 25 deletions(-) (limited to 'lib/notifications.ts') diff --git a/lib/notifications.ts b/lib/notifications.ts index af47a6d7..023fdeff 100644 --- a/lib/notifications.ts +++ b/lib/notifications.ts @@ -1,38 +1,77 @@ +import { emit } from "$lib/sockets"; +import { err, warn } from "$lib/logging"; +import { db } from "$lib/db"; +import mqtt from "$lib/mqtt"; import config from "$config"; +import { mail, templates } from "$lib/mail"; +import { f, fmt, link, fiat, t } from "$lib/utils"; import webpush from "web-push"; if (config.vapid) { webpush.setVapidDetails( - config.vapid.url, - config.vapid.publicKey, - config.vapid.privateKey, + `mailto:${config.support}`, + config.vapid.pk, + config.vapid.sk, ); } -export const notify = async (user, payload) => { - try { - let { subscriptions } = user; +export const notify = async (p, user, withdrawal) => { + emit(user.id, "payment", p); + let { username } = user; + let { paymentReceived } = t(user); - if (subscriptions) { - let i = 0; - for (let subscription of subscriptions) { - i++; - try { - await webpush.sendNotification(subscription, payload); - } catch (e) { - if ( - e.body && - (e.body.includes("expired") || e.body.includes("No such")) - ) { - user.subscriptions.splice(i, 1); - await user.save(); - } else { - err("problem sending notification", e); - } - } - } + try { + if (user.verified && user.notify) { + mail(user, paymentReceived, templates.paymentReceived, { + ...t(user), + username, + payment: { + amount: fmt(p.amount), + link: link(p.id), + tip: p.tip ? fmt(p.tip) : undefined, + fiat: f(fiat(p.amount, p.rate), p.currency), + fiatTip: p.tip ? f(fiat(p.tip, p.rate), p.currency) : undefined, + memo: p.memo, + items: + p.items && + p.items.map((i) => { + return { + quantity: i.quantity, + name: i.name, + total: i.quantity * i.price, + totalFiat: f(i.quantity * i.price, p.currency), + }; + }), + }, + withdrawal, + }); } } catch (e) { - console.log("problem notifying", e); + err("problem emailing", e.message); + } + + let subscriptions = await db.sMembers(`${user.id}:subscriptions`); + + let payload = { + title: paymentReceived, + body: `${fmt(p.amount)} ${f(fiat(p.amount, p.rate), p.currency)}`, + url: `/payment/${p.id}`, + }; + + for (let s of subscriptions) { + webpush + .sendNotification(JSON.parse(s), JSON.stringify(payload)) + .catch((e) => { + warn("sub failed", e.message); + db.sRem(`${user.id}:subscriptions`, s); + }); + } + + if (config.mqtt) { + if (!mqtt.connected) await mqtt.reconnect(); + mqtt.publish( + username, + `pay:${p.amount}:${p.tip}:${p.rate}:${p.created}:${p.id}:${p.memo}:${p.items}`, + ); } }; -- cgit v1.2.3