import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose'; import Role from './Role'; import { genCode } from '../pubUtils/util'; import { GUILD_STRUCTURE, GUILD_STATUS } from '../consts'; class Structure { @prop({ required: true }) id: number; @prop({ required: true }) lv: number; } @index({ roleId: 1 }) export default class Guild extends BaseModel { @prop({ required: true }) code: string; @prop({ required: true }) name: string; @prop({ required: true }) icon: number; @prop({ required: true, default: 1 }) lv: number; @prop({ required: true, default: 0 }) peopleNum: number; @prop({ required: true }) leader: Ref; @prop({ required: true, default: true }) isAuto: boolean; @prop({ required: true, default: 0 }) ceCondition: number; @prop({ required: true, default: '' }) notice: string; @prop({ required: true, default: '' }) introduce: string; @prop({ required: true, default: 0 }) fund: number; @prop({ required: true, default: 0 }) activeDaily: number; @prop({ required: true, default: new Date() }) refTimeDaily: number; @prop({ required: true, default: new Date() }) refTimeWeekly: number; @prop({ required: true, default: 0 }) ce: number; // 总战力 @prop({ required: true, type: String, default: [] }) members: string[]; // 军团成员的roleId,用于增加战力的时候加入总战力 @prop({ required: true, type: Structure, default: getInitStructure(), _id: false }) structure: Structure[] @prop({ required: true, default: GUILD_STATUS.RUNNING, enum: GUILD_STATUS }) status: number; public static async createGuild(params: CreateParam) { const doc = new GuildModel(); const update = Object.assign(doc.toJSON(), params); delete update._id; const code = genCode(6); const result: GuildType = await GuildModel.findOneAndUpdate({ code }, update, { upsert: true, new: true }) .select('code name icon notice introduce lv fund peopleNum manageNum activeDaily activeWeekly ceCondition isAuto leader structure') .populate('leader', 'name sHid headHid lv updatedAt', 'Role') .lean(); return result; } public static async checkName(name: string) { const result = await GuildModel.findOne({ name, status: 1 }).lean(); return !!result; } } export const GuildModel = getModelForClass(Guild); export interface GuildType extends Pick, keyof Guild> { }; export type GuildUpdateParam = Partial; // 将所有字段变成可选项 type CreateParam = Pick function getInitStructure() { let structure = new Array(); for (let id = GUILD_STRUCTURE.START; id < GUILD_STRUCTURE.END; id++) { structure.push({ id, lv: 1 }); } return structure; }