_ = require 'lodash'
stampit = require 'stampit'
co = require 'co'
_ = require 'lodash'
stampit = require 'stampit'
co = require 'co'
function to return ActiveRecord like class for REST API access
baseUrl: base url to access REST API
module.exports =
armodel: (baseUrl) ->
stamp = stampit()
.init (props) ->
_.extend @, @parse props
.methods
getStamp: ->
stamp
isNew: ->
not @[@getStamp().idAttribute]?
parse: (data = {}) ->
data
fetch: ->
stamp = @getStamp()
res = yield stamp.api.get stamp.url('read', _.pick(@, stamp.idAttribute))
stamp.api.ok res, 200
_.extend @, @parse res.body
save: (values = {}, opts = {}) ->
{url} = opts
_.extend @, values
stamp = @getStamp()
if @isNew()
res = yield stamp.api.post url || stamp.url('create'), @, opts
stamp.api.ok res, 201
_.extend @, @parse res.body
else
res = yield stamp.api.put url || stamp.url('update', _.pick(@, stamp.idAttribute)), @, opts
stamp.api.ok res, [200, 204]
_.extend @, @parse res.body
destroy: ->
stamp = @getStamp()
res = yield stamp.api.delete stamp.url('delete', _.pick(@, stamp.idAttribute))
stamp.api.ok res, [200, 204]
@
.statics
idAttribute: 'id'
baseUrl: baseUrl
api: sails.config.api()
use: (api) ->
@api = api
@
method: 'create', 'read', 'update', 'delete', or 'list'
params:
id: id of object instance
...
url: (method = 'list', params = {}, idAttribute = @idAttribute) ->
params[idAttribute] ?= '.'
URL = require 'url'
path = require 'path'
obj = URL.parse @baseUrl
obj.pathname = path.join obj.pathname, params[idAttribute].toString()
obj.query = _.omit params, idAttribute
URL.format obj
fetchOne: (id) ->
props = {}
props[@idAttribute] = id
yield @(props).fetch()
opts = url: ‘http://abc.com/api/model/full‘ data: createdBy: ‘admin@abc.com’ …
Example:
co proxy.fetchAll() .then (gen) -> for i from gen() console.log proxy ```
fetchAll: (opts = {}) ->
{url, data} = opts
opts = _.omit opts, 'url', 'data'
self = @
skip = 0
count = 0
results = []
cond = ->
skip < count
action = ->
co self.api.get url || self.url('list', skip: skip), data, opts
.then (res) ->
self.api.ok res, 200
{body} = res
if Array.isArray body
_body =
count: body.length
results: body
body = _body
skip = skip + count
{count, results} = body
yield sails.config.Promise.until cond, action
.then -> ->
for i in results
yield i