generator-restgoose
Version:
Modern, Lightweight, and Powerfull Rest API Code generator. Out-Of-Box NodeJS REST API Server generator built on top of Mongoose, Express, Cors, Passport, JWT and many more.
203 lines (177 loc) • 5.09 kB
JavaScript
;
// Module dependencies.
const mongoose = require('mongoose');
const Model = mongoose.models.<%= capSchemaName %>;
const Util = require('../library').Util;
// const debug = require('debug')('App:ApiObject:<%= lowSchemaName %>')
const csvReader = require('csvtojson');
<% let flds = schemaFields.map(x=>"'"+x.split(':')[0].trim()+"'");%>
const ModelOptions = {
mutable: [<%- flds %>],
search: [<%- flds %>]
};
/*
========= [ CORE METHODS ] =========
*/
// GET
exports.Read = (id) => {
return Model.findOne({
_id: id
})<% populates.forEach(function(fld,index){ %>
.populate('<%= fld %>') <% }) %>
.then(data => {
if (!data) {
return Promise.reject(new Error(404));
}
return data;
});
};
// POST
exports.Create = (data) => {
data = new Model(data);
return data.save()
.then(() => data.toObject());
};
// PUT
exports.Update = (id, updateData) => {
const finalData = {};
ModelOptions.mutable.forEach(prop => {
if (typeof updateData[prop] !== 'undefined') {
finalData[prop] = updateData[prop];
}
});
return Model.findOneAndUpdate({
_id: id
}, {
$set: finalData
}, {
new: true
})
.then(data => {
return data.toObject() || null;
}); // eo Model.findOneAndUpdate
};
// DELETE
exports.Delete = (id) => {
return Model.deleteOne({
_id: id
}).then(() => {
return 'The data got Deleted';
});
};
/*
========= [ BULK METHODS ] =========
*/
// ALL
exports.ReadList = (listOptions) => {
const res = {
data: {},
count: 0
};
// return Promise.reject(new Error('Fake Error')) // Quick Err Check
return Model.find()
.limit(listOptions.limit)
.skip(listOptions.skip)<% populates.forEach(function(fld,index){ %>
.populate('<%= fld %>') <% }) %>
.sort({ createdAt: listOptions.sort })
.exec()
.then((list) => {
res.data = list;
return Model.countDocuments();
})
.then(count => {
res.count = count;
return res;
});
};
// BULK ADD
exports.CreateBulk = (file) => {
const csvFilePath = file.path;
return csvReader()
.fromFile(csvFilePath)
.then(jsonData => Model.insertMany(jsonData))
.then(insertData => Util.ProcessCountResponseMap(insertData));
};
// BULK EDIT
exports.UpdateBulk = (condition, file) => {
const csvFilePath = file.path;
return csvReader()
.fromFile(csvFilePath)
.then(jsonData => Model.updateMany(condition, jsonData))
.then(insertData => Util.ProcessCountResponseMap(insertData));
};
// BULK DELETE
exports.DeleteBulk = () => {
return Model.remove({}).then(() => 'All data got Deleted');
};
/*
========= [ SEARCH METHODS ] =========
*/
// SEARCH
exports.Search = (listOptions, keywordObj, strict) => {
let k = {};
if (strict) {
k = keywordObj;
} else {
Object.keys(keywordObj).forEach(key => {
if (isNaN(keywordObj[key])) {
k[key] = new RegExp(keywordObj[key], 'i');
} else {
k[key] = keywordObj[key];
}
});
}
return Model.find(k)
.limit(listOptions.limit)
.skip(listOptions.skip)
.sort({ createdAt: listOptions.sort })
.exec();
};
// SEARCH ADVANCED
exports.SearchAdvanced = (listOptions, data) => {
const searchObj = [];
ModelOptions.search.forEach(prop => {
if (typeof data[prop] !== 'undefined') {
// let negate = data[prop].negate || false;
switch (data[prop].search) {
case 'single':
searchObj.push({
[prop]: new RegExp(data[prop].value, 'i')
});
break;
case 'range':
searchObj.push({
[prop]: {
$gte: data[prop].value[0] || Number.MAX_SAFE_INTEGER
}
});
searchObj.push({
[prop]: {
$lte: data[prop].value[1] || Number.MIN_SAFE_INTEGER
}
});
break;
case 'array':
searchObj.push({
[prop]: {
$in: [].concat(data[prop].value)
}
});
break;
}
}
});
// debug('Modelfields.search: %o', ModelOptions.search);
// debug('data: %o', data);
// debug('searchObj: %o', searchObj);
if (!searchObj || searchObj.length === 0) {
return Promise.resolve([]);
}
return Model.find({
$and: searchObj
})
.skip(listOptions.skip)
.limit(listOptions.limit)
.sort({ createdAt: listOptions.sort })
.exec();
};