From b108b047cd853fd44a2d2048822f54b6e76f512f Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 29 Nov 2019 18:46:26 +0100 Subject: [PATCH] Improvements and fixes for push notifications (#11507) * Strip markdown from push notifications * Revert "Strip markdown from push notifications" This reverts commit 4741e584c63031d0d4609e18a4e4f082d4c4e72e. * correctly set type for mention push notifications * Add unformattedText field to chat messages * fiix lint errors * Add check that markdown formatting is stripped from messages * Add check for markdown formatting in messages. --- package-lock.json | 5 +++++ package.json | 3 ++- test/api/unit/models/group.test.js | 5 +++-- .../integration/members/POST-send_private_message.test.js | 7 +++++-- website/server/libs/chat.js | 2 +- website/server/libs/inbox/index.js | 2 +- website/server/models/group.js | 7 ++++++- website/server/models/message.js | 6 +++++- 8 files changed, 28 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4318220973..bcde87dda5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10881,6 +10881,11 @@ } } }, + "remove-markdown": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.3.0.tgz", + "integrity": "sha1-XktmdJOpNXlyjz1S7MHbnKUF3Jg=" + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", diff --git a/package.json b/package.json index b5653c463a..4898aec15f 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,8 @@ "vinyl-buffer": "^1.0.1", "winston": "^2.4.3", "winston-loggly-bulk": "^2.0.2", - "xml2js": "^0.4.4" + "xml2js": "^0.4.4", + "remove-markdown": "^0.3.0" }, "private": true, "engines": { diff --git a/test/api/unit/models/group.test.js b/test/api/unit/models/group.test.js index 85557ba418..b96d7f9297 100644 --- a/test/api/unit/models/group.test.js +++ b/test/api/unit/models/group.test.js @@ -1317,7 +1317,7 @@ describe('Group Model', () => { it('formats message', () => { const chatMessage = party.sendChat({ - message: 'a new message', + message: 'a _new_ message with *markdown*', user: { _id: 'user-id', profile: { name: 'user name' }, @@ -1336,7 +1336,8 @@ describe('Group Model', () => { const chat = chatMessage; - expect(chat.text).to.eql('a new message'); + expect(chat.text).to.eql('a _new_ message with *markdown*'); + expect(chat.unformattedText).to.eql('a new message with markdown'); expect(validator.isUUID(chat.id)).to.eql(true); expect(chat.timestamp).to.be.a('date'); expect(chat.likes).to.eql({}); diff --git a/test/api/v3/integration/members/POST-send_private_message.test.js b/test/api/v3/integration/members/POST-send_private_message.test.js index 47bc0ea574..eed6386c15 100644 --- a/test/api/v3/integration/members/POST-send_private_message.test.js +++ b/test/api/v3/integration/members/POST-send_private_message.test.js @@ -6,7 +6,8 @@ import { describe('POST /members/send-private-message', () => { let userToSendMessage; - const messageToSend = 'Test Private Message'; + const messageToSend = 'Test *Private* Message'; + const unformattedMessage = 'Test Private Message'; beforeEach(async () => { userToSendMessage = await generateUser(); @@ -110,7 +111,9 @@ describe('POST /members/send-private-message', () => { const sendersMessageInReceiversInbox = _.find( updatedReceiver.inbox.messages, - message => message.uuid === userToSendMessage._id && message.text === messageToSend, + message => message.uuid === userToSendMessage._id + && message.text === messageToSend + && message.unformattedText === unformattedMessage, ); const sendersMessageInSendersInbox = _.find( diff --git a/website/server/libs/chat.js b/website/server/libs/chat.js index fb41269f44..5ba4e4dbdc 100644 --- a/website/server/libs/chat.js +++ b/website/server/libs/chat.js @@ -34,7 +34,7 @@ export async function sendChatPushNotifications (user, group, message, mentions, member, { title: translate('groupActivityNotificationTitle', { user: message.user, group: group.name }, member.preferences.language), - message: message.text, + message: message.unformattedText, identifier: 'groupActivity', category: 'groupActivity', payload: { diff --git a/website/server/libs/inbox/index.js b/website/server/libs/inbox/index.js index 9dcbbdb01e..e6aa8c057e 100644 --- a/website/server/libs/inbox/index.js +++ b/website/server/libs/inbox/index.js @@ -23,7 +23,7 @@ export async function sentMessage (sender, receiver, message, translate) { { name: getUserInfo(sender, ['name']).name }, receiver.preferences.language, ), - message, + message: messageSent.unformattedText, identifier: 'newPM', category: 'newPM', payload: { replyTo: sender._id, senderName, message }, diff --git a/website/server/models/group.js b/website/server/models/group.js index c05cf32878..805532f280 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -634,7 +634,12 @@ schema.methods.sendChat = function sendChat (options = {}) { return; } } - sendPushNotification(member, { identifier: 'chatMention', title: `${user.profile.name} mentioned you in ${this.name}`, message }); + sendPushNotification(member, { + identifier: 'chatMention', + title: `${user.profile.name} mentioned you in ${this.name}`, + message: newChatMessage.unformattedText, + payload: { type: this.type }, + }); }); } return newChatMessage; diff --git a/website/server/models/message.js b/website/server/models/message.js index 1fdea935ce..1cf5d1b575 100644 --- a/website/server/models/message.js +++ b/website/server/models/message.js @@ -1,12 +1,14 @@ import mongoose from 'mongoose'; import { v4 as uuid } from 'uuid'; import { defaults } from 'lodash'; +import removeMd from 'remove-markdown'; import baseModel from '../libs/baseModel'; const defaultSchema = () => ({ id: String, timestamp: Date, text: String, + unformattedText: String, info: { $type: mongoose.Schema.Types.Mixed }, // sender properties @@ -110,10 +112,12 @@ export function setUserStyles (newMessage, user) { export function messageDefaults (msg, user, client, flagCount = 0, info = {}) { const id = uuid(); + const trimmedMessage = msg.substring(0, 3000); const message = { id, _id: id, - text: msg.substring(0, 3000), + text: trimmedMessage, + unformattedText: removeMd(trimmedMessage), info, timestamp: Number(new Date()), likes: {},