built.io-browserify
Version:
SDK for Built.io Backend which is compatible with Browserify
1,440 lines (1,379 loc) • 59.7 kB
JavaScript
var R = require('ramda');
var utility = require('./utilities/utility');
var uploadHelper = require("./utilities/uploadHelper");
var instanceMethodBuilder = require('./utilities/instanceMethodBuilder')();
var Built = require('./built');
var node = require('./node');
var path = node.path;
var fs = node.fs;
var constants = require('./constants')
/*
Constants
*/
var objectsPath = '/objects';
/**
* @class Object
* @classdesc
* An object is an instance of a class.
* @instance
* @description Represents an object of a class
* @param {String|object} uid The uid of this object or an object with initial values
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var Project = Built.App('blt5d4sample2633b').Class('project').Object;
* // Example demonstrate constructor taking an object's uid as argument
* var obj = Project('blt12sampleb09157');
*
* // Example demonstrate constructor taking an initial value
* var obj = Project({
* name:'abc',
* email:['abc@email.com','pqr@email.com']
* });
* @return {Object}
*/
var objectCons = module.exports = R.curry(function(app,cls,headers,query,initial,deltaObj) {
var delta = {};
var data = {};
if (utility.isObject(deltaObj)) {
delta = deltaObj;
} else {
delta = {
uid: deltaObj
};
}
if (utility.isEmpty(initial))
data = delta;
else
data = initial;
var returnObj = {
app : app,
cls : cls,
headers : headers,
query : query,
data : data,
delta : delta,
toJSON: function() {
return data;
}
}
returnObj = instanceMethodBuilder.build(module.exports, returnObj);
installPluginsOnInstance(returnObj);
return returnObj;
});
function installPluginsOnInstance(object){
pluginsHelper.plugins.map(function(plugin){
if(plugin.realtime && plugin.realtime.onObjectInstance){
plugin.realtime.onObjectInstance(object);
}
});
};
/**
* Gets the data for the given property
* @memberof Object
* @function get
* @param {String} property The object's property
* @instance
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object({
* name:'Super Project #41!',
* description: 'Small description'
* });
* var value = project.get('name');
* @return {variable}
*/
var getProperty = module.exports.get = R.curry(function(property, object) {
return getData(object)[property] || getDeltaObject(object)[property];
});
instanceMethodBuilder.define('get',2);
/**
* Gets the header object
* @function getHeaders
* @memberof Object
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* var headers = project().getHeaders();
* @return {object}
*/
var getHeaders = module.exports.getHeaders = function(object) {
return object.headers;
}
instanceMethodBuilder.define('getHeaders',1);
module.exports.getCombinedHeaders = function(object) {
var Cls = require('./class');
var clsHeaders = Cls.getCombinedHeaders(object.cls);
var combinedHeaders = R.mixin(clsHeaders.headers, object.headers)
return combinedHeaders;
}
instanceMethodBuilder.define('getCombinedHeaders',1);
/**
* Sets a new header
* @function setHeader
* @param {String} header The header key
* @param {String} value The header value
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.setHeader('custom-header','custom-value');
* @instance
* @memberof Object
* @return {Object}
*/
var setHeader = module.exports.setHeader = R.curry(function(header, value, object) {
var existingHeaders = object.headers;
var newHeader = R.mixin({}, existingHeaders);
newHeader[header] = value;
return object.cls.ObjectCons(newHeader,getQuery(object),getData(object),getDeltaObject(object));
});
instanceMethodBuilder.define('setHeader',3);
/**
* Removes a header from the object
* @function removeHeader
* @param {String} header The header to be removed
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* var project = project.removeHeader('custom-header');
* @instance
* @memberof Object
* @return {Object}
*/
var removeHeader = module.exports.removeHeader = R.curry(function(header, object) {
var newHeaders = R.mixin({}, object.headers);
delete newHeaders[header];
return object.cls.ObjectCons( newHeaders,getQuery(object),getData(object),getDeltaObject(object));
})
instanceMethodBuilder.define('removeHeader',2);
var getURL = module.exports.getURL = function(object) {
var Cls = require('./class');
if (object.isNew())
return Cls.getURL(object.cls) + objectsPath + '/' + object.getUid();
else
return Cls.getURL(object.cls) + objectsPath
}
instanceMethodBuilder.define('getURL',1);
/**
* Decreases the number field by a given amount (Note: Decrement is done on the server)
* @function decrement
* @param {String} key Uid of the number field
* @param {number} number By how much amount to decrement
* @throws new Error('Not a number');
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.decrement('version',2);
* @return {Object}
*/
module.exports.decrement = R.curry(function(key, number, object) {
return operationHelper('SUB',key,number,object);
})
instanceMethodBuilder.define('decrement',3);
/**
* Increases the number field by a given amount (Note: Increment is done on the server)
* @function increment
* @param {String} key Uid of number field
* @param {number} number By how much amount to increment
* @throws new Error('Not a number');
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.increment('version',10); //Increases age field value by 10
* @return {Object}
*/
module.exports.increment = R.curry(function(key, number, object) {
return operationHelper('ADD',key,number,object);
})
instanceMethodBuilder.define('increment',3);
/**
* Returns the JSON representation of object's data
* @function getData
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object({
* name:'Super Project #41!'
* });
* var data = project.getData();
* @return {object}
*/
var getData = module.exports.getData = function(object) {
return object.data;
}
instanceMethodBuilder.define('getData',1);
/**
* Assigns parameters to the object
* @function assign
* @param {object} data Plain JavaScript object with new contents
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var Project = Built.App('blt5d4sample2633b').Class('project').Object;
* var project = Project({
* name: 'Super Project #41!'
* });
* project = project.assign({version: 2});
* @return {Object}
*/
module.exports.assign = R.curry(function(data, object) { // assigns dirty object to object.data as well to fullfill user expectations
var newData = R.mixin(getData(object), data);
var newDelta = R.mixin(getDeltaObject(object), data);
return object.cls.ObjectCons( object.headers,getQuery(object),newData, newDelta);
})
instanceMethodBuilder.define('assign',2);
/**
* Sets a new key value in object
* @function set
* @memberof Object
* @param {String} key The key for the new property
* @param {String} value The value for the new property
* @instance
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project')
* .Object('blt12sampleb09157');
* project = project.set('name','Super Project #41!');
* @return {Object}
*/
var set = module.exports.set = R.curry(function(name, value, object) { // assigns dirty object to object.data as well to fullfill user expectations
var newData = R.mixin({}, getData(object));
var newDelta = R.mixin({}, getDeltaObject(object));
newData[name] = value;
newDelta[name] = value;
return object.cls.ObjectCons(object.headers,getQuery(object),newData, newDelta);
})
instanceMethodBuilder.define('set',3);
/**
* Retrieves the uid of the object
* @function getUid
* @instance
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project')
* .Object('blt12sampleb09157');
* var uid = project.getUid();
* @memberof Object
* @return {String}
*/
var getUid = module.exports.getUid = function(object){
return getDeltaObject(object).uid || getData(object).uid;
}
instanceMethodBuilder.define('getUid',1);
/**
* Assigns a uid
* @function setUid
* @param {String} uid Uid of an object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
// 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.setUid('blt12sampleb09157');
* @instance
* @memberof Object
* @return {Object}
*/
module.exports.setUid = set('uid');
instanceMethodBuilder.define('setUid',2);
/**
* Assign tag(s) to this object
* @function setTags
* @param {Array} tags Array of tags
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.setTags(['tag1','tag2']);
* @return {Object}
*/
module.exports.setTags = R.curry(function(tags,object){
var newDelta = getDeltaObject(object);
newDelta['tags'] = tags;
return object.cls.ObjectCons( object.headers,getQuery(object),getData(object), newDelta);
});
instanceMethodBuilder.define('setTags',2);
/**
* Sets a location for this object
* @function setLocation
* @param {Location} point Accepts a instance on Built.Location
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var location = Buitl.Location(60,80);
* var project= Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.setLocation(location);
* @instance
* @memberof Object
* @return {Object}
*/
module.exports.setLocation = R.curry(function(point,object){
var newDelta = R.mixin({},getDeltaObject(object));
var locData = point.toJSON();
newDelta['__loc'] = [locData.longitude,locData.latitude];
return object.cls.ObjectCons( object.headers,getQuery(object),getData(object), newDelta);
});
instanceMethodBuilder.define('setLocation',2);
/**
* Returns the location of this object
* @function getLocation
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* var location = project.getLocation();
* @return {Location}
*/
module.exports.getLocation = R.curry(function(object){
var Location = Built.Location;
var objLoc = object.get('__loc');
var locObject = Location(objLoc[0],objLoc[1]);
return locObject;
});
instanceMethodBuilder.define('getLocation',1);
/**
* Determines whether uid is assigned to this object or not
* @function isNew
* @param {String} uid Uid of an object
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object({
* uid:'blt12sampleb09157'
* });
* var boolean = project.isNew();
* @return {Boolean}
*/
module.exports.isNew = function(object){
return !! object.getUid();
}
instanceMethodBuilder.define('isNew',1);
/**
* Pushes a value in the multiple field. The method ensures push operation to be atmoic
* @function pushValue
* @param {String} key Uid of field
* @param {String|Object|Array} value Value to be pushed
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
// 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.pushValue('multi_field', {
* first_name:'Super Project #41!',
* second_name:'Super Project #41!'
* });
* @instance
* @memberof Object
* @return {Object}
*/
module.exports.pushValue = R.curry(function(key, value, object) {
return arrayOperationHelper('PUSH', key, value, "", object);
})
instanceMethodBuilder.define('pushValue',3);
/**
* For the given field marked multiple, it deletes the first matched value. The method ensures pull operation to be atmoic
* @function pullValue
* @param {String} key Uid of field
* @param {String|Array|Object} value Values to be deleted
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.pullValue('multi_field', {
* first_name:'first',
* second_name:'second'
* });
* @instance
* @memberof Object
* @return {Object}
*/
module.exports.pullValue = R.curry(function(key,value,object) {
return arrayOperationHelper('PULL', key, value, "", object);
})
instanceMethodBuilder.define('pullValue',3);
/**
* For the given field marked multiple, it updates the value at the given index. The method ensures update operation to be atmoic
* @function updateValueAtIndex
* @param {String} key Uid of field
* @param {String|Object} value Update value for the field based on it type
* @param {number} index Index at which the value should be updated
* @throws new Error('Index value inappropriate')
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.updateValueAtIndex('multi_field', 1);
* @instance
* @memberof Object
* @return {Object}
*/
module.exports.updateValueAtIndex = R.curry(function(key, value, index,object) {
return arrayOperationHelper('UPDATE',key, value, index, object);
})
instanceMethodBuilder.define('updateValueAtIndex', 4);
/**
* Upserts the object (Updates the matching object if found on Built.io Backend or creates a new object)
* @function upsert
* @param {object} upsertObject Plain JavaScript object specifying the upsert conditions
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' if uid of an object on Built.io Backend
* var Project = Built.App('blt5d4sample2633b').Class('project').Object;
* var project = Project({
* name:'Super Project #41!',
* version: 1
* });
* // If object having its name field as 'Super Project #41!' if found, it is updated,
* // else it creates a new object on Built.io Backend
* project = project.upsert({
* name:'Super Project #41!'
* });
* project.save()
* .then(function(project){
* // do something
* });
* @return {Object}
*/
module.exports.upsert = R.curry(function(upsertObject,object){
var newDelta = R.mixin({}, getDeltaObject(object));
newDelta['UPSERT'] = upsertObject;
return object.cls.ObjectCons(object.headers,getQuery(object),getData(object),newDelta);
})
instanceMethodBuilder.define('upsert',2);
/**
* Checks whether the object has a given property
* @function has
* @param {String} key The property to be checked
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object({
* name:'Super Project #41!',
* version :2
* });
* var boolean = project.has('name');
* @return {Boolean}
* */
module.exports.has = R.curry(function(key,object){
return object.data.hasOwnProperty(key);
})
instanceMethodBuilder.define('has',2);
/**
* Sets ACL for this object
* @function setACL
* @param {ACL} aclObject The ACL object
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* var acl = Built.ACL();
* acl = acl.setPublicDeleteAccess(true);
* project = project.setACL(acl);
* @return {Object}
*/
module.exports.setACL = R.curry(function(aclObject,object){
var newDelta = R.mixin({},getDeltaObject(object));
newDelta['ACL'] = aclObject.toJSON();
return object.cls.ObjectCons(object.headers,getQuery(object),getData(object),newDelta);
})
instanceMethodBuilder.define('setACL',2);
/**
* Gets the ACL object from an upload
* @function getACL
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project')
* .Object('blt12sampleb09157');
* project.fetch()
* .then(function(project){
* console.log(project.getACL())
* })
* @return {ACL}
*/
module.exports.getACL = function(object){
return Built.ACL(object.get('ACL'));
}
instanceMethodBuilder.define('getACL',1);
/**
* Adds a group field
* @function addGroup
* @memberof Object
* @param {Built.Group|Built.GroupMultiple} group Instance of Built.Group or Built.GroupMultiple
* @instance
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'details' is a group field in bug class
* var app = Built.App('blt5d4sample2633b');
* var Bugs = app.Class('bugs').Object;
* var bug = Bugs();
* // Consider 'bugs' class has a group field 'details' which contains a reference field 'project'
* var details = Built.Group('details',{
* title: 'UI bug'
* })
* bug = bug.addGroup(details);
* bug.save()
* .then(function(bug){
* console.log(bug.toJSON())
* })
* @return {Object}
*/
var addGroup = module.exports.addGroup = R.curry(function(group, object){
var newDelta = R.mixin({}, getDeltaObject(object))
// JSON.stringify deserializes the entire strucuture(i.e calls toJSON function in each object if avaliable so Built.Group Built.GroupMultipe Built.Upsert get deserialized)
group = JSON.parse(JSON.stringify(group))
newDelta = R.mixin(group, newDelta)
return object.cls.ObjectCons(object.headers,getQuery(object),getData(object),newDelta);
})
instanceMethodBuilder.define('addGroup', 2)
/**
* Assigns referenced object's uids to a reference field of an object
* @function setReference
* @param {String} field_uid The uid of the field whose references are to be set
* @param {String | Array} refValue Single uid/SDK object or Array of uids/SDK objects
* @throws new Error('new Error('Uid not found'))
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'bugs' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var app = Built.App('blt5d4sample2633b');
* var Bugs = app.Class('bugs').Object;
* var Project = app.Class('project').Object;
* var project = Project({
* uid:'blt12sampleb09157'
* });
* var bugs = Bugs();
* // Using array of SDK objects as argument
* project = project.setReference('project',[project]);
* // Using array of uid's as argument
* project = project.setReference('project',['blt12sampleb0333','blt12sampleb09222']);
@return {Object}
*/
module.exports.setReference = R.curry(function(field_uid, refValue, object) {
var newDelta = R.mixin({},getDeltaObject(object));
var finalValue = refValue
if(utility.isArray(refValue)){
if(refValue[0] && refValue[0].app){ //check whether it is array of built objects
finalValue = []
for (var i = 0; i < refValue.length; i++) {
if(!refValue[i].getUid()){
throw new Error('Uid not found');
}
finalValue.push(refValue[i].getUid());
}
}
} else {
if(refValue.app)
finalValue = refValue.getUid()
}
newDelta[field_uid] = finalValue
return object.cls.ObjectCons(object.headers,getQuery(object),getData(object),newDelta);
});
instanceMethodBuilder.define('setReference',3);
/**
* This method will first create object(s) in referred class and then assigns its uids in the base class's referring field.
* Example: Consider you have a reference field 'project' in class 'Bugs' class. This method would first create object(s) in 'Project' class
* and then assign its 'uids' in 'Bugs' class's reference field 'project'.
* @function setReferenceWithObject
* @memberof Object
* @instance
* @param {String} field_uid The uid of the reference field or "." delimated string for 'group' fields as shown in example
* @param {Object | Array} refObjs JSON object or an array of plain JavaScript objects or SDK object(s)
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'bugs' is a uid of a class on Built.io Backend
* // 'blt12sampleb09111' is uid of an object on Built.io Backend
* var app = Built.App('blt5d4sample2633b');
* var Bugs = app.Class('bugs').Object;
* var bug = Bugs('blt12sampleb09111');
* bug = bug.setReferenceWithObject('project', [{
* name: 'Super Project #41!'
* }]);
*
* bug
* .save()
* .then(function(bug){
* console.log(bug.toJSON())
* });
@return {Object}
*/
module.exports.setReferenceWithObject = R.curry(function(field_uid, refValue, object) {
var newDelta = R.mixin({},getDeltaObject(object));
var finalValue = refValue
if(utility.isArray(refValue)){
if(refValue[0] && refValue[0].app){ //check whether it is array of built objects
finalValue = []
for (var i = 0; i < refValue.length; i++) {
finalValue.push(refValue[i].toJSON());
}
}
} else {
if(refValue.app)
finalValue = refValue.toJSON()
}
newDelta[field_uid] = finalValue
return object.cls.ObjectCons(object.headers, getQuery(object), getData(object), newDelta);
});
instanceMethodBuilder.define('setReferenceWithObject',3);
/**
* Fires a query on Built.io Backend and the object that fulfills the query condition is assigned in the reference field.
* Note: 'query' should be such that only one object should satisfy it, as Built.io Backend doesn't allow multipe references to be set using a 'query'
* @function setReferenceWhere
* @memberof Object
* @param {String} field_uid The uid of the reference field
* @param {object} query JavaScript object specifying the conditions
* @instance
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'bugs' is a uid of a class on Built.io Backend
* // 'blt12sampleb09111' is uid of an object on Built.io Backend
* var app = Built.App('blt5d4sample2633b');
* var Bugs = app.Class('bugs').Object;
* var bug = Bugs('blt12sampleb09111');
* bug = bug.setReferenceWhere('project', {
* name: 'Super Project #41!'
* });
*
* bug.save()
* .then(function(bug){
* console.log(bug.toJSON())
* });
* @return {Object}
*/
module.exports.setReferenceWhere = R.curry(function(field_uid,conditionObject,object){
var newDelta = R.mixin({},getDeltaObject(object));
var whereClause = {
WHERE : conditionObject
};
newDelta[field_uid] = whereClause
return object.cls.ObjectCons(object.headers,getQuery(object),getData(object),newDelta);
});
instanceMethodBuilder.define('setReferenceWhere',3);
/**
* Use this method to perfom a upsert(update else insert) operation on reference field.
* @function upsertForReference
* @memberof Object
* @param {String} field_uid Reference uid on which UPSERT is to be performed
* @param {Built.Upsert} upsert Instance of Built.Upsert
* @instance
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'bugs' is a uid of a class on Built.io Backend
* var app = Built.App('blt5d4sample2633b');
* var Bugs = app.Class('bugs').Object;
* var bug = Bugs();
* var upsertOps = Built.Upsert([{
* condition:{
* name:'Super Project #41'
* },
* replacement:{
* name: 'Super Project A',
* description: 'New project'
* }
* }])
* bug = bug.upsertForReference('project', upsertOps);
* // The method would first check Project class (the class referred by 'Bugs' class using 'project' field) and
* // checks if any object with name 'Super Project #41!' exists; if yes, it's name would be replaced by 'Super Project A' and
* // description by 'New project'.
* // If not, a new entry would be made with name as 'Super Project A' and description as 'New project' and its
* // uid would be assigned to reference field 'project.
* @return {Object}
*/
module.exports.upsertForReference = R.curry(function(field_uid, upsertArray, object) {
var newDelta = R.mixin({}, getDeltaObject(object))
newDelta[field_uid] = upsertArray
return object.cls.ObjectCons(object.headers, getQuery(object), getData(object), newDelta);
});
instanceMethodBuilder.define('upsertForReference', 3);
/**
* Issues a timeless update, which means that the date of creation and the date of updation are not modified
* @function timeless
* @Instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project = project.timeless();
* @return {Object}
*/
module.exports.timeless = function(object){
var newHeader = getHeaders(object);
newHeader['timeless'] = true;
return object.cls.ObjectCons(newHeader,getQuery(object),getData(object),getDeltaObject(object));
};
instanceMethodBuilder.define('timeless',1);
/**
* Adds a custom query to the object
* @function addQuery
* @param {String} key Query parameter's name
* @param {Variable} object Query parameter's value
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project')
* .Object('blt12sampleb09157');
* project = project.addQuery('include_owner',true);
* project.fetch()
* .then(function(object){
* // do something
* });
* @return {Object}
*/
var addQuery = module.exports.addQuery = R.curry(function(key,value,object){
var newQuery = R.mixin({},getQuery(object));
newQuery[key] = value;
return object.cls.ObjectCons(object.headers,newQuery,getData(object),getDeltaObject(object));
});
instanceMethodBuilder.define('addQuery',3);
/**
* Includes the owner of the object in response
* @function includeOwner
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* var project = project.includeOwner();
* @return {Object}
*/
module.exports.includeOwner = addQuery('include_owner',true);
instanceMethodBuilder.define('includeOwner',1);
/**
* By default, when a object is fetched referenced object's uids are returned in response. Using this method you can
* retrieve the reference object itself.
* @function include
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* var project = project.include(['project']);
* project.fetch()
* .then(function(project){
* console.log(project.toJSON())
* })
* @return {Object}
*/
module.exports.include = addQuery('include');
instanceMethodBuilder.define('include', 2);
var exceptOnlyHelper = R.curry(function(operation, key, uidArray, object) {
var newQuery = R.mixin({}, getQuery(object));
if (newQuery[operation]) {
newQuery[operation] = R.mixin(newQuery[operation], utility.keyValue(key, uidArray))
} else
newQuery[operation] = utility.keyValue(key, uidArray)
return object.cls.ObjectCons(getHeaders(object), newQuery, getData(object), getDeltaObject(object));
})
/**
* Removes a set of fields from response
* @function except
* @param {Array} fieldUidArray Array of field uid's that need to be excluded from response
* @instance
* @memberof Object
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* // 'Class('class_name').Object returns a 'Object' constructor
* // 'project' is a uid of a class on Built.io Backed
* var obj = Built.App('blt5d4sample2633b').Class('project').Object('blt12sampleb09157');
* obj = obj.except(['username']);
* obj.fetch()
* .then(function(obj){
* // The response won't contain 'username' field
* console.log(obj.toJSON())
* });
* @return {Object}
*/
module.exports.except = exceptOnlyHelper('except','BASE');
instanceMethodBuilder.define('except',2);
/**
* Removes a set of fields from the referenced object
* @function exceptReference
* @param {String} Reference field uid
* @param {Array} fieldUidArray Array of field uids that need to be excluded from the referenced object
* @instance
* @memberof Object
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* // 'Class('class_name').Object returns a 'Object' constructor
* // 'project' is a uid of a class on Built.io Backed
* var obj = Built.App('blt5d4sample2633b').Class('project').Object('blt12sampleb09157');
* var obj = obj.include(['bug'])
* obj = obj.exceptReference('bug',['description']); //description is a reference field that references the bug class
* obj.fetch()
* .then(function(obj){
* // The response won't contain 'description' field in the Address class object
* console.log(obj.toJSON())
* });
* @return {Object}
*/
module.exports.exceptReference = exceptOnlyHelper('except');
instanceMethodBuilder.define('exceptReference',3);
/**
* This method should be used when it is required to only have a set of fields in the base class object's response
* @function only
* @param {Array} Array of field uid's that need to be present in the response
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* // 'Class('class_name').Object returns a 'Object' constructor
* // 'project' is a uid of a class on Built.io Backed
* // Consider project
* var obj = Built.App('blt5d4sample2633b').Class('project').Object('blt12sampleb09157');
* obj = obj.only(['username']);
* obj.fetch()
* .then(function(obj){
* // The response will only have the username field
* console.log(obj.toJSON())
* });
* @instance
* @memberof Object
* @return {Object}
*/
module.exports.only = exceptOnlyHelper('only','BASE');
instanceMethodBuilder.define('only',2);
/**
* This method should be used when it is required to only have a set of fields in the referenced object
* @function onlyReference
* @param {String} Reference field uid
* @param {Array} Array of field uids that need to be present in the referenced object
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* // 'Class('class_name').Object returns a 'Object' constructor
* // 'project' is a uid of a class on Built.io Backed
* // Consider project
* var obj = Built.App('blt5d4sample2633b').Class('project').Object('blt12sampleb09157');
* obj = obj.include(['project']);
* // 'name' is a reference field that references the Project class
* obj = obj.onlyReference('project',['name']);
*
* obj.fetch()
* .then(function(obj){
* // The response will only have name field in the Project object
* console.log(obj.toJSON())
* });
* @instance
* @memberof Object
* @return {Object}
*/
module.exports.onlyReference = exceptOnlyHelper('only');
instanceMethodBuilder.define('onlyReference',3);
/**
* Saves an object as draft, i.e., the object bypasses all validations and is not published
* @function saveAsDraft
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project').Object();
* project.saveAsDraft({
* name:'Super Project #41!'
* })
* .then(function(project){
* console.log(project.toJSON());
* });
* @instance
* @return {Promise<Object>}
*/
module.exports.saveAsDraft = function(object){
var newDelta = R.mixin({}, getDeltaObject(object));
newDelta['published'] = false;
var draftObject = object.cls.ObjectCons(object.headers,getQuery(object),getData(object),newDelta);
return module.exports.save(draftObject);
}
instanceMethodBuilder.define('saveAsDraft',1);
/**
* Saves/updates the object on Built.io Backend
* @function save
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var Project = Built.App('blt5d4sample2633b').Class('project').Object;
* var projectWithUid = Project({
* uid:'blt12sampleb09157',
* name:'Super Project #41!'
* });
* // As the object has a uid property set, an update request is sent to Built.io Backend.
* projectWithUid.save()
* .then(function(object){
* // updated object
* });
* var projectWithoutUid = Project({
* name:'Super Project #43!'
* });
* // As the object has no uid property, a create request is sent.
* projectWithoutUid.save()
* .then(function(object){
* // created object
* })
* @return {Promise<Object>}
*/
module.exports.save = function(object) {
var entity = {
"object": getDeltaObject(object)
};
var adaptor = object.app.options.adaptor;
var method;
if (!object.isNew()) {
method = 'POST';
} else {
method = 'PUT';
}
var params = getQuery(object);
if(Object.keys(params).length === 0){
params = null;
}
var requestObject = utility.getAdaptorObj(method,getURL(object),module.exports.getCombinedHeaders(object),entity,params);
return adaptor.makeCall(requestObject)
.then(function(response) {
if (response.entity.count) {
var responseArray = [];
responseArray.push(response.entity.count);
responseArray.push(consObj(object, response.entity.object));
return responseArray;
} else {
return consObj(object, response.entity.object); // use case where count of objects was requested
}
});
}
instanceMethodBuilder.define('save',1);
function consObj(object, data) {
return object.cls.ObjectCons(object.headers,{},data,{});
}
/**
* Fetches the latest version of the object from Built.io Backend
* @function fetch
* @throws new Error('Uid not found');
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project')
* .Object('blt12sampleb09157');
* project.fetch()
* .then(function(project){
* // object fetch from Built.io Backend
* });
* @instance
* @memberof Object
* @return {Promise<Object>}
*/
module.exports.fetch = function(object) {
var adaptor = object.app.options.adaptor;
var reqBody = getQuery(object)
/*if(Object.keys(body).length === 0){
reBody = null;
}*/
if (!object.isNew()) {
throw new Error('Uid not found');
}
var requestObject = utility.getAdaptorObj('GET', module.exports.getURL(object), module.exports.getCombinedHeaders(object), null, reqBody);
return adaptor.makeCall(requestObject).then(function(response) {
return object.cls.ObjectCons( getHeaders(object),getQuery(object),response.entity.object,getDeltaObject(object));
});
}
instanceMethodBuilder.define('fetch',1);
/**
* Deletes the object from Built.io Backend
* @function delete
* @throws new Error('Uid not found');
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend
* var project = Built.App('blt5d4sample2633b').Class('project')
* .Object('blt12sampleb09157');
* project.delete()
* .then(function(){
* // console.log('object deleted successfully')
* });
* @return {Promise<null>}
*/
module.exports.delete = function(object) {
var adaptor = object.app.options.adaptor;
if (!object.isNew()) {
throw new Error('Uid not found');
}
var requestObject = utility.getAdaptorObj('DELETE', module.exports.getURL(object), module.exports.getCombinedHeaders(object), null, null);
return adaptor.makeCall(requestObject).then(function(response) {
return null;
});
}
instanceMethodBuilder.define('delete',1);
/**
* Wraps a sub-group in Built.Group construct and returns it
* @memberof Object
* @throws new Error('Key not found in Object');
* @function getGroupForKey
* @param {field} fieldUid The uid of the group field
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* // 'manager' is a group field in Project class.
* // 'blt12sampleb09157' is uid of a object in 'project' class
* var project = Built.App('blt5d4sample2633b').Class('project')
* .Object('blt12sampleb09157')
* project.fetch()
* .then(function(project) {
* var manager = project.getGroupForKey("manager")
* console.log(manager.toJSON())
* })
* @return {Group}
*/
module.exports.getGroupForKey = function(key, object){
var groupData = object.get(key);
if(!groupData)
throw new Error("Key not found in object")
if(utility.isArray(groupData))
return Built.GroupMultiple(key, groupData)
else
return Built.Group(key, groupData)
}
instanceMethodBuilder.define('getGroupForKey', 2)
/**
* Sets the extension key for an object
* @memberof Object
* @function setExtensionKey
* @param {String} extensionKey The Extension key
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* var project = Built.App('blt5d4sample2633b').Class('project').Object()
* project = project.setExtensionKey('bltdb28fsaMplEf1b8');
* @return {Object}
*/
module.exports.setExtensionKey = setHeader('extension_key')
instanceMethodBuilder.define('setExtensionKey',2);
/**
* Gets the extension key for an object
* @memberof Object
* @function getExtensionKey
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* var project = Built.App('blt5d4sample2633b').Class('project').Object()
* project = project.setExtensionKey('bltdb28fsaMplEf1b8');
* console.log(project.getExtensionKey());
* @return {String}
*/
module.exports.getExtensionKey = function(object){
return object.getHeaders().extension_key;
}
instanceMethodBuilder.define('getExtensionKey',1);
/**
* Removes the extension key from object
* @memberof Object
* @instance
* @function removeExtensionKey
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* var project = Built.App('blt5d4sample2633b').Class('project').Object()
* project = project.removeExtensionKey();
* @return {Object}
*/
module.exports.removeExtensionKey = removeHeader('extension_key');
instanceMethodBuilder.define('removeExtensionKey',1);
/**
* Sets the master key for an object
* @memberof Object
* @function setMasterKey
* @param {String} masterKey The master key
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* var project = Built.App('blt5d4sample2633b').Class('project').Object()
* project = project.setMasterKey('bltdb28fsaMplEf1b8');
* @return {Object}
*/
module.exports.setMasterKey = setHeader('master_key')
instanceMethodBuilder.define('setMasterKey',2);
/**
* Gets the master key for an object
* @memberof Object
* @function getMasterKey
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* var project = Built.App('blt5d4sample2633b').Class('project').Object()
* project = project.setMasterKey('bltdb28fsaMplEf1b8');
* console.log(project.getMasterKey());
* @return {String}
*/
module.exports.getMasterKey = function(object){
return object.getHeaders().master_key;
}
instanceMethodBuilder.define('getMasterKey',1);
/**
* Removes the master key from object
* @memberof Object
* @instance
* @function removeMasterKey
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* var project = Built.App('blt5d4sample2633b').Class('project').Object()
* project = project.removeMasterKey();
* @return {Object}
*/
module.exports.removeMasterKey = removeHeader('master_key');
instanceMethodBuilder.define('removeMasterKey',1);
/*
This method checks if a model was provided; if it is provided, it binds a sync method to it; if not, it uses the default built model
*/
function modelHelper(model,object){
var newModel;
if(!model){
newModel = getDefaultBackBoneModel(object);
}
else{
newModel = model.extend({
sync : getSync(object)
});
}
return newModel;
}
/**
* Returns a Backbone version of the same object
* @function toBackboneModel
* @param {Model} model Takes the Backbone model to be used for conversion. (If no model is specified, Built.io Backend's default model would be used.)
* @instance
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend var model = Backbone.Model.extend({
* getName:function(){
* this.get("name");
* },
* setName:function(name){
* this.set("name", name);
* },
* idAttribute:"uid"
* });
*
* var Project = Built.App('blt5d4924dff62a633b').Class('project').Object;
* var project = Project({
* name:'Super Project #41!'
* });
*
* var backbone = project.toBackboneModel(model);
* //Now "backbone" can be used to fetch, save, delete, update object on Built.io Backend.
* backbone.save(null,{
* success:function(res){
* // res also has a Backbone model type
* }
* });
*
* // Built.io Backend's default Backbone model would be used
* var backbone = project.toBackboneModel();
* //Now "backbone" can be used to fetch, save, delete, update object on Built.io Backend.
* backbone.save(null,{
* success:function(res){
* // res also has a Backbone model type
* }
* });
* @return {Backbone} Returns a BackBone object
*/
module.exports.toBackboneModel = function(model, object){
if(utility.backboneExist()){
var newModel = modelHelper(model,object);
if(utility.isObject(object))
return new newModel(object.toJSON());
}else{
throw new Error('BACKBONE not included');
}
}
instanceMethodBuilder.define('toBackboneModel',2,[null]);
/**
* Returns a Backbone collection
* @function BackboneCollection
* @param {object} config Takes a plain JavaScript object where "objects" key is used to pass array of objects and "query" key is used to specify a query.
* @param {Model} model Takes a Backbone model to be used by the collection for conversion. (If null is specified Built's default Backbone model is used)
* @static
* @memberof Object
* @example
* //'blt5d4sample2633b' is a dummy Application API key
* // Class('class_name').Object returns a Object constructor
* // 'project' is a uid of a class on Built.io Backend
* // 'blt12sampleb09157' is uid of an object on Built.io Backend var app = Built.App('blt5d4sample2633b');
* var Project = app.Class('project').Object;
* var Query = app.Class('project').Query;
*
* var project = Project({
* username:'Super Project #41!'
* });
* var project1 = Project({
* username:'Super Project #41!'
* });
*
* var projectArray = [project,project1];
*
* var model = Backbone.Model.extend({
* getName:function(){
* this.get("username");
* },
* setName:function(name){
* this.set("username", name);
* },
* idAttribute:"uid"
* });
*
* var backbone = Project.BackboneCollection({
* objects : projectArray,
* model : model
* });
* // Converts the objects in projectArray to Backbone collection using the given model
*
* var query = Query()
* .where('username','Super Project #41!');
*
* var backbone = Project.BackboneCollection({
* query : query,
* model : model
* });
*
* // Query to Built.io Backend with given query and converts the returned objects to collection using the given model
* //Now backbone can be used to fetch, save, delete, update object on Built.io Backend.
*
* backbone.fetch();
*
* @return {Backbone} Returns a BackBone object
*/
objectCons.BackboneCollection = function(config){
var object = this;
if(utility.backboneExist()){
if(config.objects){
var collection = Backbone.Collection.extend({
sync:function(type,obj,options){
if(arguments.length == 2){
options = obj;
obj = this;
}
options = options||{};
var that = this;
if(type === "read" && object){
var query = object.cls.Query();
query.exec()
.then(function(objs){
for (var i = 0; i < objs.length; i++) {
if (typeof objs[i] == 'object') {
var newModel = modelHelper(config.model,objs[i]);
that.add(new newModel(objs[i].toJSON()));
}
}
options.success(that.models);
},function(error){
options.error(error)
});
}
/*else if(type === 'create'){
var newModel;
if(! obj instanceof Backbone.Model){
var Model = modelHelper(config.model,object);
newModel = new Model();
}
else{
newModel = obj;
}
if(options.wait === undefined || options.wait === false){
that.add(newModel);
}
var data = n