diff --git a/src/models/Guild.ts b/src/models/Guild.ts
index d3f098ea..aa520329 100644
--- a/src/models/Guild.ts
+++ b/src/models/Guild.ts
@@ -96,12 +96,14 @@ GuildSchema.virtual("channels", {
localField: "id",
foreignField: "guild_id",
justOne: false,
+ autopopulate: true,
});
GuildSchema.virtual("roles", {
ref: RoleModel,
localField: "id",
foreignField: "guild_id",
justOne: false,
+ autopopulate: true,
});
// nested populate is needed for member users: https://gist.github.com/yangsu/5312204
@@ -117,6 +119,7 @@ GuildSchema.virtual("emojis", {
localField: "id",
foreignField: "guild_id",
justOne: false,
+ autopopulate: true,
});
GuildSchema.virtual("joined_at", {
@@ -125,7 +128,6 @@ GuildSchema.virtual("joined_at", {
foreignField: "guild_id",
justOne: true,
}).get((member: any, virtual: any, doc: any) => {
- console.log("get", member, this);
return member.joined_at;
});
diff --git a/src/models/Member.ts b/src/models/Member.ts
index fc9d5b99..52151235 100644
--- a/src/models/Member.ts
+++ b/src/models/Member.ts
@@ -1,7 +1,19 @@
-import { PublicUser, User, UserModel } from "./User";
+import { PublicUser, PublicUserProjection, User, UserModel } from "./User";
import { Schema, Types, Document } from "mongoose";
import db from "../util/Database";
+export const PublicMemberProjection = {
+ id: true,
+ guild_id: true,
+ nick: true,
+ roles: true,
+ joined_at: true,
+ pending: true,
+ deaf: true,
+ mute: true,
+ premium_since: true,
+};
+
export interface Member {
id: string;
guild_id: string;
@@ -80,6 +92,9 @@ MemberSchema.virtual("user", {
localField: "id",
foreignField: "id",
justOne: true,
+ autopopulate: {
+ select: PublicUserProjection,
+ },
});
// @ts-ignore
diff --git a/src/models/Message.ts b/src/models/Message.ts
index ee038f97..15ff57d3 100644
--- a/src/models/Message.ts
+++ b/src/models/Message.ts
@@ -1,7 +1,7 @@
import { Schema, Types, Document } from "mongoose";
import db from "../util/Database";
-import { PublicUser, UserModel } from "./User";
-import { MemberModel, PublicMember } from "./Member";
+import { PublicUser, PublicUserProjection, UserModel } from "./User";
+import { MemberModel, PublicMember, PublicMemberProjection } from "./Member";
import { Role, RoleModel } from "./Role";
import { Channel } from "./Channel";
@@ -229,6 +229,14 @@ export const MessageSchema = new Schema({
channel_id: String,
guild_id: String,
},
+ // virtual:
+ // author: {
+ // ref: UserModel,
+ // localField: "author_id",
+ // foreignField: "id",
+ // justOne: true,
+ // autopopulate: { select: { id: true, user_data: false } },
+ // },
});
MessageSchema.virtual("author", {
@@ -236,6 +244,7 @@ MessageSchema.virtual("author", {
localField: "author_id",
foreignField: "id",
justOne: true,
+ autopopulate: { select: PublicUserProjection },
});
MessageSchema.virtual("member", {
@@ -250,6 +259,7 @@ MessageSchema.virtual("mentions", {
localField: "mention_user_ids",
foreignField: "id",
justOne: false,
+ autopopulate: { select: PublicUserProjection },
});
MessageSchema.virtual("mention_roles", {
@@ -257,6 +267,7 @@ MessageSchema.virtual("mention_roles", {
localField: "mention_role_ids",
foreignField: "id",
justOne: false,
+ autopopulate: true,
});
MessageSchema.virtual("mention_channels", {
@@ -264,6 +275,7 @@ MessageSchema.virtual("mention_channels", {
localField: "mention_channel_ids",
foreignField: "id",
justOne: false,
+ autopopulate: { select: { id: true, guild_id: true, type: true, name: true } },
});
MessageSchema.set("removeResponse", ["mention_channel_ids", "mention_role_ids", "mention_user_ids", "author_id"]);
diff --git a/src/models/Role.ts b/src/models/Role.ts
index adb75b0a..84ad55d0 100644
--- a/src/models/Role.ts
+++ b/src/models/Role.ts
@@ -34,6 +34,7 @@ export const RoleSchema = new Schema({
bot_id: String,
},
});
+RoleSchema.set("removeResponse", ["guild_id"]);
// @ts-ignore
export const RoleModel = db.model<RoleDocument>("Role", RoleSchema, "roles");
diff --git a/src/models/User.ts b/src/models/User.ts
index 76251e09..1f01e837 100644
--- a/src/models/User.ts
+++ b/src/models/User.ts
@@ -3,6 +3,13 @@ import { ClientStatus, Status } from "./Status";
import { Schema, Types, Document } from "mongoose";
import db from "../util/Database";
+export const PublicUserProjection = {
+ username: true,
+ discriminator: true,
+ id: true,
+ public_flags: true,
+ avatar: true,
+};
export interface User {
id: string;
username: string; // username max length 32, min 2
diff --git a/src/models/index.ts b/src/models/index.ts
index 03b9fe70..876e5984 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -1,5 +1,8 @@
import mongoose from "mongoose";
import { Schema } from "mongoose";
+import mongooseAutoPopulate from "mongoose-autopopulate";
+
+mongoose.plugin(mongooseAutoPopulate);
mongoose.plugin((schema: Schema, opts: any) => {
schema.set("toObject", {
|