UNPKG

built.io

Version:

SDK for Built.io Backend

208 lines (194 loc) 6.57 kB
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);