'use strict'; var debug = require('debug')('e2e:appstore'), fs = require('fs'), path = require('path'), request = require('superagent-sync'), sleep = require('sleep').sleep, stripe = require('stripe'); exports = module.exports = AppStore; function AppStore(origin) { this._origin = origin; // credentials for api calls this._credentials = { password: null, accessToken: null }; if (fs.existsSync(path.join(__dirname, '../ecosystem.json'))) { this._ecosystem = require(path.join(__dirname, '../ecosystem.json')); // staging appstore } else { this._ecosystem = require(path.join(__dirname, '../keys/appstore/ecosystem-staging.json')); } } function verifyResponse(res, errorMessage) { if (res.statusCode < 200 || res.statusCode > 299) { debug('Response error statusCode:%s error:%s body:%j', res.statusCode, res.error, res.body); debug(errorMessage.red); throw new Error(errorMessage); } } AppStore.prototype.getAccessToken = function (user) { var res = request.get(this._origin + '/api/v1/login').auth(user.email, user.password).end(); verifyResponse(res, 'Could not login as user:' + user.email + ' password:' + user.password); return res.body.accessToken; }; AppStore.prototype.setCredentials = function (password, accessToken) { this._credentials = { password: password, accessToken: accessToken }; }; AppStore.prototype.waitForCloudron = function (boxId) { var creationTime = new Date(); process.stdout.write('Waiting for cloudron to come up.'); var res; while (true) { sleep(10); process.stdout.write('.'); res = request.get(this._origin + '/api/v1/cloudrons/' + boxId).query({ accessToken: this._credentials.accessToken }).end(); verifyResponse(res, 'Could not query cloudron status'); if (res.body.box.status === 'ready') { debug(); break; } } debug('Box created in %s minutes with IP:%s'.green, (new Date() - creationTime) / 60000, res.body.box.ip); return res.body.box; }; AppStore.prototype.createCloudron = function (box) { var accessToken = this._credentials.accessToken; var res = request.post(this._origin + '/api/v1/cloudrons').send(box).query({ accessToken: accessToken }).end(); verifyResponse(res, 'Could not create cloudron'); debug('Cloudron %s created'.green, box.domain); return res.body.box; }; AppStore.prototype.deleteCloudron = function (box) { var res = request.post(this._origin + '/api/v1/cloudrons/' + box.id) .query({ accessToken: this._credentials.accessToken }) .set('X-HTTP-Method-Override', 'DELETE') .send({ password: this._credentials.password }) .end(); verifyResponse(res, 'Could not delete cloudron'); }; AppStore.prototype.getManifest = function (appId, version) { var res = request.get(this._origin + '/api/v1/apps/' + appId + '/versions/' + version).end(); verifyResponse(res, 'Could not get get app manifest'); return res.body.manifest; }; AppStore.prototype.restore = function (boxId, backupId) { var res = request.post(this._origin + '/api/v1/cloudrons/' + boxId + '/restore/' + backupId).query({ accessToken: this._credentials.accessToken }).end(); verifyResponse(res, 'Could not restore cloudron'); }; AppStore.prototype.setupBilling = function (callback) { var stripeApi = stripe(this._ecosystem.env['STRIPE_SECRET']); var that = this; stripeApi.tokens.create({ card: { number: '4242424242424242', exp_month: 12, exp_year: 2016, cvc: '123' } }, function (error, token) { if (error) return callback(error); debug('Got stripe token', token.id); var data = { password: that._credentials.password, billingToken: token.id }; var res = request.put(that._origin + '/api/v1/users').send(data).query({ accessToken: that._credentials.accessToken }).end(); verifyResponse(res, 'Could not setup billing'); callback(null); }); };