ReferalAllocator.coffee 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. _ = require("underscore")
  2. logger = require('logger-sharelatex')
  3. User = require('../../models/User').User
  4. SubscriptionLocator = require "../Subscription/SubscriptionLocator"
  5. Settings = require "settings-sharelatex"
  6. module.exports = ReferalAllocator =
  7. allocate: (referal_id, new_user_id, referal_source, referal_medium, callback = ->)->
  8. if !referal_id?
  9. return logger.log new_user_id:new_user_id, "no referal for user"
  10. logger.log referal_id:referal_id, new_user_id:new_user_id, "allocating users referal"
  11. query = {"referal_id":referal_id}
  12. User.findOne query, (error, user) ->
  13. return callback(error) if error?
  14. return callback(new Error("user not found")) if !user? or !user._id?
  15. if referal_source == "bonus"
  16. User.update query, {
  17. $push:
  18. refered_users: new_user_id
  19. $inc:
  20. refered_user_count: 1
  21. }, {}, (err)->
  22. if err?
  23. logger.err err:err, referal_id:referal_id, new_user_id:new_user_id, "something went wrong allocating referal"
  24. return callback(err)
  25. ReferalAllocator.assignBonus user._id, callback
  26. else
  27. callback()
  28. assignBonus: (user_id, callback = (error) ->) ->
  29. query = _id: user_id
  30. User.findOne query, (error, user) ->
  31. return callback(error) if error
  32. return callback(new Error("user not found #{user_id} for assignBonus")) if !user?
  33. logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus"
  34. if user.refered_user_count? and user.refered_user_count > 0
  35. newFeatures = ReferalAllocator._calculateFeatures(user)
  36. if _.isEqual newFeatures, user.features
  37. return callback()
  38. User.update query, { $set: features: newFeatures }, callback
  39. else
  40. callback()
  41. _calculateFeatures : (user)->
  42. bonusLevel = ReferalAllocator._getBonusLevel(user)
  43. currentFeatures = _.clone(user.features) #need to clone because we exend with underscore later
  44. betterBonusFeatures = {}
  45. _.each Settings.bonus_features["#{bonusLevel}"], (bonusLevel, key)->
  46. currentLevel = user?.features?[key]
  47. if _.isBoolean(currentLevel) and currentLevel == false
  48. betterBonusFeatures[key] = bonusLevel
  49. if _.isNumber(currentLevel)
  50. if currentLevel == -1
  51. return
  52. bonusIsGreaterThanCurrent = currentLevel < bonusLevel
  53. if bonusIsGreaterThanCurrent or bonusLevel == -1
  54. betterBonusFeatures[key] = bonusLevel
  55. newFeatures = _.extend(currentFeatures, betterBonusFeatures)
  56. return newFeatures
  57. _getBonusLevel: (user)->
  58. highestBonusLevel = 0
  59. _.each _.keys(Settings.bonus_features), (level)->
  60. levelIsLessThanUser = level <= user.refered_user_count
  61. levelIsMoreThanCurrentHighest = level >= highestBonusLevel
  62. if levelIsLessThanUser and levelIsMoreThanCurrentHighest
  63. highestBonusLevel = level
  64. return highestBonusLevel