UNPKG

mixpanel

Version:

A simple server-side API for mixpanel

248 lines (204 loc) 7.31 kB
/** * Mixin with profile-related helpers (for people and groups) */ const util = require('util'); const {ensure_timestamp} = require('./utils'); function merge_modifiers(data, modifiers) { if (modifiers) { if (modifiers.$ignore_alias) { data.$ignore_alias = modifiers.$ignore_alias; } if (modifiers.$ignore_time) { data.$ignore_time = modifiers.$ignore_time; } if (modifiers.hasOwnProperty("$ip")) { data.$ip = modifiers.$ip; } if (modifiers.hasOwnProperty("$time")) { data.$time = ensure_timestamp(modifiers.$time); } if (modifiers.hasOwnProperty("$latitude") && modifiers.hasOwnProperty('$longitude')) { data.$latitude = modifiers.$latitude; data.$longitude = modifiers.$longitude; } } return data; }; exports.merge_modifiers = merge_modifiers; exports.ProfileHelpers = (Base = Object) => class extends Base { get token() { return this.mixpanel.token; } get config() { return this.mixpanel.config; } _set(prop, to, modifiers, callback, {identifiers, set_once = false}) { let $set = {}; if (typeof(prop) === 'object') { if (typeof(to) === 'object') { callback = modifiers; modifiers = to; } else { callback = to; } $set = prop; } else { $set[prop] = to; if (typeof(modifiers) === 'function' || !modifiers) { callback = modifiers; } } let data = { '$token': this.token, ...identifiers, }; const set_key = set_once ? "$set_once" : "$set"; data[set_key] = $set; if ('ip' in $set) { data.$ip = $set.ip; delete $set.ip; } if ($set.$ignore_time) { data.$ignore_time = $set.$ignore_time; delete $set.$ignore_time; } data = merge_modifiers(data, modifiers); if (this.config.debug) { this.mixpanel.config.logger.debug(`Sending the following data to Mixpanel (${this.endpoint})`, { data }); } this.mixpanel.send_request({ method: "GET", endpoint: this.endpoint, data }, callback); } _delete_profile({identifiers, modifiers, callback}){ let data = { '$delete': '', '$token': this.token, ...identifiers, }; if (typeof(modifiers) === 'function') { callback = modifiers; } data = merge_modifiers(data, modifiers); if (this.config.debug) { this.mixpanel.config.logger.debug('Deleting profile', { identifiers }); } this.mixpanel.send_request({ method: "GET", endpoint: this.endpoint, data }, callback); } _remove({identifiers, data, modifiers, callback}) { let $remove = {}; if (typeof(data) !== 'object' || util.isArray(data)) { if (this.config.debug) { this.mixpanel.config.logger.error("Invalid value passed to #remove - data must be an object with scalar values"); } return; } for (const [key, val] of Object.entries(data)) { if (typeof(val) === 'string' || typeof(val) === 'number') { $remove[key] = val; } else { if (this.config.debug) { this.mixpanel.config.logger.error( "Invalid argument passed to #remove - values must be scalar", { key, value: val } ); } return; } } if (Object.keys($remove).length === 0) { return; } data = { '$remove': $remove, '$token': this.token, ...identifiers }; if (typeof(modifiers) === 'function') { callback = modifiers; } data = merge_modifiers(data, modifiers); if (this.config.debug) { this.mixpanel.config.logger.debug( `Sending the following data to Mixpanel (${this.endpoint})`, { data } ); } this.mixpanel.send_request({ method: "GET", endpoint: this.endpoint, data }, callback); } _union({identifiers, data, modifiers, callback}) { let $union = {}; if (typeof(data) !== 'object' || util.isArray(data)) { if (this.config.debug) { this.mixpanel.config.logger.error("Invalid value passed to #union - data must be an object with scalar or array values"); } return; } for (const [key, val] of Object.entries(data)) { if (util.isArray(val)) { var merge_values = val.filter(function(v) { return typeof(v) === 'string' || typeof(v) === 'number'; }); if (merge_values.length > 0) { $union[key] = merge_values; } } else if (typeof(val) === 'string' || typeof(val) === 'number') { $union[key] = [val]; } else { if (this.config.debug) { this.mixpanel.config.logger.error( "Invalid argument passed to #union - values must be a scalar value or array", { key, value: val } ); } } } if (Object.keys($union).length === 0) { return; } data = { '$union': $union, '$token': this.token, ...identifiers, }; if (typeof(modifiers) === 'function') { callback = modifiers; } data = merge_modifiers(data, modifiers); if (this.config.debug) { this.mixpanel.config.logger.debug( `Sending the following data to Mixpanel (${this.endpoint})`, { data } ); } this.mixpanel.send_request({ method: "GET", endpoint: this.endpoint, data }, callback); } _unset({identifiers, prop, modifiers, callback}){ let $unset = []; if (util.isArray(prop)) { $unset = prop; } else if (typeof(prop) === 'string') { $unset = [prop]; } else { if (this.config.debug) { this.mixpanel.config.logger.error( "Invalid argument passed to #unset - must be a string or array", { prop } ); } return; } let data = { '$unset': $unset, '$token': this.token, ...identifiers, }; if (typeof(modifiers) === 'function') { callback = modifiers; } data = merge_modifiers(data, modifiers); if (this.config.debug) { this.mixpanel.config.logger.debug( `Sending the following data to Mixpanel (${this.endpoint})`, { data } ); } this.mixpanel.send_request({ method: "GET", endpoint: this.endpoint, data }, callback); } };