LearnedWordsManager.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. const db = require('./DB')
  2. const mongoCache = require('./MongoCache')
  3. const logger = require('logger-sharelatex')
  4. const metrics = require('metrics-sharelatex')
  5. const { promisify } = require('util')
  6. const LearnedWordsManager = {
  7. learnWord(userToken, word, callback) {
  8. if (callback == null) {
  9. callback = () => {}
  10. }
  11. mongoCache.del(userToken)
  12. return db.spellingPreferences.update(
  13. {
  14. token: userToken
  15. },
  16. {
  17. $addToSet: { learnedWords: word }
  18. },
  19. {
  20. upsert: true
  21. },
  22. callback
  23. )
  24. },
  25. unlearnWord(userToken, word, callback) {
  26. if (callback == null) {
  27. callback = () => {}
  28. }
  29. mongoCache.del(userToken)
  30. return db.spellingPreferences.update(
  31. {
  32. token: userToken
  33. },
  34. {
  35. $pull: { learnedWords: word }
  36. },
  37. callback
  38. )
  39. },
  40. getLearnedWords(userToken, callback) {
  41. if (callback == null) {
  42. callback = () => {}
  43. }
  44. const mongoCachedWords = mongoCache.get(userToken)
  45. if (mongoCachedWords != null) {
  46. metrics.inc('mongoCache', 0.1, { status: 'hit' })
  47. return callback(null, mongoCachedWords)
  48. }
  49. metrics.inc('mongoCache', 0.1, { status: 'miss' })
  50. logger.info({ userToken }, 'mongoCache miss')
  51. db.spellingPreferences.findOne({ token: userToken }, function(
  52. error,
  53. preferences
  54. ) {
  55. if (error != null) {
  56. return callback(error)
  57. }
  58. let words =
  59. (preferences != null ? preferences.learnedWords : undefined) || []
  60. if (words) {
  61. // remove duplicates
  62. words = words.filter(
  63. (value, index, self) => self.indexOf(value) === index
  64. )
  65. }
  66. mongoCache.set(userToken, words)
  67. callback(null, words)
  68. })
  69. },
  70. deleteUsersLearnedWords(userToken, callback) {
  71. if (callback == null) {
  72. callback = () => {}
  73. }
  74. db.spellingPreferences.remove({ token: userToken }, callback)
  75. }
  76. }
  77. const promises = {
  78. learnWord: promisify(LearnedWordsManager.learnWord),
  79. unlearnWord: promisify(LearnedWordsManager.unlearnWord),
  80. getLearnedWords: promisify(LearnedWordsManager.getLearnedWords),
  81. deleteUsersLearnedWords: promisify(
  82. LearnedWordsManager.deleteUsersLearnedWords
  83. )
  84. }
  85. LearnedWordsManager.promises = promises
  86. module.exports = LearnedWordsManager
  87. ;['learnWord', 'unlearnWord', 'getLearnedWords'].map(method =>
  88. metrics.timeAsyncMethod(
  89. LearnedWordsManager,
  90. method,
  91. 'mongo.LearnedWordsManager',
  92. logger
  93. )
  94. )