mongoose-advanced-soft-delete
Version:
Lightweight Mongoose Plugin for Effortless Soft Deletion
234 lines (230 loc) • 7.01 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/index.ts
var src_exports = {};
__export(src_exports, {
applyNotDeletedFilter: () => applyNotDeletedFilter,
softDeletePlugin: () => softDeletePlugin
});
module.exports = __toCommonJS(src_exports);
// src/helper-functions.ts
var applyNotDeletedFilter = function(next) {
const filter = this.getFilter();
if (filter.fetchAllIncludingSoftDeletedRecords) {
delete filter.fetchAllIncludingSoftDeletedRecords;
} else if (!filter.isDeleted) {
this.setQuery(__spreadProps(__spreadValues({}, filter), {
isDeleted: { $ne: true }
}));
}
next();
};
// src/plugin.ts
var softDeletePlugin = (schema) => {
schema.add({
isDeleted: {
type: Boolean,
required: true,
default: false
},
deletedAt: {
type: Date,
default: null
}
});
schema.pre("find", applyNotDeletedFilter);
schema.pre("findOne", applyNotDeletedFilter);
schema.pre("countDocuments", applyNotDeletedFilter);
schema.pre("aggregate", function() {
if (this.options.includeSoftDeleted) {
return;
}
const pipeline = this.pipeline();
const firstStage = pipeline[0];
if (firstStage && firstStage["$geoNear"]) {
const geoNearStage = pipeline.shift();
this.pipeline().unshift({ $match: { isDeleted: { $ne: true } } });
this.pipeline().unshift(geoNearStage);
return;
}
this.pipeline().unshift({ $match: { isDeleted: { $ne: true } } });
});
schema.static(
"findDeleted",
function() {
return this.find({ isDeleted: true });
}
);
schema.static(
"findOneIncludingSoftDeleted",
function(query, projection, options) {
return __async(this, null, function* () {
const document = yield this.findOne(
__spreadProps(__spreadValues({}, query), {
fetchAllIncludingSoftDeletedRecords: true
}),
projection,
options
);
return document;
});
}
);
schema.static(
"findAllIncludingSoftDeleted",
function(query, projection, options) {
return __async(this, null, function* () {
const documents = yield this.find(
__spreadProps(__spreadValues({}, query), {
fetchAllIncludingSoftDeletedRecords: true
}),
projection,
options
);
return documents;
});
}
);
schema.static(
"restore",
function(query, options) {
return __async(this, null, function* () {
const deletedDocuments = yield this.find(
__spreadProps(__spreadValues({}, query), { isDeleted: true }),
void 0,
options
);
if (!deletedDocuments) {
throw new Error("Record not found");
}
let restored = 0;
for (const deletedDocument of deletedDocuments) {
if (deletedDocument.isDeleted) {
deletedDocument.isDeleted = false;
deletedDocument.deletedAt = null;
yield deletedDocument.save(options);
restored++;
}
}
return { restored };
});
}
);
schema.static(
"softDeleteById",
function(id, options) {
return __async(this, null, function* () {
const document = yield this.findById(id, void 0, options);
if (!document) {
return null;
}
if (!document.isDeleted) {
document.isDeleted = true;
document.deletedAt = /* @__PURE__ */ new Date();
yield document.save(options);
}
return { deletedCount: 1 };
});
}
);
schema.static(
"softDelete",
function(query, options) {
return __async(this, null, function* () {
const documents = yield this.find(query, void 0, options);
if (!documents) {
return null;
}
let deletedCount = 0;
for (const document of documents) {
if (!document.isDeleted) {
document.isDeleted = true;
document.deletedAt = /* @__PURE__ */ new Date();
yield document.save(options);
deletedCount++;
}
}
return { deletedCount };
});
}
);
schema.static(
"softDeleteMany",
function(query, options) {
return __async(this, null, function* () {
const documents = yield this.find(query, void 0, options);
if (!documents) {
return null;
}
let deletedCount = 0;
for (const document of documents) {
if (!document.isDeleted) {
document.isDeleted = true;
document.deletedAt = /* @__PURE__ */ new Date();
yield document.save(options);
deletedCount++;
}
}
return { deletedCount };
});
}
);
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
applyNotDeletedFilter,
softDeletePlugin
});