summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-04-07 03:02:13 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-04-07 03:02:13 +0200
commitf48127f8a4881afc6dfb9b066b4eb357f1ef6c63 (patch)
tree2fcd6f0d13b54ceb9490902767beab6d013cd480 /src
parentremove dist (diff)
downloadserver-f48127f8a4881afc6dfb9b066b4eb357f1ef6c63.tar.xz
:bug: fix lean not working with virtuals
Diffstat (limited to 'src')
-rw-r--r--src/index.ts4
-rw-r--r--src/models/Message.ts86
-rw-r--r--src/models/index.ts27
-rw-r--r--src/util/Database.ts9
4 files changed, 69 insertions, 57 deletions
diff --git a/src/index.ts b/src/index.ts
index 914431d8..343a7496 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,6 +5,6 @@ export * from "./models/index";
 export * from "./util/index";
 
 import Config, { DefaultOptions } from "./util/Config";
-import db, { MongooseCache } from "./util/Database";
+import db, { MongooseCache, toObject } from "./util/Database";
 
-export { Config, db, DefaultOptions, MongooseCache };
+export { Config, db, DefaultOptions, MongooseCache, toObject };
diff --git a/src/models/Message.ts b/src/models/Message.ts
index 15f00cf4..ee038f97 100644
--- a/src/models/Message.ts
+++ b/src/models/Message.ts
@@ -1,8 +1,9 @@
 import { Schema, Types, Document } from "mongoose";
 import db from "../util/Database";
-import { UserModel } from "./User";
-import { MemberModel } from "./Member";
-import { RoleModel } from "./Role";
+import { PublicUser, UserModel } from "./User";
+import { MemberModel, PublicMember } from "./Member";
+import { Role, RoleModel } from "./Role";
+import { Channel } from "./Channel";
 
 export interface Message {
 	id: string;
@@ -36,6 +37,12 @@ export interface Message {
 		channel_id?: string;
 		guild_id?: string;
 	};
+	// mongoose virtuals:
+	author?: PublicUser;
+	member?: PublicMember;
+	mentions?: PublicUser[];
+	mention_roles?: Role[];
+	mention_channels?: Channel[];
 }
 
 export interface MessageDocument extends Document, Message {
@@ -190,50 +197,39 @@ export const Embed = {
 	],
 };
 
-export const MessageSchema = new Schema(
-	{
-		id: String,
+export const MessageSchema = new Schema({
+	id: String,
+	channel_id: String,
+	author_id: String,
+	webhook_id: String,
+	guild_id: String,
+	application_id: String,
+	content: String,
+	timestamp: Date,
+	edited_timestamp: Date,
+	tts: Boolean,
+	mention_everyone: Boolean,
+	mention_user_ids: [String],
+	mention_role_ids: [String],
+	mention_channel_ids: [String],
+	attachments: [Attachment],
+	embeds: [Embed],
+	reactions: [Reaction],
+	nonce: Schema.Types.Mixed, // can be a long or a string
+	pinned: Boolean,
+	type: { type: Number },
+	activity: {
+		type: Number,
+		party_id: String,
+	},
+	flags: Types.Long,
+	stickers: [],
+	message_reference: {
+		message_id: String,
 		channel_id: String,
-		author_id: String,
-		webhook_id: String,
 		guild_id: String,
-		application_id: String,
-		content: String,
-		timestamp: Date,
-		edited_timestamp: Date,
-		tts: Boolean,
-		mention_everyone: Boolean,
-		mention_user_ids: [String],
-		mention_role_ids: [String],
-		mention_channel_ids: [String],
-		attachments: [Attachment],
-		embeds: [Embed],
-		reactions: [Reaction],
-		nonce: Schema.Types.Mixed, // can be a long or a string
-		pinned: Boolean,
-		type: { type: Number },
-		activity: {
-			type: Number,
-			party_id: String,
-		},
-		flags: Types.Long,
-		stickers: [],
-		message_reference: {
-			message_id: String,
-			channel_id: String,
-			guild_id: String,
-		},
 	},
-	{
-		toJSON: {
-			transform: function (doc, ret) {
-				delete ret.mention_channel_ids;
-				delete ret.mention_user_ids;
-				delete ret.mention_role_ids;
-			},
-		},
-	}
-);
+});
 
 MessageSchema.virtual("author", {
 	ref: UserModel,
@@ -270,6 +266,8 @@ MessageSchema.virtual("mention_channels", {
 	justOne: false,
 });
 
+MessageSchema.set("removeResponse", ["mention_channel_ids", "mention_role_ids", "mention_user_ids", "author_id"]);
+
 // TODO: missing Application Model
 // MessageSchema.virtual("application", {
 // 	ref: Application,
diff --git a/src/models/index.ts b/src/models/index.ts
index bb6024fe..03b9fe70 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -1,4 +1,20 @@
 import mongoose from "mongoose";
+import { Schema } from "mongoose";
+
+mongoose.plugin((schema: Schema, opts: any) => {
+	schema.set("toObject", {
+		virtuals: true,
+		versionKey: false,
+		transform(doc: any, ret: any) {
+			delete ret._id;
+			delete ret.__v;
+			const props = schema.get("removeResponse") || [];
+			props.forEach((prop: string) => {
+				delete ret[prop];
+			});
+		},
+	});
+});
 
 export * from "./Ban";
 export * from "./Channel";
@@ -15,14 +31,3 @@ export * from "./Message";
 export * from "./Status";
 export * from "./VoiceState";
 export * from "./Event";
-
-mongoose.plugin((schema: any) => {
-	schema.options.toJSON = {
-		virtuals: true,
-		versionKey: false,
-		transform(doc: any, ret: any) {
-			delete ret._id;
-			delete ret.__v;
-		},
-	};
-});
diff --git a/src/util/Database.ts b/src/util/Database.ts
index 883c8dcd..e17eeccb 100644
--- a/src/util/Database.ts
+++ b/src/util/Database.ts
@@ -2,6 +2,7 @@ import "./MongoBigInt";
 import mongoose, { Collection, Connection } from "mongoose";
 import { ChangeStream, ChangeEvent, Long } from "mongodb";
 import EventEmitter from "events";
+import { Document } from "mongoose";
 const uri = process.env.MONGO_URL || "mongodb://localhost:27017/fosscord?readPreference=secondaryPreferred";
 
 console.log(`[DB] connect: ${uri}`);
@@ -10,6 +11,14 @@ const connection = mongoose.createConnection(uri, { autoIndex: true, useNewUrlPa
 
 export default <Connection>connection;
 
+function transform<T extends Document>(document: T) {
+	return document.toObject({ virtuals: true });
+}
+
+export function toObject<T extends Document>(document: T | T[]) {
+	return Array.isArray(document) ? document.map((x) => transform<T>(x)) : transform(document);
+}
+
 export interface MongooseCache {
 	on(event: "delete", listener: (id: string) => void): this;
 	on(event: "change", listener: (data: any) => void): this;