RocketChat/Rocket.Chat

View on GitHub
apps/meteor/ee/app/livechat-enterprise/server/hooks/applySimultaneousChatsRestrictions.ts

Summary

Maintainability
A
0 mins
Test Coverage
import type { ILivechatDepartment } from '@rocket.chat/core-typings';
import { LivechatDepartment } from '@rocket.chat/models';

import { settings } from '../../../../../app/settings/server';
import { callbacks } from '../../../../../lib/callbacks';

callbacks.add(
    'livechat.applySimultaneousChatRestrictions',
    async (_: any, { departmentId }: { departmentId?: string } = {}) => {
        if (departmentId) {
            const departmentLimit =
                (
                    await LivechatDepartment.findOneById<Pick<ILivechatDepartment, 'maxNumberSimultaneousChat'>>(departmentId, {
                        projection: { maxNumberSimultaneousChat: 1 },
                    })
                )?.maxNumberSimultaneousChat || 0;
            if (departmentLimit > 0) {
                return { $match: { 'queueInfo.chats': { $gte: Number(departmentLimit) } } };
            }
        }

        const maxChatsPerSetting = settings.get('Livechat_maximum_chats_per_agent') as number;
        const agentFilter = {
            $and: [
                { 'livechat.maxNumberSimultaneousChat': { $gt: 0 } },
                { $expr: { $gte: ['queueInfo.chats', 'livechat.maxNumberSimultaneousChat'] } },
            ],
        };
        // apply filter only if agent setting is 0 or is disabled
        const globalFilter =
            maxChatsPerSetting > 0
                ? {
                        $and: [
                            {
                                $or: [
                                    {
                                        'livechat.maxNumberSimultaneousChat': { $exists: false },
                                    },
                                    { 'livechat.maxNumberSimultaneousChat': 0 },
                                    { 'livechat.maxNumberSimultaneousChat': '' },
                                    { 'livechat.maxNumberSimultaneousChat': null },
                                ],
                            },
                            { 'queueInfo.chats': { $gte: maxChatsPerSetting } },
                        ],
                  }
                : // dummy filter meaning: don't match anything
                  { _id: '' };

        return { $match: { $or: [agentFilter, globalFilter] } };
    },
    callbacks.priority.HIGH,
    'livechat-apply-simultaneous-restrictions',
);