swoosh
Version:
A quick declarative way to use a mongodb backend.
99 lines (81 loc) • 2.25 kB
text/coffeescript
mongoose = require 'mongoose'
module.exports = (name, attributes, methods, publicAttr, root) ->
getPub = (entity) -> if publicAttr then generated.pub entity else entity
generated = {}
pub = false
schema = new mongoose.Schema(attributes)
generated.model = mongoose.model(name, schema)
if publicAttr
generated.pub = (entity) ->
retval = {}
for x in publicAttr
retval[x] = entity[x]
retval
generated.get = (id, fn) ->
cb = fn ? ->
if id
generated.model.findById id, (err, entity) ->
if err then cb err
else cb null, entity
else
generated.model.find {}, (err, entitys) ->
if err then cb err
else cb null, entitys
generated.post = (data, fn) ->
cb = fn ? ->
posting = new generated.model(data)
posting.save (err) ->
if err
cb err
else
cb null, posting
generated.put = (id, data, fn) ->
cb = fn ? ->
generated.model.findById id, (err, entity) ->
if err then cb err
else
for attr of data
entity[attr] = data[attr]
entity.save (err) ->
if err then cb err
else cb null, entity
generated.delete = (id, fn) ->
cb = fn ? ->
if id
generated.model.remove { _id: id }, (err) -> cb(err)
else
cb "No id specified"
generated.route = (app) ->
if "get" in methods
app.get "/#{root}/#{name}/:id?", (req, res) ->
generated.get req.params.id, (err, response) ->
if err
res.send 500, err
else if req.params.id
res.send getPub(response)
else
res.send (
for x in response
getPub x)
if "post" in methods
app.post "/#{root}/
generated.post req.body, (err, response) ->
if err
res.send 500, err
else
res.send getPub(response)
if "put" in methods
app.put "/#{root}/
generated.put req.params.id, req.body, (err, response) ->
if err
res.send 500, err
else
res.send response
if "delete" in methods
app.delete "/#{root}/#{name}/:id", (req, res) ->
generated.delete req.params.id, (err) ->
if err
res.send 500, err
else
res.send 200
generated