RocketChat/Rocket.Chat

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

Summary

Maintainability
A
0 mins
Test Coverage
import { isLivechatCustomFieldsProps, isPOSTLivechatCustomFieldParams, isPOSTLivechatCustomFieldsParams } from '@rocket.chat/rest-typings';

import { API } from '../../../../api/server';
import { getPaginationItems } from '../../../../api/server/helpers/getPaginationItems';
import { Livechat } from '../../lib/LivechatTyped';
import { findLivechatCustomFields, findCustomFieldById } from '../lib/customFields';
import { findGuest } from '../lib/livechat';

API.v1.addRoute(
    'livechat/custom.field',
    { validateParams: isPOSTLivechatCustomFieldParams },
    {
        async post() {
            const { token, key, value, overwrite } = this.bodyParams;

            const guest = await findGuest(token);
            if (!guest) {
                throw new Error('invalid-token');
            }

            if (!(await Livechat.setCustomFields({ token, key, value, overwrite }))) {
                return API.v1.failure();
            }

            return API.v1.success({ field: { key, value, overwrite } });
        },
    },
);

API.v1.addRoute(
    'livechat/custom.fields',
    { validateParams: isPOSTLivechatCustomFieldsParams },
    {
        async post() {
            const { token } = this.bodyParams;
            const guest = await findGuest(token);
            if (!guest) {
                throw new Error('invalid-token');
            }

            const fields = await Promise.all(
                this.bodyParams.customFields.map(
                    async (customField: {
                        key: string;
                        value: string;
                        overwrite: boolean;
                    }): Promise<{ Key: string; value: string; overwrite: boolean }> => {
                        const data = Object.assign({ token }, customField);
                        if (!(await Livechat.setCustomFields(data))) {
                            throw new Error('error-setting-custom-field');
                        }

                        return { Key: customField.key, value: customField.value, overwrite: customField.overwrite };
                    },
                ),
            );

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

API.v1.addRoute(
    'livechat/custom-fields',
    { authRequired: true, permissionsRequired: ['view-l-room'], validateParams: isLivechatCustomFieldsProps },
    {
        async get() {
            const { offset, count } = await getPaginationItems(this.queryParams);
            const { sort } = await this.parseJsonQuery();
            const { text } = this.queryParams;

            const customFields = await findLivechatCustomFields({
                text,
                pagination: {
                    offset,
                    count,
                    sort,
                },
            });

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

API.v1.addRoute(
    'livechat/custom-fields/:_id',
    { authRequired: true, permissionsRequired: ['view-l-room'] },
    {
        async get() {
            const { customField } = await findCustomFieldById({ customFieldId: this.urlParams._id });

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