From fe551ece474fa0e99a09c7722dd3331f19368c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Tue, 16 Apr 2019 18:07:18 +0200 Subject: [PATCH] Create notifications on UpdatePost, too Note that we don't create duplicate notifications. I made use of the behaviour of XSS-middleware: It removes all css classes from `` anchors. Because notifications rely on a css class `mention` which gets removed in a later middleware, this gives us a nice behaviour for re-notifications without creating duplicates. The downside is that it creates dependencies between middlewares and it's not that obvious at all. cc @mattwr18 @ulfgebhardt @appinteractive @Tirokk --- backend/src/middleware/notifications/index.js | 9 +++-- backend/src/middleware/notifications/spec.js | 38 ++++++++++++++++++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/backend/src/middleware/notifications/index.js b/backend/src/middleware/notifications/index.js index 89d86bed3..942eb588d 100644 --- a/backend/src/middleware/notifications/index.js +++ b/backend/src/middleware/notifications/index.js @@ -1,11 +1,13 @@ import extractIds from './extractMentions' const notify = async (resolve, root, args, context, resolveInfo) => { - const ids = extractIds(args.content) // before mention class gets removed + // extract user ids before xss-middleware removes link classes + const ids = extractIds(args.content) + const post = await resolve(root, args, context, resolveInfo) const session = context.driver.session() - const { content, id: postId } = post + const { id: postId } = post const createdAt = (new Date()).toISOString() const cypher = ` match(u:User) where u.id in $ids @@ -22,6 +24,7 @@ const notify = async (resolve, root, args, context, resolveInfo) => { export default { Mutation: { - CreatePost: notify + CreatePost: notify, + UpdatePost: notify } } diff --git a/backend/src/middleware/notifications/spec.js b/backend/src/middleware/notifications/spec.js index c7dd99613..786ee7115 100644 --- a/backend/src/middleware/notifications/spec.js +++ b/backend/src/middleware/notifications/spec.js @@ -74,16 +74,50 @@ describe('currentUser { notifications }', () => { }) it('sends you a notification', async () => { - const newContent = 'Hey @al-capone how do you do?' + const expectedContent = 'Hey @al-capone how do you do?' const expected = { currentUser: { notifications: [ - { read: false, post: { content: newContent } } + { read: false, post: { content: expectedContent } } ] } } await expect(client.request(query, { read: false })).resolves.toEqual(expected) }) + + describe('who mentions me again', () => { + beforeEach(async () => { + const updatedContent = `${post.content} One more mention to @al-capone` + // The response `post.content` contains a link but the XSSmiddleware + // should have the `mention` CSS class removed. I discovered this + // during development and thought: A feature not a bug! This way we + // can encode a re-mentioning of users when you edit your post or + // comment. + const createPostMutation = ` + mutation($id: ID!, $content: String!) { + UpdatePost(id: $id, content: $content) { + title + content + } + } + ` + authorClient = new GraphQLClient(host, { headers: authorHeaders }) + await authorClient.request(createPostMutation, { id: post.id, content: updatedContent }) + }) + + it('creates exactly one more notification', async () => { + const expectedContent = 'Hey @al-capone how do you do? One more mention to @al-capone' + const expected = { + currentUser: { + notifications: [ + { read: false, post: { content: expectedContent } }, + { read: false, post: { content: expectedContent } } + ] + } + } + await expect(client.request(query, { read: false })).resolves.toEqual(expected) + }) + }) }) }) })