CompileController.coffee 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. type: file.type
  36. build: file.build
  37. }
  38. clearCache: (req, res, next = (error) ->) ->
  39. ProjectPersistenceManager.clearProject req.params.project_id, (error) ->
  40. return next(error) if error?
  41. res.sendStatus(204) # No content
  42. syncFromCode: (req, res, next = (error) ->) ->
  43. file = req.query.file
  44. line = parseInt(req.query.line, 10)
  45. column = parseInt(req.query.column, 10)
  46. project_id = req.params.project_id
  47. CompileManager.syncFromCode project_id, file, line, column, (error, pdfPositions) ->
  48. return next(error) if error?
  49. res.send JSON.stringify {
  50. pdf: pdfPositions
  51. }
  52. syncFromPdf: (req, res, next = (error) ->) ->
  53. page = parseInt(req.query.page, 10)
  54. h = parseFloat(req.query.h)
  55. v = parseFloat(req.query.v)
  56. project_id = req.params.project_id
  57. CompileManager.syncFromPdf project_id, page, h, v, (error, codePositions) ->
  58. return next(error) if error?
  59. res.send JSON.stringify {
  60. code: codePositions
  61. }
  62. wordcount: (req, res, next = (error) ->) ->
  63. file = req.query.file || "main.tex"
  64. project_id = req.params.project_id
  65. image = req.query.image
  66. logger.log {image, file, project_id}, "word count request"
  67. CompileManager.wordcount project_id, file, image, (error, result) ->
  68. return next(error) if error?
  69. res.send JSON.stringify {
  70. texcount: result
  71. }