From 16aabf27bd8d89dbd52e9e124e2c7b5355a4f3bf Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:02:04 -0300 Subject: [PATCH] refactor: Use updater for saveCustomFields function (#35131) --- .../lib/server/functions/saveCustomFields.ts | 8 +- .../saveCustomFieldsWithoutValidation.ts | 77 +++++++++++-------- 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/apps/meteor/app/lib/server/functions/saveCustomFields.ts b/apps/meteor/app/lib/server/functions/saveCustomFields.ts index a67304d5c5a..8d171aea9ee 100644 --- a/apps/meteor/app/lib/server/functions/saveCustomFields.ts +++ b/apps/meteor/app/lib/server/functions/saveCustomFields.ts @@ -4,8 +4,10 @@ import { trim } from '../../../../lib/utils/stringUtils'; import { settings } from '../../../settings/server'; export const saveCustomFields = async function (userId: string, formData: Record): Promise { - if (trim(settings.get('Accounts_CustomFields')) !== '') { - validateCustomFields(formData); - return saveCustomFieldsWithoutValidation(userId, formData); + if (trim(settings.get('Accounts_CustomFields')).length === 0) { + return; } + + validateCustomFields(formData); + return saveCustomFieldsWithoutValidation(userId, formData); }; diff --git a/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.ts b/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.ts index 5383048f13b..5a4f3a6096a 100644 --- a/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.ts +++ b/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.ts @@ -1,49 +1,58 @@ -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'; +const getCustomFieldsMeta = function (customFieldsMeta: string) { + try { + return JSON.parse(customFieldsMeta); + } catch (e) { + throw new Meteor.Error('error-invalid-customfield-json', 'Invalid JSON for Custom Fields'); + } +}; export const saveCustomFieldsWithoutValidation = async function (userId: string, formData: Record): Promise { - 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 customFieldsSetting = settings.get('Accounts_CustomFields'); + if (!customFieldsSetting || trim(customFieldsSetting).length === 0) { + return; + } + + // configured custom fields in setting + const customFieldsMeta = getCustomFieldsMeta(customFieldsSetting); - const customFields: Record = {}; - Object.keys(customFieldsMeta).forEach((key) => { - customFields[key] = formData[key]; - }); - await Users.setCustomFields(userId, customFields); + const customFields: Record = Object.keys(customFieldsMeta).reduce( + (acc, currentValue) => ({ + ...acc, + [currentValue]: formData[currentValue], + }), + {}, + ); - // Update customFields of all Direct Messages' Rooms for userId - const setCustomFieldsResponse = await Subscriptions.setCustomFieldsDirectMessagesByUserId(userId, customFields); - if (setCustomFieldsResponse.modifiedCount) { - void notifyOnSubscriptionChangedByUserIdAndRoomType(userId, 'd'); + const updater = Users.getUpdater(); + + updater.set('customFields', customFields); + + // add modified records to updater + Object.keys(customFields).forEach((fieldName) => { + if (!customFieldsMeta[fieldName].modifyRecordField) { + return; } - for await (const fieldName of Object.keys(customFields)) { - if (!customFieldsMeta[fieldName].modifyRecordField) { - return; - } - - const { modifyRecordField } = customFieldsMeta[fieldName]; - const update: DeepWritable> = {}; - 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); + const { modifyRecordField } = customFieldsMeta[fieldName]; + + if (modifyRecordField.array) { + updater.addToSet(modifyRecordField.field, customFields[fieldName]); + } else { + updater.set(modifyRecordField.field, customFields[fieldName]); } + }); + + await Users.updateFromUpdater({ _id: userId }, updater); + + // Update customFields of all Direct Messages' Rooms for userId + const setCustomFieldsResponse = await Subscriptions.setCustomFieldsDirectMessagesByUserId(userId, customFields); + if (setCustomFieldsResponse.modifiedCount) { + void notifyOnSubscriptionChangedByUserIdAndRoomType(userId, 'd'); } };