wallet-svr/src/modules/ShareCodeRecord.ts

81 lines
2.1 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('23456789abcdefghjkmnpqrstuvwxy', 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()
@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 },
})
@pre<ShareCodeRecordClass>('save', async function () {
if (this.code === DEFAULT_SHARE_CODE) {
let exists = false
while (!exists) {
const code = nanoid()
const record = await ShareCodeRecord.findByCode(code, this.type)
if (!record) {
exists = true
this.code = code
}
}
}
})
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 })