built.io
Version:
SDK for Built.io Backend
188 lines (175 loc) • 6.13 kB
JavaScript
var R = require('ramda');
var utility = require('./utilities/utility');
var instanceMethodBuilder = require('./utilities/instanceMethodBuilder')();
var userMetrics = require('./utilities/user-metrics');
var UUID_TOKEN_POSTFIX = "blt_uuid";
/*
Constants
*/
var triggerUrl = '/trigger';
/**
* @class Event
* @classdesc
* Use 'Event' to trigger an event on Built.io Backend
* @description
* Represents an analytics event
* @param {string|object} uid The uid of the event, or initial values of the event
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* var Event = Built.App('blt5d4sample2633b').Analytics().Event;
*
* //Constructor accepting event uid as argument
* var event = Event('event1');
*
* // Constructor accepting inital properties as argument
* var event = Event({
* username:'ABC';
* });
* event = event.setUid('event2');
* @return {Event}
*/
var eventCons = module.exports = R.curry(function(app, analytics, uid, properties) {
var returnObj = {
app : app,
analytics : analytics,
uid : uid,
properties: properties
}
return instanceMethodBuilder.build(module.exports, returnObj);
});
/**
* Gets the properties assigned to this event
* @function getProperties
* @instance
* @memberof Event
* @example
* var event = Built.App('blt5d4sample2633b').Event({
* username:'ABC';
* });
* event = event.setUid('event2');
* console.log(event.getProperties())
* @return {object}
*/
var getProperties = module.exports.getProperties = function(event){
return event.properties;
}
instanceMethodBuilder.define('getProperties',1);
/**
* Returns the uid of this event
* @function getUid
* @instance
* @memberof Event
* @example
* var event = Built.App('blt5d4sample2633b').Event('event1');
* var uid = event.getUid();
* @return {String}
*/
var getUid = module.exports.getUid = function(event){
return event.uid;
}
instanceMethodBuilder.define('getUid',1);
/**
* Assigns a uid to the event
* @function setUid
* @instance
* @memberof Event
* @param {String} uid Uid for the event
* @example
* var event = Built.App('blt5d4sample2633b').Event({
* username:'ABC'
* });
* event = event.setUid('event1');
* @return {Event}
*/
module.exports.setUid = R.curry(function(uid,event){
return eventCons(event.app, event.analytics, uid, event.properties);
});
instanceMethodBuilder.define('setUid',2);
var setPropertiesHelper = R.curry(function(key,value,event){
if(value instanceof Date){
value = value.toISOString();
}
var newProperties = getMixinedProperties(event);
newProperties[key] = value;
return eventCons(event.app, event.analytics, event.uid, newProperties);
});
/**
* Assigns properties to the event. These are nothing but data you want to send along with the event
* @function setProperties
* @param {object} properties Plain JavaScript object containing custom properties
* @instance
* @memberof Event
* @example
* var event = Built.App('blt5d4sample2633b').Event('event1');
* // username data is send along with the event
* event = event.setProperties({
* username:'ABC'
* });
* @return {Event}
*/
module.exports.setProperties = R.curry(function(value, event){
var newProperties = R.mixin(value,getMixinedProperties(event));
return eventCons(event.app, event.analytics, event.uid, newProperties);
});
instanceMethodBuilder.define('setProperties',2);
/**
* You can assign a created at date to an Event. If this is provided Built.io Backend would consider it as the time the event was triggered else would attach server's timestamp as its created at.
* @function setCreatedAt
* @param {Date} date The custom created at date to be assigned to event
* @instance
* @memberof Event
* @example
* var event = Built.App('blt5d4sample2633b').Event('event1');
* event = event.setCreatedAt(new Date());
* @return {Event}
*/
module.exports.setCreatedAt = setPropertiesHelper('created_at');
instanceMethodBuilder.define('setCreatedAt',2);
/**
* Triggers this event on Built.io Backend
* @function trigger
* @param forceTrigger Triggers regardless of the batchSize
* @instance
* @memberof Event
* @example
* var event = Built.App('blt5d4sample2633b').Event('event1');
* event.trigger()
* .then(function(event){
* // Returns the same event
* });
*/
module.exports.trigger = function(forceTrigger, event){
var keyValue = utility.keyValue;
if(event.analytics.getBatchSize() > 1 && !forceTrigger){
event = event.setCreatedAt(new Date());
event.analytics.pushEventInQueue(event);
}else{
// If trackAnonymously is false send currently logged-in user's uid if avaliable, if true send blank value
var app_user_object_uid = !event.analytics.getTrackAnonymously()? (event.app.getUserJSON()? event.app.getUserJSON().uid : "anonymous"): "anonymous";
event = event.setProperties({app_user_object_uid:app_user_object_uid})
//Fetch uuid that should be used for this application
var blt_uuid = userMetrics.getUUIDForAPI(event.app.getApiKey())
// Creates event.properties with event.super_properties to form a object event{ properties:{//data}, super_properties:{//data}}
var eventProps = keyValue('event', keyValue("properties", constructEventProperties(event)))
var superProps = keyValue('super_properties', R.mixin(event.analytics.getSuperProperties().static, {blt_uuid: blt_uuid}))
var entity = R.mixin(superProps,eventProps)
var adaptor = event.app.options.adaptor;
var requestObject = utility.getAdaptorObj('POST', getURL(event), event.app.getHeaders(), entity, null);
adaptor.makeCall(requestObject);
}
}
instanceMethodBuilder.define('trigger',2, [false]);
function getURL(event){
var app = event.app;
return app.getURL() +'/events/'+ event.getUid() + triggerUrl; // GLOBAL variable
}
function getUid(){
return event.uid;
}
function constructEventProperties(event){
// We merge dynamically generated properties with event properties
return R.mixin(event.analytics.getSuperProperties().dynamic(),event.getProperties())
}
function getMixinedProperties(event){
return R.mixin({}, event.getProperties())
}