summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/models/index.ts44
-rw-r--r--src/util/Database.ts1
2 files changed, 42 insertions, 3 deletions
diff --git a/src/models/index.ts b/src/models/index.ts
index 4cc6ec2b..61c8d85a 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -1,7 +1,42 @@
-import mongoose from "mongoose";
-import { Schema } from "mongoose";
+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 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) => {
@@ -17,6 +52,11 @@ mongoose.plugin((schema: Schema, opts: any) => {
 			});
 		},
 	});
+	schema.post("findOne", (doc, next) => {
+		if (!doc) return next(new HTTPError("Not found", 404));
+		// @ts-ignore
+		return next();
+	});
 });
 
 export * from "./Activity";
diff --git a/src/util/Database.ts b/src/util/Database.ts
index ed596907..16e07d3b 100644
--- a/src/util/Database.ts
+++ b/src/util/Database.ts
@@ -5,7 +5,6 @@ import EventEmitter from "events";
 const uri = process.env.MONGO_URL || "mongodb://localhost:27017/fosscord?readPreference=secondaryPreferred";
 import { URL } from "url";
 
-// TODO: auto throw error if findOne doesn't find anything
 const url = new URL(uri.replace("mongodb://", "http://"));
 
 const connection = mongoose.createConnection(uri, {