import BaseModel from './BaseModel'; import { getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { nowSeconds } from '../pubUtils/timeUtil'; class RewardInter { @prop({ required: true }) id: number; @prop({ required: true }) count: number; } class SendRole { @prop({ required: true }) roleId: string; } export default class GMMail extends BaseModel { @prop({ required: true }) serverId: number; @prop({ required: true, type: SendRole, default:[], _id: false }) sendRoles: SendRole[]; @prop({ required: true, type: RewardInter, default: [], _id: false }) goods: RewardInter[]; @prop({ required: true, default: nowSeconds() }) sendTime: number; @prop({ required: true }) endTime: number; @prop({ required: true }) content: string; @prop({ required: true }) sendName: string; @prop({ required: true }) gmMailType: number; //1:群体邮件,2:分服务器邮件 public static async addMail(params: {serverId: number, sendRoles: SendRole[], sendName: string, endTime: number, content: string, gmMailType: number, sendTime?: number, goods?: RewardInter[] }, lean = true) { const doc = new GMMailModel(); let mail = Object.assign(doc.toJSON(), params); mail = await GMMailModel.findOneAndUpdate({ _id: mail._id }, { $set: mail }, {upsert: true, new: true}).lean(lean); return mail; } public static async getGmMailById(_id: string, lean = true) { const result: GMMailType = await GMMailModel.findOne({ _id }).lean(lean); return result; } public static async getMail(updatedMailAt: number, lean = true) { const result: GMMailType[] = await GMMailModel.find({ $or: [{updatedAt: { $gte: new Date(updatedMailAt) }}, {sendTime: { $lte: nowSeconds() }}], endTime: { $gte: nowSeconds()} }).lean(lean); return result; } public static async getMails( lean = true) { const result: GMMailType[] = await GMMailModel.find({ endTime: { $gte: nowSeconds() }}).lean(lean); return result; } } export const GMMailModel = getModelForClass(GMMail); export interface GMMailType extends Pick, keyof GMMail> { };