micro-model
Version:
Model that can be used on both Client & Server
51 lines (44 loc) • 1.27 kB
text/coffeescript
superagent ?= require 'superagent'
PassiveModel ?= require 'passive-model'
# Utility functions.
rp = superagent.Request.prototype
# Adding delete.
superagent.delete = superagent.del
# Making superagent return (err, res) if we supply two arguments to callback.
rp.endWithoutErr = rp.end
rp.end = (fn) ->
@endWithoutErr (res) ->
return fn(res) if fn.length < 2
if res.ok then fn(null, res) else fn(response.text);
# `id` helper `.get('/users').id('alex')`.
rp.id = (obj) ->
@url = "#{@url}/#{obj.id || obj}"
@
# Allow send Model.
rp.sendWithoutModel = rp.send
rp.send = (data) ->
if data._model
@model data
data = data.toHash()
@sendWithoutModel data
# Unmarshal or update model.
rp.model = (model) ->
@_model = model
@
rp.endWithoutModel = rp.end
rp.end = (fn) ->
@endWithoutModel (err, res) =>
if @_model and !err
data = res.body
if _.isFunction @_model
# unmarshalling model or array of models.
if _.isArray data
models = (PassiveModel.fromHash(doc, @_model) for doc in data)
fn null, models
else
fn null, PassiveModel.fromHash(res.body, @_model)
else
# updating existing model.
fn null, @_model.fromHash(data)
else
fn err, res