mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
- create only one relationship by using merge, but do not update createdAt attribute/update test - order by updatedAt_desc
81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
const resourceTypes = ['Post', 'Comment']
|
|
|
|
const transformReturnType = record => {
|
|
return {
|
|
...record.get('notification').properties,
|
|
from: {
|
|
__typename: record.get('resource').labels.find(l => resourceTypes.includes(l)),
|
|
...record.get('resource').properties,
|
|
},
|
|
to: {
|
|
...record.get('user').properties,
|
|
},
|
|
}
|
|
}
|
|
|
|
export default {
|
|
Query: {
|
|
notifications: async (_parent, args, context, _resolveInfo) => {
|
|
const { user: currentUser } = context
|
|
const session = context.driver.session()
|
|
let notifications
|
|
let whereClause
|
|
let orderByClause
|
|
switch (args.read) {
|
|
case true:
|
|
whereClause = 'WHERE notification.read = TRUE'
|
|
break
|
|
case false:
|
|
whereClause = 'WHERE notification.read = FALSE'
|
|
break
|
|
default:
|
|
whereClause = ''
|
|
}
|
|
switch (args.orderBy) {
|
|
case 'updatedAt_asc':
|
|
orderByClause = 'ORDER BY notification.updatedAt ASC'
|
|
break
|
|
case 'updatedAt_desc':
|
|
orderByClause = 'ORDER BY notification.updatedAt DESC'
|
|
break
|
|
default:
|
|
orderByClause = ''
|
|
}
|
|
|
|
try {
|
|
const cypher = `
|
|
MATCH (resource {deleted: false, disabled: false})-[notification:NOTIFIED]->(user:User {id:$id})
|
|
${whereClause}
|
|
RETURN resource, notification, user
|
|
${orderByClause}
|
|
`
|
|
const result = await session.run(cypher, { id: currentUser.id })
|
|
notifications = await result.records.map(transformReturnType)
|
|
} finally {
|
|
session.close()
|
|
}
|
|
return notifications
|
|
},
|
|
},
|
|
Mutation: {
|
|
markAsRead: async (parent, args, context, resolveInfo) => {
|
|
const { user: currentUser } = context
|
|
const session = context.driver.session()
|
|
let notification
|
|
try {
|
|
const cypher = `
|
|
MATCH (resource {id: $resourceId})-[notification:NOTIFIED {read: FALSE}]->(user:User {id:$id})
|
|
SET notification.read = TRUE
|
|
RETURN resource, notification, user
|
|
`
|
|
const result = await session.run(cypher, { resourceId: args.id, id: currentUser.id })
|
|
const notifications = await result.records.map(transformReturnType)
|
|
notification = notifications[0]
|
|
} finally {
|
|
session.close()
|
|
}
|
|
return notification
|
|
},
|
|
},
|
|
}
|