mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-19 03:52:31 -05:00
e3abb9ceb3
Watching for these events: Level completed User registered Playtime of 30s in a level Purchase Payment Subscribe Earned an achievement
87 lines
2.8 KiB
CoffeeScript
87 lines
2.8 KiB
CoffeeScript
Purchase = require './Purchase'
|
|
User = require '../users/User'
|
|
Handler = require '../commons/Handler'
|
|
{handlers} = require '../commons/mapping'
|
|
mongoose = require 'mongoose'
|
|
log = require 'winston'
|
|
sendwithus = require '../sendwithus'
|
|
hipchat = require '../hipchat'
|
|
|
|
PurchaseHandler = class PurchaseHandler extends Handler
|
|
modelClass: Purchase
|
|
editableProperties: []
|
|
postEditableProperties: ['purchased']
|
|
jsonSchema: require '../../app/schemas/models/purchase.schema'
|
|
|
|
makeNewInstance: (req) ->
|
|
purchase = super(req)
|
|
purchase.set 'purchaser', req.user._id
|
|
purchase.set 'recipient', req.user._id
|
|
purchase.set 'created', new Date().toISOString()
|
|
purchase
|
|
|
|
post: (req, res) ->
|
|
purchased = req.body.purchased
|
|
purchaser = req.user._id
|
|
purchasedOriginal = purchased?.original
|
|
|
|
Handler = require '../commons/Handler'
|
|
return @sendBadInputError(res) if not Handler.isID(purchasedOriginal)
|
|
|
|
collection = purchased?.collection
|
|
return @sendBadInputError(res) if not collection in @jsonSchema.properties.purchased.properties.collection.enum
|
|
|
|
handler = require('../' + handlers[collection])
|
|
criteria = { 'original': purchasedOriginal }
|
|
sort = { 'version.major': -1, 'version.minor': -1 }
|
|
|
|
handler.modelClass.findOne(criteria).sort(sort).exec (err, purchasedItem) =>
|
|
gemsOwned = req.user.get('earned')?.gems or 0
|
|
return @sendDatabaseError(res, err) if err
|
|
return @sendNotFoundError(res) unless purchasedItem
|
|
return @sendBadInputError(res, 'This cannot be purchased.') if not cost = purchasedItem.get('gems')
|
|
return @sendForbiddenError(res, 'Not enough gems.') if cost > req.user.gems()
|
|
req.purchasedItem = purchasedItem # for safekeeping
|
|
|
|
criteria = {
|
|
'purchased.original': purchasedOriginal
|
|
'recipient': purchaser
|
|
}
|
|
Purchase.findOne criteria, (err, purchase) =>
|
|
if purchase
|
|
@addPurchaseToUser(req, res)
|
|
return @sendSuccess(res, @formatEntity(req, purchase))
|
|
|
|
else
|
|
super(req, res)
|
|
|
|
onPostSuccess: (req) ->
|
|
@addPurchaseToUser(req)
|
|
req.user?.saveActiveUser 'purchase'
|
|
|
|
addPurchaseToUser: (req) ->
|
|
user = req.user
|
|
purchased = user.get('purchased') or {}
|
|
purchased = _.cloneDeep purchased
|
|
item = req.purchasedItem
|
|
|
|
group = switch item.get('kind')
|
|
when 'Item' then 'items'
|
|
when 'Hero' then 'heroes'
|
|
else 'levels'
|
|
|
|
original = item.get('original') + ''
|
|
purchased[group] ?= []
|
|
unless original in purchased[group]
|
|
#- add the purchase to the list of purchases
|
|
purchased[group].push(original+'')
|
|
user.set('purchased', purchased)
|
|
|
|
#- deduct the gems from the user
|
|
spent = hadSpent = user.get('spent') ? 0
|
|
spent += item.get('gems')
|
|
user.set('spent', spent)
|
|
|
|
user.save()
|
|
|
|
module.exports = new PurchaseHandler()
|