diff --git a/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.js index 63069e393..a24ae54ef 100644 --- a/backend/src/schema/resolvers/posts.js +++ b/backend/src/schema/resolvers/posts.js @@ -2,10 +2,9 @@ import uuid from 'uuid/v4' import { neo4jgraphql } from 'neo4j-graphql-js' import fileUpload from './fileUpload' import { getBlockedUsers, getBlockedByUsers } from './users.js' -import { mergeWith, isArray } from 'lodash' +import { mergeWith, isArray, isEmpty } from 'lodash' import { UserInputError } from 'apollo-server' import Resolver from './helpers/Resolver' - const filterForBlockedUsers = async (params, context) => { if (!context.user) return params const [blockedUsers, blockedByUsers] = await Promise.all([ @@ -29,10 +28,26 @@ const filterForBlockedUsers = async (params, context) => { return params } +const maintainPinnedPosts = params => { + const pinnedPostFilter = { pinnedBy_in: { role_in: ['admin'] } } + if (isEmpty(params.filter)) { + params.filter = { OR: [pinnedPostFilter, {}] } + } else { + const filteredPostsArray = [] + Object.keys(params.filter).forEach(key => { + filteredPostsArray.push({ [key]: params.filter[key] }) + }) + filteredPostsArray.push(pinnedPostFilter) + params.filter = { OR: filteredPostsArray } + } + return params +} + export default { Query: { Post: async (object, params, context, resolveInfo) => { params = await filterForBlockedUsers(params, context) + params = await maintainPinnedPosts(params) return neo4jgraphql(object, params, context, resolveInfo, false) }, findPosts: async (object, params, context, resolveInfo) => { diff --git a/webapp/store/postsFilter.js b/webapp/store/postsFilter.js index 7a499b66f..964b265c0 100644 --- a/webapp/store/postsFilter.js +++ b/webapp/store/postsFilter.js @@ -10,31 +10,23 @@ const defaultFilter = {} export const state = () => { return { filter: { - OR: [{ pinnedBy_in: { role_in: ['admin'] } }, {}], + ...defaultFilter, }, } } export const mutations = { TOGGLE_FILTER_BY_FOLLOWED(state, currentUserId) { - let filter = clone(state.filter) - const id = filter.OR.find(object => object.author) + const filter = clone(state.filter) + const id = get(filter, 'author.followedBy_some.id') if (id) { - filter.OR.forEach(object => delete object.author) + delete filter.author state.filter = filter } else { - if (isEmpty(filter.OR[-1])) filter.OR.pop() - filter.OR.map(object => { - for (let key in object) { - if (object.hasOwnProperty(key)) { - object = { key: object[key] } - } - } - }) - filter.OR.unshift({ + state.filter = { + ...filter, author: { followedBy_some: { id: currentUserId } }, - }) - state.filter = filter + } } }, RESET_CATEGORIES(state) { @@ -43,20 +35,9 @@ export const mutations = { state.filter = filter }, TOGGLE_CATEGORY(state, categoryId) { - let filter = clone(state.filter) - if (isEmpty(filter.OR[-1])) filter.OR.pop() - filter.OR.map(object => { - for (let key in object) { - if (object.hasOwnProperty(key)) { - object = { key: object[key] } - } - } - }) - filter.OR.unshift({ - categories_some: { id_in: [categoryId] }, - }) - // update(filter, 'categories_some.id_in', categoryIds => xor(categoryIds, [categoryId])) - // if (isEmpty(get(filter.OR[0], 'categories_some.id_in'))) delete filter.OR[0].categories_some + const filter = clone(state.filter) + update(filter, 'categories_some.id_in', categoryIds => xor(categoryIds, [categoryId])) + if (isEmpty(get(filter, 'categories_some.id_in'))) delete filter.categories_some state.filter = filter }, TOGGLE_EMOTION(state, emotion) {