Skip to content
This repository has been archived by the owner on Nov 29, 2018. It is now read-only.

Commit

Permalink
tidy up and some better error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Cherry committed Jun 17, 2014
1 parent f522f23 commit ee2341a
Showing 1 changed file with 153 additions and 162 deletions.
315 changes: 153 additions & 162 deletions pointdns.js
@@ -1,177 +1,168 @@
var https = require('https')

var app = {}

app.api = {
hostname: 'pointhq.com',
username: null,
apitoken: null,
timeout: 10000,
}

function validate(params, list, callback) {
for (key in list) {
if (!(list[key] in params)){
callback(new Error('param not found: ' + list[key]))
return false
}
}
return true
var https = require('https'),
app = {
api: {
hostname: 'pointhq.com',
username: null,
apitoken: null,
timeout: 10000,
}
};

function validate(params, list, callback){
for(key in list){
if(!(list[key] in params)){
callback('param not found: ' + list[key]);
return false;
}
}
return true;
}

app.zones = {
list: function(params, callback) {
var query = ''
if (typeof params !== 'undefined' && 'group' in params) {
query = '?group=' + params['group']
}
app.call(200, 'GET', '/zones' + query, callback, {'list_escape': 'zone'})
},
list: function(params, callback){
var query = '';
if(typeof params !== 'undefined' && 'group' in params){
query = '?group=' + params['group'];
}
app.req(200, 'GET', '/zones' + query, {'list_escape': 'zone'}, callback);
}
}

app.zone = {
add: function(fields, callback) {
app.call(201, 'POST', '/zones', callback, {'escape': 'zone', 'fields': {'zone': fields}})
},
update: function(params, fields, callback) {
if (!(validate(params, ['zone_id'], callback))){
return
}
app.call(202, 'PUT', '/zones' + params['zone_id'], callback, {'escape': 'zone', 'fields': {'zone': fields}})
},
get: function(params, callback) {
if (!(validate(params, ['zone_id'], callback))) {
return
}
app.call(200, 'GET', '/zones/' + params['zone_id'], callback, {'escape': 'zone'})
},
del: function(params, callback) {
if (!(validate(params, ['zone_id'], callback))) {
return
}
app.call(202, 'DELETE', '/zones/' + params['zone_id'], callback, {'escape': 'zone'})
},
add: function(fields, callback){
app.req(201, 'POST', '/zones', {'escape': 'zone', 'fields': {'zone': fields}}, callback);
},
update: function(params, fields, callback){
if(!(validate(params, ['zone_id'], callback))){
return;
}
app.req(202, 'PUT', '/zones' + params['zone_id'], {'escape': 'zone', 'fields': {'zone': fields}}, callback);
},
get: function(params, callback){
if(!(validate(params, ['zone_id'], callback))){
return;
}
app.req(200, 'GET', '/zones/' + params['zone_id'], {'escape': 'zone'}, callback);
},
del: function(params, callback){
if(!(validate(params, ['zone_id'], callback))){
return;
}
app.req(202, 'DELETE', '/zones/' + params['zone_id'], {'escape': 'zone'}, callback);
}
}

app.records = {
list: function(params, callback) {
if (!(validate(params, ['zone_id'], callback))) {
return
}
app.call(200, 'GET', '/zones/' + params['zone_id'] + '/records/', callback, {'list_escape': 'zone_record'})
},
list: function(params, callback){
if (!(validate(params, ['zone_id'], callback))){
return;
}
app.req(200, 'GET', '/zones/' + params['zone_id'] + '/records/', {'list_escape': 'zone_record'}, callback);
}
}

app.record = {
add: function(params, fields, callback) { // zone_record
if (!(validate(params, ['zone_id'], callback))) {
return
}
app.call(201, 'POST', '/zones/' + params['zone_id'] + '/records', callback, { 'escape': 'zone_record', 'fields':{'zone_record': fields} })
},
update: function(params, fields, callback) { // zone_record
if (!(validate(params, ['zone_id', 'record_id'], callback))) {
return
}
app.call(202, 'PUT', '/zones/' + params['zone_id'] + '/records' + params['record_id'], callback, { 'escape': 'zone_record', 'fields':{'zone_record': fields} })
},
get: function(params, callback) { // zone_record
if (!(validate(params, ['zone_id', 'record_id'], callback))) {
return
}
app.call(200, 'GET', '/zones/' + params['zone_id'] + '/records/' + params['record_id'], callback, {'escape': 'zone_record'})
},
del: function(params, callback) { // zone_record
if (!(validate(params, ['zone_id', 'record_id'], callback))) {
return
}
app.call(202, 'DELETE', '/zones/' + params['zone_id'] + '/records' + params['record_id'], callback, {'escape': 'zone_record'})
},
add: function(params, fields, callback){ // zone_record
if (!(validate(params, ['zone_id'], callback))){
return;
}
app.req(201, 'POST', '/zones/' + params['zone_id'] + '/records/', { 'escape': 'zone_record', 'fields':{'zone_record': fields}}, callback);
},
update: function(params, fields, callback){ // zone_record
if (!(validate(params, ['zone_id', 'record_id'], callback))){
return;
}
app.req(202, 'PUT', '/zones/' + params['zone_id'] + '/records/' + params['record_id'], { 'escape': 'zone_record', 'fields':{'zone_record': fields}}, callback);
},
get: function(params, callback){ // zone_record
if (!(validate(params, ['zone_id', 'record_id'], callback))){
return
}
app.req(200, 'GET', '/zones/' + params['zone_id'] + '/records/' + params['record_id'], {'escape': 'zone_record'}, callback);
},
del: function(params, callback){ // zone_record
if (!(validate(params, ['zone_id', 'record_id'], callback))){
return;
}
app.req(202, 'DELETE', '/zones/' + params['zone_id'] + '/records/' + params['record_id'], {'escape': 'zone_record'}, callback);
}
}


app.call = function(status, method, path, callback, data) {

// credentials
if( ! (app.api.username && app.api.apitoken) ) {
callback( new Error('credentials missing') )
return
}

var querystr = JSON.stringify(data['fields'])
var auth = 'Basic ' + new Buffer(app.api.username + ':' + app.api.apitoken).toString('base64');
var headers = {
'Accept': 'application/json',
'User-Agent': 'Nodejs-pointDNS',
'Authorization': auth,
}

if( method.match( /(POST|PUT)/ ) ) {
headers['Content-Type'] = 'application/json'
headers['Content-Length'] = querystr.length
}

var options = {
host: app.api.hostname,
port: 443,
path: path,
method: method,
headers: headers,
}

//request
var req = https.request(options, function(res) {
if (res.statusCode != status) {
callback( new Error('http error') )
return
}
var responseData = '';
res.on('data', function(chunk) {
responseData += chunk;
});
res.on('end', function(){
result = JSON.parse( responseData )
if ('escape' in data) {
result = result[data['escape']]
} else if ('list_escape' in data) {
tmp = []
result.forEach(function(entry) {
tmp.push(entry[data['list_escape']])
})
result = tmp
}
req.end();
callback(null, result)
});
});

// timeout
req.on( 'socket', function( socket ) {
if( app.api.timeout ) {
socket.setTimeout( app.api.timeout )
socket.on( 'timeout', function() {
req.abort()
})
}
})

req.on('error', function(e) {
console.error(e);
callback(e)
return
});

if( method.match( /(POST|PUT)/ ) ) {
req.end( querystr )
} else {
req.end()
}

app.req = function(status, method, path, data, callback){
// credentials
if(!app.api.username || !app.api.apitoken){
return callback('credentials missing');
}

var querystr = JSON.stringify(data['fields']),
auth = 'Basic ' + new Buffer(app.api.username + ':' + app.api.apitoken).toString('base64'),
headers = {
'Accept': 'application/json',
'User-Agent': 'Nodejs-pointDNS',
'Authorization': auth,
},
options = {
host: app.api.hostname,
port: 443,
path: path,
method: method,
headers: headers,
}

if(method.match(/(POST|PUT)/)){
headers['Content-Type'] = 'application/json';
headers['Content-Length'] = querystr.length;
}

//request
var req = https.request(options, function(res){
if(res.statusCode == 404){
return callback('404 response. Incorrect or invalid fields');
}
if (res.statusCode != status){
return callback('Invalid status code: '+res.statusCode);
}
var responseData = '';
res.on('data', function(chunk){
responseData += chunk;
});
res.on('end', function(){
result = JSON.parse(responseData);
if('escape' in data){
result = result[data['escape']];
}else if('list_escape' in data){
tmp = [];
result.forEach(function(entry){
tmp.push(entry[data['list_escape']]);
})
result = tmp;
}
callback(null, result)
});
});

// timeout
req.on('socket', function(socket){
if(app.api.timeout){
socket.setTimeout(app.api.timeout)
socket.on('timeout', function(){
req.abort();
})
}
})

req.on('error', function(err){
return callback(err);
});

if(method.match(/(POST|PUT)/)){
req.end(querystr);
}else{
req.end();
}
}

module.exports = function( setup ) {
for( var k in setup ) {
app.api[ k ] = setup[ k ]
}
return app
module.exports = function(setup){
for(var k in setup){
app.api[k] = setup[k];
}
return app;
}

0 comments on commit ee2341a

Please sign in to comment.