RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/livechat/server/api/v1/integration.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import { Settings } from '@rocket.chat/models';
import { isPOSTomnichannelIntegrations } from '@rocket.chat/rest-typings';

import { trim } from '../../../../../lib/utils/stringUtils';
import { API } from '../../../../api/server';
import { notifyOnSettingChangedById } from '../../../../lib/server/lib/notifyListener';

API.v1.addRoute(
    'omnichannel/integrations',
    { authRequired: true, permissionsRequired: ['view-livechat-manager'], validateParams: { POST: isPOSTomnichannelIntegrations } },
    {
        async post() {
            const {
                LivechatWebhookUrl,
                LivechatSecretToken,
                LivechatHttpTimeout,
                LivechatWebhookOnStart,
                LivechatWebhookOnClose,
                LivechatWebhookOnChatTaken,
                LivechatWebhookOnChatQueued,
                LivechatWebhookOnForward,
                LivechatWebhookOnOfflineMsg,
                LivechatWebhookOnVisitorMessage,
                LivechatWebhookOnAgentMessage,
            } = this.bodyParams;

            const settingsIds = [
                typeof LivechatWebhookUrl !== 'undefined' && { _id: 'Livechat_webhookUrl', value: trim(LivechatWebhookUrl) },
                typeof LivechatSecretToken !== 'undefined' && { _id: 'Livechat_secret_token', value: trim(LivechatSecretToken) },
                typeof LivechatHttpTimeout !== 'undefined' && { _id: 'Livechat_http_timeout', value: LivechatHttpTimeout },
                typeof LivechatWebhookOnStart !== 'undefined' && { _id: 'Livechat_webhook_on_start', value: !!LivechatWebhookOnStart },
                typeof LivechatWebhookOnClose !== 'undefined' && { _id: 'Livechat_webhook_on_close', value: !!LivechatWebhookOnClose },
                typeof LivechatWebhookOnChatTaken !== 'undefined' && { _id: 'Livechat_webhook_on_chat_taken', value: !!LivechatWebhookOnChatTaken },
                typeof LivechatWebhookOnChatQueued !== 'undefined' && {
                    _id: 'Livechat_webhook_on_chat_queued',
                    value: !!LivechatWebhookOnChatQueued,
                },
                typeof LivechatWebhookOnForward !== 'undefined' && { _id: 'Livechat_webhook_on_forward', value: !!LivechatWebhookOnForward },
                typeof LivechatWebhookOnOfflineMsg !== 'undefined' && {
                    _id: 'Livechat_webhook_on_offline_msg',
                    value: !!LivechatWebhookOnOfflineMsg,
                },
                typeof LivechatWebhookOnVisitorMessage !== 'undefined' && {
                    _id: 'Livechat_webhook_on_visitor_message',
                    value: !!LivechatWebhookOnVisitorMessage,
                },
                typeof LivechatWebhookOnAgentMessage !== 'undefined' && {
                    _id: 'Livechat_webhook_on_agent_message',
                    value: !!LivechatWebhookOnAgentMessage,
                },
            ].filter(Boolean) as unknown as { _id: string; value: any }[];

            const promises = settingsIds.map((setting) => Settings.updateValueById(setting._id, setting.value));

            (await Promise.all(promises)).forEach((value, index) => {
                if (value?.modifiedCount) {
                    void notifyOnSettingChangedById(settingsIds[index]._id);
                }
            });

            return API.v1.success();
        },
    },
);