Don't export sendUserNotification (#937)

* Rename file to webPush.js

* Move webPush code into lib/webPush

* Don't export sendUserNotification

* Fix null in deposit push notification

* restore deposit notification change

---------

Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
This commit is contained in:
ekzyis 2024-03-19 23:43:04 +01:00 committed by GitHub
parent 687d71f246
commit 22ff832efb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 97 additions and 59 deletions

View File

@ -15,7 +15,7 @@ import { msatsToSats } from '../../lib/format'
import { parse } from 'tldts' import { parse } from 'tldts'
import uu from 'url-unshort' import uu from 'url-unshort'
import { actSchema, advSchema, bountySchema, commentSchema, discussionSchema, jobSchema, linkSchema, pollSchema, ssValidate } from '../../lib/validate' import { actSchema, advSchema, bountySchema, commentSchema, discussionSchema, jobSchema, linkSchema, pollSchema, ssValidate } from '../../lib/validate'
import { sendUserNotification, notifyItemParents, notifyUserSubscribers, notifyZapped, notifyTerritorySubscribers } from '../../lib/webPush' import { notifyItemParents, notifyUserSubscribers, notifyZapped, notifyTerritorySubscribers, notifyMention } from '../../lib/webPush'
import { defaultCommentSort, isJob, deleteItemByAuthor, getDeleteCommand, hasDeleteCommand } from '../../lib/item' import { defaultCommentSort, isJob, deleteItemByAuthor, getDeleteCommand, hasDeleteCommand } from '../../lib/item'
import { datePivot, whenRange } from '../../lib/time' import { datePivot, whenRange } from '../../lib/time'
import { imageFeesInfo, uploadIdsFromText } from './image' import { imageFeesInfo, uploadIdsFromText } from './image'
@ -1225,12 +1225,7 @@ export const createMentions = async (item, models) => {
// only send if mention is new to avoid duplicates // only send if mention is new to avoid duplicates
if (mention.createdAt.getTime() === mention.updatedAt.getTime()) { if (mention.createdAt.getTime() === mention.updatedAt.getTime()) {
sendUserNotification(user.id, { notifyMention(user.id, item)
title: 'you were mentioned',
body: item.text,
item,
tag: 'MENTION'
}).catch(console.error)
} }
}) })
} }

View File

