summary refs log tree commit diff
path: root/util/src/models/index.ts
blob: b6100f868ba51006d8ce084b33848773ced61ab1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// @ts-nocheck
import mongoose, { Schema, Document } from "mongoose";
import mongooseAutoPopulate from "mongoose-autopopulate";

type UpdateWithAggregationPipeline = UpdateAggregationStage[];
type UpdateAggregationStage =
	| { $addFields: any }
	| { $set: any }
	| { $project: any }
	| { $unset: any }
	| { $replaceRoot: any }
	| { $replaceWith: any };
type EnforceDocument<T, TMethods> = T extends Document ? T : T & Document & TMethods;

declare module "mongoose" {
	interface SchemaOptions {
		removeResponse?: string[];
	}
	interface Model<T, TQueryHelpers = {}, TMethods = {}> {
		// removed null -> always return document -> throw error if it doesn't exist
		findOne(
			filter?: FilterQuery<T>,
			projection?: any | null,
			options?: QueryOptions | null,
			callback?: (err: CallbackError, doc: EnforceDocument<T, TMethods>) => void
		): QueryWithHelpers<EnforceDocument<T, TMethods>, EnforceDocument<T, TMethods>, TQueryHelpers>;
		findOneAndUpdate(
			filter?: FilterQuery<T>,
			update?: UpdateQuery<T> | UpdateWithAggregationPipeline,
			options?: QueryOptions | null,
			callback?: (err: any, doc: EnforceDocument<T, TMethods> | null, res: any) => void
		): QueryWithHelpers<EnforceDocument<T, TMethods>, EnforceDocument<T, TMethods>, TQueryHelpers>;
	}
}

var HTTPError: any;

try {
	HTTPError = require("lambert-server").HTTPError;
} catch (e) {
	HTTPError = Error;
}

mongoose.plugin(mongooseAutoPopulate);

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];
			});
		},
	});
	schema.post("findOne", function (doc, next) {
		try {
			// @ts-ignore
			const isExistsQuery = JSON.stringify(this._userProvidedFields) === JSON.stringify({ _id: 1 });
			if (!doc && !isExistsQuery) {
				// @ts-ignore
				return next(new HTTPError(`${this?.mongooseCollection?.name}.${this?._conditions?.id} not found`, 400));
			}
			// @ts-ignore
			return next();
		} catch (error) {
			// @ts-ignore
			next();
		}
	});
});

export * from "./Activity";
export * from "./Application";
export * from "./Ban";
export * from "./Channel";
export * from "./Emoji";
export * from "./Event";
export * from "./Template";
export * from "./Guild";
export * from "./Invite";
export * from "./Interaction";
export * from "./Member";
export * from "./Message";
export * from "./Status";
export * from "./Role";
export * from "./User";
export * from "./VoiceState";
export * from "./ReadState";
export * from "./RateLimit";