-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Expand file tree
/
Copy pathsaveCustomFieldsWithoutValidation.ts
More file actions
72 lines (60 loc) · 2.25 KB
/
saveCustomFieldsWithoutValidation.ts
File metadata and controls
72 lines (60 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import type { IUser } from '@rocket.chat/core-typings';
import type { Updater } from '@rocket.chat/models';
import { Subscriptions, Users } from '@rocket.chat/models';
import { Meteor } from 'meteor/meteor';
import type { ClientSession } 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>,
options?: {
_updater?: Updater<IUser>;
session?: ClientSession;
},
): Promise<void> {
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).reduce(
(acc, currentValue) => ({
...acc,
[currentValue]: formData[currentValue],
}),
{},
);
const { _updater, session } = options || {};
const updater = _updater || Users.getUpdater();
updater.set('customFields', customFields);
// add modified records to updater
Object.keys(customFields).forEach((fieldName) => {
if (!customFieldsMeta[fieldName].modifyRecordField) {
return;
}
const { modifyRecordField } = customFieldsMeta[fieldName];
if (modifyRecordField.array) {
updater.addToSet(modifyRecordField.field, customFields[fieldName]);
} else {
updater.set(modifyRecordField.field, customFields[fieldName]);
}
});
if (!_updater) {
await Users.updateFromUpdater({ _id: userId }, updater, { session });
}
// Update customFields of all Direct Messages' Rooms for userId
const setCustomFieldsResponse = await Subscriptions.setCustomFieldsDirectMessagesByUserId(userId, customFields, { session });
if (setCustomFieldsResponse.modifiedCount) {
void notifyOnSubscriptionChangedByUserIdAndRoomType(userId, 'd');
}
};