diff --git a/package-lock.json b/package-lock.json
index 902566ed..17d70c4a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,10 +13,12 @@
"lambert-db": "^1.1.7",
"missing-native-js-functions": "^1.2.2",
"mongodb": "^3.6.6",
- "mongoose": "^5.12.3"
+ "mongoose": "^5.12.3",
+ "mongoose-autopopulate": "^0.12.3"
},
"devDependencies": {
"@types/jsonwebtoken": "^8.5.0",
+ "@types/mongoose-autopopulate": "^0.10.1",
"@types/mongoose-lean-virtuals": "^0.5.1",
"@types/node": "^14.14.25",
"typescript": "^4.1.3"
@@ -58,6 +60,15 @@
"@types/node": "*"
}
},
+ "node_modules/@types/mongoose-autopopulate": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@types/mongoose-autopopulate/-/mongoose-autopopulate-0.10.1.tgz",
+ "integrity": "sha512-L67MAIE3WEoTtt7a7/spRYk+76lgp67FAP6I38Y9NcC1kQuzwqnukTaJzodfb8180wxHZM4qt68u6x6ptuDRaQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/mongoose": "*"
+ }
+ },
"node_modules/@types/mongoose-lean-virtuals": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@types/mongoose-lean-virtuals/-/mongoose-lean-virtuals-0.5.1.tgz",
@@ -720,6 +731,14 @@
"url": "https://opencollective.com/mongoose"
}
},
+ "node_modules/mongoose-autopopulate": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/mongoose-autopopulate/-/mongoose-autopopulate-0.12.3.tgz",
+ "integrity": "sha512-yNmYsfi6OpS/GQ+48mkB0KQ199ExHmmPrt3wt3fyxPHPMtEBGts7yq3wBQR6VgKCPOQaKvCI1URbJCPOtrPeLw==",
+ "peerDependencies": {
+ "mongoose": "4.x || 5.x"
+ }
+ },
"node_modules/mongoose-legacy-pluralize": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
@@ -1194,6 +1213,15 @@
"@types/node": "*"
}
},
+ "@types/mongoose-autopopulate": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@types/mongoose-autopopulate/-/mongoose-autopopulate-0.10.1.tgz",
+ "integrity": "sha512-L67MAIE3WEoTtt7a7/spRYk+76lgp67FAP6I38Y9NcC1kQuzwqnukTaJzodfb8180wxHZM4qt68u6x6ptuDRaQ==",
+ "dev": true,
+ "requires": {
+ "@types/mongoose": "*"
+ }
+ },
"@types/mongoose-lean-virtuals": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@types/mongoose-lean-virtuals/-/mongoose-lean-virtuals-0.5.1.tgz",
@@ -1694,6 +1722,12 @@
}
}
},
+ "mongoose-autopopulate": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/mongoose-autopopulate/-/mongoose-autopopulate-0.12.3.tgz",
+ "integrity": "sha512-yNmYsfi6OpS/GQ+48mkB0KQ199ExHmmPrt3wt3fyxPHPMtEBGts7yq3wBQR6VgKCPOQaKvCI1URbJCPOtrPeLw==",
+ "requires": {}
+ },
"mongoose-legacy-pluralize": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
diff --git a/package.json b/package.json
index b92228ff..9bf8cd16 100644
--- a/package.json
+++ b/package.json
@@ -24,10 +24,12 @@
"lambert-db": "^1.1.7",
"missing-native-js-functions": "^1.2.2",
"mongodb": "^3.6.6",
- "mongoose": "^5.12.3"
+ "mongoose": "^5.12.3",
+ "mongoose-autopopulate": "^0.12.3"
},
"devDependencies": {
"@types/jsonwebtoken": "^8.5.0",
+ "@types/mongoose-autopopulate": "^0.10.1",
"@types/mongoose-lean-virtuals": "^0.5.1",
"@types/node": "^14.14.25",
"typescript": "^4.1.3"
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", {
|