import stampit from 'stampit';
import _ from 'lodash';
import Promise from 'bluebird';
import models from './models';
import Account from './account';
import Pinger from './pinger';
import SyncanoFile from './file';
import BatchManager from './batchmanager';
/**
* Main Syncano object.
* @constructor
* @type {Syncano}
* @param {Object} options All configuration options
* @param {Object} [options.baseUrl = 'https://api.syncano.io'] Base URL for all api calls.
* @param {Object} [options.accountKey = null] Your Syncano account key.
* @param {Object} [options.userKey = null] Instance user api key.
* @param {Object} [options.socialToken = null] Instance social authentication token.
* @param {Object} [options.defaults = {}] Object with default properties for api calls.
* @returns {Syncano}
* @example {@lang javascript}
* var connection = Syncano({accountKey: '123'});
* var connection = Syncano({userKey: '123'});
* var connection = Syncano({socialToken: '123'});
* var connection = Syncano({ defaults: { instanceName: 'my-instance' }});
*/
const Syncano = stampit()
// We need function here, do not use arrow syntax!
.init(function() {
this.Account = Account.setConfig(this)();
this.Monitor = Pinger.setConfig(this)();
this.BatchManager = BatchManager.setConfig(this);
_.forEach(models, (model, name) => {
this[name] = model.setConfig(this);
});
})
.refs({
baseUrl: 'https://api.syncano.io',
progressCallback: null,
accountKey: null,
userKey: null,
apiKey: null,
socialToken: null,
defaults: {}
})
.methods({
/**
* Sets *instanceName*.
* @memberOf Syncano
* @instance
* @param {String} instanceName Instance name for all api calls
* @returns {Syncano}
* @throws {Error} Instance name must be a string.
* @example {@lang javascript}
* var connection = Syncano({accountKey: '123'});
* connection.setInstanceName('my-instance');
*/
setInstanceName(instanceName) {
if(_.isEmpty(instanceName)) this.defaults.instanceName = null;
else {
if(!_.isString(instanceName)) return Promise.reject(new Error('Instance name must be a string.'));
this.defaults.instanceName = instanceName;
}
return this;
},
/**
* Sets progressCallback
*
* @memberOf Syncano
* @instance
*
* @param {Function} callback Function to be called on 'progress' event
* @returns {Syncano}
*/
onProgress(callback) {
this.progressCallback = callback;
return this;
},
/**
* Gets *instanceName*.
* @memberOf Syncano
* @instance
* @returns {String}
* @example {@lang javascript}
* var connection = Syncano({accountKey: '123'});
* var instanceName = connection.getInstanceName();
*/
getInstanceName() {
return this.defaults.instanceName;
},
/**
* Sets *baseUrl*.
* @memberOf Syncano
* @instance
* @param {String} baseUrl Base URL for all api calls
* @returns {Syncano}
* @throws {Error} Base URL is required.
* @example {@lang javascript}
* var connection = Syncano({accountKey: '123'});
* connection.setBaseUrl('https://dummy.com/');
*/
setBaseUrl(baseUrl) {
if(_.isEmpty(baseUrl)) return Promise.reject(new Error('Base URL is required.'));
this.baseUrl = baseUrl;
return this;
},
/**
* Gets *baseUrl*.
* @memberOf Syncano
* @instance
* @returns {String}
* @example {@lang javascript}
* var connection = Syncano({accountKey: '123'});
* var baseUrl = connection.getBaseUrl();
*/
getBaseUrl() {
return this.baseUrl;
},
/**
* Sets *accountKey*.
* @memberOf Syncano
* @instance
* @param {String} accountKey Your {@link https://syncano.io|Syncano} account key
* @returns {Syncano}
* @example {@lang javascript}
* var connection = Syncano({accountKey: '123'});
* connection.setAccountKey('abcd');
*/
setAccountKey(accountKey) {
this.accountKey = accountKey;
return this;
},
/**
* Gets *accountKey*.
* @memberOf Syncano
* @instance
* @returns {String}
* @example {@lang javascript}
* var connection = Syncano({accountKey: '123'});
* var accountKey = connection.getAccountKey();
*/
getAccountKey() {
return this.accountKey;
},
/**
* Sets *userKey*.
* @memberOf Syncano
* @instance
* @param {String} userKey Instance user api key
* @returns {Syncano}
* @example {@lang javascript}
* var connection = Syncano({userKey: '123'});
* connection.setUserKey('abcd');
*/
setUserKey(userKey) {
this.userKey = userKey;
return this;
},
/**
* Gets *userKey*.
* @memberOf Syncano
* @instance
* @returns {String}
* @example {@lang javascript}
* var connection = Syncano({userKey: '123'});
* var userKey = connection.getUserKey();
*/
getUserKey() {
return this.userKey;
},
/**
* Sets *apiKey*.
* @memberOf Syncano
* @instance
* @param {String} apiKey Instance user api key
* @returns {Syncano}
* @example {@lang javascript}
* var connection = Syncano({apiKey: '123'});
* connection.setApiKey('abcd');
*/
setApiKey(apiKey) {
this.apiKey = apiKey;
return this;
},
/**
* Gets *apiKey*.
* @memberOf Syncano
* @instance
* @returns {String}
* @example {@lang javascript}
* var connection = Syncano({apiKey: '123'});
* var apiKey = connection.getApiKey();
*/
getApiKey() {
return this.apiKey;
},
/**
* Sets *socialToken*.
* @memberOf Syncano
* @instance
* @param {String} socialToken Instance social authentication token
* @returns {Syncano}
* @example {@lang javascript}
* var connection = Syncano({socialToken: '123'});
* connection.setSocialToken('abcd');
*/
setSocialToken(socialToken) {
this.socialToken = socialToken;
return this;
},
/**
* Gets *socialToken*.
* @memberOf Syncano
* @instance
* @returns {String}
* @example {@lang javascript}
* var connection = Syncano({socialToken: '123'});
* var socialToken = connection.getSocialToken();
*/
getSocialToken() {
return this.socialToken;
},
file(content) {
return new SyncanoFile(content);
}
}).static({
file(content) {
return new SyncanoFile(content);
}
});
export default Syncano;