built.io
Version:
SDK for Built.io Backend
208 lines (194 loc) • 6.57 kB
JavaScript
var R = require('ramda');
var Obj = require('./object');
var User = require('./user');
var Installation = require('./installation');
var Role = require('./role');
var Upload = require('./upload');
var Query = require('./query');
var Built = require('./built');
var utility = require('./utilities/utility');
var instanceMethodBuilder = require('./utilities/instanceMethodBuilder')();
var APP_USER_CLS = 'built_io_application_user';
var APP_ROLE_CLS = 'built_io_application_user_role';
var APP_INSTALLATION_CLS = 'built_io_installation_data';
var Upload_CLS = 'built_io_upload';
var clsToConsMap = {};
clsToConsMap[APP_USER_CLS] = User;
clsToConsMap[APP_ROLE_CLS] = Role;
clsToConsMap[APP_INSTALLATION_CLS] = Installation;
clsToConsMap[Upload_CLS] = Upload;
/**
* @class Class
* @classdesc
* A Class is a collection of objects.
* @instance
* @param {String} uid The uid for this class
* @description Use this constructor to get an instance of Class
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
*
* var cls = Built.App('blt5d4sample2633b').Class('project'); // person is a class uid.
* @return {Class}
*/
var clsCons = module.exports = R.curry(function(app,headers,data,uid) {
var cls = {
app : app,
headers : headers,
data :data,
uid : uid,
toJSON : function(){
return data
}
};
/**
* @name Object
* @description Represents an {@link Object} of a class
* @static
* @memberof Class
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
*
* var object = Built.App('blt5d4sample2633b').Class('project').Object();
*/
var wrappedObject = utility.wrapper(Obj(app,cls,{},{},{}),[{}]);
var wrappedUser = utility.wrapper(User(app,cls,{},{},{}),[{}]);
var wrappedRole = utility.wrapper(Role(app,cls,{},{},{}),[{}]);
var wrapperInstallation = utility.wrapper(Installation(app,cls,{},{},{}),[{}]);
var wrapperUpload = utility.wrapper(Upload(app,{},{}),[{}]);
/*
appClsWrapped are Object constructors wrapped only with app and cls, and its only used for internal purpose
*/
var appClsWrappedObject = utility.wrapper(Obj(app,cls) ,[{},{},{},{}]);
var appClsWrappedUser = utility.wrapper(User(app,cls),[{},{},{},{}]);
var appClsWrappedRole = utility.wrapper(Role(app,cls),[{},{},{},{}]);
var appClsInstallation = utility.wrapper(Installation(app,cls),[{},{},{},{}]);
var appClsUpload = utility.wrapper(Upload(app),[{},{},{}]);
switch (uid) {
case APP_USER_CLS:
cls.Object = wrappedUser;
cls.ObjectCons = appClsWrappedUser;
utility.copyProperties(cls.Object,User);
utility.copyProperties(cls.ObjectCons,User);
break;
case APP_ROLE_CLS:
cls.Object = wrappedRole;
cls.ObjectCons = appClsWrappedRole
utility.copyProperties(cls.Object, Role);
utility.copyProperties(cls.ObjectCons,Role);
break;
case APP_INSTALLATION_CLS:
cls.Object = wrapperInstallation;
cls.ObjectCons = appClsInstallation;
utility.copyProperties(cls.Object,Installation);
utility.copyProperties(cls.ObjectCons,Installation);
break;
case Upload_CLS:
cls.Object = wrapperUpload;
cls.ObjectCons = appClsUpload;
utility.copyProperties(cls.Object,Upload);
utility.copyProperties(cls.ObjectCons,Upload);
break;
default:
cls.Object = wrappedObject;
cls.ObjectCons = appClsWrappedObject;
utility.copyProperties(cls.Object,Obj);
utility.copyProperties(cls.ObjectCons,Obj);
break;
}
/**
* @name Query
* @description Represents a {@link Query} on a 'Class' which can be executed to retrieve objects that pass the query condition
* @static
* @memberof Class
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
*
* var object = Built.App('blt5d4sample2633b').Class('project').Query();
*/
var curriedQuery = Query(app,cls,{},app.options.cachePolicy);
cls.Query = R.wrap(curriedQuery, function(curriedQuery, queryObj) {
if (queryObj) {
return curriedQuery(queryObj);
} else {
return curriedQuery({});
}
});
utility.copyProperties(cls.Query, Query);
installPluginsOnInst(cls);
installPluginsOnObjCons(cls)
return instanceMethodBuilder.build(module.exports,cls);
});
/*
pluginsHelper is global variable declared in built.js
*/
function installPluginsOnInst(cls){
pluginsHelper.plugins.map(function(plugin){
if(plugin.realtime && plugin.realtime.onClassInstance){
plugin.realtime.onClassInstance(cls);
}
});
};
function installPluginsOnObjCons(cls){
pluginsHelper.plugins.map(function(plugin){
if(plugin.realtime && plugin.realtime.onObjectCons){
plugin.realtime.onObjectCons(cls);
}
});
}
/**
* Gets the headers of a class
* @function getHeaders
* @memberof Class
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
*
* var cls = Built.App('blt5d4sample2633b').Class('project');
* var obj = cls.getHeaders();
* @return {object}
*/
module.exports.getHeaders = function(cls) {
return cls.headers;
}
instanceMethodBuilder.define('getHeaders',1);
var getCombinedHeaders = module.exports.getCombinedHeaders = function(cls) {
// get headers from application and combine it with its own headers
return {
headers: R.mixin(cls.headers, Built.App.getHeaders(cls.app))
}
}
instanceMethodBuilder.define('getCombinedHeaders',1);
/**
* Gets the schema of a class
* @function getSchema
* @memberof Class
* @instance
* @example
* // 'blt5d4sample2633b' is a dummy Application API key
* var cls = Built.App('blt5d4sample2633b').Class('project');
* cls.getSchema()
* .then(function(schema){
* // schema is an array of fields
* })
* @return {Promise<Array>}
*/
module.exports.getSchema = function(cls){
var Adaptor = cls.app.options.adaptor;
var requestObject = utility.getAdaptorObj('GET',getURL(cls),getCombinedHeaders(cls).headers,null,null);
return Adaptor.makeCall(requestObject).then(function(response){
return response.entity.class.schema;
});
}
instanceMethodBuilder.define('getSchema',1);
var getURL = module.exports.getURL = function(cls) {
return Built.App.getURL(cls.app) + "/classes/" + cls.uid;
}
instanceMethodBuilder.define('getURL',1);
module.exports.getUid = function(cls){
return cls.uid;
}
instanceMethodBuilder.define('getUid',1);
module.exports.isNew = function(upload){
return !! upload.uid;
}
instanceMethodBuilder.define('isNew',1);