⚡ 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",
|
"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",
|
||||||
|
@ -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"
|
||||||
|
@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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"]);
|
||||||
|
@ -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");
|
||||||
|
@ -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
|
||||||
|
@ -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", {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user