UserOnboardingController.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const { db, ObjectId } = require('../../infrastructure/mongodb')
  2. const UserUpdater = require('./UserUpdater')
  3. const EmailHandler = require('../Email/EmailHandler')
  4. const logger = require('logger-sharelatex')
  5. const async = require('async')
  6. const _ = require('underscore')
  7. module.exports = {
  8. sendRecentSignupOnboardingEmails(req, res, next) {
  9. res.setTimeout(600 * 1000) // increase timeout to handle days with a lot of signups
  10. // find all the users with no onboardingEmailSentAt and
  11. // have signed up in the last 7 days
  12. db.users
  13. .find(
  14. {
  15. onboardingEmailSentAt: null,
  16. _id: {
  17. $gt: ObjectId.createFromTime(Date.now() / 1000 - 7 * 24 * 60 * 60)
  18. }
  19. },
  20. { projection: { email: 1 } }
  21. )
  22. .toArray(function(error, users) {
  23. if (error) {
  24. return next(error)
  25. }
  26. const ids = _.map(users, function(user) {
  27. return user._id
  28. })
  29. logger.log('SENDING USER ONBOARDING EMAILS TO: ', ids)
  30. async.mapLimit(users, 10, sendOne, function(error) {
  31. if (error) {
  32. return next(error)
  33. }
  34. logger.log('DONE SENDING ONBOARDING EMAILS')
  35. res.send(ids)
  36. })
  37. })
  38. }
  39. }
  40. function sendOne(user, callback) {
  41. var opts = {
  42. to: user.email
  43. }
  44. EmailHandler.sendEmail('userOnboardingEmail', opts, function(error) {
  45. if (error) {
  46. return callback(error)
  47. }
  48. UserUpdater.updateUser(
  49. user._id,
  50. { $set: { onboardingEmailSentAt: new Date() } },
  51. function() {
  52. callback()
  53. }
  54. )
  55. })
  56. }