diff options
author | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-08-12 20:33:02 +0200 |
---|---|---|
committer | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-08-12 20:33:02 +0200 |
commit | c72661a98782c1316038382a4989b3a05bdab731 (patch) | |
tree | 83d4ba2b54a3cb1b761703993a3b43bd2e5db797 /util/src/models/index.ts | |
parent | Merge branch 'rtc' (diff) | |
download | server-c72661a98782c1316038382a4989b3a05bdab731.tar.xz |
:sparkles: util
Diffstat (limited to 'util/src/models/index.ts')
-rw-r--r-- | util/src/models/index.ts | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/util/src/models/index.ts b/util/src/models/index.ts new file mode 100644 index 00000000..d0a46bf9 --- /dev/null +++ b/util/src/models/index.ts @@ -0,0 +1,89 @@ +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) => { + 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"; |