import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose'; import Role, { RoleType } from './Role'; import FriendShip, { FriendShipType } from './FriendShip'; import { ROLE } from '../consts'; class Relation { @prop({ required: true, default: '' }) roleId: string; // 对方玩家id @prop({ required: true, ref: 'Role', type: mongoose.Schema.Types.ObjectId }) role: Ref; @prop({ required: true, ref: 'FriendRelation', type: mongoose.Schema.Types.ObjectId }) friendShip: Ref; } /** * 好友系统关系表 */ @index({ roleId: 1, createdAt: -1 }) export default class FriendRelation extends BaseModel { @prop({ required: true, default: '' }) roleId: string; // 操作玩家本人id @prop({ required: true, default: [], type: Relation, _id: false }) friends: Relation[]; // 好友列表 @prop({ required: true, default: [], type: Relation, _id: false }) blacklist: Relation[]; // 黑名单列表 // 创建 public static async addFriend(roleId: string, friend: RoleType, friendShip: FriendShipType) { const result: FriendRelationType = await FriendRelationModel.findOneAndUpdate( { roleId }, { $setOnInsert: { blacklist: [] }, $push: { friends: { roleId: friend.roleId, role: friend._id, friendShip: friendShip._id } } }, { upsert: true, new: true }).lean(); return result; } // 获取列表 public static async findFriendByRole(roleId: string, populate = true) { let document = FriendRelationModel.findOne({ roleId }) .lean({ getters: true, virtuals: true }); if (populate) { document .populate('friends.role', ROLE.SHOW_SIMPLE, 'Role') .populate('friends.friendShip', null, 'FriendShip'); } let result: FriendRelationType = await document; return result; } public static async deleteAccount(roleId: string) { let result = await FriendRelationModel.deleteMany({ roleId }); await FriendRelationModel.updateMany({}, { $pull: { friends: { roleId }, blacklist: { roleId } }}); return result; } } export const FriendRelationModel = getModelForClass(FriendRelation); export interface FriendRelationType extends Pick, keyof FriendRelation> { };