UNPKG

built.io-browserify

Version:

SDK for Built.io Backend which is compatible with Browserify

1,440 lines (1,379 loc) 59.7 kB
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