refactor: Use updater for saveCustomFields function (#35131)

pull/34274/head^2
gabriellsh 11 months ago committed by GitHub
parent b048969a7b
commit 16aabf27bd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 8
      apps/meteor/app/lib/server/functions/saveCustomFields.ts
  2. 77
      apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.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<string, any>): Promise<void> {
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);
};

@ -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<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 customFieldsSetting = settings.get<string>('Accounts_CustomFields');
if (!customFieldsSetting || trim(customFieldsSetting).length === 0) {
return;
}
// configured custom fields in setting
const customFieldsMeta = getCustomFieldsMeta(customFieldsSetting);
const customFields: Record<string, any> = {};
Object.keys(customFieldsMeta).forEach((key) => {
customFields[key] = formData[key];
});
await Users.setCustomFields(userId, customFields);
const customFields: Record<string, any> = 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<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);
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');
}
};

Loading…
Cancel
Save