ProjectHistoryHandler.coffee 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. Project = require('../../models/Project').Project
  2. ProjectDetailsHandler = require "./ProjectDetailsHandler"
  3. logger = require('logger-sharelatex')
  4. settings = require("settings-sharelatex")
  5. HistoryManager = require "../History/HistoryManager"
  6. ProjectEntityUpdateHandler = require "./ProjectEntityUpdateHandler"
  7. module.exports = ProjectHistoryHandler =
  8. setHistoryId: (project_id, history_id, callback = (err) ->) ->
  9. # reject invalid history ids
  10. return callback(new Error("invalid history id")) if !history_id or typeof(history_id) isnt 'number'
  11. # use $exists:false to prevent overwriting any existing history id, atomically
  12. Project.update {_id: project_id, "overleaf.history.id": {$exists:false}}, {"overleaf.history.id":history_id}, (err, result)->
  13. return callback(err) if err?
  14. return callback(new Error("history exists")) if result?.n == 0
  15. callback()
  16. getHistoryId: (project_id, callback = (err, result) ->) ->
  17. ProjectDetailsHandler.getDetails project_id, (err, project) ->
  18. return callback(err) if err? # n.b. getDetails returns an error if the project doesn't exist
  19. callback(null, project?.overleaf?.history?.id)
  20. upgradeHistory: (project_id, callback = (err, result) ->) ->
  21. # project must have an overleaf.history.id before allowing display of new history
  22. Project.update {_id: project_id, "overleaf.history.id": {$exists:true}}, {"overleaf.history.display":true, "overleaf.history.upgradedAt": new Date()}, (err, result)->
  23. return callback(err) if err?
  24. # return an error if overleaf.history.id wasn't present
  25. return callback(new Error("history not upgraded")) if result?.n == 0
  26. callback()
  27. downgradeHistory: (project_id, callback = (err, result) ->) ->
  28. Project.update {_id: project_id, "overleaf.history.upgradedAt": {$exists:true}}, {"overleaf.history.display":false, $unset:{"overleaf.history.upgradedAt":1}}, (err, result)->
  29. return callback(err) if err?
  30. return callback(new Error("history not downgraded")) if result?.n == 0
  31. callback()
  32. ensureHistoryExistsForProject: (project_id, callback = (err) ->) ->
  33. # We can only set a history id for a project that doesn't have one. The
  34. # history id is cached in the project history service, and changing an
  35. # existing value corrupts the history, leaving it in an irrecoverable
  36. # state. Setting a history id when one wasn't present before is ok,
  37. # because undefined history ids aren't cached.
  38. ProjectHistoryHandler.getHistoryId project_id, (err, history_id) ->
  39. return callback(err) if err?
  40. return callback() if history_id? # history already exists, success
  41. HistoryManager.initializeProject (err, history) ->
  42. return callback(err) if err?
  43. return callback(new Error("failed to initialize history id")) if !history?.overleaf_id
  44. ProjectHistoryHandler.setHistoryId project_id, history.overleaf_id, (err) ->
  45. return callback(err) if err?
  46. ProjectEntityUpdateHandler.resyncProjectHistory project_id, (err) ->
  47. return callback(err) if err?
  48. logger.log {project_id: project_id, history_id: history.overleaf_id}, "started syncing project with new history id"
  49. HistoryManager.flushProject project_id, callback