Implement suggestions of Robert

This commit is contained in:
Wolfgang Huß 2020-02-06 09:29:35 +01:00
parent 0161b7f16c
commit ff620171b2
5 changed files with 89 additions and 84 deletions

View File

@ -553,7 +553,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
])
authenticatedUser = null
const comments = await Promise.all([
const [trollingCommentC1, trollingCommentC2] = await Promise.all([
factory.create('Comment', {
author: jennyRostock,
id: 'c1',
@ -610,8 +610,6 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
postId: 'p15',
}),
])
const trollingCommentC1 = comments[0]
const trollingCommentC2 = comments[1]
await Promise.all([
democracy.relateTo(p3, 'post'),

View File

@ -1,7 +1,7 @@
import extractMentionedUsers from './mentions/extractMentionedUsers'
import { validateNotifyUsers } from '../validation/validationMiddleware'
const debug = require('debug')('backend:notificationsMiddleware')
const debug = require('debug')('human-connection-backend:notificationsMiddleware')
const handleContentDataOfPost = async (resolve, root, args, context, resolveInfo) => {
const idsOfUsers = extractMentionedUsers(args.content)
@ -73,7 +73,8 @@ const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => {
}
mentionedCypher += `
SET notification.read = FALSE
SET ( CASE WHEN notification.createdAt IS NULL THEN notification END ).createdAt = toString(datetime())
// Wolle SET ( CASE WHEN notification.createdAt IS NULL THEN notification END ).createdAt = toString(datetime())
SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime()))
SET notification.updatedAt = toString(datetime())
`
const session = context.driver.session()
@ -100,7 +101,7 @@ const notifyUsersOfComment = async (label, commentId, postAuthorId, reason, cont
WHERE NOT (postAuthor)-[:BLOCKED]-(commenter)
MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(postAuthor)
SET notification.read = FALSE
SET ( CASE WHEN notification.createdAt IS NULL THEN notification END ).createdAt = toString(datetime())
SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime()))
SET notification.updatedAt = toString(datetime())
`,
{ commentId, postAuthorId, reason },

View File

@ -1,13 +1,12 @@
import { gql } from '../../helpers/jest'
import Factory from '../../factories'
import { createTestClient } from 'apollo-server-testing'
import { getNeode, getDriver } from '../../db/neo4j'
import { getDriver } from '../../db/neo4j'
import createServer from '../../server'
let server, query, mutate, notifiedUser, authenticatedUser
const factory = Factory()
const driver = getDriver()
const neode = getNeode()
const categoryIds = ['cat9']
const createPostMutation = gql`
mutation($id: ID, $title: String!, $postContent: String!, $categoryIds: [ID]!) {
@ -52,7 +51,6 @@ beforeAll(async () => {
context: () => {
return {
user: authenticatedUser,
neode: neode,
driver,
}
},
@ -64,14 +62,14 @@ beforeAll(async () => {
})
beforeEach(async () => {
notifiedUser = await neode.create('User', {
notifiedUser = await factory.create('User', {
id: 'you',
name: 'Al Capone',
slug: 'al-capone',
email: 'test@example.org',
password: '1234',
})
await neode.create('Category', {
await factory.create('Category', {
id: 'cat9',
name: 'Democracy & Politics',
icon: 'university',
@ -175,7 +173,7 @@ describe('notifications', () => {
describe('commenter is not me', () => {
beforeEach(async () => {
commentContent = 'Commenters comment.'
commentAuthor = await neode.create('User', {
commentAuthor = await factory.create('User', {
id: 'commentAuthor',
name: 'Mrs Comment',
slug: 'mrs-comment',
@ -256,7 +254,7 @@ describe('notifications', () => {
})
beforeEach(async () => {
postAuthor = await neode.create('User', {
postAuthor = await factory.create('User', {
id: 'postAuthor',
name: 'Mrs Post',
slug: 'mrs-post',
@ -460,7 +458,7 @@ describe('notifications', () => {
beforeEach(async () => {
commentContent =
'One mention about me with <a data-mention-id="you" class="mention" href="/profile/you" target="_blank">@al-capone</a>.'
commentAuthor = await neode.create('User', {
commentAuthor = await factory.create('User', {
id: 'commentAuthor',
name: 'Mrs Comment',
slug: 'mrs-comment',
@ -470,11 +468,11 @@ describe('notifications', () => {
})
it('sends only one notification with reason mentioned_in_comment', async () => {
postAuthor = await neode.create('User', {
id: 'MrPostAuthor',
postAuthor = await factory.create('User', {
id: 'MrAuthor',
name: 'Mr Author',
slug: 'mr-author',
email: 'post-author@example.org',
email: 'mr-author@example.org',
password: '1234',
})
@ -546,7 +544,7 @@ describe('notifications', () => {
await postAuthor.relateTo(notifiedUser, 'blocked')
commentContent =
'One mention about me with <a data-mention-id="you" class="mention" href="/profile/you" target="_blank">@al-capone</a>.'
commentAuthor = await neode.create('User', {
commentAuthor = await factory.create('User', {
id: 'commentAuthor',
name: 'Mrs Comment',
slug: 'mrs-comment',
@ -630,7 +628,7 @@ describe('notifications', () => {
describe('user', () => {
it('sends me a notification for filing a report on a user', async () => {
await neode.create('User', reportedUserOrAuthorData)
await factory.create('User', reportedUserOrAuthorData)
resourceId = 'reportedUser'
await fileReportAction()
@ -655,7 +653,7 @@ describe('notifications', () => {
beforeEach(async () => {
title = 'My post'
postContent = 'My post content.'
postAuthor = await neode.create('User', reportedUserOrAuthorData)
postAuthor = await factory.create('User', reportedUserOrAuthorData)
})
describe('post', () => {
@ -684,7 +682,7 @@ describe('notifications', () => {
describe('comment', () => {
beforeEach(async () => {
commentContent = "Commenter's comment."
commentAuthor = await neode.create('User', {
commentAuthor = await factory.create('User', {
id: 'commentAuthor',
name: 'Mrs Comment',
slug: 'mrs-comment',

View File

@ -49,14 +49,16 @@ export default {
const notificationsTransactionResponse = await transaction.run(
`
MATCH (resource)-[notification:NOTIFIED]->(user:User {id:$id})
WHERE ((labels(resource)[0] in ["Post", "Comment"] AND NOT resource.deleted AND NOT resource.disabled) OR labels(resource)[0] in ["Report"])
WHERE
((labels(resource)[0] in ["Post", "Comment"] AND NOT resource.deleted AND NOT resource.disabled)
OR labels(resource)[0] in ["Report"])
${whereClause}
WITH user, notification, resource,
[(resource)<-[:WROTE]-(author:User) | author {.*}] as authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author)} ] as posts,
[(reportedResource)<-[:BELONGS_TO]-(resource)<-[file:FILED]-(user) | file {.*, reportedResource: apoc.map.merge(properties(reportedResource), {__typename: labels(reportedResource)[0]})} ] as files
[(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author)} ] AS posts,
[(reportedResource)<-[:BELONGS_TO]-(resource)<-[file:FILED]-(user) | file {.*, reportedResource: apoc.map.merge(properties(reportedResource), {__typename: labels(reportedResource)[0]})} ] AS files
WITH resource, user, notification, authors, posts, files,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], filed: files, resource: files[0].reportedResource} as finalResource
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], filed: files, resource: files[0].reportedResource} AS finalResource
RETURN notification {.*, from: finalResource, to: properties(user)}
${orderByClause}
${offset} ${limit}

View File

@ -63,94 +63,100 @@ export const testNotifications = [
]
export const extractNotificationDataOfCurrentUser = (notification, currentUser) => {
const from = notification.from
let triggerer
const id = from.id
const createdAt = notification.createdAt
const read = notification.read
const reason = notification.reason
let title
let author
const from = notification.from // for readability
let user = null
let post = null
let comment = null
let contentExcerpt = null
let report = null
let reasonExtention = ''
let triggerer
let title
let author
let linkName
let linkParams
let linkHashParam
if (from.__typename === 'Post') {
post = from
triggerer = post.author
} else if (from.__typename === 'Comment') {
comment = from
triggerer = comment.author
post = comment.post
} else if (from.__typename === 'Report') {
report = {
reasonCategory: from.filed[0].reasonCategory,
reasonDescription: from.filed[0].reasonDescription,
}
triggerer = currentUser
if (from.filed[0].reportedResource.__typename === 'User') {
user = from.filed[0].reportedResource
reasonExtention = '.user'
} else if (from.filed[0].reportedResource.__typename === 'Post') {
post = from.filed[0].reportedResource
reasonExtention = '.post'
} else if (from.filed[0].reportedResource.__typename === 'Comment') {
comment = from.filed[0].reportedResource
post = from.filed[0].reportedResource.post
reasonExtention = '.comment'
}
// extract data out of the deep structure of db response
// leave undefined data as default, see above, so later by priority user, comment, post we get easely a clou what it is
switch (from.__typename) {
case 'Comment':
comment = from
post = comment.post
triggerer = comment.author
break
case 'Post':
post = from
triggerer = post.author
break
case 'Report':
{
const filed = from.filed[0] // for readability
report = {
reasonCategory: filed.reasonCategory,
reasonDescription: filed.reasonDescription,
}
triggerer = currentUser
switch (filed.reportedResource.__typename) {
case 'User':
user = filed.reportedResource
reasonExtention = '.user'
break
case 'Comment':
comment = filed.reportedResource
post = filed.reportedResource.post
reasonExtention = '.comment'
break
case 'Post':
post = filed.reportedResource
reasonExtention = '.post'
break
}
}
break
}
// extract the content and link data by priority: user, comment, post
if (user) {
// it's a user
title = user.name
author = user
linkName = 'profile-id-slug'
linkParams = { id: user.id, slug: user.slug }
} else {
// it's a comment or post
title = post.title
linkName = 'post-id-slug'
linkParams = { id: post.id, slug: post.slug }
if (comment) {
// it's a comment
author = comment.author
contentExcerpt = comment.contentExcerpt
linkHashParam = { hash: `#commentId-${comment.id}` }
} else {
// it's a post
author = post.author
contentExcerpt = post.contentExcerpt
linkHashParam = {}
}
}
const params = user
? {
id: user.id,
slug: user.slug,
}
: post
? {
id: post.id,
slug: post.slug,
}
: {}
const hashParam = comment ? { hash: `#commentId-${comment.id}` } : {}
const linkTo = {
name: user ? 'profile-id-slug' : 'post-id-slug',
params,
...hashParam,
}
const data = {
createdAt: notification.createdAt,
read: notification.read,
reason: notification.reason,
id: from.id,
triggerer,
id,
createdAt,
read,
reason,
title,
user,
post,
comment,
contentExcerpt,
post,
author,
title,
contentExcerpt,
report,
reasonExtention,
linkTo,
linkTo: { name: linkName, params: linkParams, ...linkHashParam },
}
return data
}