TpdsUpdateSender.coffee 5.6 KB

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