perf: 插件贡献文档及示例

This commit is contained in:
xiaojunnuo
2024-03-22 00:50:02 +08:00
parent d9efc3d4d8
commit 72fb20abf3
43 changed files with 890 additions and 22 deletions

View File

@@ -0,0 +1,42 @@
import { IsAccess, AccessInput } from "@certd/pipeline";
/**
* 这个注解将注册一个授权配置
* 在certd的后台管理系统中用户可以选择添加此类型的授权
*/
@IsAccess({
name: "demo",
title: "授权插件示例",
desc: "",
})
export class DemoAccess {
/**
* 授权属性配置
*/
@AccessInput({
title: "密钥Id",
component: {
placeholder: "demoKeyId",
},
required: true,
})
demoKeyId = "";
/**
* 授权属性配置
*/
@AccessInput({
//标题
title: "密钥串",
component: {
//input组件的placeholder
placeholder: "demoKeySecret",
},
//是否必填
required: true,
})
//属性名称
demoKeySecret = "";
}
new DemoAccess();

View File

@@ -0,0 +1,79 @@
import _ from "lodash";
import { CreateRecordOptions, IDnsProvider, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert";
import { Autowire, ILogger } from "@certd/pipeline";
import { DemoAccess } from "./access";
// TODO 这里注册一个dnsProvider
@IsDnsProvider({
//注意这里name要跟access的name一致
name: "demo",
title: "Dns提供商Demo",
desc: "demo dns provider示例",
accessType: "demo",
})
export class DemoDnsProvider implements IDnsProvider {
@Autowire()
access!: DemoAccess;
@Autowire()
logger!: ILogger;
async onInstance() {
const access: any = this.access;
this.logger.debug("access",access)
//初始化的操作
//...
}
async getDomainList():Promise<any[]> {
// TODO 这里你要实现一个获取域名列表的方法
const access = this.access
this.logger.debug("access",access)
return []
}
async matchDomain(dnsRecord: string):Promise<any> {
const domainList = await this.getDomainList();
let domainRecord = null;
for (const item of domainList) {
//TODO 根据域名去匹配账户中是否有该域名, 这里不一定是item.name 具体要看你要实现的平台的接口而定
if (_.endsWith(dnsRecord + ".", item.name)) {
domainRecord = item;
break;
}
}
if (!domainRecord) {
this.logger.info("账户中域名列表:",domainList)
this.logger.error("找不到域名,请确认账户中是否真的有此域名")
throw new Error("can not find Domain:"+dnsRecord);
}
return domainRecord;
}
async createRecord(options: CreateRecordOptions): Promise<any> {
const { fullRecord, value, type } = options;
this.logger.info("添加域名解析:", fullRecord, value,type);
//先确定账户中是否有该域名
const domainRecord = await this.matchDomain(fullRecord);
this.logger.debug("matchDomain:",domainRecord)
//TODO 然后调用接口创建txt类型的dns解析记录
// .. 这里调用对应平台的后台接口
const access = this.access
this.logger.debug("access",access)
}
async removeRecord(options: RemoveRecordOptions): Promise<any> {
const { fullRecord, value, record } = options;
this.logger.info("删除域名解析:", fullRecord, value,record);
//TODO 这里调用删除txt dns解析记录接口
const access = this.access
this.logger.debug("access",access)
this.logger.info("删除域名解析成功:", fullRecord, value);
}
}
//TODO 实例化这个provider将其自动注册到系统中
new DemoDnsProvider();

View File

@@ -0,0 +1,3 @@
export * from './dns-provider'
export * from './plugin-test'
export * from './access'

View File

@@ -0,0 +1,87 @@
import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline";
import { CertInfo, CertReader } from "@certd/plugin-cert";
@IsTaskPlugin({
name: "demoTest",
title: "Demo测试插件",
default: {
strategy: {
runStrategy: RunStrategy.SkipWhenSucceed,
},
},
})
export class DemoTestPlugin extends AbstractTaskPlugin {
//测试参数
@TaskInput({
title: "属性示例",
})
text!: string;
//测试参数
@TaskInput({
title: "选择框",
component:{
name:"a-select",
options:[
{value:"1",label:"选项1"},
{value:"2",label:"选项2"},
]
}
})
select!: string;
//测试参数
@TaskInput({
title: "switch",
component:{
name:"a-switch",
}
})
switch!: boolean;
//证书选择,此项必须要有
@TaskInput({
title: "域名证书",
helper: "请选择前置任务输出的域名证书",
component: {
name: "pi-output-selector",
},
required: true,
})
cert!: CertInfo;
//授权选择框
@TaskInput({
title: "demo授权",
helper: "demoAccess授权",
component: {
name: "pi-access-selector",
type: "demoAccess",
},
rules: [{ required: true, message: "此项必填" }],
})
accessId!: string;
accessService!: IAccessService;
logger!: ILogger;
async onInstance() {
this.accessService = this.ctx.accessService;
this.logger = this.ctx.logger;
}
async execute(): Promise<void> {
const { select, text, cert, accessId } = this;
const certReader = new CertReader(cert);
const access = await this.accessService.getById(accessId);
this.logger.debug("access",access)
this.logger.debug("certReader",certReader)
this.logger.info("DemoTestPlugin execute");
this.logger.info( "text:", text);
this.logger.info( "select:", select);
this.logger.info( "switch:", this.switch);
this.logger.info( "授权id:", accessId);
//TODO 这里实现你要部署的执行方法
}
}
//TODO 这里实例化插件,进行注册
new DemoTestPlugin();

View File

@@ -0,0 +1 @@
export * from "./demo"