RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.ts

Summary

Maintainability
A
3 hrs
Test Coverage
import type { IUser, DeepWritable } from '@rocket.chat/core-typings';
import { Subscriptions, Users } from '@rocket.chat/models';
import { Meteor } from 'meteor/meteor';
import type { UpdateFilter } from 'mongodb';

import { trim } from '../../../../lib/utils/stringUtils';
import { settings } from '../../../settings/server';
import { notifyOnSubscriptionChangedByUserIdAndRoomType } from '../lib/notifyListener';

export const saveCustomFieldsWithoutValidation = async function (userId: string, formData: Record<string, any>): Promise<void> {
    if (trim(settings.get('Accounts_CustomFields')) !== '') {
        let customFieldsMeta;
        try {
            customFieldsMeta = JSON.parse(settings.get('Accounts_CustomFields'));
        } catch (e) {
            throw new Meteor.Error('error-invalid-customfield-json', 'Invalid JSON for Custom Fields');
        }

        const customFields: Record<string, any> = {};
        Object.keys(customFieldsMeta).forEach((key) => {
            customFields[key] = formData[key];
        });
        await Users.setCustomFields(userId, customFields);

        // Update customFields of all Direct Messages' Rooms for userId
        const setCustomFieldsResponse = await Subscriptions.setCustomFieldsDirectMessagesByUserId(userId, customFields);
        if (setCustomFieldsResponse.modifiedCount) {
            void notifyOnSubscriptionChangedByUserIdAndRoomType(userId, 'd');
        }

        for await (const fieldName of Object.keys(customFields)) {
            if (!customFieldsMeta[fieldName].modifyRecordField) {
                return;
            }

            const { modifyRecordField } = customFieldsMeta[fieldName];
            const update: DeepWritable<UpdateFilter<IUser>> = {};
            if (modifyRecordField.array) {
                update.$addToSet = {};
                update.$addToSet[modifyRecordField.field] = customFields[fieldName];
            } else {
                update.$set = {};
                update.$set[modifyRecordField.field] = customFields[fieldName];
            }

            await Users.updateOne({ _id: userId }, update);
        }
    }
};