@ -1,6 +1,6 @@
import webPush from 'web-push' import webPush from 'web-push'
import removeMd from 'remove-markdown' import removeMd from 'remove-markdown'
import { ANON_USER_ID, COMMENT_DEPTH_LIMIT } from './constants' import { ANON_USER_ID, COMMENT_DEPTH_LIMIT, FOUND_BLURBS, LOST_BLURBS } from './constants'
import { msatsToSats, numWithUnits } from './format' import { msatsToSats, numWithUnits } from './format'
import models from '../api/models' import models from '../api/models'
@ -83,7 +83,7 @@ const sendNotification = (subscription, payload) => {
}) })
} }
export async function sendUserNotification (userId, notification) { async function sendUserNotification (userId, notification) {
try { try {
notification.data ??= {} notification.data ??= {}
if (notification.item) { if (notification.item) {
@ -243,6 +243,27 @@ export const notifyZapped = async ({ models, id }) => {
} }
} }
export const notifyMention = async (userId, item) => {
try {
await sendUserNotification(userId, {
title: 'you were mentioned',
body: item.text,
item,
tag: 'MENTION'
}).catch(console.error)
} catch (err) {
console.error(err)
}
}
export const notifyReferral = async (userId) => {
try {
await sendUserNotification(userId, { title: 'someone joined via one of your referral links', tag: 'REFERRAL' }).catch(console.error)
} catch (err) {
console.error(err)
}
}
export const notifyTerritoryTransfer = async ({ models, sub, to }) => { export const notifyTerritoryTransfer = async ({ models, sub, to }) => {
try { try {
await sendUserNotification(to.id, { await sendUserNotification(to.id, {
@ -253,3 +274,64 @@ export const notifyTerritoryTransfer = async ({ models, sub, to }) => {
console.error(err) console.error(err)
} }
} }
export async function notifyEarner (userId, earnings) {
const fmt = msats => numWithUnits(msatsToSats(msats, { abbreviate: false }))
const title = `you stacked ${fmt(earnings.msats)} in rewards`
const tag = 'EARN'
let body = ''
if (earnings.POST) body += `#${earnings.POST.bestRank} among posts with ${fmt(earnings.POST.msats)} in total\n`
if (earnings.COMMENT) body += `#${earnings.COMMENT.bestRank} among comments with ${fmt(earnings.COMMENT.msats)} in total\n`
if (earnings.TIP_POST) body += `#${earnings.TIP_POST.bestRank} in post zapping with ${fmt(earnings.TIP_POST.msats)} in total\n`
if (earnings.TIP_COMMENT) body += `#${earnings.TIP_COMMENT.bestRank} in comment zapping with ${fmt(earnings.TIP_COMMENT.msats)} in total`
try {
await sendUserNotification(userId, { title, tag, body })
} catch (err) {
console.error(err)
}
}
export async function notifyDeposit (userId, invoice) {
try {
await sendUserNotification(userId, {
title: `${numWithUnits(msatsToSats(invoice.received_mtokens), { abbreviate: false })} were deposited in your account`,
body: invoice.comment || undefined,
tag: 'DEPOSIT',
data: { sats: msatsToSats(invoice.received_mtokens) }
})
} catch (err) {
console.error(err)
}
}
export async function notifyNewStreak (userId, streak) {
const index = streak.id % FOUND_BLURBS.length
const blurb = FOUND_BLURBS[index]
try {
await sendUserNotification(userId, {
title: 'you found a cowboy hat',
body: blurb,
tag: 'STREAK-FOUND'
}).catch(console.error)
} catch (err) {
console.error(err)
}
}
export async function notifyStreakLost (userId, streak) {
const index = streak.id % LOST_BLURBS.length
const blurb = LOST_BLURBS[index]
try {
await sendUserNotification(userId, {
title: 'you lost your cowboy hat',
body: blurb,
tag: 'STREAK-LOST'
})
} catch (err) {
console.error(err)
}
}

View File

@ -10,7 +10,7 @@ import { PrismaAdapter } from '@auth/prisma-adapter'
import { getToken } from 'next-auth/jwt' import { getToken } from 'next-auth/jwt'
import { NodeNextRequest } from 'next/dist/server/base-http/node' import { NodeNextRequest } from 'next/dist/server/base-http/node'
import { schnorr } from '@noble/curves/secp256k1' import { schnorr } from '@noble/curves/secp256k1'
import { sendUserNotification } from '../../../lib/webPush' import { notifyReferral } from '../../../lib/webPush'
/** /**
* Stores userIds in user table * Stores userIds in user table
@ -66,7 +66,7 @@ function getCallbacks (req) {
const referrer = await prisma.user.findUnique({ where: { name: req.cookies.sn_referrer } }) const referrer = await prisma.user.findUnique({ where: { name: req.cookies.sn_referrer } })
if (referrer) { if (referrer) {
await prisma.user.update({ where: { id: user.id }, data: { referrerId: referrer.id } }) await prisma.user.update({ where: { id: user.id }, data: { referrerId: referrer.id } })
sendUserNotification(referrer.id, { title: 'someone joined via one of your referral links', tag: 'REFERRAL' }).catch(console.error) notifyReferral(referrer.id)
} }
} }

View File

@ -1,6 +1,5 @@
import serialize from '../api/resolvers/serial.js' import serialize from '../api/resolvers/serial.js'
import { sendUserNotification } from '../lib/webPush.js' import { notifyEarner } from '../lib/webPush.js'
import { msatsToSats, numWithUnits } from '../lib/format.js'
import { PrismaClient } from '@prisma/client' import { PrismaClient } from '@prisma/client'
import { proportions } from '../lib/madness.js' import { proportions } from '../lib/madness.js'
import { SN_USER_IDS } from '../lib/constants.js' import { SN_USER_IDS } from '../lib/constants.js'
@ -106,24 +105,10 @@ export async function earn ({ name }) {
} }
} }
Promise.allSettled(Object.entries(notifications).map(([userId, earnings]) => Promise.allSettled(
sendUserNotification(parseInt(userId, 10), buildUserNotification(earnings)) Object.entries(notifications).map(([userId, earnings]) => notifyEarner(parseInt(userId, 10), earnings))
)).catch(console.error) ).catch(console.error)
} finally { } finally {
models.$disconnect().catch(console.error) models.$disconnect().catch(console.error)
} }
} }
function buildUserNotification (earnings) {
const fmt = msats => numWithUnits(msatsToSats(msats, { abbreviate: false }))
const title = `you stacked ${fmt(earnings.msats)} in rewards`
const tag = 'EARN'
let body = ''
if (earnings.POST) body += `#${earnings.POST.bestRank} among posts with ${fmt(earnings.POST.msats)} in total\n`
if (earnings.COMMENT) body += `#${earnings.COMMENT.bestRank} among comments with ${fmt(earnings.COMMENT.msats)} in total\n`
if (earnings.TIP_POST) body += `#${earnings.TIP_POST.bestRank} in post zapping with ${fmt(earnings.TIP_POST.msats)} in total\n`
if (earnings.TIP_COMMENT) body += `#${earnings.TIP_COMMENT.bestRank} in comment zapping with ${fmt(earnings.TIP_COMMENT.msats)} in total`
return { title, tag, body }
}

View File

@ -1,5 +1,4 @@
import { sendUserNotification } from '../lib/webPush' import { notifyNewStreak, notifyStreakLost } from '../lib/webPush'
import { FOUND_BLURBS, LOST_BLURBS } from '../lib/constants'
const STREAK_THRESHOLD = 100 const STREAK_THRESHOLD = 100
@ -61,17 +60,7 @@ export async function computeStreaks ({ models }) {
WHERE ending_streaks.id = "Streak"."userId" AND "endedAt" IS NULL WHERE ending_streaks.id = "Streak"."userId" AND "endedAt" IS NULL
RETURNING "Streak".id, ending_streaks."id" AS "userId"` RETURNING "Streak".id, ending_streaks."id" AS "userId"`
Promise.allSettled( Promise.allSettled(endingStreaks.map(streak => notifyStreakLost(streak.userId, streak)))
endingStreaks.map(({ id, userId }) => {
const index = id % LOST_BLURBS.length
const blurb = LOST_BLURBS[index]
return sendUserNotification(userId, {
title: 'you lost your cowboy hat',
body: blurb,
tag: 'STREAK-LOST'
}).catch(console.error)
})
)
} }
export async function checkStreak ({ data: { id }, models }) { export async function checkStreak ({ data: { id }, models }) {
@ -115,11 +104,5 @@ export async function checkStreak ({ data: { id }, models }) {
if (!streak) return if (!streak) return
// new streak started for user // new streak started for user
const index = streak.id % FOUND_BLURBS.length notifyNewStreak(id, streak)
const blurb = FOUND_BLURBS[index]
sendUserNotification(id, {
title: 'you found a cowboy hat',
body: blurb,
tag: 'STREAK-FOUND'
}).catch(console.error)
} }

View File

@ -3,8 +3,7 @@ import {
getInvoice, getPayment, cancelHodlInvoice, deletePayment, getInvoice, getPayment, cancelHodlInvoice, deletePayment,
subscribeToInvoices, subscribeToPayments, subscribeToInvoice subscribeToInvoices, subscribeToPayments, subscribeToInvoice
} from 'ln-service' } from 'ln-service'
import { sendUserNotification } from '../lib/webPush' import { notifyDeposit } from '../lib/webPush'
import { msatsToSats, numWithUnits } from '../lib/format'
import { INVOICE_RETENTION_DAYS } from '../lib/constants' import { INVOICE_RETENTION_DAYS } from '../lib/constants'
import { datePivot, sleep } from '../lib/time.js' import { datePivot, sleep } from '../lib/time.js'
import retry from 'async-retry' import retry from 'async-retry'
@ -129,14 +128,8 @@ async function checkInvoice ({ data: { hash }, boss, models, lnd }) {
// don't send notifications for JIT invoices // don't send notifications for JIT invoices
if (dbInv.preimage) return if (dbInv.preimage) return
if (code === 0) { if (code === 0) {
sendUserNotification(dbInv.userId, { notifyDeposit(dbInv.userId, { comment: dbInv.comment, ...inv })
title: `${numWithUnits(msatsToSats(inv.received_mtokens), { abbreviate: false })} were deposited in your account`,
body: dbInv.comment || undefined,
tag: 'DEPOSIT',
data: { sats: msatsToSats(inv.received_mtokens) }
}).catch(console.error)
} }
return await boss.send('nip57', { hash }) return await boss.send('nip57', { hash })