pm2/lib/API/Keymetrics/kmapi.js
2017-06-23 15:51:12 +02:00

163 lines
4.2 KiB
JavaScript

var querystring = require('querystring');
var https = require('https');
var fs = require('fs');
var needle = require('needle');
var url = require('url');
var cst = require('../../../constants.js');
var KM = function() {
this.BASE_URI = 'https://app.keymetrics.io';
this.CLIENT_ID = '938758711';
this.CB_URI = 'https://app.keymetrics.io';
this.ACCESS_TOKEN_FILE = cst.KM_ACCESS_TOKEN;
this.access_token = null;
}
/**
* @param user_info.username
* @param user_info.password
* @return promise
*/
KM.prototype.loginAndGetAccessToken = function (user_info, cb) {
var that = this;
var URL_AUTH = '/api/oauth/authorize?response_type=token&scope=all&client_id=' +
that.CLIENT_ID + '&redirect_uri=' + that.CB_URI;
needle.get(that.BASE_URI + URL_AUTH, function(err, res) {
if (err) return cb(err);
var cookie = res.cookies;
needle.post(that.BASE_URI + '/api/oauth/login', user_info, {
cookies : cookie
}, function(err, resp, body) {
if (err) return cb(err);
if (body.indexOf('/api/oauth/login') > -1) return cb('Wrong credentials');
var location = resp.headers.location;
var redirect = that.BASE_URI + location;
needle.get(redirect, {
cookies : cookie
}, function(err, res) {
if (err) return cb(err);
var refresh_token = querystring.parse(url.parse(res.headers.location).query).access_token;
needle.post(that.BASE_URI + '/api/oauth/token', {
client_id : that.CLIENT_ID,
grant_type : 'refresh_token',
refresh_token : refresh_token,
scope : 'all'
}, function(err, res, body) {
if (err) return cb(err);
that.access_token = body.access_token;
return cb(null, body.access_token);
})
});
});
});
}
KM.prototype.getLocalAccessToken = function(cb) {
var that = this;
fs.readFile(that.ACCESS_TOKEN_FILE, function(e, content) {
if (e) return cb(e);
cb(null, content.toString());
});
};
KM.prototype.saveLocalAccessToken = function(access_token, cb) {
var that = this;
fs.writeFile(that.ACCESS_TOKEN_FILE, access_token, function(e, content) {
if (e) return cb(e);
cb();
});
};
KM.prototype.getBuckets = function(cb) {
var that = this;
needle.get(that.BASE_URI + '/api/bucket', {
headers : {
'Authorization' : 'Bearer ' + that.access_token
},
json : true
}, function(err, res, body) {
if (err) return cb(err);
return cb(null, body);
});
}
/**
* @param user_info.username
* @param user_info.password
* @param user_info.email
* @return promise
*/
KM.prototype.register = function(user_info, cb) {
var that = this;
needle.post(that.BASE_URI + '/api/oauth/register', user_info, {
json: true,
headers: {
'X-Register-Provider': 'pm2-register'
}
}, function (err, res, body) {
if (err) return cb(err);
if (body.email && body.email.message) return cb(body.email.message);
if (body.username && body.username.message) return cb(body.username.message);
cb(null, {
token : body.access_token.token
})
});
};
KM.prototype.defaultNode = function(cb) {
var that = this;
needle.get(that.BASE_URI + '/api/node/default', function(err, res, body) {
if (err) return cb(err);
cb(null, url.parse(body.endpoints.web).protocol + '//' + url.parse(body.endpoints.web).hostname);
});
}
KM.prototype.createBucket = function(default_node, bucket_name, cb) {
var that = this;
needle.post(default_node + '/api/bucket/create_classic', {
name : bucket_name
}, {
json : true,
headers : {
'Authorization' : 'Bearer ' + that.access_token
}
}, function(err, res, body) {
if (err) return cb(err);
cb(null, body);
});
}
KM.prototype.fullCreationFlow = function(user_info, cb) {
var that = this;
this.register(user_info, function(err, dt) {
if (err) return cb(err);
that.access_token = dt.token;
that.defaultNode(function(err, default_node) {
if (err) return cb(err);
that.createBucket(default_node, 'Node Monitoring', function(err, packet) {
if (err) return cb(err);
return cb(null, {
secret_id : packet.bucket.secret_id,
public_id : packet.bucket.public_id
});
});
})
});
}
module.exports = new KM;