import type { AtLeast, ILivechatCustomField } from '@rocket.chat/core-typings'; import { i18n } from '../../../../app/utils/lib/i18n'; import { trim } from '../../../../lib/utils/stringUtils'; export function validateCustomFields( allowedCustomFields: AtLeast[], customFields: Record, { ignoreAdditionalFields = false, ignoreValidationErrors = false, }: { ignoreAdditionalFields?: boolean; ignoreValidationErrors?: boolean } = {}, ): Record { const validValues: Record = {}; for (const cf of allowedCustomFields) { if (!customFields.hasOwnProperty(cf._id)) { if (cf.required && !ignoreValidationErrors) { throw new Error(i18n.t('error-invalid-custom-field-value', { field: cf.label || cf._id })); } continue; } const cfValue: string = trim(customFields[cf._id]); if (!cfValue || typeof cfValue !== 'string') { if (cf.required && !ignoreValidationErrors) { throw new Error(i18n.t('error-invalid-custom-field-value', { field: cf.label || cf._id })); } continue; } if (cf.regexp) { const regex = new RegExp(cf.regexp); if (!regex.test(cfValue)) { if (ignoreValidationErrors) { continue; } throw new Error(i18n.t('error-invalid-custom-field-value', { field: cf.label || cf._id })); } } validValues[cf._id] = cfValue; } if (!ignoreAdditionalFields) { const allowedCustomFieldIds = new Set(allowedCustomFields.map((cf) => cf._id)); for (const key in customFields) { if (!allowedCustomFieldIds.has(key)) { throw new Error(i18n.t('error-custom-field-not-allowed', { key })); } } } return validValues; }