task-svr/src/models/wallet/ShareCodeRecord.ts
2024-05-15 18:57:22 +08:00

68 lines
1.8 KiB
TypeScript

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<typeof ShareCodeRecordClass>,
code: string,
type: ShareCodeType,
) {
return this.findOne({ code, type, status: ShareCodeStatus.PENDING }).exec()
}
}
export const ShareCodeRecord = getModelForClass(ShareCodeRecordClass, { existingConnection: ShareCodeRecordClass.db })