From 83543487e7418683bd79cfe3b9e0d792bdb977f7 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Thu, 12 Jun 2025 22:41:08 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81=E9=9B=A8=E4=BA=91dns?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/plugin-rainyun/access.ts | 16 +++- .../plugins/plugin-rainyun/dns-provider.ts | 87 +++++++------------ 2 files changed, 48 insertions(+), 55 deletions(-) diff --git a/packages/ui/certd-server/src/plugins/plugin-rainyun/access.ts b/packages/ui/certd-server/src/plugins/plugin-rainyun/access.ts index 441b9e26..dc5c5cb6 100644 --- a/packages/ui/certd-server/src/plugins/plugin-rainyun/access.ts +++ b/packages/ui/certd-server/src/plugins/plugin-rainyun/access.ts @@ -60,10 +60,24 @@ export class RainyunAccess extends BaseAccess { "domains.Domain": req.query??"" }, } - return await this.doRequest({ + const res = await this.doRequest({ url: `/product/domain/?options=${encodeURIComponent(JSON.stringify(options))}`, method: "GET", }); + + return { + total: res.TotalRecords, + list: res.Records || [] + } + } + + + async getDomainId(domain:string){ + const res = await this.getDomainList({query: domain,size:1}); + if (res.list.length === 0) { + throw new Error(`域名${domain}不存在 ` ); + } + return res.list[0].ID; } async doRequest(req:HttpRequestConfig){ diff --git a/packages/ui/certd-server/src/plugins/plugin-rainyun/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-rainyun/dns-provider.ts index 4d0f9118..ea5adc46 100644 --- a/packages/ui/certd-server/src/plugins/plugin-rainyun/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-rainyun/dns-provider.ts @@ -19,69 +19,48 @@ export class RainyunDnsProvider extends AbstractDnsProvider { async createRecord(options: CreateRecordOptions): Promise { const access: RainyunAccess = this.ctx.access as RainyunAccess - console.log(access) + + const domainId = await access.getDomainId(options.domain); + if (!domainId) { + throw new Error(`域名${options.domain}未找到`); + } + const { fullRecord,hostRecord, value, type, domain } = options; this.logger.info('添加域名解析:', fullRecord, value, domain); - // const domain = await this.matchDomain(fullRecord); - const params = { - RegionId: 'cn-hangzhou', - DomainName: domain, - RR: hostRecord, - Type: type, - Value: value, - // Line: 'oversea' // 海外 - }; - const requestOption = { - method: 'POST', - }; - try { - const ret = await this.client.request('AddDomainRecord', params, requestOption); - this.logger.info('添加域名解析成功:', JSON.stringify(options), ret.RecordId); - return ret.RecordId; - } catch (e: any) { - if (e.code === 'DomainRecordDuplicate') { - return; - } - if(e.code === "LastOperationNotFinished"){ - this.logger.info('上一个操作还未完成,5s后重试') - await this.ctx.utils.sleep(5000) - return this.createRecord(options) - } - this.logger.info('添加域名解析出错', e); - this.resolveError(e, options); - } + const ret = await access.doRequest({ + url: `/product/domain/${domainId}/dns`, + method: 'POST', + data: { + host: hostRecord, + value: value, + type: type, + line: 'DEFAULT', + ttl: 360, + }, + }); + this.logger.info('添加域名解析成功:', JSON.stringify(options), ret.ID); + return { + recordId:ret.ID, + domainId: domainId + }; + } - resolveError(e: any, req: CreateRecordOptions) { - if (e.message?.indexOf('The specified domain name does not exist') > -1) { - throw new Error(`阿里云账号中不存在此域名:${req.domain}`); - } - throw e; - } + async removeRecord(options: RemoveRecordOptions): Promise { const { fullRecord, value } = options.recordReq; + const access: RainyunAccess = this.ctx.access as RainyunAccess const record = options.recordRes; - const params = { - RegionId: 'cn-hangzhou', - RecordId: record, - }; - - const requestOption = { - method: 'POST', - }; - try{ - const ret = await this.client.request('DeleteDomainRecord', params, requestOption); - this.logger.info('删除域名解析成功:', fullRecord, value, ret.RecordId); - return ret.RecordId; - }catch (e) { - if(e.code === "LastOperationNotFinished"){ - this.logger.info('上一个操作还未完成,5s后重试') - await this.ctx.utils.sleep(5000) - return this.removeRecord(options) + const ret = await access.doRequest({ + url: `/product/domain/${record.domainId}/dns`, + method: 'DELETE', + data:{ + record_id: record.recordId } - throw e - } + }); + this.logger.info('删除域名解析成功:', fullRecord, value, ret); + return ret; } }