From 9f21b1a09797d7dab253e4416c538b55fb8f4488 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 23 Jan 2026 18:37:38 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=89=80=E6=9C=89=E7=9A=84dnsprovider?= =?UTF-8?q?=20=E6=94=AF=E6=8C=81=E5=AF=BC=E5=85=A5=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dns-provider/aliesa-dns-provider.ts | 38 ++++++++++++++++++- .../plugin-aws/aws-route53-provider.ts | 7 +++- .../src/plugins/plugin-aws/libs/aws-client.ts | 29 +++++++++++++- .../plugins/plugin-cloudflare/dns-provider.ts | 24 +++++++++++- .../src/plugins/plugin-dnsla/dns-provider.ts | 21 +++++++++- .../src/plugins/plugin-godaddy/access.ts | 2 +- .../plugins/plugin-godaddy/dns-provider.ts | 20 +++++++++- .../dns-provider/huawei-dns-provider.ts | 24 +++++++++++- .../plugins/plugin-jdcloud/dns-provider.ts | 22 ++++++++++- .../plugins/plugin-namesilo/dns-provider.ts | 22 ++++++++++- .../plugins/plugin-rainyun/dns-provider.ts | 22 ++++++++++- 11 files changed, 219 insertions(+), 12 deletions(-) diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliesa-dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliesa-dns-provider.ts index 1673b0285..ccfba855a 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliesa-dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliesa-dns-provider.ts @@ -1,5 +1,5 @@ -import { IAccessService } from '@certd/pipeline'; -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; +import { IAccessService, Pager, PageRes, PageSearch } from '@certd/pipeline'; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; import { AliesaAccess, AliyunAccess } from '../../plugin-lib/aliyun/index.js'; import { AliyunClientV2 } from '../../plugin-lib/aliyun/lib/aliyun-client-v2.js'; @@ -101,6 +101,40 @@ export class AliesaDnsProvider extends AbstractDnsProvider { }) this.logger.info('删除域名解析成功:', record.RecordId); } + + async getDomainListPage(req: PageSearch): Promise> { + const pager = new Pager(req) + const ret = await this.client.doRequest({ + // 接口名称 + action: "ListSites", + // 接口版本 + version: "2024-09-10", + // 接口协议 + protocol: "HTTPS", + // 接口 HTTP 方法 + method: "GET", + authType: "AK", + style: "RPC", + data: { + query: { + SiteName: req.searchKey, + // ["SiteSearchType"] = "exact"; + SiteSearchType: "fuzzy", + AccessType: "NS", + PageSize: pager.pageSize, + PageNumber: pager.pageNo, + } + } + }) + const list = ret.Sites?.map(item => ({ + domain: item.SiteName, + id: item.SiteId, + })) + return { + list: list || [], + total: ret.TotalCount, + } + } } new AliesaDnsProvider(); diff --git a/packages/ui/certd-server/src/plugins/plugin-aws/aws-route53-provider.ts b/packages/ui/certd-server/src/plugins/plugin-aws/aws-route53-provider.ts index 0d0f7d27f..5685e545f 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aws/aws-route53-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aws/aws-route53-provider.ts @@ -1,6 +1,7 @@ -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; import { AwsClient } from './libs/aws-client.js'; import { AwsAccess } from './access.js'; +import { PageRes, PageSearch } from '@certd/pipeline'; @IsDnsProvider({ @@ -57,6 +58,10 @@ export class AwsRoute53Provider extends AbstractDnsProvider { this.logger.warn(`删除域名解析失败:${e.message} : ${hostedZoneId} ${fullRecord} ${value} ${type} `, ); } } + + async getDomainListPage(req: PageSearch): Promise> { + return await this.client.route53ListHostedZonesPage(req); + } } new AwsRoute53Provider(); diff --git a/packages/ui/certd-server/src/plugins/plugin-aws/libs/aws-client.ts b/packages/ui/certd-server/src/plugins/plugin-aws/libs/aws-client.ts index f5db11aee..5b6943ab6 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aws/libs/aws-client.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aws/libs/aws-client.ts @@ -1,9 +1,13 @@ // 导入所需的 SDK 模块 import { AwsAccess } from '../access.js'; -import { CertInfo } from '@certd/plugin-cert'; +import { CertInfo, DomainRecord } from '@certd/plugin-cert'; import { ILogger, utils } from '@certd/basic'; +import { PageRes, PageSearch } from '@certd/pipeline'; type AwsClientOptions = { access: AwsAccess; region: string, logger: ILogger }; +/** + * https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/route-53-domains/ + */ export class AwsClient { options: AwsClientOptions; access: AwsAccess; @@ -77,6 +81,29 @@ export class AwsClient { return response.HostedZones; } + async route53ListHostedZonesPage(req: PageSearch): Promise> { + const { ListHostedZonesByNameCommand } = await import("@aws-sdk/client-route-53"); // ES Modules import + + const client = await this.route53ClientGet(); + const input:any = { // ListHostedZonesByNameRequest + MaxItems: req.pageSize, + }; + if (req.searchKey) { + input.DNSName = req.searchKey; + } + const command = new ListHostedZonesByNameCommand(input); + const response = await this.doRequest(() => client.send(command)); + let list :any[]= response.HostedZones || []; + list = list.map((item: any) => ({ + id: item.Id.replace('/hostedzone/', ''), + domain: item.Name, + })); + return { + total: list.length, + list, + }; + } + async route53ChangeRecord(req: { hostedZoneId: string, fullRecord: string, type: string, value: string, action: "UPSERT" | "DELETE" }) { diff --git a/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts index 3ea917ace..ddd092654 100644 --- a/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts @@ -1,6 +1,7 @@ -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; import { CloudflareAccess } from './access.js'; +import { Pager, PageRes, PageSearch } from '@certd/pipeline'; export type CloudflareRecord = { id: string; @@ -144,6 +145,27 @@ export class CloudflareDnsProvider extends AbstractDnsProvider await this.doRequestApi(url, null, 'delete'); this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},value=${value}`); } + + async getDomainListPage(req: PageSearch): Promise> { + const pager = new Pager(req); + + let url = `https://api.cloudflare.com/client/v4/zones?page=${pager.pageNo}&per_page=${pager.pageSize}`; + if (req.searchKey) { + url += `&name=${req.searchKey}`; + } + const ret = await this.doRequestApi(url, null, 'get'); + + let list = ret.result || [] + list = list.map((item: any) => ({ + id: item.id, + domain: item.name, + })); + const total = ret.result_info.total_count || list.length; + return { + total, + list, + }; + } } //实例化这个provider,将其自动注册到系统中 diff --git a/packages/ui/certd-server/src/plugins/plugin-dnsla/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-dnsla/dns-provider.ts index 536af40c2..8682c2360 100644 --- a/packages/ui/certd-server/src/plugins/plugin-dnsla/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-dnsla/dns-provider.ts @@ -1,6 +1,7 @@ -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; import { DnslaAccess } from "./access.js"; +import { Pager, PageRes, PageSearch } from "@certd/pipeline"; export type DnslaRecord = { id: string; @@ -176,6 +177,24 @@ export class DnslaDnsProvider extends AbstractDnsProvider { await this.doRequestApi(url, null, 'delete'); this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},value=${value}`); } + + async getDomainListPage(req: PageSearch): Promise> { + const pager = new Pager(req); + const url = `/api/domain?pageIndex=${pager.pageNo}&pageSize=${pager.pageSize}`; + const ret = await this.doRequestApi(url, null, 'get'); + + + let list = ret.data.results || [] + list = list.map((item: any) => ({ + id: item.id, + domain: item.domain, + })); + const total = ret.data.total || list.length; + return { + total, + list, + }; + } } //实例化这个provider,将其自动注册到系统中 diff --git a/packages/ui/certd-server/src/plugins/plugin-godaddy/access.ts b/packages/ui/certd-server/src/plugins/plugin-godaddy/access.ts index d8d00af06..2e8e63046 100644 --- a/packages/ui/certd-server/src/plugins/plugin-godaddy/access.ts +++ b/packages/ui/certd-server/src/plugins/plugin-godaddy/access.ts @@ -68,7 +68,7 @@ export class GodaddyAccess extends BaseAccess { const pager = new Pager(opts); const req = { - url :`/v1/domains?limit=${pager.pageSize}`, + url :`/v1/domains?limit=${pager.pageSize}&offset=${pager.getOffset()}`, method: "get", } return await this.doRequest(req); diff --git a/packages/ui/certd-server/src/plugins/plugin-godaddy/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-godaddy/dns-provider.ts index 4c3c9ebca..5aee4d06a 100644 --- a/packages/ui/certd-server/src/plugins/plugin-godaddy/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-godaddy/dns-provider.ts @@ -1,6 +1,7 @@ -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; import { GodaddyAccess } from "./access.js"; +import { Pager, PageRes, PageSearch } from "@certd/pipeline"; export type GodaddyRecord = { domain: string, @@ -84,6 +85,23 @@ export class GodaddyDnsProvider extends AbstractDnsProvider { }) this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},id=${res}`); } + + async getDomainListPage(req: PageSearch): Promise> { + const pager = new Pager(req); + + const ret = await this.access.getDomainList(req) + + let list = ret.zones || [] + list = list.map((item: any) => ({ + id: item.domainId, + domain: item.domain, + })); + const total = list.length === pager.pageSize ? list.length+1: list.length + return { + total, + list, + }; + } } //实例化这个provider,将其自动注册到系统中 diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts index 29468c9e5..658a69837 100644 --- a/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts @@ -1,8 +1,9 @@ import * as _ from "lodash-es"; -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; import { HuaweiAccess } from "../access/index.js"; import { ApiRequestOptions, HuaweiYunClient } from "@certd/lib-huawei"; +import { Pager, PageRes, PageSearch } from "@certd/pipeline"; export type SearchRecordOptions = { zoneId: string; @@ -177,6 +178,27 @@ export class HuaweiDnsProvider extends AbstractDnsProvider { this.logger.info("删除域名解析失败,没有找到解析记录", fullRecord, value); } } + + async getDomainListPage(req: PageSearch): Promise> { + const pager = new Pager(req); + let url = `${this.dnsEndpoint}/v2/zones?offset=${pager.getOffset()}&limit=${pager.pageSize}`; + if (req.searchKey){ + url += `&name=${req.searchKey}` + } + const ret = await this.client.request({ + url, + method: "GET" + }); + let list = ret.zones || [] + list = list.map((item: any) => ({ + id: item.id, + domain: item.name, + })); + return { + total:ret.metadata.total_count || list.length, + list, + }; + } } new HuaweiDnsProvider(); diff --git a/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts index 597cdbada..a7f4bc4e0 100644 --- a/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts @@ -1,5 +1,6 @@ -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; import { JDCloudAccess } from "./access.js"; +import { Pager, PageRes, PageSearch } from "@certd/pipeline"; @IsDnsProvider({ name: "jdcloud", @@ -92,6 +93,25 @@ export class JDCloudDnsProvider extends AbstractDnsProvider { return service; } + async getDomainListPage(req: PageSearch): Promise> { + const pager = new Pager(req); + const service = await this.getJDDomainService(); + const domainRes = await service.describeDomains({ + domainName: req.searchKey, + pageNumber: pager.pageNo, + pageSize: pager.pageSize, + }) + let list = domainRes.result?.dataList || [] + list = list.map((item: any) => ({ + id: item.domainId, + domain: item.domainName, + })); + return { + total:domainRes.result.totalCount || list.length, + list, + }; + } + } new JDCloudDnsProvider(); diff --git a/packages/ui/certd-server/src/plugins/plugin-namesilo/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-namesilo/dns-provider.ts index 693dccb35..01434462a 100644 --- a/packages/ui/certd-server/src/plugins/plugin-namesilo/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-namesilo/dns-provider.ts @@ -1,7 +1,8 @@ -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; import qs from 'qs'; import { NamesiloAccess } from './access.js'; import { merge } from 'lodash-es'; +import { Pager, PageRes, PageSearch } from '@certd/pipeline'; export type NamesiloRecord = { record_id: string; @@ -102,6 +103,25 @@ export class NamesiloDnsProvider extends AbstractDnsProvider { }); this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},value=${value}`); } + + async getDomainListPage(req: PageSearch): Promise> { + + const pager = new Pager(req); + const ret =await this.doRequest('/api/listDomains', { + key:req.searchKey, + page: pager.pageNo, + pageSize: pager.pageSize, + }); + // this.logger.info("获取域名列表成功:", ret); + const list = ret.domains.map((item: any) => ({ + id: item.domain, + domain: item.domain, + })); + return { + total:ret.pager?.total || list.length, + list, + }; + } } //实例化这个provider,将其自动注册到系统中 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 133e37395..216da0bfb 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 @@ -1,5 +1,6 @@ -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; +import { AbstractDnsProvider, CreateRecordOptions, DomainRecord, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert"; import { RainyunAccess } from "./access.js"; +import { Pager, PageRes, PageSearch } from "@certd/pipeline"; @IsDnsProvider({ name: "rainyun", @@ -60,6 +61,25 @@ export class RainyunDnsProvider extends AbstractDnsProvider { this.logger.info("删除域名解析成功:", fullRecord, value, ret); return ret; } + + async getDomainListPage(req: PageSearch): Promise> { + const access: RainyunAccess = this.ctx.access as RainyunAccess; + const pager = new Pager(req); + const ret = await access.getDomainList({ + offset: pager.getOffset(), + limit: pager.pageSize, + query: req.searchKey, + }) + // this.logger.info("获取域名列表成功:", ret); + const list = ret.list.map((item: any) => ({ + id: item.id, + domain: item.domain, + })); + return { + total:ret.total || list.length, + list, + }; + } } new RainyunDnsProvider();