TpdsUpdateSender.coffee 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. settings = require('settings-sharelatex')
  2. logger = require('logger-sharelatex')
  3. path = require('path')
  4. Project = require('../../models/Project').Project
  5. keys = require('../../infrastructure/Keys')
  6. metrics = require("../../infrastructure/Metrics")
  7. request = require("request")
  8. buildPath = (user_id, project_name, filePath)->
  9. projectPath = path.join(project_name, "/", filePath)
  10. projectPath = encodeURIComponent(projectPath)
  11. fullPath = path.join("/user/", "#{user_id}", "/entity/",projectPath)
  12. return fullPath
  13. tpdsworkerEnabled = -> settings.apis.tpdsworker?.url?
  14. if !tpdsworkerEnabled()
  15. logger.log "tpdsworker is not enabled, request will not be sent to it"
  16. module.exports = TpdsUpdateSender =
  17. _enqueue: (group, method, job, callback)->
  18. if !tpdsworkerEnabled()
  19. return callback()
  20. opts =
  21. uri:"#{settings.apis.tpdsworker.url}/enqueue/web_to_tpds_http_requests"
  22. json :
  23. group:group
  24. method:method
  25. job:job
  26. method:"post"
  27. timeout: (5 * 1000)
  28. request opts, (err)->
  29. if err?
  30. logger.err err:err, "error queuing something in the tpdsworker"
  31. callback(err)
  32. else
  33. logger.log group:group, "successfully queued up job for tpdsworker"
  34. callback()
  35. _addEntity: (options, callback = (err)->)->
  36. getProjectsUsersIds options.project_id, (err, user_id, allUserIds)->
  37. logger.log project_id: options.project_id, user_id:user_id, path: options.path, uri:options.uri, rev:options.rev, "sending file to third party data store"
  38. postOptions =
  39. method : "post"
  40. headers:
  41. sl_entity_rev:options.rev
  42. sl_project_id:options.project_id
  43. sl_all_user_ids:JSON.stringify(allUserIds)
  44. uri : "#{settings.apis.thirdPartyDataStore.url}#{buildPath(user_id, options.project_name, options.path)}"
  45. title: "addFile"
  46. streamOrigin : options.streamOrigin
  47. TpdsUpdateSender._enqueue options.project_id, "pipeStreamFrom", postOptions, (err)->
  48. logger.log project_id: options.project_id, user_id:user_id, path: options.path, uri:options.uri, rev:options.rev, "sending file to third party data store queued up for processing"
  49. callback(err)
  50. addFile : (options, callback = (err)->)->
  51. metrics.inc("tpds.add-file")
  52. options.streamOrigin = settings.apis.filestore.url + path.join("/project/#{options.project_id}/file/","#{options.file_id}")
  53. @_addEntity(options, callback)
  54. addDoc : (options, callback = (err)->)->
  55. metrics.inc("tpds.add-doc")
  56. options.streamOrigin = settings.apis.docstore.pubUrl + path.join("/project/#{options.project_id}/doc/","#{options.doc_id}/raw")
  57. @_addEntity(options, callback)
  58.   
  59. moveEntity : (options, callback = (err)->)->
  60. metrics.inc("tpds.move-entity")
  61. if options.newProjectName?
  62. startPath = path.join("/#{options.project_name}/")
  63. endPath = path.join("/#{options.newProjectName}/")
  64. else
  65. startPath = mergeProjectNameAndPath(options.project_name, options.startPath)
  66. endPath = mergeProjectNameAndPath(options.project_name, options.endPath)
  67. getProjectsUsersIds options.project_id, (err, user_id, allUserIds)->
  68. logger.log project_id: options.project_id, user_id:user_id, startPath:startPath, endPath:endPath, uri:options.uri, "moving entity in third party data store"
  69. moveOptions =
  70. method : "put"
  71. title:"moveEntity"
  72. uri : "#{settings.apis.thirdPartyDataStore.url}/user/#{user_id}/entity"
  73. headers:
  74. sl_project_id:options.project_id,
  75. sl_entity_rev:options.rev
  76. sl_all_user_ids:JSON.stringify(allUserIds)
  77. json :
  78. user_id : user_id
  79. endPath: endPath
  80. startPath: startPath
  81. TpdsUpdateSender._enqueue options.project_id, "standardHttpRequest", moveOptions, callback
  82. deleteEntity : (options, callback = (err)->)->
  83. metrics.inc("tpds.delete-entity")
  84. getProjectsUsersIds options.project_id, (err, user_id, allUserIds)->
  85. logger.log project_id: options.project_id, user_id:user_id, path: options.path, uri:options.uri, "deleting entity in third party data store"
  86. deleteOptions =
  87. method : "DELETE"
  88. headers:
  89. sl_project_id:options.project_id
  90. sl_all_user_ids:JSON.stringify(allUserIds)
  91. uri : "#{settings.apis.thirdPartyDataStore.url}#{buildPath(user_id, options.project_name, options.path)}"
  92. title:"deleteEntity"
  93. sl_all_user_ids:JSON.stringify(allUserIds)
  94. TpdsUpdateSender._enqueue options.project_id, "standardHttpRequest", deleteOptions, callback
  95. pollDropboxForUser: (user_id, callback = (err) ->) ->
  96. metrics.inc("tpds.poll-dropbox")
  97. logger.log user_id: user_id, "polling dropbox for user"
  98. options =
  99. method: "POST"
  100. uri:"#{settings.apis.thirdPartyDataStore.url}/user/poll"
  101. json:
  102. user_ids: [user_id]
  103. TpdsUpdateSender._enqueue "poll-dropbox:#{user_id}", "standardHttpRequest", options, callback
  104. getProjectsUsersIds = (project_id, callback = (err, owner_id, allUserIds)->)->
  105. Project.findById project_id, "_id owner_ref readOnly_refs collaberator_refs", (err, project)->
  106. allUserIds = [].concat(project.collaberator_refs).concat(project.readOnly_refs).concat(project.owner_ref)
  107. callback err, project.owner_ref, allUserIds
  108. mergeProjectNameAndPath = (project_name, path)->
  109. if(path.indexOf('/') == 0)
  110. path = path.substring(1)
  111. fullPath = "/#{project_name}/#{path}"
  112. return fullPath