backbone-http
Version:
An HTTP interface for BackboneORM
100 lines (82 loc) • 3.78 kB
text/coffeescript
###
backbone-http.js 0.5.0
Copyright (c) 2013 Vidigami - https://github.com/vidigami/backbone-http
License: MIT (http://www.opensource.org/licenses/mit-license.php)
Dependencies: Backbone.js, Underscore.js, Moment.js, Inflection.js, BackboneORM, and Superagent.
###
_ = require 'underscore'
Backbone = require 'backbone'
bborm = require 'backbone-orm'
Schema = bborm.Schema
Utils = bborm.Utils
JSONUtils = bborm.JSONUtils
ModelCache = bborm.CacheSingletons.ModelCache
HTTPCursor = require './cursor'
module.exports = class HTTPSync
constructor: (@model_type) ->
@model_type.model_name = Utils.findOrGenerateModelName(@model_type)
throw new Error("Missing url for model: #{@model_type}") unless @url = _.result(@model_type.prototype, 'url')
@schema = new Schema(@model_type)
@request = require 'superagent'
initialize: (model) ->
return if @is_initialized; @is_initialized = true
@schema.initialize()
###################################
# Backbone ORM - Class Extensions
###################################
# @private
resetSchema: (options, callback) ->
@request
.del(@url)
.end (err, res) ->
return callback(err) if err
return callback(new Error "Ajax failed with status #{res.status} for #{'destroy'} with: #{JSON.stringify(res.body)}") unless res.ok
callback()
cursor: (query={}) -> return new HTTPCursor(query, {model_type: @model_type, url: @url, request: @request})
destroy: (query, callback) ->
@request
.del(@url)
.query(query)
.end (err, res) ->
return callback(err) if err
return callback(new Error "Ajax failed with status #{res.status} for #{'destroy'} with: #{JSON.stringify(res.body)}") unless res.ok
callback()
module.exports = (type) ->
if Utils.isCollection(new type()) # collection
model_type = Utils.configureCollectionModelType(type, module.exports)
return type::sync = model_type::sync
sync = new HTTPSync(type)
type::sync = sync_fn = (method, model, options={}) -> # save for access by model extensions
sync.initialize()
return module.exports.apply(null, Array::slice.call(arguments, 1)) if method is 'createSync' # create a new sync
return sync if method is 'sync'
return sync.schema if method is 'schema'
return true if method is 'isRemote'
###################################
# Classic Backbone Sync
###################################
if _.contains(['create', 'update', 'patch', 'delete', 'read'], method)
throw new Error 'Missing url for model' unless url = options.url or _.result(model, 'url')
request = sync.request # use request from the sync
switch method
when 'read'
req = request.get(url).query({$one: !model.models}).type('json')
when 'create'
req = request.post(url).send(options.attrs or model.toJSON(options)).type('json')
when 'update'
req = request.put(url).send(options.attrs or model.toJSON(options)).type('json')
when 'patch'
req = request.patch(url).send(options.attrs or model.toJSON(options)).type('json')
when 'delete'
req = request.del(url)
req.end (err, res) ->
return options.error(err) if err
return options.error(new Error "Ajax failed with status #{res.status} for #{method} with: #{JSON.stringify(res.body)}") unless res.ok
options.success(JSONUtils.parse(res.body))
return
###################################
# Backbone ORM Sync
###################################
return if sync[method] then sync[method].apply(sync, Array::slice.call(arguments, 1)) else undefined
Utils.configureModelType(type) # mixin extensions
return ModelCache.configureSync(type, sync_fn)