UserFeaturesUpdater.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. const { User } = require('../../models/User')
  2. const { promisifyAll } = require('../../util/promises')
  3. function _featuresChanged(newFeatures, featuresBefore) {
  4. for (const feature in newFeatures) {
  5. if (featuresBefore[feature] !== newFeatures[feature]) {
  6. return true
  7. }
  8. }
  9. return false
  10. }
  11. module.exports = {
  12. updateFeatures(userId, features, callback) {
  13. const update = {
  14. featuresUpdatedAt: new Date(),
  15. }
  16. for (const key in features) {
  17. const value = features[key]
  18. update[`features.${key}`] = value
  19. }
  20. User.findByIdAndUpdate(userId, update, (err, docBeforeUpdate) => {
  21. let featuresChanged = false
  22. if (docBeforeUpdate) {
  23. featuresChanged = _featuresChanged(features, docBeforeUpdate.features)
  24. }
  25. return callback(err, features, featuresChanged)
  26. })
  27. },
  28. overrideFeatures(userId, features, callback) {
  29. const update = { features, featuresUpdatedAt: new Date() }
  30. User.findByIdAndUpdate(userId, update, (err, docBeforeUpdate) => {
  31. let featuresChanged = false
  32. if (docBeforeUpdate) {
  33. featuresChanged = _featuresChanged(features, docBeforeUpdate.features)
  34. }
  35. return callback(err, featuresChanged)
  36. })
  37. },
  38. createFeaturesOverride(userId, featuresOverride, callback) {
  39. User.updateOne(
  40. { _id: userId },
  41. { $push: { featuresOverrides: featuresOverride } },
  42. callback
  43. )
  44. },
  45. }
  46. module.exports.promises = promisifyAll(module.exports, {
  47. multiResult: {
  48. updateFeatures: ['features', 'featuresChanged'],
  49. },
  50. })