CompileController.coffee 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. RequestParser = require "./RequestParser"
  2. CompileManager = require "./CompileManager"
  3. Settings = require "settings-sharelatex"
  4. Metrics = require "./Metrics"
  5. ProjectPersistenceManager = require "./ProjectPersistenceManager"
  6. logger = require "logger-sharelatex"
  7. module.exports = CompileController =
  8. compile: (req, res, next = (error) ->) ->
  9. timer = new Metrics.Timer("compile-request")
  10. RequestParser.parse req.body, (error, request) ->
  11. return next(error) if error?
  12. request.project_id = req.params.project_id
  13. ProjectPersistenceManager.markProjectAsJustAccessed request.project_id, (error) ->
  14. return next(error) if error?
  15. CompileManager.doCompile request, (error, outputFiles = []) ->
  16. if error?
  17. logger.error err: error, project_id: request.project_id, "error running compile"
  18. if error.timedout
  19. status = "timedout"
  20. else
  21. status = "error"
  22. code = 500
  23. else
  24. status = "failure"
  25. for file in outputFiles
  26. if file.path?.match(/output\.pdf$/)
  27. status = "success"
  28. timer.done()
  29. res.status(code or 200).send {
  30. compile:
  31. status: status
  32. error: error?.message or error
  33. outputFiles: outputFiles.map (file) ->
  34. url: "#{Settings.apis.clsi.url}/project/#{request.project_id}/output/#{file.path}"
  35. path: file.path
  36. type: file.type
  37. build: file.build
  38. }
  39. clearCache: (req, res, next = (error) ->) ->
  40. ProjectPersistenceManager.clearProject req.params.project_id, (error) ->
  41. return next(error) if error?
  42. res.sendStatus(204) # No content
  43. syncFromCode: (req, res, next = (error) ->) ->
  44. file = req.query.file
  45. line = parseInt(req.query.line, 10)
  46. column = parseInt(req.query.column, 10)
  47. project_id = req.params.project_id
  48. CompileManager.syncFromCode project_id, file, line, column, (error, pdfPositions) ->
  49. return next(error) if error?
  50. res.send JSON.stringify {
  51. pdf: pdfPositions
  52. }
  53. syncFromPdf: (req, res, next = (error) ->) ->
  54. page = parseInt(req.query.page, 10)
  55. h = parseFloat(req.query.h)
  56. v = parseFloat(req.query.v)
  57. project_id = req.params.project_id
  58. CompileManager.syncFromPdf project_id, page, h, v, (error, codePositions) ->
  59. return next(error) if error?
  60. res.send JSON.stringify {
  61. code: codePositions
  62. }
  63. wordcount: (req, res, next = (error) ->) ->
  64. file = req.query.file || "main.tex"
  65. project_id = req.params.project_id
  66. image = req.query.image
  67. logger.log {image, file, project_id}, "word count request"
  68. CompileManager.wordcount project_id, file, image, (error, result) ->
  69. return next(error) if error?
  70. res.send JSON.stringify {
  71. texcount: result
  72. }
  73. status: (req, res, next = (error)-> )->
  74. res.send("OK")