fix: duplicate push notification on subscribed user and territory (#1820)

* fix: duplicate notification on subscribed user and territory

* fix comments not showing up, adjust query

* use  and tagged template helpers

---------

Co-authored-by: k00b <k00b@stacker.news>
This commit is contained in:
soxa 2025-01-22 23:12:41 +01:00 committed by GitHub
parent a92215ccf6
commit ae1942ada7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4,6 +4,7 @@ import { COMMENT_DEPTH_LIMIT, FOUND_BLURBS, LOST_BLURBS } from './constants'
import { msatsToSats, numWithUnits } from './format'
import models from '@/api/models'
import { isMuted } from '@/lib/user'
import { Prisma } from '@prisma/client'
const webPushEnabled = process.env.NODE_ENV === 'production' ||
(process.env.VAPID_MAILTO && process.env.NEXT_PUBLIC_VAPID_PUBKEY && process.env.VAPID_PRIVKEY)
@ -123,21 +124,36 @@ export async function replyToSubscription (subscriptionId, notification) {
export const notifyUserSubscribers = async ({ models, item }) => {
try {
const isPost = !!item.title
const userSubsExcludingMutes = await models.$queryRawUnsafe(`
SELECT "UserSubscription"."followerId", "UserSubscription"."followeeId", users.name as "followeeName"
FROM "UserSubscription"
INNER JOIN users ON users.id = "UserSubscription"."followeeId"
WHERE "followeeId" = $1 AND ${isPost ? '"postsSubscribedAt"' : '"commentsSubscribedAt"'} IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM "Mute" WHERE "Mute"."muterId" = "UserSubscription"."followerId" AND "Mute"."mutedId" = $1)
-- ignore subscription if user was already notified of item as a reply
AND NOT EXISTS (
SELECT 1 FROM "Reply"
INNER JOIN users follower ON follower.id = "UserSubscription"."followerId"
WHERE "Reply"."itemId" = $2
AND "Reply"."ancestorUserId" = follower.id
AND follower."noteAllDescendants"
)
`, Number(item.userId), Number(item.id))
const userSubsExcludingMutes = await models.$queryRaw`
SELECT "UserSubscription"."followerId", "UserSubscription"."followeeId", users.name as "followeeName"
FROM "UserSubscription"
INNER JOIN users ON users.id = "UserSubscription"."followeeId"
WHERE "followeeId" = ${Number(item.userId)}::INTEGER
AND ${isPost ? Prisma.sql`"postsSubscribedAt"` : Prisma.sql`"commentsSubscribedAt"`} IS NOT NULL
-- ignore muted users
AND NOT EXISTS (
SELECT 1
FROM "Mute"
WHERE "Mute"."muterId" = "UserSubscription"."followerId"
AND "Mute"."mutedId" = ${Number(item.userId)}::INTEGER)
-- ignore subscription if user was already notified of item as a reply
AND NOT EXISTS (
SELECT 1 FROM "Reply"
INNER JOIN users follower ON follower.id = "UserSubscription"."followerId"
WHERE "Reply"."itemId" = ${Number(item.id)}::INTEGER
AND "Reply"."ancestorUserId" = follower.id
AND follower."noteAllDescendants"
)
-- ignore subscription if user has posted to a territory the recipient is subscribed to
${isPost
? Prisma.sql`AND NOT EXISTS (
SELECT 1
FROM "SubSubscription"
WHERE "SubSubscription"."userId" = "UserSubscription"."followerId"
AND "SubSubscription"."subName" = ${item.subName}
)`
: Prisma.empty}`
const subType = isPost ? 'POST' : 'COMMENT'
const tag = `FOLLOW-${item.userId}-${subType}`
await Promise.allSettled(userSubsExcludingMutes.map(({ followerId, followeeName }) => sendUserNotification(followerId, {