import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' import { dbconn } from 'decorators/dbconn' import logger from 'logger/logger' import { TaskSvr } from 'service/task.service' import { BaseModule } from './Base' @dbconn() @index({ transactionHash: 1 }, { unique: true }) @modelOptions({ schemaOptions: { collection: 'schedule_confirm_event', timestamps: true }, }) export class ScheduleConfirmEventClass extends BaseModule { @prop({ required: true }) public address!: string @prop() public event: string @prop({ required: true }) public transactionHash: string @prop() public blockNumber: number @prop() public blockHash: string @prop() public removed: boolean @prop() public operater: string @prop({ type: () => [String] }) public scheduleIds: string[] @prop() public blockTime: number @prop({ default: 0 }) public version: number public static async saveEvent(event: any) { logger.info(JSON.stringify(event)) if (event.removed) { return } const data = { address: event.address, blockNumber: event.blockNumber, removed: event.removed, operater: event.returnValues.sender, scheduleIds: event.returnValues.ids, transactionHash: event.transactionHash, blockTime: new Date(event.timestamp).getTime(), $inc: { version: 1 }, } let record = await ScheduleConfirmEvent.insertOrUpdate({ transactionHash: event.transactionHash }, data) if (record.version === 1) { logger.log('receive events: ' + JSON.stringify(record.scheduleIds)) for (let id of record.scheduleIds) { await new TaskSvr().parseOneSchedule(id) } } return record } } export const ScheduleConfirmEvent = getModelForClass(ScheduleConfirmEventClass, { existingConnection: ScheduleConfirmEventClass['db'], })