68 lines
1.8 KiB
TypeScript
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 })
|