Fix mention notifications on edit (#5549)

Signed-off-by: Kristina Fefelova <kristin.fefelova@gmail.com>
This commit is contained in:
Kristina 2024-05-08 21:19:24 +04:00 committed by GitHub
parent 42fc3a15e9
commit b27b88bc04
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 75 additions and 38 deletions

View File

@ -228,13 +228,7 @@ export function stripTags (markup: Markup, textLimit = 0, extensions: Extensions
let charCount = 0
let isHardStop = false
parsed.descendants((node, _pos, parent): boolean => {
if (isHardStop) {
return false
}
if (node.type.isText) {
const text = node.text ?? ''
const pushText = (text: string): void => {
if (textLimit > 0 && charCount + text.length > textLimit) {
const toAddCount = textLimit - charCount
const textPart = text.substring(0, toAddCount)
@ -245,12 +239,25 @@ export function stripTags (markup: Markup, textLimit = 0, extensions: Extensions
textParts.push(text)
charCount += text.length
}
}
parsed.descendants((node, _pos, parent): boolean => {
if (isHardStop) {
return false
}
if (node.type.isText) {
const text = node.text ?? ''
pushText(text)
return false
} else if (node.type.isBlock) {
if (textParts.length > 0 && textParts[textParts.length - 1] !== WHITESPACE) {
textParts.push(WHITESPACE)
charCount++
}
} else if (node.type.name === 'reference') {
const label = node.attrs.label ?? ''
pushText(label.length > 0 ? `@${label}` : '')
}
return true
})

View File

@ -49,8 +49,10 @@ import contact, { Person, PersonAccount } from '@hcengineering/contact'
import {
getCommonNotificationTxes,
getPushCollaboratorTx,
isMessageAlreadyNotified,
shouldNotifyCommon
shouldNotifyCommon,
isShouldNotifyTx,
NotifyResult,
createPushFromInbox
} from '@hcengineering/server-notification-resources'
async function getPersonAccount (person: Ref<Person>, control: TriggerControl): Promise<PersonAccount | undefined> {
@ -147,18 +149,27 @@ export async function getPersonNotificationTxes (
)
}
const data: Partial<Data<MentionInboxNotification>> = {
const data: Omit<Data<MentionInboxNotification>, 'docNotifyContext'> = {
header: activity.string.MentionedYouIn,
messageHtml: reference.message,
mentionedIn: reference.attachedDocId,
mentionedInClass: reference.attachedDocClass
mentionedIn: reference.attachedDocId ?? reference.srcDocId,
mentionedInClass: reference.attachedDocClass ?? reference.srcDocClass,
user: receiver._id,
isViewed: false
}
const notifyResult = await shouldNotifyCommon(control, receiver._id, notification.ids.MentionCommonNotificationType)
const messageNotifyResult = await getMessageNotifyResult(reference, receiver._id, control, originTx, doc)
if (await isReferenceAlreadyNotified(reference, receiver._id, control)) {
if (messageNotifyResult.allowed) {
notifyResult.allowed = false
}
if (messageNotifyResult.push) {
notifyResult.push = false
}
if (messageNotifyResult.emails.length > 0) {
notifyResult.emails = []
}
const txes = await getCommonNotificationTxes(
control,
@ -174,6 +185,32 @@ export async function getPersonNotificationTxes (
notification.class.MentionInboxNotification
)
if (!notifyResult.allowed && notifyResult.push) {
const exists = (
await control.findAll(
notification.class.ActivityInboxNotification,
{ attachedTo: reference.attachedDocId as Ref<ActivityMessage>, user: receiver._id },
{ limit: 1, projection: { _id: 1 } }
)
)[0]
if (exists !== undefined) {
const pushTx = await createPushFromInbox(
control,
receiver._id,
reference.srcDocId,
reference.srcDocClass,
{ ...data, docNotifyContext: exists.docNotifyContext },
notification.class.MentionInboxNotification,
senderId as Ref<PersonAccount>,
exists._id,
new Map()
)
if (pushTx !== undefined) {
res.push(pushTx)
}
}
}
res.push(...txes)
return res
}
@ -238,22 +275,29 @@ async function getCollaboratorsTxes (
return res
}
async function isReferenceAlreadyNotified (
async function getMessageNotifyResult (
reference: Data<ActivityReference>,
receiver: Ref<Account>,
control: TriggerControl
): Promise<boolean> {
control: TriggerControl,
originTx: TxCUD<Doc>,
doc: Doc
): Promise<NotifyResult> {
const { hierarchy } = control
const tx = TxProcessor.extractTx(originTx) as TxCUD<Doc>
if (reference.attachedDocClass === undefined || reference.attachedDocId === undefined) {
return false
if (
reference.attachedDocClass === undefined ||
reference.attachedDocId === undefined ||
tx._class !== core.class.TxCreateDoc
) {
return { allowed: false, emails: [], push: false }
}
if (!hierarchy.isDerived(reference.attachedDocClass, activity.class.ActivityMessage)) {
return false
return { allowed: false, emails: [], push: false }
}
return await isMessageAlreadyNotified(reference.attachedDocId as Ref<ActivityMessage>, receiver, control)
return await isShouldNotifyTx(control, tx, originTx, doc, receiver, false, false, undefined)
}
function isMarkupType (type: Ref<Class<Type<any>>>): boolean {

View File

@ -110,20 +110,6 @@ export function getPushCollaboratorTx (
return undefined
}
export async function isMessageAlreadyNotified (
_id: Ref<ActivityMessage>,
user: Ref<Account>,
control: TriggerControl
): Promise<boolean> {
const exists = await control.findAll(
notification.class.ActivityInboxNotification,
{ attachedTo: _id, user },
{ limit: 1, projection: { _id: 1 } }
)
return exists.length > 0
}
export async function getCommonNotificationTxes (
control: TriggerControl,
doc: Doc,
@ -531,7 +517,7 @@ export async function createPushFromInbox (
_class: Ref<Class<InboxNotification>>,
senderId: Ref<PersonAccount>,
_id: Ref<Doc>,
cache: Map<Ref<Doc>, Doc>
cache: Map<Ref<Doc>, Doc> = new Map<Ref<Doc>, Doc>()
): Promise<Tx | undefined> {
let title: string = ''
let body: string = ''