// Ours const Now = require('../lib') module.exports = class DomainRecords extends Now { async getRecord(id) { const all = (await this.ls()).entries() for (const [domain, records] of all) { for (const record of records) { if (record.id === id) { record.domain = domain return record } } } return null } async ls(dom) { let domains if (dom) { domains = [dom] } else { const ret = await this.listDomains() domains = ret .filter(x => !x.isExternal) .map(x => x.name) .sort((a, b) => a.localeCompare(b)) } const records = new Map() const bodies = [] for (const domain of domains) { bodies.push( this.retry(async (bail, attempt) => { const url = `/domains/${domain}/records` if (this._debug) { console.time(`> [debug] #${attempt} GET ${url}`) } const res = await this._fetch(url) if (this._debug) { console.timeEnd(`> [debug] #${attempt} GET ${url}`) } const body = await res.json() if (res.status === 404 && body.code === 'not_found') { return bail(new Error(body.message)) } else if (res.status !== 200) { throw new Error(`Failed to get DNS records for domain "${domain}"`) } return body }) ) } const domainList = await Promise.all(bodies) for (const body of domainList) { const index = domainList.indexOf(body) records.set( domains[index], body.records.sort((a, b) => a.slug.localeCompare(b.slug)) ) } return records } create(domain, data) { const url = `/domains/${domain}/records` return this.retry(async (bail, attempt) => { if (this._debug) { console.time(`> [debug] #${attempt} POST ${url}`) } const res = await this._fetch(url, { method: 'POST', body: data }) if (this._debug) { console.timeEnd(`> [debug] #${attempt} POST ${url}`) } const body = await res.json() if (res.status === 400) { return bail( new Error(body.error ? body.error.message : 'Unknown error') ) } else if (res.status === 403) { const err = new Error(`Not authorized to access the domain "${domain}"`) err.userError = true return bail(err) } else if (res.status === 404) { let err if (body.error.code === 'not_found') { err = new Error(`The domain "${domain}" was not found`) err.userError = true return bail(err) } } if (res.status !== 200) { throw new Error(body.error ? body.error.message : 'Unknown error') } return body }) } delete(domain, recordId) { const url = `/domains/${domain}/records/${recordId}` return this.retry(async (bail, attempt) => { if (this._debug) { console.time(`> [debug] #${attempt} DELETE ${url}`) } const res = await this._fetch(url, { method: 'DELETE' }) if (this._debug) { console.timeEnd(`> [debug] #${attempt} DELETE ${url}`) } const body = await res.json() if (res.status === 403) { const err = new Error(`Not authorized to access domain ${domain}`) err.userError = true return bail(err) } else if (res.status === 404) { let err if (body.error.code === 'not_found') { err = new Error(body.error.message) err.userError = true return bail(err) } } if (res.status !== 200) { throw new Error(body.error ? body.error.message : 'Unkown error') } return body }) } }