Fix missing push notifications for thread subscriptions (#1843)
* Fix missing push notifications for thread subscriptions * Filter by comments in calling context * Fix mutes not considered * Fix duplicate push notification (reply+thread subscription) sent
This commit is contained in:
parent
b28407ee99
commit
c023e8d7d5
@ -1,5 +1,5 @@
|
|||||||
import { ANON_ITEM_SPAM_INTERVAL, ITEM_SPAM_INTERVAL, PAID_ACTION_PAYMENT_METHODS, USER_ID } from '@/lib/constants'
|
import { ANON_ITEM_SPAM_INTERVAL, ITEM_SPAM_INTERVAL, PAID_ACTION_PAYMENT_METHODS, USER_ID } from '@/lib/constants'
|
||||||
import { notifyItemMention, notifyItemParents, notifyMention, notifyTerritorySubscribers, notifyUserSubscribers } from '@/lib/webPush'
|
import { notifyItemMention, notifyItemParents, notifyMention, notifyTerritorySubscribers, notifyUserSubscribers, notifyThreadSubscribers } from '@/lib/webPush'
|
||||||
import { getItemMentions, getMentions, performBotBehavior } from './lib/item'
|
import { getItemMentions, getMentions, performBotBehavior } from './lib/item'
|
||||||
import { msatsToSats, satsToMsats } from '@/lib/format'
|
import { msatsToSats, satsToMsats } from '@/lib/format'
|
||||||
import { GqlInputError } from '@/lib/error'
|
import { GqlInputError } from '@/lib/error'
|
||||||
@ -259,6 +259,7 @@ export async function nonCriticalSideEffects ({ invoice, id }, { models }) {
|
|||||||
|
|
||||||
if (item.parentId) {
|
if (item.parentId) {
|
||||||
notifyItemParents({ item, models }).catch(console.error)
|
notifyItemParents({ item, models }).catch(console.error)
|
||||||
|
notifyThreadSubscribers({ models, item }).catch(console.error)
|
||||||
}
|
}
|
||||||
for (const { userId } of item.mentions) {
|
for (const { userId } of item.mentions) {
|
||||||
notifyMention({ models, item, userId }).catch(console.error)
|
notifyMention({ models, item, userId }).catch(console.error)
|
||||||
|
@ -202,6 +202,44 @@ export const notifyTerritorySubscribers = async ({ models, item }) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const notifyThreadSubscribers = async ({ models, item }) => {
|
||||||
|
try {
|
||||||
|
const author = await models.user.findUnique({ where: { id: item.userId } })
|
||||||
|
|
||||||
|
const subscribers = await models.$queryRaw`
|
||||||
|
SELECT DISTINCT "ThreadSubscription"."userId" FROM "ThreadSubscription"
|
||||||
|
JOIN users ON users.id = "ThreadSubscription"."userId"
|
||||||
|
JOIN "Reply" r ON "ThreadSubscription"."itemId" = r."ancestorId"
|
||||||
|
WHERE r."itemId" = ${item.id}
|
||||||
|
-- don't send notifications for own items
|
||||||
|
AND r."userId" <> "ThreadSubscription"."userId"
|
||||||
|
-- send notifications for all levels?
|
||||||
|
AND CASE WHEN users."noteAllDescendants" THEN TRUE ELSE r.level = 1 END
|
||||||
|
-- muted?
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM "Mute" m WHERE m."muterId" = users.id AND m."mutedId" = r."userId")
|
||||||
|
-- already received notification as reply to self?
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1 FROM "Item" i
|
||||||
|
JOIN "Item" p ON p.path @> i.path
|
||||||
|
WHERE i.id = ${item.parentId} AND p."userId" = "ThreadSubscription"."userId" AND users."noteAllDescendants"
|
||||||
|
)`
|
||||||
|
|
||||||
|
await Promise.allSettled(subscribers.map(({ userId }) =>
|
||||||
|
sendUserNotification(userId, {
|
||||||
|
// we reuse the same payload as for user subscriptions because they use the same title+body we want to use here
|
||||||
|
// so we should also merge them together (= same tag+data) to avoid confusion
|
||||||
|
title: `@${author.name} replied to a post`,
|
||||||
|
body: item.text,
|
||||||
|
item,
|
||||||
|
data: { followeeName: author.name, subType: 'COMMENT' },
|
||||||
|
tag: `FOLLOW-${author.id}-COMMENT`
|
||||||
|
})
|
||||||
|
))
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const notifyItemParents = async ({ models, item }) => {
|
export const notifyItemParents = async ({ models, item }) => {
|
||||||
try {
|
try {
|
||||||
const user = await models.user.findUnique({ where: { id: item.userId } })
|
const user = await models.user.findUnique({ where: { id: item.userId } })
|
||||||
|
Loading…
x
Reference in New Issue
Block a user