import { getModelForClass, index, modelOptions, pre, prop, ReturnModelType } from '@typegoose/typegoose' import { dbconn } from 'decorators/dbconn' import { BaseModule } from '../Base' import { customAlphabet } from 'nanoid' const nanoid = customAlphabet('1234567890', 8) export const DEFAULT_SHARE_CODE = '00000000' export const DEFAULT_EXPIRE_TIME = 5 * 60 * 1000 export enum ShareCodeType { BIND_UAW = 1, // uaw 绑定 } export enum ShareCodeStatus { PENDING = 1, SUCCESS = 2, FAIL = 3, EXPIRED = 4, } /** * 分享码记录 */ @dbconn('wallet') @index({ type: 1, code: 1 }, { unique: true, partialFilterExpression: { status: 1 } }) @index({ account: 1, type: 1, status: 1 }, { unique: true, partialFilterExpression: { status: 1 } }) @index({ expiredAt: 1, status: 1 }, { unique: false }) @modelOptions({ schemaOptions: { collection: 'share_code_record', timestamps: true }, }) class ShareCodeRecordClass extends BaseModule { @prop({ required: true }) public account: string @prop({ required: true }) public openId: string @prop() public email?: string @prop({ required: true }) public plat: string @prop({ required: true }) public code!: string @prop({ default: Date.now() + DEFAULT_EXPIRE_TIME }) public expiredAt?: number @prop({ required: true, default: ShareCodeType.BIND_UAW }) public type: ShareCodeType @prop({ required: true, default: ShareCodeStatus.PENDING }) public status: ShareCodeStatus public static async findByCode( this: ReturnModelType, code: string, type: ShareCodeType, ) { return this.findOne({ code, type, status: ShareCodeStatus.PENDING }).exec() } } export const ShareCodeRecord = getModelForClass(ShareCodeRecordClass, { existingConnection: ShareCodeRecordClass.db })