function collectChangedFields()

in packages/webhook-triggers-app/src/workflows/workflow-field-changes.js [153:212]


function collectChangedFields(issue) {
    const changedFields = [];

    // Check built-in properties (summary, description) first
    const builtInProperties = ['summary', 'description'];
    for (let i = 0; i < builtInProperties.length; i++) {
        const propName = builtInProperties[i];
        const change = checkBuiltInPropertyChange(issue, propName);
        if (change) {
            changedFields.push(change);
        }
    }

    // Check custom fields
    if (!issue.fields) {
        return changedFields;
    }

    // Get all field names, filtering out methods
    const allKeys = Object.keys(issue.fields);
    const fieldNames = allKeys.filter(function (key) {
        const value = issue.fields[key];
        return typeof value !== 'function';
    });

    // Check each field for changes using YouTrack API
    for (let i = 0; i < fieldNames.length; i++) {
        const fieldName = fieldNames[i];
        const currentValue = issue.fields[fieldName];

        try {
            // YouTrack API: issue.fields.isChanged(fieldName) where fieldName is a STRING
            let fieldWasChanged = false;

            if (typeof issue.fields.isChanged === 'function') {
                fieldWasChanged = issue.fields.isChanged(fieldName);
            }

            if (!fieldWasChanged) {
                continue;
            }

            // Get old value using YouTrack API (returns null if the field was previously empty)
            const oldValue = issue.fields.oldValue(fieldName);

            const oldValueSerialized = serializeFieldValue(oldValue);
            const currentValueSerialized = serializeFieldValue(currentValue);

            changedFields.push({
                name: fieldName,
                oldValue: oldValueSerialized,
                value: currentValueSerialized
            });
        } catch {
            // Silently skip fields that don't support change tracking
        }
    }

    return changedFields;
}