TpdsController.coffee 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. tpdsUpdateHandler = require('./TpdsUpdateHandler')
  2. UpdateMerger = require "./UpdateMerger"
  3. logger = require('logger-sharelatex')
  4. Path = require('path')
  5. metrics = require("../../infrastructure/Metrics")
  6. module.exports =
  7. # mergeUpdate and deleteUpdate are used by Dropbox, where the project is only passed as the name, as the
  8. # first part of the file path. They have to check the project exists, find it, and create it if not.
  9. # They also ignore 'noisy' files like .DS_Store, .gitignore, etc.
  10. mergeUpdate: (req, res)->
  11. metrics.inc("tpds.merge-update")
  12. {filePath, user_id, projectName} = parseParams(req)
  13. source = req.headers["x-sl-update-source"] or "unknown"
  14. logger.log user_id:user_id, filePath:filePath, fullPath:req.params[0], projectName:projectName, source: source, "reciving update request from tpds"
  15. tpdsUpdateHandler.newUpdate user_id, projectName, filePath, req, source, (err)->
  16. logger.log user_id:user_id, filePath:filePath, fullPath:req.params[0], "sending response that tpdsUpdate has been completed"
  17. if err?
  18. logger.err err:err, user_id:user_id, filePath:filePath, "error reciving update from tpds"
  19. res.send(500)
  20. else
  21. logger.log user_id:user_id, filePath:filePath, projectName:projectName, "telling tpds update has been processed"
  22. res.send 200
  23. req.session.destroy()
  24. deleteUpdate: (req, res)->
  25. metrics.inc("tpds.delete-update")
  26. {filePath, user_id, projectName} = parseParams(req)
  27. source = req.headers["x-sl-update-source"] or "unknown"
  28. logger.log user_id:user_id, filePath:filePath, projectName:projectName, fullPath:req.params[0], source: source, "reciving delete request from tpds"
  29. tpdsUpdateHandler.deleteUpdate user_id, projectName, filePath, source, (err)->
  30. if err?
  31. logger.err err:err, user_id:user_id, filePath:filePath, "error reciving update from tpds"
  32. res.send(500)
  33. else
  34. logger.log user_id:user_id, filePath:filePath, projectName:projectName, "telling tpds delete has been processed"
  35. res.send 200
  36. req.session.destroy()
  37. # updateProjectContents and deleteProjectContents are used by GitHub. The project_id is known so we
  38. # can skip right ahead to creating/updating/deleting the file. These methods will not ignore noisy
  39. # files like .DS_Store, .gitignore, etc because people are generally more explicit with the files they
  40. # want in git.
  41. updateProjectContents: (req, res, next = (error) ->) ->
  42. {project_id} = req.params
  43. path = "/" + req.params[0] # UpdateMerger expects leading slash
  44. source = req.headers["x-sl-update-source"] or "unknown"
  45. logger.log project_id: project_id, path: path, source: source, "received project contents update"
  46. UpdateMerger.mergeUpdate project_id, path, req, source, (error) ->
  47. return next(error) if error?
  48. res.send(200)
  49. req.session.destroy()
  50. deleteProjectContents: (req, res, next = (error) ->) ->
  51. {project_id} = req.params
  52. path = "/" + req.params[0] # UpdateMerger expects leading slash
  53. source = req.headers["x-sl-update-source"] or "unknown"
  54. logger.log project_id: project_id, path: path, source: source, "received project contents delete request"
  55. UpdateMerger.deleteUpdate project_id, path, source, (error) ->
  56. return next(error) if error?
  57. res.send(200)
  58. req.session.destroy()
  59. parseParams: parseParams = (req)->
  60. path = req.params[0]
  61. user_id = req.params.user_id
  62. path = Path.join("/",path)
  63. if path.substring(1).indexOf('/') == -1
  64. filePath = "/"
  65. projectName = path.substring(1)
  66. else
  67. filePath = path.substring(path.indexOf("/",1))
  68. projectName = path.substring(0, path.indexOf("/",1))
  69. projectName = projectName.replace("/","")
  70. return filePath:filePath, user_id:user_id, projectName:projectName