LearnedWordsManager.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. $push: { 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. const words =
  59. (preferences != null ? preferences.learnedWords : undefined) || []
  60. mongoCache.set(userToken, words)
  61. callback(null, words)
  62. })
  63. },
  64. deleteUsersLearnedWords(userToken, callback) {
  65. if (callback == null) {
  66. callback = () => {}
  67. }
  68. db.spellingPreferences.remove({ token: userToken }, callback)
  69. }
  70. }
  71. const promises = {
  72. learnWord: promisify(LearnedWordsManager.learnWord),
  73. unlearnWord: promisify(LearnedWordsManager.unlearnWord),
  74. getLearnedWords: promisify(LearnedWordsManager.getLearnedWords),
  75. deleteUsersLearnedWords: promisify(
  76. LearnedWordsManager.deleteUsersLearnedWords
  77. )
  78. }
  79. LearnedWordsManager.promises = promises
  80. module.exports = LearnedWordsManager
  81. ;['learnWord', 'unlearnWord', 'getLearnedWords'].map(method =>
  82. metrics.timeAsyncMethod(
  83. LearnedWordsManager,
  84. method,
  85. 'mongo.LearnedWordsManager',
  86. logger
  87. )
  88. )