@yawetse/pkgcloud
Version:
An infrastructure-as-a-service agnostic cloud library for node.js
261 lines (222 loc) • 7.52 kB
JavaScript
/*
* records.js: Rackspace DNS client records functionality
*
* (C) 2013 Rackspace
* Ken Perkins
* MIT LICENSE
*
*/
var urlJoin = require('url-join'),
pkgcloud = require('../../../../../lib/pkgcloud'),
_ = require('underscore'),
dns = pkgcloud.providers.rackspace.dns;
var _urlPrefix = 'domains',
_recordFragment = 'records';
module.exports = {
/**
* @name Client.getRecords
* @description getRecords retrieves your list of records for this domain
* @param {Object|Number} zone the zone for the getRecords query
* @param {Function} callback handles the callback of your api call
*/
getRecords: function (zone, callback) {
var self = this,
zoneId = zone instanceof dns.Zone ? zone.id : zone;
var requestOptions = {
path: urlJoin(_urlPrefix, zoneId, _recordFragment)
};
self._request(requestOptions, function (err, body, res) {
if(err) {
return callback(err);
}
else if (!body || !body.records) {
return callback(new Error('Unexpected empty response'));
}
else{
return callback(null, body.records.map(function (record) {
return new dns.Record(self, record);
}), res);
}
});
},
/**
* @name Client.getRecord
* @description get the details of dns record for the provided zone and record
* @param {object|Number} zone the zone of the record to query for
* @param {object|String} record the record to query for
* @param {Function} callback handles the callback of your api call
*/
getRecord: function (zone, record, callback) {
var self = this,
zoneId = zone instanceof dns.Zone ? zone.id : zone,
recordId = record instanceof dns.Record ? record.id : record;
var requestOptions = {
path: urlJoin(_urlPrefix, zoneId, _recordFragment, recordId)
};
self._request(requestOptions, function (err, body) {
return err
? callback(err)
: callback(err, new dns.Record(self, body));
});
},
/**
* @name Client.updateRecord
* @description update a dns record for a given domain
* @param {Record} record the record to update
* @param {Function} callback handles the callback of your api call
*/
updateRecord: function (zone, record, callback) {
this.updateRecords(zone, [ record ], callback);
},
/**
* @name Client.updateRecords
* @description update a set of dns records for a given domain
* @param {Array} records the records to update
* @param {Function} callback handles the callback of your api call
*/
updateRecords: function (zone, records, callback) {
var self = this,
data = [],
zoneId = zone instanceof dns.Zone ? zone.id : zone;
_.each(records, function (record) {
if (!record.type || !record.name || !record.data) {
return;
}
var updateRecord = {
id: record.id,
type: record.type,
data: record.data,
name: record.name
};
if (record.type === 'MX' || record.type === 'SRV') {
updateRecord.priority = record.priority;
}
if (record.ttl) {
updateRecord.ttl = record.ttl > 300 ? record.ttl : 300;
}
if (record.comment) {
updateRecord.comment = record.comment;
}
data.push(updateRecord);
});
var requestOptions = {
path: urlJoin(_urlPrefix, zoneId, _recordFragment),
method: 'PUT',
body: {
records: data
}
};
self._asyncRequest(requestOptions, function(err, result) {
return err
? callback(err)
: callback(null, result.response
? result.response.records.map(function (record) {
return new dns.Record(self, record);
})
: []);
});
},
/**
* @name Client.addRecord
* @description create a dns record for a given zone
* @param {object|Number} zone the zone to add the record to
* @param {object} record the record to create
* @param {Function} callback handles the callback of your api call
*/
createRecord: function (zone, record, callback) {
this.createRecords(zone, [ record ], function(err, records) {
return err
? callback(err)
: callback(err, records[0]);
});
},
/**
* @name Client.createRecords
* @description create a set of dns records for a given zone
* @param {object|Number} zone the zone to add the records to
* @param {Array} records the array of records to create
* @param {Function} callback handles the callback of your api call
*/
createRecords: function (zone, records, callback) {
var self = this,
data = [],
zoneId = zone instanceof dns.Zone ? zone.id : zone;
_.each(records, function (record) {
if (!record.type || !record.name || !record.data) {
return;
}
var newRecord = {
type: record.type,
data: record.data,
name: record.name
};
if (record.type === 'MX' || record.type === 'SRV') {
newRecord.priority = record.priority;
}
if (record.ttl) {
newRecord.ttl = record.ttl > 300 ? record.ttl : 300;
}
if (record.comment) {
newRecord.comment = record.comment;
}
data.push(newRecord);
});
var requestOptions = {
path: urlJoin(_urlPrefix, zoneId, _recordFragment),
method: 'POST',
body: {
records: data
}
};
self._asyncRequest(requestOptions, function (err, result) {
return err
? callback(err)
: callback(err, result.response.records.map(function (record) {
return new dns.Record(self, record);
}));
});
},
/**
* @name Client.deleteRecord
* @description delete a dns record for a given domain
* @param {object|Number} zone the zone of the record to query for
* @param {object|String} record the record to query for
* @param {Function} callback handles the callback of your api call
*/
deleteRecord: function (zone, record, callback) {
var self = this,
zoneId = zone instanceof dns.Zone ? zone.id : zone,
recordId = record instanceof dns.Record ? record.id : record;
var requestOptions = {
path: urlJoin(_urlPrefix, zoneId, _recordFragment, recordId),
method: 'DELETE'
};
self._asyncRequest(requestOptions, function (err) {
return callback(err);
});
},
/**
* @name Client.deleteRecords
* @description deletes multiple dns records for a given domain
* @param {object|Number} zone the zone of the record to query for
* @param {Array} records the array of ids to delete
* @param {Function} callback handles the callback of your api call
*/
deleteRecords: function (zone, records, callback) {
var self = this,
zoneId = zone instanceof dns.Zone ? zone.id : zone;
var ids = _.map(records, function(record) {
return 'id=' +
(record instanceof dns.Record
? record.id
: record);
});
var requestOptions = {
path: urlJoin(_urlPrefix, zoneId, _recordFragment + '?' + ids.join('&')),
method: 'DELETE'
};
self._asyncRequest(requestOptions, function (err) {
return callback(err);
});
}
};