chain-client/src/models/RequestTask.ts
2023-04-06 09:57:49 +08:00

115 lines
2.9 KiB
TypeScript

import { getModelForClass, DocumentType, modelOptions, mongoose, prop, Severity } from '@typegoose/typegoose'
import { BlockChain } from 'chain/BlockChain'
import { dbconn } from 'decorators/dbconn'
import logger from 'logger/logger'
import { BaseModule } from './Base'
export enum TaskType {
UNKNOW = 0,
MINT_FT = 1,
MINT_NFT = 2,
TRANSFER_FT = 3,
TRANSFER_NFT = 4,
MINT_PRESALE_BOX = 5,
}
export enum ReqTaskStatus {
NOTSTART = 0,
PEDING = 1,
WAIT_CONFIRM = 2,
SUCCESS = 3,
REVERT = 8,
ERROR = 9,
}
@dbconn()
@modelOptions({
schemaOptions: { collection: 'chain_request_task', timestamps: true },
options: { allowMixed: Severity.ALLOW },
})
export class RequestTaskClass extends BaseModule {
@prop({ required: true })
public taskId!: string
@prop({ required: true })
public chainTaskId!: string
@prop({ enum: TaskType, default: TaskType.UNKNOW })
public taskType: TaskType
@prop({ required: true, default: 0 })
public tryCount: number
@prop({ required: true, default: 0 })
public maxTryCount: number
/**
* address: string
*/
@prop({ type: mongoose.Schema.Types.Mixed })
public reqData: any
@prop({ enum: ReqTaskStatus, default: ReqTaskStatus.NOTSTART })
public status: ReqTaskStatus
@prop({ required: true, default: true })
public newRecord: boolean
@prop()
public startTime: number
@prop()
public endTime: number
@prop()
public txHash: string
/**
* 添加时的block num
*/
@prop()
public blockAdd: number
/**
* 请求时的block num
*/
@prop()
public blockReq: number
@prop({ type: mongoose.Schema.Types.Mixed, default: [] })
public errMsg: any[]
public async requestChain(this: DocumentType<RequestTaskClass>) {
let result
let self = this
self.blockReq = new BlockChain().currentBlockNum
await self.save()
switch (self.taskType) {
case TaskType.MINT_FT:
result = await new BlockChain().erc20Reactor.mint(self.reqData)
break
case TaskType.MINT_NFT:
result = await new BlockChain().erc721Reactor.batchMint(self.reqData)
break
case TaskType.TRANSFER_FT:
result = await new BlockChain().erc20Reactor.transfer(self.reqData)
break
case TaskType.TRANSFER_NFT:
result = await new BlockChain().erc721Reactor.transfer(self.reqData)
break
case TaskType.MINT_PRESALE_BOX:
result = await new BlockChain().erc721Reactor.mintOne(self.reqData)
break
}
logger.info(result)
let { transactionHash } = result
self.txHash = transactionHash
self.status = ReqTaskStatus.WAIT_CONFIRM
await self.save()
}
public static async allUnFinishedTask(chainTaskId: string) {
return RequestTask.find({ chainTaskId, status: { $ne: ReqTaskStatus.SUCCESS } })
}
}
export const RequestTask = getModelForClass(RequestTaskClass, { existingConnection: RequestTaskClass['db'] })