@typegoose/auto-increment
Version:
Automaticly Increment properties
173 lines • 14.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AutoIncrementID = exports.AutoIncrementIDSkipSymbol = exports.AutoIncrementSimple = exports.isNullOrUndefined = void 0;
const tslib_1 = require("tslib");
const mongoose_1 = 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;
}
exports.isNullOrUndefined = isNullOrUndefined;
/**
* 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;
}
}
});
}
exports.AutoIncrementSimple = AutoIncrementSimple;
/** 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;
}
// @ts-expect-error mongoose now restrics indexes to "string"
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 },
}, {
new: true,
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;
});
}
exports.AutoIncrementID = AutoIncrementID;
tslib_1.__exportStar(require("./types"), exports);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b0luY3JlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRvSW5jcmVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSx1Q0FBZ0M7QUFDaEMsK0NBQXVDO0FBR3ZDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRTVCOzs7R0FHRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLEdBQVk7SUFDNUMsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFDM0MsQ0FBQztBQUZELDhDQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FDakMsTUFBNEIsRUFDNUIsT0FBa0U7SUFFbEUsc0NBQXNDO0lBQ3RDLE1BQU0sTUFBTSxHQUFpQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUYsb0JBQU0sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpHLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsaUZBQWlGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVILENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QyxzQ0FBc0M7UUFDdEMsSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLENBQUMsS0FBSyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxrQ0FBa0M7UUFDbEMsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNFLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLENBQUMsS0FBSyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3pDLG9CQUFNLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUVqSCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLEtBQUssQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsMEJBQTBCO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsb0JBQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUcsSUFBSSxDQUFDLFdBQW1DLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDM0Isb0JBQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3ZFLHFIQUFxSDtnQkFDckgsNENBQTRDO2dCQUMzQyxJQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUF5RCxDQUFDO1lBQ2hHLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBbkRELGtEQW1EQztBQUVELHVDQUF1QztBQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLGtCQUFRLENBQUMsTUFBTSxDQUNsQztJQUNFLEtBQUssRUFBRSxNQUFNO0lBQ2IsU0FBUyxFQUFFLE1BQU07SUFDakIsS0FBSyxFQUFFLE1BQU07Q0FDZCxFQUNELEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUN0QixDQUFDO0FBQ0YsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFFaEQsUUFBQSx5QkFBeUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUV2RTs7Ozs7R0FLRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxNQUE0QixFQUFFLE9BQStCO0lBQzNGLCtDQUErQztJQUMvQyxNQUFNLEdBQUcsR0FBcUM7UUFDNUMsS0FBSyxFQUFFLEtBQUs7UUFDWixXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLGlCQUFpQixFQUFFLGtCQUFrQjtRQUNyQyxnQkFBZ0IsRUFBRSxpQkFBaUI7UUFDbkMsT0FBTyxFQUFFLENBQUM7UUFDVixrQkFBa0IsRUFBRSxFQUFFO1FBQ3RCLEdBQUcsT0FBTztLQUNYLENBQUM7SUFFRixrQ0FBa0M7SUFDbEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0MsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNFLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBSyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFJLEtBQWlELENBQUM7SUFFdEQsb0JBQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFM0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxVQUFVLHNCQUFzQjtRQUN0RCxvQkFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRXZDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxHQUFHLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEMsTUFBTSxpQkFBaUIsR0FBWSxJQUFJLENBQUMsV0FBbUIsQ0FBQyxTQUFTLENBQUM7UUFDdEUsSUFBSSxTQUFpQixDQUFDO1FBRXRCLElBQUksT0FBTyxHQUFHLENBQUMsa0JBQWtCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDakQsU0FBUyxHQUFHLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsV0FBa0IsQ0FBQyxDQUFDO1lBRS9FLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMscUZBQXFGLENBQUMsQ0FBQztZQUN6RyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixJQUFJLGlCQUFpQixDQUFDO1FBQzFELENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxvQkFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RSx5RkFBeUY7WUFDekYsTUFBTSxFQUFFLEdBQXdCLElBQUksQ0FBQyxFQUFFLElBQUssSUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1RSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBNkIsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNwRyw4Q0FBOEM7WUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLO2lCQUN4QixPQUFPLENBQUM7Z0JBQ1AsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSzthQUNqQixDQUFDO2lCQUNELElBQUksRUFBRTtpQkFDTixJQUFJLEVBQUUsQ0FBQztZQUVWLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQ2pCLFNBQVMsRUFBRSxTQUFTO29CQUNwQixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7b0JBQ2hCLEtBQUssRUFBRSxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxXQUFXO2lCQUNyQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsb0JBQU0sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUVyRCxPQUFPO1FBQ1QsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCxJQUFJLE9BQU8sSUFBSSxDQUFDLGlDQUF5QixDQUFDLEtBQUssU0FBUyxJQUFJLGlDQUF5QixFQUFFLENBQUM7WUFDdEYsb0JBQU0sQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQztZQUU3RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUssSUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUUvRCxJQUFJLE9BQU8sVUFBVSxDQUFDLGlDQUF5QixDQUFDLElBQUksU0FBUyxJQUFJLFVBQVUsQ0FBQyxpQ0FBeUIsQ0FBQyxFQUFFLENBQUM7WUFDdkcsb0JBQU0sQ0FBQyxJQUFJLENBQUMsaUZBQWlGLENBQUMsQ0FBQztZQUUvRixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSzthQUN4QixnQkFBZ0IsQ0FDZjtZQUNFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztZQUNoQixTQUFTLEVBQUUsU0FBUztTQUNyQixFQUNEO1lBQ0UsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUU7U0FDakMsRUFDRDtZQUNFLEdBQUcsRUFBRSxJQUFJO1lBQ1QsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQzVCLE1BQU0sRUFBRSxJQUFJO1lBQ1osbUJBQW1CLEVBQUUsSUFBSTtTQUMxQixDQUNGO2FBQ0EsSUFBSSxFQUFFO2FBQ04sSUFBSSxFQUFFLENBQUM7UUFFVixJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsU0FBUyxlQUFlLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzdHLENBQUM7UUFFRCxvQkFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFFaEMsT0FBTztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWxIRCwwQ0FrSEM7QUFFRCxrREFBd0IifQ==