habitica/src/server/store.coffee

94 lines
2.9 KiB
CoffeeScript
Raw Normal View History

2013-01-25 19:18:17 +00:00
###
Setup read / write access
@param store
###
module.exports.customAccessControl = (store) ->
userAccess(store)
partySystem(store)
REST(store)
###
General user access
###
userAccess = (store) ->
store.readPathAccess "users.*", -> # captures, next) ->
next = arguments[arguments.length - 1]
2013-02-06 19:57:12 +00:00
return next(true) unless @session?.userId # https://github.com/codeparty/racer/issues/37
uid = arguments[0]
next (uid is @session.userId) or @session.req?._isServer
store.writeAccess "*", "users.*", -> # captures, value, next) ->
2013-02-06 19:57:12 +00:00
next = arguments[arguments.length-1]
return next(true) unless @session?.userId # https://github.com/codeparty/racer/issues/37
captures = arguments[0].split('.')
uid = captures.shift()
attrPath = captures.join('.') # new array shifted left, after shift() was run
# public access to users.*.party.invitation (TODO, lock down a bit more)
if (attrPath == 'party.invitation')
return next(true)
# Same session (user.id = this.session.userId)
if (uid is @session.userId) or @session.req?._isServer
return next(true)
next(false)
store.writeAccess "*", "users.*.balance", (id, newBalance, next) ->
2013-02-06 19:57:12 +00:00
return next(true) unless @session?.userId # https://github.com/codeparty/racer/issues/37
oldBalance = @session.req._racerModel?.get("users.#{id}.balance") || 0
purchasingSomethingOnClient = newBalance < oldBalance
next(purchasingSomethingOnClient or @session.req?._isServer)
2013-01-25 19:18:17 +00:00
store.writeAccess "*", "users.*.flags.ads", -> # captures, value, next ->
next = arguments[arguments.length - 1]
2013-02-06 19:57:12 +00:00
return next(true) unless @session?.userId # https://github.com/codeparty/racer/issues/37
next(@session.req?._isServer)
2013-01-30 20:57:36 +00:00
###
REST
Get user with API token
###
REST = (store) ->
store.query.expose "users", "withIdAndToken", (id, apiToken) ->
2013-01-30 20:57:36 +00:00
@where("id").equals(id)
.where('apiToken').equals(apiToken)
2013-01-30 20:57:36 +00:00
.limit(1)
store.queryAccess "users", "withIdAndToken", (id, apiToken, next) ->
2013-02-06 19:57:12 +00:00
return next(true) unless @session?.userId # https://github.com/codeparty/racer/issues/37
next(true) # only user has id & token
2013-01-30 21:10:57 +00:00
###
Party permissions
###
partySystem = (store) ->
store.query.expose "users", "party", (ids) ->
2013-01-30 21:10:57 +00:00
@where("id").within(ids)
.only('stats',
'items',
'party',
'preferences.gender',
'preferences.armorSet',
'auth.local.username',
'auth.facebook.displayName')
2013-01-30 21:10:57 +00:00
store.queryAccess "users", "party", (ids, next) ->
2013-01-30 21:10:57 +00:00
next(true) # no harm in public user stats
store.query.expose "parties", "withId", (id) ->
@where("id").equals(id)
store.queryAccess "parties", "withId", (id, next) ->
next(true)
store.readPathAccess "parties.*", ->
next = arguments[arguments.length-1]
next(true)
store.writeAccess "*", "parties.*", ->
next = arguments[arguments.length-1]
next(true)