use mongoose autopopulate

This commit is contained in:
Flam3rboy 2021-04-07 20:26:19 +02:00
parent 25d901e8e1
commit a6d82b466f
8 changed files with 82 additions and 6 deletions

36
package-lock.json generated
View File

@ -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",

View File

@ -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"

View File

@ -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;
});

View File

@ -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

View File

@ -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"]);

View File

@ -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");

View File

@ -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

View File

@ -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", {