UNPKG

@typegoose/auto-increment

Version:
172 lines 14.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AutoIncrementIDSkipSymbol = void 0; exports.isNullOrUndefined = isNullOrUndefined; exports.AutoIncrementSimple = AutoIncrementSimple; exports.AutoIncrementID = AutoIncrementID; const tslib_1 = require("tslib"); const mongoose_1 = tslib_1.__importDefault(require("mongoose")); const logSettings_1 = require("./logSettings"); const DEFAULT_INCREMENT = 1; /** * Because since node 4.0.0 the internal util.is* functions got deprecated * @param val Any value to test if null or undefined */ function isNullOrUndefined(val) { return val === null || val === undefined; } /** * The Plugin - Simple version * Increments an value each time it is saved * @param schema The Schema * @param options The Options */ function AutoIncrementSimple(schema, options) { // convert normal object into an array const fields = Array.isArray(options) ? options : [options]; logSettings_1.logger.info('Initilaize AutoIncrement for an schema with %d fields to increment', fields.length); if (fields.length <= 0) { throw new Error('Options with at least one field are required!'); } // check if all fields are valid for (const field of fields) { if (typeof field.field != 'string') { throw new Error(`Got Field object, but did not contain a "field" key with "string" value, got: ${JSON.stringify(field)}`); } const schemaField = schema.path(field.field); // check if the field is even existing if (isNullOrUndefined(schemaField)) { throw new Error(`Field "${field.field}" does not exists on the Schema!`); } // check if the field is an number if (schemaField.instance !== 'Number' && schemaField.instance !== 'BigInt') { throw new Error(`Field "${field.field}" is not a Number or BigInt!`); } if (isNullOrUndefined(field.incrementBy)) { logSettings_1.logger.info('Field "%s" does not have an incrementBy defined, defaulting to %d', field.field, DEFAULT_INCREMENT); if (schemaField.instance === 'BigInt') { field.incrementBy = BigInt(DEFAULT_INCREMENT); } else { field.incrementBy = DEFAULT_INCREMENT; } } } // to have an name to the function if debugging schema.pre('save', function AutoIncrementPreSaveSimple() { if (!this.isNew) { logSettings_1.logger.info('Starting to increment "%s"', this.constructor.modelName); for (const field of fields) { logSettings_1.logger.info('Incrementing "%s" by %d', field.field, field.incrementBy); // "this as any" is required because mongoose sets a document to default to "unknown" if not explicitly set for hooks // but in this case it should work just fine this[field.field] += field.incrementBy; } } }); } /** The Schema used for the trackers */ const IDSchema = new mongoose_1.default.Schema({ field: String, modelName: String, count: BigInt, }, { versionKey: false }); IDSchema.index({ field: 1, modelName: 1 }, { unique: true }); exports.AutoIncrementIDSkipSymbol = Symbol('AutoIncrementIDSkip'); /** * The Plugin - ID * Increments an counter in an tracking collection * @param schema The Schema * @param options The Options */ function AutoIncrementID(schema, options) { /** The Options with default options applied */ const opt = { field: '_id', incrementBy: DEFAULT_INCREMENT, trackerCollection: 'identitycounters', trackerModelName: 'identitycounter', startAt: 0, overwriteModelName: '', ...options, }; // check if the field is an number const schemaField = schema.path(opt.field); if (schemaField.instance !== 'Number' && schemaField.instance !== 'BigInt') { throw new Error(`Field "${opt.field}" is not a Number or BigInt!`); } let model; logSettings_1.logger.info('AutoIncrementID called with options %O', opt); schema.pre('save', async function AutoIncrementPreSaveID() { logSettings_1.logger.info('AutoIncrementID PreSave'); opt.incrementBy = BigInt(opt.incrementBy); opt.startAt = BigInt(opt.startAt); const originalModelName = this.constructor.modelName; let modelName; if (typeof opt.overwriteModelName === 'function') { modelName = opt.overwriteModelName(originalModelName, this.constructor); if (!modelName || typeof modelName !== 'string') { throw new Error('"overwriteModelname" is a function, but did return a falsy type or is not a string!'); } } else { modelName = opt.overwriteModelName || originalModelName; } if (!model) { logSettings_1.logger.info('Creating idtracker model named "%s"', opt.trackerModelName); // needs to be done, otherwise "undefiend" error if the plugin is used in an sub-document const db = this.db ?? this.ownerDocument().db; model = db.model(opt.trackerModelName, IDSchema, opt.trackerCollection); // test if the counter document already exists const counter = await model .findOne({ modelName: modelName, field: opt.field, }) .lean() .exec(); if (!counter) { await model.create({ modelName: modelName, field: opt.field, count: opt.startAt - opt.incrementBy, }); } } if (!this.isNew) { logSettings_1.logger.info('Document is not new, not incrementing'); return; } if (typeof this[exports.AutoIncrementIDSkipSymbol] === 'boolean' && exports.AutoIncrementIDSkipSymbol) { logSettings_1.logger.info('Symbol "AutoIncrementIDSkipSymbol" is set to "true", skipping'); return; } const ownerDocDb = this.db ?? this.ownerDocument().db; if (typeof ownerDocDb[exports.AutoIncrementIDSkipSymbol] == 'boolean' && ownerDocDb[exports.AutoIncrementIDSkipSymbol]) { logSettings_1.logger.info('Symbol "AutoIncrementIDSkipSymbol" is set on the connection to "true", skipping'); return; } const leandoc = await model .findOneAndUpdate({ field: opt.field, modelName: modelName, }, { $inc: { count: opt.incrementBy }, }, { returnDocument: 'after', fields: { count: 1, _id: 0 }, upsert: true, setDefaultsOnInsert: true, }) .lean() .exec(); if (isNullOrUndefined(leandoc)) { throw new Error(`"findOneAndUpdate" incrementing count failed for "${modelName}" on field "${opt.field}"`); } logSettings_1.logger.info('Setting "%s" to "%d"', opt.field, leandoc.count); this[opt.field] = leandoc.count; return; }); } tslib_1.__exportStar(require("./types"), exports); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b0luY3JlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRvSW5jcmVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLDhDQUVDO0FBUUQsa0RBbURDO0FBcUJELDBDQWlIQzs7QUE3TUQsZ0VBQWdDO0FBQ2hDLCtDQUF1QztBQUd2QyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUU1Qjs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxHQUFZO0lBQzVDLE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLG1CQUFtQixDQUNqQyxNQUE0QixFQUM1QixPQUFrRTtJQUVsRSxzQ0FBc0M7SUFDdEMsTUFBTSxNQUFNLEdBQWlDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRixvQkFBTSxDQUFDLElBQUksQ0FBQyxvRUFBb0UsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakcsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUgsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFD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