From 8a410cf6f54357a431523cdf7b2489bd4e45e110 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 17 Oct 2022 19:21:03 +0200 Subject: [PATCH] add search groups to resolvers --- backend/src/schema/resolvers/searches.js | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/backend/src/schema/resolvers/searches.js b/backend/src/schema/resolvers/searches.js index 63279b4bf..21363365f 100644 --- a/backend/src/schema/resolvers/searches.js +++ b/backend/src/schema/resolvers/searches.js @@ -66,6 +66,21 @@ const searchHashtagsSetup = { limit: 'LIMIT $limit', } +const searchGroupsSetup = { + fulltextIndex: 'group_fulltext_search', + match: `MATCH (resource:Group) + MATCH (user:User {id: $userId}) + OPTIONAL MATCH (user)-[membership:MEMBER_OF]->(resource) + WITH user, resource, membership`, + whereClause: `WHERE score >= 0.0 + AND NOT (resource.deleted = true OR resource.disabled = true) + AND (resource.groupType IN ['public', 'closed'] + OR membership.role IN ['usual', 'admin', 'owner'])`, + withClause: 'WITH resource', + returnClause: 'resource { .*, __typename: labels(resource)[0] }', + limit: 'LIMIT $limit', +} + const countSetup = { returnClause: 'toString(size(collect(resource)))', limit: '', @@ -84,6 +99,11 @@ const countHashtagsSetup = { ...countSetup, } +const countGroupsSetup = { + ...searchGroupsSetup, + ...countSetup, +} + const searchResultPromise = async (session, setup, params) => { return session.readTransaction(async (transaction) => { return transaction.run(cypherTemplate(setup), params) @@ -113,6 +133,7 @@ const multiSearchMap = [ { symbol: '!', setup: searchPostsSetup, resultName: 'posts' }, { symbol: '@', setup: searchUsersSetup, resultName: 'users' }, { symbol: '#', setup: searchHashtagsSetup, resultName: 'hashtags' }, + { symbol: '&', setup: searchGroupsSetup, resultName: 'groups' }, ] export default { @@ -178,6 +199,25 @@ export default { }), } }, + searchGroups: async (_parent, args, context, _resolveInfo) => { + const { query, groupsOffset, firstGroups } = args + return { + groupCount: getSearchResults( + context, + countGroupsSetup, + { + query: queryString(query), + skip: 0, + }, + countResultCallback, + ), + groups: getSearchResults(context, searchGroupsSetup, { + query: queryString(query), + skip: groupsOffset, + limit: firstGroups, + }), + } + }, searchResults: async (_parent, args, context, _resolveInfo) => { const { query, limit } = args let userId = null @@ -197,6 +237,7 @@ export default { return [ ...(await getSearchResults(context, searchPostsSetup, params)), ...(await getSearchResults(context, searchUsersSetup, params)), + ...(await getSearchResults(context, searchGroupsSetup, params)), ...(await getSearchResults(context, searchHashtagsSetup, params)), ]