summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-04-07 20:26:19 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-04-07 20:26:19 +0200
commita6d82b466f61c1b60b1058d75b0647f2c0ac91a0 (patch)
tree3861fb579509fa3b271edf707ce2f5a0006b3c9c
parentgetPermission use cache (diff)
downloadserver-a6d82b466f61c1b60b1058d75b0647f2c0ac91a0.tar.xz
:zap: use mongoose autopopulate
-rw-r--r--package-lock.json36
-rw-r--r--package.json4
-rw-r--r--src/models/Guild.ts4
-rw-r--r--src/models/Member.ts17
-rw-r--r--src/models/Message.ts16
-rw-r--r--src/models/Role.ts1
-rw-r--r--src/models/User.ts7
-rw-r--r--src/models/index.ts3
8 files changed, 82 insertions, 6 deletions
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", {