'use strict'; var defaults = { baseUrl: 'https://dns.api.gandi.net/api/v5/' }; module.exports.create = function(config) { var baseUrl = (config.baseUrl || defaults.baseUrl).replace(/\/$/, ''); var authtoken = config.token; var request; return { init: function(opts) { request = opts.request; return null; }, zones: function(opts) { console.log(opts); return request({ method: 'GET', url: baseUrl + '/zones', headers: { 'X-Api-Key': authtoken }, json: true }).then(function(resp) { return resp.body.map(function(zone) { return zone.name; }); }); }, set: function(opts) { console.log(opts); return request({ method: 'GET', url: baseUrl + '/domains/' + opts.challenge.dnsZone + '/records/' + opts.challenge.dnsPrefix + '/TXT', headers: { 'X-Api-Key': authtoken }, json: true }).then(function(resp) { if (resp.body.cause === 'Not Found') { return request({ method: 'POST', url: baseUrl + '/domains/' + opts.challenge.dnsZone + '/records', headers: { 'X-Api-Key': authtoken }, json: { rrset_name: opts.challenge.dnsPrefix, rrset_type: 'TXT', rrset_ttl: 300, rrset_values: [opts.challenge.dnsAuthorization] } }); } else { const body = resp.body; let value = body.rrset_values.map(x => JSON.parse(x)); if (body.rrset_values) { return request({ method: 'PUT', url: baseUrl + '/domains/' + opts.challenge.dnsZone + '/records/' + opts.challenge.dnsPrefix + '/TXT', headers: { 'X-Api-Key': authtoken }, json: { rrset_ttl: 300, rrset_values: value.concat([ opts.challenge.dnsAuthorization ]) } }); } } }); }, remove: function(opts) { console.log(opts); return request({ method: 'DELETE', url: baseUrl + '/domains/' + opts.challenge.dnsZone + '/records/' + opts.challenge.dnsPrefix + '/TXT', headers: { 'X-Api-Key': authtoken }, json: true }); }, get: function(opts) { console.log(opts); return request({ method: 'GET', url: baseUrl + '/domains/' + opts.challenge.dnsZone + '/records/' + opts.challenge.dnsPrefix, headers: { 'X-Api-Key': authtoken }, json: true }).then(function(resp) { const body = resp.body; if (body.length > 0) { let value = body[0].rrset_values .map(x => JSON.parse(x)) .filter( field => field === opts.challenge.dnsAuthorization ); if (value !== []) { return { dnsAuthorization: value[0] }; } else { return null; } } else { return null; } }); } }; };