Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save dreamerkumar/9640cb9b92cf21c109a4c047065a7e4d to your computer and use it in GitHub Desktop.
Save dreamerkumar/9640cb9b92cf21c109a4c047065a7e4d to your computer and use it in GitHub Desktop.
Logic to implement get list, get, post, put and delete. This one is done without promises. Logic is generic so can be used with any mongoose model
'use strict';
require('./model');
const mongoose = require('mongoose');
const Model = mongoose.model('Rep');
const _ = require('lodash');
const controller = {
list: (req, res) => {
Model.find(getCallback(opTypes.list, req, res));
},
get: (req, res) => {
Model.findById(_.get(req, 'params.id')).exec(getCallback(opTypes.get, req, res));
},
post: (req, res) => {
const data = _.pick(req.body, _.pickSchema(Model));
new Model(data).save(getCallback(opTypes.post, req, res));
},
put: (req, res) => {
Model.findById(_.get(req, 'params.id')).exec(getCallback(opTypes.put, req, res));
},
delete: (req, res) => {
Model.findById(_.get(req, 'params.id')).exec(getCallback(opTypes.delete, req, res));
}
};
const getTypeResponse = (res, result) => res.json(result);
const saveTypeResponse = (res, result) => res.send(result._id);
const deleteTypeResponse = (res, result) => res.send('Delete Successful');
const handleSuccess = (opType, req, res, result) => {
console.log(opType.text + ' successfull', result);
opType.response(res, result);
};
const reportFailure = (opType, res, err, statusCode) => {
console.log(opType.text + ' failed: ', err);
res.status(statusCode || opType.errorStatusCode).send({error: opType.text +' failed'});
};
const handleOpStatus = (opType, req, res, err, result, statusCode) => {
if(err){
reportFailure(opType, res, err, statusCode);
} else {
handleSuccess(opType, req, res, result);
}
};
const putOp = (opType, req, res, result) => {
var body = _.get(req, 'body');
const validKeys = _.intersection(_.keys(body), _.pickSchema(Model))
const data = _.pick(body, validKeys);
_.extend(result, data);
result.save(handleOpStatus(opTypes.put, req, res, null, result));
};
const deleteOp = (opType, req, res, result) => {
result.remove(handleOpStatus(opTypes.delete, req, res, null, result));
};
const opTypes = {
list: { emptyAllowed: true, text: 'Get list', response: getTypeResponse, errorStatusCode: 404, op: handleSuccess },
get: { text: 'Get', response: getTypeResponse, errorStatusCode: 404, op: handleSuccess },
post: { text: 'Save', response: saveTypeResponse, errorStatusCode: 500, op: handleSuccess },
put: { text: 'Update', response: saveTypeResponse, errorStatusCode: 500, op: putOp },
delete: { text: 'Delete', response: deleteTypeResponse, errorStatusCode: 500, op: deleteOp }
};
const getCallback = (opType, req, res) => {
return (err, result) => {
if(err){
reportFailure(opType, res, err);
} else {
if(!result && !opType.emptyAllowed){
reportFailure(opType, res, 'Not Found', 404)
} else {
opType.op(opType, req, res, result);
}
}
};
};
module.exports = controller;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment