Created
October 29, 2017 22:27
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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