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 @@
+
+
+ {{ option.groupName | truncate(70) }}
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
@@ -100,13 +108,14 @@
@@ -365,6 +428,10 @@ export default {
opacity: 0.8;
}
}
+
+ .group-teaser-card-wrapper {
+ padding: 0;
+ }
}
.grid-total-search-results {
diff --git a/webapp/graphql/Search.js b/webapp/graphql/Search.js
index 71dd18c07..d2131ddc0 100644
--- a/webapp/graphql/Search.js
+++ b/webapp/graphql/Search.js
@@ -61,6 +61,20 @@ export const searchPosts = gql`
}
`
+export const searchGroups = gql`
+ ${groupFragment}
+
+ query ($query: String!, $firstGroups: Int, $groupsOffset: Int) {
+ searchGroups(query: $query, firstGroups: $firstGroups, groupsOffset: $groupsOffset) {
+ groupCount
+ groups {
+ __typename
+ ...group
+ }
+ }
+ }
+`
+
export const searchUsers = gql`
${userFragment}
From c2617af23f0d0bfc9ed1381f45903de655828b89 Mon Sep 17 00:00:00 2001
From: Moriz Wahl
Date: Sat, 22 Oct 2022 15:28:01 +0200
Subject: [PATCH 10/19] add db:migrate up to CI
---
.github/workflows/test.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index de171cc61..cc4d2deb9 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -202,6 +202,8 @@ jobs:
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps neo4j backend
- name: backend | Initialize Database
run: docker-compose exec -T backend yarn db:migrate init
+ - name: backend | Migrate Database Up
+ run: docker-compose exec -T backend yarn db:migrate up
- name: backend | Unit test
run: docker-compose exec -T backend yarn test
##########################################################################
From 6f4bde93f62d2c42e4e90e71fb2d47a056b0827d Mon Sep 17 00:00:00 2001
From: Moriz Wahl
Date: Sun, 23 Oct 2022 00:52:48 +0200
Subject: [PATCH 11/19] Update backend/src/schema/resolvers/searches.js
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Wolfgang Huß
---
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 c72be11be..466fae08f 100644
--- a/backend/src/schema/resolvers/searches.js
+++ b/backend/src/schema/resolvers/searches.js
@@ -76,8 +76,8 @@ const searchGroupsSetup = {
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] }',
+ withClause: 'WITH resource, membership',
+ returnClause: 'resource { .*, myRole: membership.role, __typename: labels(resource)[0] }',
limit: 'LIMIT $limit',
}
From 19aa01f83f6e24b2648617dd927abe4dfb52edcd Mon Sep 17 00:00:00 2001
From: Moriz Wahl
Date: Sun, 23 Oct 2022 00:53:22 +0200
Subject: [PATCH 12/19] Update
webapp/components/generic/SearchGroup/SearchGroup.vue
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Wolfgang Huß
---
webapp/components/generic/SearchGroup/SearchGroup.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/webapp/components/generic/SearchGroup/SearchGroup.vue b/webapp/components/generic/SearchGroup/SearchGroup.vue
index 8dc3d2c13..b5903615e 100644
--- a/webapp/components/generic/SearchGroup/SearchGroup.vue
+++ b/webapp/components/generic/SearchGroup/SearchGroup.vue
@@ -1,5 +1,5 @@
-
+
{{ option.groupName | truncate(70) }}
From 7102de6e521e092c94c17094246dfc23af4cab80 Mon Sep 17 00:00:00 2001
From: Moriz Wahl
Date: Sun, 23 Oct 2022 00:53:41 +0200
Subject: [PATCH 13/19] Update
webapp/components/generic/SearchGroup/SearchGroup.vue
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Wolfgang Huß
---
webapp/components/generic/SearchGroup/SearchGroup.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/webapp/components/generic/SearchGroup/SearchGroup.vue b/webapp/components/generic/SearchGroup/SearchGroup.vue
index b5903615e..3bac21f7b 100644
--- a/webapp/components/generic/SearchGroup/SearchGroup.vue
+++ b/webapp/components/generic/SearchGroup/SearchGroup.vue
@@ -14,7 +14,7 @@ export default {
}