mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2026-01-15 09:24:34 +00:00
Implement suggestions of Robert
This commit is contained in:
parent
0161b7f16c
commit
ff620171b2
@ -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'),
|
||||
|
||||
@ -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 },
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user