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", "lambert-db": "^1.1.7",
"missing-native-js-functions": "^1.2.2", "missing-native-js-functions": "^1.2.2",
"mongodb": "^3.6.6", "mongodb": "^3.6.6",
"mongoose": "^5.12.3" "mongoose": "^5.12.3",
"mongoose-autopopulate": "^0.12.3"
}, },
"devDependencies": { "devDependencies": {
"@types/jsonwebtoken": "^8.5.0", "@types/jsonwebtoken": "^8.5.0",
"@types/mongoose-autopopulate": "^0.10.1",
"@types/mongoose-lean-virtuals": "^0.5.1", "@types/mongoose-lean-virtuals": "^0.5.1",
"@types/node": "^14.14.25", "@types/node": "^14.14.25",
"typescript": "^4.1.3" "typescript": "^4.1.3"
@ -58,6 +60,15 @@
"@types/node": "*" "@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": { "node_modules/@types/mongoose-lean-virtuals": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/@types/mongoose-lean-virtuals/-/mongoose-lean-virtuals-0.5.1.tgz", "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" "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": { "node_modules/mongoose-legacy-pluralize": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
@ -1194,6 +1213,15 @@
"@types/node": "*" "@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": { "@types/mongoose-lean-virtuals": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/@types/mongoose-lean-virtuals/-/mongoose-lean-virtuals-0.5.1.tgz", "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": { "mongoose-legacy-pluralize": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", "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", "lambert-db": "^1.1.7",
"missing-native-js-functions": "^1.2.2", "missing-native-js-functions": "^1.2.2",
"mongodb": "^3.6.6", "mongodb": "^3.6.6",
"mongoose": "^5.12.3" "mongoose": "^5.12.3",
"mongoose-autopopulate": "^0.12.3"
}, },
"devDependencies": { "devDependencies": {
"@types/jsonwebtoken": "^8.5.0", "@types/jsonwebtoken": "^8.5.0",
"@types/mongoose-autopopulate": "^0.10.1",
"@types/mongoose-lean-virtuals": "^0.5.1", "@types/mongoose-lean-virtuals": "^0.5.1",
"@types/node": "^14.14.25", "@types/node": "^14.14.25",
"typescript": "^4.1.3" "typescript": "^4.1.3"

View File

@ -96,12 +96,14 @@ GuildSchema.virtual("channels", {
localField: "id", localField: "id",
foreignField: "guild_id", foreignField: "guild_id",
justOne: false, justOne: false,
autopopulate: true,
}); });
GuildSchema.virtual("roles", { GuildSchema.virtual("roles", {
ref: RoleModel, ref: RoleModel,
localField: "id", localField: "id",
foreignField: "guild_id", foreignField: "guild_id",
justOne: false, justOne: false,
autopopulate: true,
}); });
// nested populate is needed for member users: https://gist.github.com/yangsu/5312204 // nested populate is needed for member users: https://gist.github.com/yangsu/5312204
@ -117,6 +119,7 @@ GuildSchema.virtual("emojis", {
localField: "id", localField: "id",
foreignField: "guild_id", foreignField: "guild_id",
justOne: false, justOne: false,
autopopulate: true,
}); });
GuildSchema.virtual("joined_at", { GuildSchema.virtual("joined_at", {
@ -125,7 +128,6 @@ GuildSchema.virtual("joined_at", {
foreignField: "guild_id", foreignField: "guild_id",
justOne: true, justOne: true,
}).get((member: any, virtual: any, doc: any) => { }).get((member: any, virtual: any, doc: any) => {
console.log("get", member, this);
return member.joined_at; 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 { Schema, Types, Document } from "mongoose";
import db from "../util/Database"; 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 { export interface Member {
id: string; id: string;
guild_id: string; guild_id: string;
@ -80,6 +92,9 @@ MemberSchema.virtual("user", {
localField: "id", localField: "id",
foreignField: "id", foreignField: "id",
justOne: true, justOne: true,
autopopulate: {
select: PublicUserProjection,
},
}); });
// @ts-ignore // @ts-ignore

View File

@ -1,7 +1,7 @@
import { Schema, Types, Document } from "mongoose"; import { Schema, Types, Document } from "mongoose";
import db from "../util/Database"; import db from "../util/Database";
import { PublicUser, UserModel } from "./User"; import { PublicUser, PublicUserProjection, UserModel } from "./User";
import { MemberModel, PublicMember } from "./Member"; import { MemberModel, PublicMember, PublicMemberProjection } from "./Member";
import { Role, RoleModel } from "./Role"; import { Role, RoleModel } from "./Role";
import { Channel } from "./Channel"; import { Channel } from "./Channel";
@ -229,6 +229,14 @@ export const MessageSchema = new Schema({
channel_id: String, channel_id: String,
guild_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", { MessageSchema.virtual("author", {
@ -236,6 +244,7 @@ MessageSchema.virtual("author", {
localField: "author_id", localField: "author_id",
foreignField: "id", foreignField: "id",
justOne: true, justOne: true,
autopopulate: { select: PublicUserProjection },
}); });
MessageSchema.virtual("member", { MessageSchema.virtual("member", {
@ -250,6 +259,7 @@ MessageSchema.virtual("mentions", {
localField: "mention_user_ids", localField: "mention_user_ids",
foreignField: "id", foreignField: "id",
justOne: false, justOne: false,
autopopulate: { select: PublicUserProjection },
}); });
MessageSchema.virtual("mention_roles", { MessageSchema.virtual("mention_roles", {
@ -257,6 +267,7 @@ MessageSchema.virtual("mention_roles", {
localField: "mention_role_ids", localField: "mention_role_ids",
foreignField: "id", foreignField: "id",
justOne: false, justOne: false,
autopopulate: true,
}); });
MessageSchema.virtual("mention_channels", { MessageSchema.virtual("mention_channels", {
@ -264,6 +275,7 @@ MessageSchema.virtual("mention_channels", {
localField: "mention_channel_ids", localField: "mention_channel_ids",
foreignField: "id", foreignField: "id",
justOne: false, 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"]); 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, bot_id: String,
}, },
}); });
RoleSchema.set("removeResponse", ["guild_id"]);
// @ts-ignore // @ts-ignore
export const RoleModel = db.model<RoleDocument>("Role", RoleSchema, "roles"); 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 { Schema, Types, Document } from "mongoose";
import db from "../util/Database"; import db from "../util/Database";
export const PublicUserProjection = {
username: true,
discriminator: true,
id: true,
public_flags: true,
avatar: true,
};
export interface User { export interface User {
id: string; id: string;
username: string; // username max length 32, min 2 username: string; // username max length 32, min 2

View File

@ -1,5 +1,8 @@
import mongoose from "mongoose"; import mongoose from "mongoose";
import { Schema } from "mongoose"; import { Schema } from "mongoose";
import mongooseAutoPopulate from "mongoose-autopopulate";
mongoose.plugin(mongooseAutoPopulate);
mongoose.plugin((schema: Schema, opts: any) => { mongoose.plugin((schema: Schema, opts: any) => {
schema.set("toObject", { schema.set("toObject", {