import { APP_ID } from './../consts'; import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose'; class ServerInfo { @prop({ required: true }) id: number; @prop({ required: true }) name: string; @prop({ required: true }) host: string; @prop({ required: false }) port: number; @prop({ required: true }) status: number; @prop({ required: true }) createTime: Date; @prop({ required: true }) serverType: string; } /** * 游戏字段接口 */ @index({ id: 1 }) @modelOptions({schemaOptions: {id: false}}) export default class Game extends BaseModel { @prop({ required: true }) id: number; @prop({ required: true }) name: string; @prop({ required: true }) nameEn: string; @prop({ required: true }) des: string; @prop({ required: true, type: ServerInfo, default: [] }) serverList: Array; @prop({ required: true }) iconUrl: string; @prop({ required: true }) version: string; @prop({ required: true }) versionCode: number; public static async getAllServerList() { let game: GameType = await GameModel.findOne().lean(); if(game) { return game.serverList; } else { return [] } } public static async getServerListByType(serverType: string) { let game: GameType = await GameModel.findOne().lean(); if (!game) { const serverInfo: ServerInfo = { id: 1, name: '常山少年', host: 'pinus_test.trgame.cn', port: 3014, status: 1, createTime: new Date(), serverType: 'official' }; const iconUrl = `https://download.tgamebox.cn/avatar/${APP_ID}/1.png`; game = await GameModel.findOneAndUpdate( {}, { id: 1, name: '赵云传', nameEn: 'zyz', des: '牛逼的战棋', iconUrl, version: '0.0.1', versionCode: 1, $push: { serverList: serverInfo } }, { upsert: true, new: true }, ).lean(); } console.log(serverType, game); let serverList: Array = game ? game.serverList : []; serverList = serverList.filter(item => { return item.serverType === serverType; }); console.log(serverType, serverList); return serverList; } public static async newServer(serverId: number, serverType: string, name: string, host: string, port: number, status: number, lean = true) { let serverInfo: ServerInfo = {id: serverId, name, host, port, status, createTime: new Date(), serverType}; let game: GameType = await GameModel.findOneAndUpdate({}, {$push: {serverList: serverInfo}}, {new: true}).lean(lean); return game; } } export const GameModel = getModelForClass(Game); export interface GameType extends Pick, keyof Game>{ id: number; };