From 4f8ebebac338e497c4815920bbe38d7bf191c71f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 17 Oct 2022 19:20:41 +0200 Subject: [PATCH 01/19] add search groups to schema --- backend/src/schema/types/type/Search.gql | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/src/schema/types/type/Search.gql b/backend/src/schema/types/type/Search.gql index 9537b5a84..5cb68e22d 100644 --- a/backend/src/schema/types/type/Search.gql +++ b/backend/src/schema/types/type/Search.gql @@ -1,4 +1,4 @@ -union SearchResult = Post | User | Tag +union SearchResult = Post | User | Tag | Group type postSearchResults { postCount: Int @@ -15,9 +15,15 @@ type hashtagSearchResults { hashtags: [Tag]! } +type groupSearchResults { + groupCount: Int + groups: [Group]! +} + type Query { searchPosts(query: String!, firstPosts: Int, postsOffset: Int): postSearchResults! searchUsers(query: String!, firstUsers: Int, usersOffset: Int): userSearchResults! + searchGroups(query: String!, firstGroups: Int, groupsOffset: Int): groupSearchResults! searchHashtags(query: String!, firstHashtags: Int, hashtagsOffset: Int): hashtagSearchResults! searchResults(query: String!, limit: Int = 5): [SearchResult]! } From 8a410cf6f54357a431523cdf7b2489bd4e45e110 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 17 Oct 2022 19:21:03 +0200 Subject: [PATCH 02/19] 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)), ] From cb1e9f95e02ae7ff681b44a59a2267a535f56a85 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 21 Oct 2022 17:51:43 +0200 Subject: [PATCH 03/19] add headers for group search --- webapp/locales/de.json | 1 + webapp/locales/en.json | 1 + 2 files changed, 2 insertions(+) diff --git a/webapp/locales/de.json b/webapp/locales/de.json index 74317b1be..837cfc75c 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -744,6 +744,7 @@ "failed": "Nichts gefunden", "for": "Suche nach ", "heading": { + "Group": "Gruppe ::: Gruppen", "Post": "Beitrag ::: Beiträge", "Tag": "Hashtag ::: Hashtags", "User": "Benutzer ::: Benutzer" diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 62062ffe7..3b18e1a45 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -744,6 +744,7 @@ "failed": "Nothing found", "for": "Searching for ", "heading": { + "Group": "Group ::: Groups", "Post": "Post ::: Posts", "Tag": "Hashtag ::: Hashtags", "User": "User ::: Users" From add85ef49cabadeba2386e6805d074e7b3889717 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 21 Oct 2022 17:52:06 +0200 Subject: [PATCH 04/19] add graphql for group search --- webapp/graphql/Fragments.js | 12 ++++++++++++ webapp/graphql/Search.js | 11 ++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/webapp/graphql/Fragments.js b/webapp/graphql/Fragments.js index 68cd02c6a..1d9c2ee08 100644 --- a/webapp/graphql/Fragments.js +++ b/webapp/graphql/Fragments.js @@ -62,6 +62,18 @@ export const postFragment = gql` } ` +export const groupFragment = gql` + fragment group on Group { + id + groupName: name + slug + disabled + deleted + about + groupType + } +` + export const postCountsFragment = gql` fragment postCounts on Post { commentsCount diff --git a/webapp/graphql/Search.js b/webapp/graphql/Search.js index 56f5d7c4c..71dd18c07 100644 --- a/webapp/graphql/Search.js +++ b/webapp/graphql/Search.js @@ -1,9 +1,15 @@ import gql from 'graphql-tag' -import { userFragment, postFragment, tagsCategoriesAndPinnedFragment } from './Fragments' +import { + userFragment, + postFragment, + groupFragment, + tagsCategoriesAndPinnedFragment, +} from './Fragments' export const searchQuery = gql` ${userFragment} ${postFragment} + ${groupFragment} query ($query: String!) { searchResults(query: $query, limit: 5) { @@ -24,6 +30,9 @@ export const searchQuery = gql` ... on Tag { id } + ... on Group { + ...group + } } } ` From 522cd8ef9e354e45c6e15b3577ae43967a153b64 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 21 Oct 2022 17:52:33 +0200 Subject: [PATCH 05/19] search for groups --- .../generic/SearchGroup/SearchGroup.vue | 37 +++++++++++++++++++ .../SearchableInput/SearchableInput.vue | 23 ++++++++++-- 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 webapp/components/generic/SearchGroup/SearchGroup.vue diff --git a/webapp/components/generic/SearchGroup/SearchGroup.vue b/webapp/components/generic/SearchGroup/SearchGroup.vue new file mode 100644 index 000000000..8dc3d2c13 --- /dev/null +++ b/webapp/components/generic/SearchGroup/SearchGroup.vue @@ -0,0 +1,37 @@ + + + + diff --git a/webapp/components/generic/SearchableInput/SearchableInput.vue b/webapp/components/generic/SearchableInput/SearchableInput.vue index afafa716c..2149732c5 100644 --- a/webapp/components/generic/SearchableInput/SearchableInput.vue +++ b/webapp/components/generic/SearchableInput/SearchableInput.vue @@ -35,6 +35,12 @@ >

+

+ +

{ if (!this.isTag(item)) { this.$router.push({ - name: this.isPost(item) ? 'post-id-slug' : 'profile-id-slug', + name: this.getRouteName(item), params: { id: item.id, slug: item.slug }, }) } else { From 61c2250c03452b3c54771accbf60feb219ba2839 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 21 Oct 2022 17:54:25 +0200 Subject: [PATCH 06/19] respect & symbol in searches --- backend/src/schema/resolvers/searches.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/schema/resolvers/searches.js b/backend/src/schema/resolvers/searches.js index 21363365f..c0354731b 100644 --- a/backend/src/schema/resolvers/searches.js +++ b/backend/src/schema/resolvers/searches.js @@ -223,8 +223,8 @@ export default { let userId = null if (context.user) userId = context.user.id - const searchType = query.replace(/^([!@#]?).*$/, '$1') - const searchString = query.replace(/^([!@#])/, '') + const searchType = query.replace(/^([!@#&]?).*$/, '$1') + const searchString = query.replace(/^([!@#&])/, '') const params = { query: queryString(searchString), From 2b8b50af48de391acf3b273bdfa5d5aec0d64a24 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 21 Oct 2022 17:59:11 +0200 Subject: [PATCH 07/19] add group hint to search hint --- webapp/locales/de.json | 2 +- webapp/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/locales/de.json b/webapp/locales/de.json index 837cfc75c..036aed766 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -749,7 +749,7 @@ "Tag": "Hashtag ::: Hashtags", "User": "Benutzer ::: Benutzer" }, - "hint": "Wonach suchst Du? Nutze !… für Beiträge, @… für Mitglieder, #… für Hashtags", + "hint": "Wonach suchst Du? Nutze !… für Beiträge, @… für Mitglieder, &… für Gruppen, #… für Hashtags", "no-results": "Keine Ergebnisse für \"{search}\" gefunden. Versuch' es mit einem anderen Begriff!", "page": "Seite", "placeholder": "Suchen", diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 3b18e1a45..91acdb8f6 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -749,7 +749,7 @@ "Tag": "Hashtag ::: Hashtags", "User": "User ::: Users" }, - "hint": "What are you searching for? Use !… for posts, @… for users, #… for hashtags.", + "hint": "What are you searching for? Use !… for posts, @… for users, &… for groups, #… for hashtags.", "no-results": "No results found for \"{search}\". Try a different search term!", "page": "Page", "placeholder": "Search", From 57bbe4c6e81360471c92ea3a85a8c81fc1f2fcb4 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 21 Oct 2022 18:34:48 +0200 Subject: [PATCH 08/19] allow search groups in permission middleware, add user id to search groups query --- backend/src/middleware/permissionsMiddleware.js | 1 + backend/src/schema/resolvers/searches.js | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index d77363c29..3d698810e 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -302,6 +302,7 @@ export default shield( searchResults: allow, searchPosts: allow, searchUsers: allow, + searchGroups: allow, searchHashtags: allow, embed: allow, Category: allow, diff --git a/backend/src/schema/resolvers/searches.js b/backend/src/schema/resolvers/searches.js index c0354731b..c72be11be 100644 --- a/backend/src/schema/resolvers/searches.js +++ b/backend/src/schema/resolvers/searches.js @@ -201,6 +201,8 @@ export default { }, searchGroups: async (_parent, args, context, _resolveInfo) => { const { query, groupsOffset, firstGroups } = args + let userId = null + if (context.user) userId = context.user.id return { groupCount: getSearchResults( context, @@ -208,6 +210,7 @@ export default { { query: queryString(query), skip: 0, + userId, }, countResultCallback, ), @@ -215,6 +218,7 @@ export default { query: queryString(query), skip: groupsOffset, limit: firstGroups, + userId, }), } }, From d1b05b7e02ac2e5d7d60abfdbee90790f6913111 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 21 Oct 2022 18:35:21 +0200 Subject: [PATCH 09/19] add groups to search result page --- .../features/SearchResults/SearchResults.vue | 73 ++++++++++++++++++- webapp/graphql/Search.js | 14 ++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/webapp/components/_new/features/SearchResults/SearchResults.vue b/webapp/components/_new/features/SearchResults/SearchResults.vue index f3730f61d..dadbd5aac 100644 --- a/webapp/components/_new/features/SearchResults/SearchResults.vue +++ b/webapp/components/_new/features/SearchResults/SearchResults.vue @@ -59,6 +59,14 @@ + +