Files
ZYZ/shared/db/FriendRelation.ts
2021-02-02 14:16:56 +08:00

62 lines
2.3 KiB
TypeScript

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<Role>;
@prop({ required: true, ref: 'FriendRelation', type: mongoose.Schema.Types.ObjectId })
friendShip: Ref<FriendShip>;
}
/**
* 好友系统关系表
*/
@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) {
const result: FriendRelationType = await FriendRelationModel.findOne({ roleId })
.populate('friends.role', ROLE.SHOW_SIMPLE, 'Role')
.populate('friends.friendShip', null, 'FriendShip')
.lean({ getters: true, virtuals: true });
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<DocumentType<FriendRelation>, keyof FriendRelation> { };