@ifit/mongoose-dao
Version:
Mongo helper methods for working with data in a DAO or repository pattern
71 lines • 2.96 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataAccessObject = void 0;
require("reflect-metadata");
const inversify_1 = require("inversify");
const list_options_1 = require("../list-interfaces/list-options");
let DataAccessObject = class DataAccessObject {
constructor() {
this.dataObjectClass = typeof this;
}
async create(data) {
const result = await this.model.create(data);
return this.initObject(result);
}
async insertMany(data, options) {
const results = await this.model.insertMany(data, options);
return options && options.rawResult
? results
:
results.map((result) => this.initObject(result));
}
async findById(id) {
const result = await this.model.findById(id);
return this.initObject(result);
}
async list(searchCriteria = {}, listOptions = new list_options_1.ListOptions()) {
const totalQuery = this.model.countDocuments(searchCriteria);
const sort = {};
if (listOptions.sortField) {
sort[listOptions.sortField] = listOptions.sortAsc ? 1 : -1;
}
const resultsQuery = this.model
.find(searchCriteria)
.skip(listOptions.page * listOptions.pageSize)
.limit(listOptions.pageSize)
.sort(sort)
.lean(listOptions.lean === true);
const [total, resultObjects] = await Promise.all([totalQuery, resultsQuery]);
const results = listOptions.lean
? resultObjects
:
resultObjects.map((x) => this.initObject(x));
return { total, results };
}
async update(data) {
delete data.createdAt;
delete data.updatedAt;
const result = await this.model.findByIdAndUpdate(data.id, data, {
new: true,
});
return this.initObject(result);
}
async deleteById(id) {
const result = await this.model.findByIdAndRemove(id);
return this.initObject(result);
}
initObject(result) {
return result ? new this.targetClass(result.toObject()) : null;
}
};
exports.DataAccessObject = DataAccessObject;
exports.DataAccessObject = DataAccessObject = __decorate([
(0, inversify_1.injectable)()
], DataAccessObject);
//# sourceMappingURL=data-access-object.js.map