@release-notes/hub
Version:
A hub for hosting release notes.
210 lines (181 loc) • 3.75 kB
JavaScript
'use strict';
const
RepositoryService = require('kermit-mongoose/RepositoryService'),
mongoosePaginate = require('mongoose-paginate');
class AbstractRepository extends RepositoryService {
/**
* @inheritDoc
*/
getDefaultServiceConfig() {
let defaultServiceConfig = super.getDefaultServiceConfig();
defaultServiceConfig.enableTimestamps = true;
defaultServiceConfig.enablePaginatedSearch = true;
return defaultServiceConfig;
}
/**
* @param id
* @returns {mongoose.Types.ObjectId}
*/
getObjectId(id) {
return this.getMongoose().Types.ObjectId(id);
}
/**
* Retrieve all mongoose schema types-
*
* @returns {Object}
*/
getSchemaTypes() {
return this.getMongoose().Schema.Types;
}
/**
* @returns {Object}
*/
getSchemaOptions() {
let options = {};
if (this.serviceConfig.get('enableTimestamps')) {
options.timestamps = true;
}
return options;
}
/**
* @returns {mongoose.Schema}
*/
getSchema() {
if (!this.schema) {
let serviceConfig = this.serviceConfig;
this.schema = super.getSchema();
if (serviceConfig.get('enablePaginatedSearch')) {
this.schema.plugin(mongoosePaginate);
}
}
return this.schema;
}
/**
* @param params
* @returns {Promise}
*/
create(params) {
return this
.getModel()
.create(params);
}
/**
* Find some entities.
*
* @param conditions
* @returns {Promise}
*/
find(conditions) {
return this
.getModel()
.find(conditions, null, {
lean: true
});
}
/**
* @param entityId
* @returns {Promise}
*/
findById(entityId) {
return this
.getModel()
.findById(
this.getObjectId(entityId),
null,
{ lean: true }
)
;
}
/**
* @param entityId
* @param properties
* @param options
* @returns {Promise}
*/
findByIdAndUpdate(entityId, properties, options = {}) {
return this.findOneAndUpdate({ _id: this.getObjectId(entityId) }, properties, options);
}
/**
* @param entityId
* @returns {Promise}
*/
findByIdAndRemove(entityId) {
return this.findOneAndRemove({ _id: this.getObjectId(entityId) });
}
/**
* @param conditions
* @param properties
* @param options
* @returns {Promise}
*/
findOneAndUpdate(conditions, properties, options = {}) {
options = Object.assign({
lean: true,
'new': true
}, options);
return this
.getModel()
.findOneAndUpdate(
conditions,
properties,
options
);
}
/**
* @param conditions
* @returns {Promise}
*/
findOneAndRemove(conditions) {
return this
.getModel()
.findOneAndRemove(conditions);
}
/**
* @param query
* @param projection
* @param options
* @return {Promise}
*/
findOne(query, projection, options) {
return this
.getModel()
.findOne(query, projection, options);
}
/**
* @param query
* @param options
* @returns {Promise}
*/
findList(query, options = {}) {
options = Object.assign({
lean: true,
leanWithId: false,
offset: 0,
limit: 20
}, options);
delete options.page;
return this
.getModel()
.paginate(
query,
options
).then(result => ({
items: result.docs || [],
total: result.total,
offset: result.offset,
limit: result.limit
}));
}
/**
* Remove some entities.
*
* @param conditions
* @returns {Promise}
*/
remove(conditions) {
return this
.getModel()
.remove(conditions);
}
}
module.exports = AbstractRepository;