Files
ZYZ/shared/db/GuildTrain.ts
2021-01-23 17:04:25 +08:00

119 lines
4.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
class Reward {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
class TrainBox {
@prop({ required: true })
roleId: string;
@prop({ required: true, type: Reward })
good: Reward;
@prop({ required: true })
index: number;
}
class TrainScript {
@prop({ required: true })
hid: number;
@prop({ required: true })
progress: number;
@prop({ required: true })
time: number;
@prop({ required: true, default: [], type: TrainBox})
trainBoxs: Array<TrainBox>;
}
class Rank {
@prop({ required: true })
roleId: string;
@prop({ required: true })
score: number;
}
class Report {
@prop({ required: true })
roleId: string;
@prop({ required: true })
trainId: number;//挑战的试炼关
@prop({ required: true })
hid: number;//据点
@prop({ required: true })
score: number;
@prop({ required: true })
time: number;
@prop({ required: true })
isSuccessed: boolean;
@prop({ required: true })
type: number;//1表示普通战报 2表示系统战报即被成功压制
}
@index({guildCode:1, trainId:1})
export default class GuildTrain extends BaseModel {
@prop({ required: true })
guildCode: string;
@prop({ required: true })
trainId: number;
@prop({ required: true })
isComplete: boolean;
@prop({ required: true, default: [], type: TrainScript})
trainScripts: Array<TrainScript>;
@prop({ required: true, default: [], type: Rank })
ranks: Array<Rank>;
@prop({ required: true, default: [], type: Report })
reports: Array<Report>;
@prop({ required: true, default: false})
locked: boolean;
public static async findGuildTrain(guildCode: string, select?: string, locked = false, lean = true) {
const guildTrains: GuildTrainType[] = await GuildTrainModel.find({ guildCode, locked }).select(select).lean(lean);
return guildTrains;
}
public static async findGuildTrainByTrainIds(guildCode: string, trainIds:Array<number>, locked = false, lean = true) {
const guildTrains: GuildTrainType[] = await GuildTrainModel.find({ trainId:{ $in:trainIds}, guildCode, locked }).lean(lean);
return guildTrains;
}
public static async findTrainByTrainIdNotLock(guildCode: string, trainId: number, select?: string, locked = false, lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOne({ guildCode, trainId, locked }).select(select).lean(lean);
return guildTrain;
}
public static async updateGuildTrain(guildCode: string, trainId: number, update: GuildTrainTypeParam, lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId}, { $set: update }).lean(lean);
return guildTrain;
}
public static async updateGuildTrainProgress(guildCode: string, trainId: number, hid:number, progress: number, ranks:Array<Rank>, reports: Array<Report>, isComplete: boolean,lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId, 'trainScripts.hid':hid},
{ $set: {'trainScripts.$.progress': progress, ranks, reports, isComplete} }).lean(lean);
return guildTrain;
}
public static async openGuildTrain(guildCode: string, trainId: number, trainScripts: Array<TrainScript>, lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId },{ trainId, reports: [], locked: false, ranks: [], trainScripts, isComplete: false, guildCode}, {new: true, upsert: true}).lean(lean);
return guildTrain;
}
public static async findTrainScriptBoxByIndex(guildCode: string, roleId: string, trainId: number, hid: number, index: number, progress: number, time, locked = false, lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOne({ guildCode, trainId, locked, 'trainScripts.hid': hid,
'trainScripts.index':{$ne:index },'trainScripts.roleId':{$ne:roleId }, progress: {$gte: progress}, time:{$gte: time}}).lean(lean);
return guildTrain;
}
public static async receiveBoxByIndex(guildCode: string, roleId: string, trainId: number, hid: number, index: number, good: Reward, locked = false, lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId, locked, 'trainScripts.hid': hid, },
{ $push:{ 'trainScripts.$.trainBoxs': {roleId, index, good} }} ).lean(lean);
return guildTrain;
}
}
export const GuildTrainModel = getModelForClass(GuildTrain);
export interface GuildTrainType extends Pick<DocumentType<GuildTrain>, keyof GuildTrain> { };
export type GuildTrainTypeParam = Partial<GuildTrainType>; // 将所有字段变成可选项