mongoose-delete-ts
Version:
Mongoose soft delete plugin
88 lines (87 loc) • 3.24 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = default_1;
const mongoose_1 = require("mongoose");
const hooks_1 = __importDefault(require("./hooks"));
const methods_1 = __importDefault(require("./methods"));
const query_1 = __importDefault(require("./query"));
const statics_1 = __importDefault(require("./statics"));
function default_1(schema, options = {}) {
const typeKey = schema.get('typeKey') || 'type';
const deletedFieldNames = {};
const indexFields = indexFieldsOption(options.indexFields);
schema.add({
deleted: {
[typeKey]: Boolean,
default: false,
index: indexFields.includes('deleted'),
...options.deleted
}
});
if (hasDeletedField(options.deletedAt)) {
const deletedAtName = deletedFieldName(options.deletedAt, 'deletedAt');
deletedFieldNames.deletedAt = deletedAtName;
schema.add({
[deletedAtName]: {
...deletedFieldOptions('deletedAt', { [typeKey]: Date }, options.deletedAt),
index: indexFields.includes('deletedAt')
}
});
}
if (hasDeletedField(options.deletedBy)) {
const deletedByName = deletedFieldName(options.deletedBy, 'deletedBy');
deletedFieldNames.deletedBy = deletedByName;
schema.add({
[deletedByName]: {
...deletedFieldOptions('deletedBy', { [typeKey]: mongoose_1.Schema.Types.ObjectId }, options.deletedBy),
index: indexFields.includes('deletedBy')
}
});
}
(0, hooks_1.default)(schema, options.overrideMethods);
(0, query_1.default)(schema);
(0, methods_1.default)(schema, options, deletedFieldNames);
(0, statics_1.default)(schema, options, deletedFieldNames);
}
function hasDeletedField(option) {
return (option === true) ||
(typeof option === 'string' && option.length > 0) ||
(typeof option === 'object' && Object.keys(option).length > 0);
}
function deletedFieldName(option, fallbackName) {
if (typeof option === 'string' && option.length > 0) {
return option;
}
if (typeof option === 'object' && typeof option.name === 'string' && option.name.length > 0) {
return option.name;
}
return fallbackName;
}
function deletedFieldOptions(name, defaultOptions, option) {
const fieldOption = Object.assign({}, defaultOptions);
if (typeof option === 'string' && option.length > 0) {
Object.assign(fieldOption, { alias: name });
}
if (typeof option === 'object') {
Object.assign(fieldOption, option);
if (option.name && option.name !== name) {
Object.assign(fieldOption, { alias: name });
}
}
return fieldOption;
}
function indexFieldsOption(indexFields) {
if (indexFields === true) {
return ['deleted', 'deletedAt', 'deletedBy'];
}
else if (Array.isArray(indexFields)) {
return indexFields;
}
else if (indexFields === false) {
return [];
}
return ['deleted'];
}
;