From eb484fe163d93e02b57ab6957b2a0794e14a91a6 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Thu, 2 Sep 2021 15:24:17 +0530 Subject: [PATCH] mx: adds automatic priority for mx record lists + publishing --- scripts/register-domains.js | 9 +++++---- tests/domain-service.test.js | 26 +++++++++++++++----------- tests/register.test.js | 22 ++++++++++++++-------- utils/domain-service.js | 3 ++- utils/lib/cpanel.js | 1 - 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/scripts/register-domains.js b/scripts/register-domains.js index 1cefbda7f..cba514b01 100644 --- a/scripts/register-domains.js +++ b/scripts/register-domains.js @@ -10,18 +10,19 @@ const toHostList = R.chain(data => { const rs = getRecords(data.record); return R.chain(([recordType, urls]) => - (Array.isArray(urls) ? urls : [urls]).map(url => ({ + (Array.isArray(urls) ? urls : [urls]).map((url, index) => ({ name: data.name, type: recordType, address: (recordType === 'CNAME' ? `${url}`.toLowerCase() : `${url}`).replace(/\/$/g, ''), ttl: TTL, + ...(recordType === 'MX' ? { priority: index + 20 } : {}) })) - , rs); + , rs); }); -const registerDomains = async ({ domainService, getDomains, log = () => {} }) => { +const registerDomains = async ({ domainService, getDomains, log = () => { } }) => { const domains = await getDomains().then(toHostList); - + if (domains.length === 0) return Promise.reject(new Error('Nothing to register')); diff --git a/tests/domain-service.test.js b/tests/domain-service.test.js index d51c0916f..88ef8aa15 100644 --- a/tests/domain-service.test.js +++ b/tests/domain-service.test.js @@ -1,6 +1,6 @@ const R = require('ramda'); const { getDomainService, diffRecords } = require('../utils/domain-service'); -const {DOMAIN_DOMAIN} = require('../utils/constants'); +const { DOMAIN_DOMAIN } = require('../utils/constants'); const getCpanel = ({ zone, addZone, removeZone, redir, addRedir, removeRedir } = {}) => ({ zone: { @@ -115,16 +115,18 @@ describe('Domain service', () => { const addRedir = jest.fn(async () => ({})); const removeRedir = jest.fn(async () => ({})); - const mockDS = ({ zones, redirections }) => getDomainService({ cpanel: getCpanel({ - zone: async () => zones, - redir: async () => redirections, - addZone, - addRedir, - removeZone, - removeRedir, - }) }); + const mockDS = ({ zones, redirections }) => getDomainService({ + cpanel: getCpanel({ + zone: async () => zones, + redir: async () => redirections, + addZone, + addRedir, + removeZone, + removeRedir, + }) + }); - const getRecordCalls = recfn => recfn.mock.calls.map(R.head).map(R.pick(['name', 'type', 'address', 'redirect', 'domain', 'line'])); + const getRecordCalls = recfn => recfn.mock.calls.map(R.head).map(R.pick(['name', 'type', 'address', 'redirect', 'domain', 'line', 'priority'])); beforeEach(() => { addZone.mockClear(); @@ -187,11 +189,13 @@ describe('Domain service', () => { { name: 'a', type: 'CNAME', address: 'boo' }, { name: 'b', type: 'CNAME', address: 'goo' }, { name: 'c', type: 'A', address: '12.131321.213' }, + { name: 'c', type: 'MX', address: 'foobar.com', priority: 2 }, ]); - expect(addZone).toBeCalledTimes(1); + expect(addZone).toBeCalledTimes(2); expect(getRecordCalls(addZone)).toEqual([ { name: 'c', type: 'A', address: '12.131321.213' }, + { name: 'c', type: 'MX', address: 'foobar.com', priority: 2 }, ]); expect(removeZone).toBeCalledTimes(0); }); diff --git a/tests/register.test.js b/tests/register.test.js index 68c15e5be..70b69ba4a 100644 --- a/tests/register.test.js +++ b/tests/register.test.js @@ -22,6 +22,7 @@ describe('toHostList', () => { { name: 'akshay', record: { CNAME: 'phenax.github.io' } }, { name: 'foobar', record: { CNAME: 'v.io' } }, { name: 'xx', record: { A: ['1.2.3.4', '5.6.3.2', '1.2.31.1'] } }, + { name: 'xx', record: { CNAME: 'foobar.com', MX: ['as.com', 'f.com'] } }, ]); expect(res).toEqual([ @@ -30,6 +31,9 @@ describe('toHostList', () => { { name: 'xx', type: 'A', address: '1.2.3.4', ttl: TTL }, { name: 'xx', type: 'A', address: '5.6.3.2', ttl: TTL }, { name: 'xx', type: 'A', address: '1.2.31.1', ttl: TTL }, + { name: 'xx', type: 'CNAME', address: 'foobar.com', ttl: TTL }, + { name: 'xx', type: 'MX', address: 'as.com', priority: 20, ttl: TTL }, + { name: 'xx', type: 'MX', address: 'f.com', priority: 21, ttl: TTL }, ]); }); }); @@ -40,14 +44,16 @@ describe('registerDomains', () => { const addRedir = jest.fn(async () => ({})); const removeRedir = jest.fn(async () => ({})); - const mockDS = ({ zones, redirections }) => getDomainService({ cpanel: getCpanel({ - zone: async () => zones, - redir: async () => redirections, - addZone, - addRedir, - removeZone, - removeRedir, - }) }); + const mockDS = ({ zones, redirections }) => getDomainService({ + cpanel: getCpanel({ + zone: async () => zones, + redir: async () => redirections, + addZone, + addRedir, + removeZone, + removeRedir, + }) + }); beforeEach(() => { addZone.mockClear(); diff --git a/utils/domain-service.js b/utils/domain-service.js index 55ea3adb3..14ebf3730 100644 --- a/utils/domain-service.js +++ b/utils/domain-service.js @@ -12,11 +12,12 @@ const recordToRedirection = ({ name, address }) => ({ redirect_wildcard: 1, redirect_www: 1, }); -const recordToZone = ({ name, type, address, id }) => ({ +const recordToZone = ({ name, type, address, id, priority }) => ({ line: id, name, type, address, + ...(type === 'MX' ? { priority } : {}), ...(type === 'CNAME' ? { cname: address } : {}), ...(type === 'TXT' ? { txtdata: address } : {}), }); diff --git a/utils/lib/cpanel.js b/utils/lib/cpanel.js index b45b20ecd..542d6c98f 100644 --- a/utils/lib/cpanel.js +++ b/utils/lib/cpanel.js @@ -4,7 +4,6 @@ const qs = require('qs'); const { DOMAIN_API_HOST, DOMAIN_API_PORT, DOMAIN_USER, DOMAIN_API_KEY, DOMAIN_DOMAIN } = require('../constants'); const CpanelClient = (options) => { - // TODO: Make defaultQuery functional const api = ({ basePath = '', action = '' }) => (module, func, defaultQuery = {}) => (q = {}) => { const query = { ...defaultQuery,