From ed206f1beccd43a3b9e90ede452629a15b7ebd2c Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 15 Jan 2026 13:36:36 +0100 Subject: [PATCH] simplify group query --- backend/src/graphql/resolvers/groups.ts | 54 +++++++------------------ 1 file changed, 15 insertions(+), 39 deletions(-) diff --git a/backend/src/graphql/resolvers/groups.ts b/backend/src/graphql/resolvers/groups.ts index fbf5f96dc..681f999c3 100644 --- a/backend/src/graphql/resolvers/groups.ts +++ b/backend/src/graphql/resolvers/groups.ts @@ -24,9 +24,6 @@ export default { Query: { Group: async (_object, params, context: Context, _resolveInfo) => { const { isMember, id, slug, first, offset } = params - let pagination = '' - const orderBy = 'ORDER BY group.createdAt DESC' - if (first !== undefined && offset !== undefined) pagination = `SKIP ${offset} LIMIT ${first}` const matchParams = { id, slug } removeUndefinedNullValuesFromObject(matchParams) const session = context.driver.session() @@ -34,43 +31,22 @@ export default { if (!context.user) { throw new Error('Missing authenticated user.') } - const groupMatchParamsCypher = convertObjectToCypherMapLiteral(matchParams, true) - let groupCypher - if (isMember === true) { - groupCypher = ` - MATCH (:User {id: $userId})-[membership:MEMBER_OF]->(group:Group${groupMatchParamsCypher}) - WITH group, membership - WHERE (group.groupType IN ['public', 'closed']) OR (group.groupType = 'hidden' AND membership.role IN ['usual', 'admin', 'owner']) - RETURN group {.*, myRole: membership.role} - ${orderBy} - ${pagination} + const transactionResponse = await txc.run( ` - } else { - if (isMember === false) { - groupCypher = ` - MATCH (group:Group${groupMatchParamsCypher}) - WHERE (NOT (:User {id: $userId})-[:MEMBER_OF]->(group)) - WITH group - WHERE group.groupType IN ['public', 'closed'] - RETURN group {.*, myRole: NULL} - ${orderBy} - ${pagination} - ` - } else { - groupCypher = ` - MATCH (group:Group${groupMatchParamsCypher}) - OPTIONAL MATCH (:User {id: $userId})-[membership:MEMBER_OF]->(group) - WITH group, membership - WHERE (group.groupType IN ['public', 'closed']) OR (group.groupType = 'hidden' AND membership.role IN ['usual', 'admin', 'owner']) - RETURN group {.*, myRole: membership.role} - ${orderBy} - ${pagination} - ` - } - } - const transactionResponse = await txc.run(groupCypher, { - userId: context.user.id, - }) + MATCH (group:Group${convertObjectToCypherMapLiteral(matchParams, true)}) + OPTIONAL MATCH (:User {id: $userId})-[membership:MEMBER_OF]->(group) + WITH group, membership + ${(isMember === true && "WHERE membership IS NOT NULL AND (group.groupType IN ['public', 'closed']) OR (group.groupType = 'hidden' AND membership.role IN ['usual', 'admin', 'owner'])") || ''} + ${(isMember === false && 'WHERE NOT membership') || ''} + ${(isMember === undefined && "WHERE (group.groupType IN ['public', 'closed']) OR (group.groupType = 'hidden' AND membership.role IN ['usual', 'admin', 'owner'])") || ''} + RETURN group {.*} + ORDER BY group.createdAt DESC + ${first !== undefined && offset !== undefined ? `SKIP ${offset} LIMIT ${first}` : ''} + `, + { + userId: context.user.id, + }, + ) return transactionResponse.records.map((record) => record.get('group')) }) try {