diff --git a/src/apolloClient.ts b/src/apolloClient.ts index 1789d696d..8e2824139 100644 --- a/src/apolloClient.ts +++ b/src/apolloClient.ts @@ -80,7 +80,11 @@ const apolloServer = new ApolloServer({ scopeBrandIds = brandIds; } - if (!user.isOwner) { + if (!user.isOwner && scopeBrandIds.length) { + // Select non-existent or empty arrays too + scopeBrandIds.push(null); + scopeBrandIds.push([]); + brandIdSelector = { _id: { $in: scopeBrandIds } }; commonQuerySelector = { scopeBrandIds: { $in: scopeBrandIds } }; commonQuerySelectorElk = { terms: { scopeBrandIds } }; diff --git a/src/data/resolvers/mutations/conversations.ts b/src/data/resolvers/mutations/conversations.ts index 2efafc0d5..c43442872 100644 --- a/src/data/resolvers/mutations/conversations.ts +++ b/src/data/resolvers/mutations/conversations.ts @@ -1,6 +1,6 @@ import * as strip from 'strip'; import * as _ from 'underscore'; -import { ConversationMessages, Conversations, Customers, Integrations } from '../../../db/models'; +import { ConversationMessages, Conversations, Customers, Integrations, Users } from '../../../db/models'; import Messages from '../../../db/models/ConversationMessages'; import { CONVERSATION_STATUSES, @@ -320,6 +320,21 @@ const conversationMutations = { await sendNotifications({ user, conversations, type: NOTIFICATION_TYPES.CONVERSATION_ASSIGNEE_CHANGE }); + // Add bot message and update conversation + let assignedUser = await Users.getUser(assignedUserId); + + for (const conversation of conversations) { + let message = await ConversationMessages.addMessage({ + conversationId: conversation._id, + content: `${assignedUser.details?.shortName || assignedUser.email} has been assigned to this conversation`, + fromBot: true, + }); + + graphqlPubsub.publish('conversationClientMessageInserted', { + conversationClientMessageInserted: message, + }); + } + return conversations; }, @@ -339,6 +354,23 @@ const conversationMutations = { // notify graphl subscription publishConversationsChanged(_ids, 'assigneeChanged'); + // Add bot message and update conversation + for (const conversation of oldConversations) { + if (!conversation.assignedUserId) continue; + + let unAssignedUser = await Users.getUser(conversation.assignedUserId); + let message = await ConversationMessages.addMessage({ + conversationId: conversation._id, + content: `${unAssignedUser.details?.shortName || + unAssignedUser.email} has been deassigned from this conversation`, + fromBot: true, + }); + + graphqlPubsub.publish('conversationClientMessageInserted', { + conversationClientMessageInserted: message, + }); + } + return updatedConversations; }, diff --git a/src/data/resolvers/queries/conversationQueryBuilder.ts b/src/data/resolvers/queries/conversationQueryBuilder.ts index 0275673f4..b1872e44b 100644 --- a/src/data/resolvers/queries/conversationQueryBuilder.ts +++ b/src/data/resolvers/queries/conversationQueryBuilder.ts @@ -3,6 +3,8 @@ import { Channels, Integrations } from '../../../db/models'; import { CONVERSATION_STATUSES } from '../../../db/models/definitions/constants'; import { fixDate } from '../../utils'; +const { USE_CHAT_RESTRICTIONS } = process.env; + interface IIn { $in: string[]; } @@ -29,6 +31,7 @@ export interface IListArgs { interface IUserArgs { _id: string; + isOwner?: boolean; starredConversationIds?: string[]; } @@ -69,6 +72,12 @@ export default class Builder { statusFilter = this.statusFilter([CONVERSATION_STATUSES.CLOSED]); } + let assignedUserQuery: any = {}; + + if (USE_CHAT_RESTRICTIONS === 'true' && !this.user.isOwner) { + assignedUserQuery.assignedUserId = { $in: [this.user._id, null] }; + } + return { ...statusFilter, // exclude engage messages if customer did not reply @@ -76,9 +85,11 @@ export default class Builder { { userId: { $exists: true }, messageCount: { $gt: 1 }, + ...assignedUserQuery, }, { userId: { $exists: false }, + ...assignedUserQuery, }, ], }; diff --git a/src/data/resolvers/queries/conversations.ts b/src/data/resolvers/queries/conversations.ts index 691c5d2af..8e28ff21a 100644 --- a/src/data/resolvers/queries/conversations.ts +++ b/src/data/resolvers/queries/conversations.ts @@ -93,6 +93,7 @@ const conversationQueries = { // initiate query builder const qb = new QueryBuilder(params, { _id: user._id, + isOwner: user.isOwner, starredConversationIds: user.starredConversationIds, });