⚡ use mongoose autopopulate
This commit is contained in:
parent
25d901e8e1
commit
a6d82b466f
36
package-lock.json
generated
36
package-lock.json
generated
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
});
|
||||
|
||||
|
@ -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
|
||||
|
@ -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"]);
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
@ -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", {
|
||||
|
Loading…
x
Reference in New Issue
Block a user