From a5689e2f678cf2dc6f0d9b3a61cd83d4b5acca58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 22 Nov 2019 08:44:40 +0100 Subject: [PATCH] Get implementing 'reviewedByModerator' further --- backend/src/schema/resolvers/comments.js | 34 +++---------------- .../schema/resolvers/helpers/claimResource.js | 21 ++++++++++++ backend/src/schema/resolvers/posts.js | 23 +++---------- backend/src/schema/resolvers/users.js | 7 ++-- backend/src/schema/types/type/Comment.gql | 20 +++++------ backend/src/schema/types/type/User.gql | 20 +++++------ 6 files changed, 53 insertions(+), 72 deletions(-) create mode 100644 backend/src/schema/resolvers/helpers/claimResource.js diff --git a/backend/src/schema/resolvers/comments.js b/backend/src/schema/resolvers/comments.js index 13d06506e..4a3d4f1d1 100644 --- a/backend/src/schema/resolvers/comments.js +++ b/backend/src/schema/resolvers/comments.js @@ -1,5 +1,6 @@ import uuid from 'uuid/v4' import Resolver from './helpers/Resolver' +import { queryReviewedByModerator } from './helpers/claimResource.js' export default { Mutation: { @@ -69,37 +70,10 @@ export default { hasOne: { author: '<-[:WROTE]-(related:User)', post: '-[:COMMENTS]->(related:Post)', - // Wolle !!! Following statement is not correct, but the correct (see file 'backend/src/schema/types/type/Comment.gql') makes an error. Should be: '<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(related:User) RETURN related ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC LIMIT 1' - // Wolle reviewedByModerator: '<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(related:User)', - reviewedByModerator: '<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(related:User) WITH caseFolder, review, related ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC WITH collect(related) AS orderedRelated WITH orderedRelated[0] AS related', }, }), - // Wolle reviewedByModerator: async (parent, params, context, resolveInfo) => { - // console.log('reviewedByModerator !!!') - // console.log('reviewedByModerator !!!') - // console.log('reviewedByModerator !!!') - // console.log('reviewedByModerator !!!') - // console.log('reviewedByModerator !!!') - // if (typeof parent.reviewedByModerator !== 'undefined') return parent.reviewedByModerator - // // const { id } = parent - // // const statement = ` - // // MATCH (p:Post {id: $id})-[:TAGGED|CATEGORIZED]->(categoryOrTag)<-[:TAGGED|CATEGORIZED]-(post:Post) - // // WHERE NOT post.deleted AND NOT post.disabled - // // RETURN DISTINCT post - // // LIMIT 10 - // // ` - // // let reviewedByModerator - // // const session = context.driver.session() - // // try { - // // const result = await session.run(statement, { id }) - // // relatedContributions = result.records.map(r => r.get('post').properties) - // // } finally { - // // session.close() - // // } - // // return reviewedByModerator - // return { - // id: 'Hallo !!!' - // } - // }, + reviewedByModerator: async (parent, _params, context, _resolveInfo) => { + return await queryReviewedByModerator('Comment', parent, context) + }, }, } diff --git a/backend/src/schema/resolvers/helpers/claimResource.js b/backend/src/schema/resolvers/helpers/claimResource.js new file mode 100644 index 000000000..75e68afbe --- /dev/null +++ b/backend/src/schema/resolvers/helpers/claimResource.js @@ -0,0 +1,21 @@ +export async function queryReviewedByModerator(label, parent, context) { + if (typeof parent.reviewedByModerator !== 'undefined') return parent.reviewedByModerator + const { id } = parent + const statement = ` + MATCH (resource {id: $id})<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(moderator:User) + WHERE $label IN labels(resource) + RETURN moderator + ORDER BY caseFolder.updatedAt DESC, review.updatedAt DESC + LIMIT 1 + ` + let reviewedByModerator + const session = context.driver.session() + try { + const result = await session.run(statement, { label, id }) + const [firstElement] = result.records.map(r => r.get('moderator').properties) + reviewedByModerator = firstElement + } finally { + session.close() + } + return reviewedByModerator +} diff --git a/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.js index b4eeac489..7875772c4 100644 --- a/backend/src/schema/resolvers/posts.js +++ b/backend/src/schema/resolvers/posts.js @@ -5,6 +5,8 @@ import { getBlockedUsers, getBlockedByUsers } from './users.js' import { mergeWith, isArray, isEmpty } from 'lodash' import { UserInputError } from 'apollo-server' import Resolver from './helpers/Resolver' +import { queryReviewedByModerator } from './helpers/claimResource.js' + const filterForBlockedUsers = async (params, context) => { if (!context.user) return params const [blockedUsers, blockedByUsers] = await Promise.all([ @@ -340,25 +342,8 @@ export default { } return relatedContributions }, - reviewedByModerator: async (parent, params, context, resolveInfo) => { - if (typeof parent.reviewedByModerator !== 'undefined') return parent.reviewedByModerator - const { id } = parent - const statement = ` - MATCH (p:Post {id: $id})<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(moderator:User) - RETURN moderator - ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC - LIMIT 1 - ` - let reviewedByModerator - const session = context.driver.session() - try { - const result = await session.run(statement, { id }) - const [firstElement] = result.records.map(r => r.get('moderator').properties) - reviewedByModerator = firstElement - } finally { - session.close() - } - return reviewedByModerator + reviewedByModerator: async (parent, _params, context, _resolveInfo) => { + return await queryReviewedByModerator('Post', parent, context) }, }, } diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index 0fe77c88d..d985a1382 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -3,6 +3,7 @@ import fileUpload from './fileUpload' import { neode } from '../../bootstrap/neo4j' import { UserInputError, ForbiddenError } from 'apollo-server' import Resolver from './helpers/Resolver' +import { queryReviewedByModerator } from './helpers/claimResource.js' const instance = neode() @@ -200,9 +201,6 @@ export default { }, hasOne: { invitedBy: '<-[:INVITED]-(related:User)', - // Wolle !!! Following statement is not correct, but the correct (see file 'backend/src/schema/types/type/User.gql') makes an error. Should be: '<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(related:User) RETURN related ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC LIMIT 1' - // Wolle reviewedByModerator: '<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(related:User)', - reviewedByModerator: '<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(moderators:User) WITH caseFolder, review, moderators ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC WITH collect(moderators) AS orderedModerators WITH orderedModerators AS related', location: '-[:IS_IN]->(related:Location)', }, hasMany: { @@ -217,5 +215,8 @@ export default { badges: '<-[:REWARDED]-(related:Badge)', }, }), + reviewedByModerator: async (parent, _params, context, _resolveInfo) => { + return await queryReviewedByModerator('User', parent, context) + }, }, } diff --git a/backend/src/schema/types/type/Comment.gql b/backend/src/schema/types/type/Comment.gql index 347b7fc20..bc9d6ae69 100644 --- a/backend/src/schema/types/type/Comment.gql +++ b/backend/src/schema/types/type/Comment.gql @@ -19,16 +19,16 @@ type Comment { # """ # ) reviewedByModerator: User - @cypher( - statement: """ - MATCH (this)<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(moderators:User) - WITH caseFolder, review, moderators - ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC - WITH collect(moderators) AS orderedModerators - WITH orderedModerators[0] AS moderator - RETURN moderator - """ - ) + # Wolle @cypher( + # statement: """ + # MATCH (this)<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(moderators:User) + # WITH caseFolder, review, moderators + # ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC + # WITH collect(moderators) AS orderedModerators + # WITH orderedModerators[0] AS moderator + # RETURN moderator + # """ + # ) } type Mutation { diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index 576bb2ebb..77a77616f 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -43,16 +43,16 @@ type User { # """ # ) reviewedByModerator: User - @cypher( - statement: """ - MATCH (this)<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(moderators:User) - WITH caseFolder, review, moderators - ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC - WITH collect(moderators) AS orderedModerators - WITH orderedModerators[0] AS moderator - RETURN moderator - """ - ) + # Wolle @cypher( + # statement: """ + # MATCH (this)<-[:FLAGGED]-(caseFolder:CaseFolder)<-[review:REVIEWED]-(moderators:User) + # WITH caseFolder, review, moderators + # ORDER BY caseFolder.updatedAt ASC, review.updatedAt ASC + # WITH collect(moderators) AS orderedModerators + # WITH orderedModerators[0] AS moderator + # RETURN moderator + # """ + # ) role: UserGroup! publicKey: String invitedBy: User @relation(name: "INVITED", direction: "IN")