UserFeaturesUpdater.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const { User } = require('../../models/User')
  2. const { callbackify } = require('util')
  3. const Settings = require('@overleaf/settings')
  4. function _featuresChanged(newFeatures, featuresBefore) {
  5. for (const feature in newFeatures) {
  6. if (featuresBefore[feature] !== newFeatures[feature]) {
  7. return true
  8. }
  9. }
  10. return false
  11. }
  12. async function updateFeatures(userId, features) {
  13. const update = {
  14. featuresUpdatedAt: new Date(),
  15. }
  16. // record the system-wide features epoch, if defined
  17. if (Settings.featuresEpoch) {
  18. update.featuresEpoch = Settings.featuresEpoch
  19. }
  20. for (const key in features) {
  21. const value = features[key]
  22. update[`features.${key}`] = value
  23. }
  24. const docBeforeUpdate = await User.findByIdAndUpdate(userId, update).exec()
  25. let featuresChanged = false
  26. if (docBeforeUpdate) {
  27. featuresChanged = _featuresChanged(features, docBeforeUpdate.features)
  28. }
  29. return { features, featuresChanged }
  30. }
  31. async function overrideFeatures(userId, features) {
  32. const update = { features, featuresUpdatedAt: new Date() }
  33. const docBeforeUpdate = await User.findByIdAndUpdate(userId, update).exec()
  34. let featuresChanged = false
  35. if (docBeforeUpdate) {
  36. featuresChanged = _featuresChanged(features, docBeforeUpdate.features)
  37. }
  38. return featuresChanged
  39. }
  40. async function createFeaturesOverride(userId, featuresOverride) {
  41. return await User.updateOne(
  42. { _id: userId },
  43. { $push: { featuresOverrides: featuresOverride } }
  44. ).exec()
  45. }
  46. module.exports = {
  47. updateFeatures: callbackify(updateFeatures),
  48. overrideFeatures: callbackify(overrideFeatures),
  49. createFeaturesOverride: callbackify(createFeaturesOverride),
  50. promises: {
  51. updateFeatures,
  52. overrideFeatures,
  53. createFeaturesOverride,
  54. },
  55. }