refactor: Use updater for saveCustomFields function (#35131)
parent
b048969a7b
commit
16aabf27bd
@ -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…
Reference in new issue