ProjectHistoryRedisManager.coffee 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. Settings = require('settings-sharelatex')
  2. projectHistoryKeys = Settings.redis?.project_history?.key_schema
  3. rclient = require("redis-sharelatex").createClient(Settings.redis.documentupdater)
  4. logger = require('logger-sharelatex')
  5. module.exports = ProjectHistoryRedisManager =
  6. queueOps: (project_id, ops..., callback = (error, projectUpdateCount) ->) ->
  7. multi = rclient.multi()
  8. # Push the ops onto the project history queue
  9. multi.rpush projectHistoryKeys.projectHistoryOps({project_id}), ops...
  10. # To record the age of the oldest op on the queue set a timestamp if not
  11. # already present (SETNX).
  12. multi.setnx projectHistoryKeys.projectHistoryFirstOpTimestamp({project_id}), Date.now()
  13. multi.exec (error, result) ->
  14. return callback(error) if error?
  15. # return the number of entries pushed onto the project history queue
  16. callback null, result[0]
  17. queueRenameEntity: (project_id, projectHistoryId, entity_type, entity_id, user_id, projectUpdate, callback) ->
  18. projectUpdate =
  19. pathname: projectUpdate.pathname
  20. new_pathname: projectUpdate.newPathname
  21. meta:
  22. user_id: user_id
  23. ts: new Date()
  24. version: projectUpdate.version
  25. projectHistoryId: projectHistoryId
  26. projectUpdate[entity_type] = entity_id
  27. logger.log {project_id, projectUpdate}, "queue rename operation to project-history"
  28. jsonUpdate = JSON.stringify(projectUpdate)
  29. ProjectHistoryRedisManager.queueOps project_id, jsonUpdate, callback
  30. queueAddEntity: (project_id, projectHistoryId, entity_type, entitiy_id, user_id, projectUpdate, callback = (error) ->) ->
  31. projectUpdate =
  32. pathname: projectUpdate.pathname
  33. docLines: projectUpdate.docLines
  34. url: projectUpdate.url
  35. meta:
  36. user_id: user_id
  37. ts: new Date()
  38. version: projectUpdate.version
  39. projectHistoryId: projectHistoryId
  40. projectUpdate[entity_type] = entitiy_id
  41. logger.log {project_id, projectUpdate}, "queue add operation to project-history"
  42. jsonUpdate = JSON.stringify(projectUpdate)
  43. ProjectHistoryRedisManager.queueOps project_id, jsonUpdate, callback
  44. queueResyncProjectStructure: (project_id, projectHistoryId, docs, files, callback) ->
  45. logger.log {project_id, docs, files}, "queue project structure resync"
  46. projectUpdate =
  47. resyncProjectStructure: { docs, files }
  48. projectHistoryId: projectHistoryId
  49. meta:
  50. ts: new Date()
  51. jsonUpdate = JSON.stringify projectUpdate
  52. ProjectHistoryRedisManager.queueOps project_id, jsonUpdate, callback
  53. queueResyncDocContent: (project_id, projectHistoryId, doc_id, lines, version, pathname, callback) ->
  54. logger.log {project_id, doc_id, lines, version, pathname}, "queue doc content resync"
  55. projectUpdate =
  56. resyncDocContent:
  57. content: lines.join("\n"),
  58. version: version
  59. projectHistoryId: projectHistoryId
  60. path: pathname
  61. doc: doc_id
  62. meta:
  63. ts: new Date()
  64. jsonUpdate = JSON.stringify projectUpdate
  65. ProjectHistoryRedisManager.queueOps project_id, jsonUpdate, callback