UserRegistrationHandler.coffee 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. sanitize = require('sanitizer')
  2. User = require("../../models/User").User
  3. UserCreator = require("./UserCreator")
  4. AuthenticationManager = require("../Authentication/AuthenticationManager")
  5. NewsLetterManager = require("../Newsletter/NewsletterManager")
  6. async = require("async")
  7. logger = require("logger-sharelatex")
  8. module.exports =
  9. validateEmail : (email) ->
  10. re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\ ".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA -Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  11. return re.test(email)
  12. hasZeroLengths : (props) ->
  13. hasZeroLength = false
  14. props.forEach (prop) ->
  15. if prop.length == 0
  16. hasZeroLength = true
  17. return hasZeroLength
  18. _registrationRequestIsValid : (body, callback)->
  19. email = sanitize.escape(body.email).trim().toLowerCase()
  20. password = body.password
  21. username = email.match(/^[^@]*/)
  22. if @hasZeroLengths([password, email])
  23. return false
  24. else if !@validateEmail(email)
  25. return false
  26. else
  27. return true
  28. _createNewUserIfRequired: (user, userDetails, callback)->
  29. if !user?
  30. UserCreator.createNewUser {holdingAccount:false, email:userDetails.email}, callback
  31. else
  32. callback null, user
  33. registerNewUser: (userDetails, callback)->
  34. self = @
  35. requestIsValid = @_registrationRequestIsValid userDetails
  36. if !requestIsValid
  37. return callback(new Error("request is not valid"))
  38. userDetails.email = userDetails.email?.trim()?.toLowerCase()
  39. User.findOne email:userDetails.email, (err, user)->
  40. if err?
  41. return callback err
  42. if user?.holdingAccount == false
  43. return callback(new Error("EmailAlreadyRegistered"), user)
  44. self._createNewUserIfRequired user, userDetails, (err, user)->
  45. if err?
  46. return callback(err)
  47. async.series [
  48. (cb)-> User.update {_id: user._id}, {"$set":{holdingAccount:false}}, cb
  49. (cb)-> AuthenticationManager.setUserPassword user._id, userDetails.password, cb
  50. (cb)->
  51. NewsLetterManager.subscribe user, ->
  52. cb() #this can be slow, just fire it off
  53. ], (err)->
  54. logger.log user: user, "registered"
  55. callback(err, user)