TemplatesController.coffee 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. path = require('path')
  2. Project = require('../../../js/models/Project').Project
  3. ProjectUploadManager = require('../../../js/Features/Uploads/ProjectUploadManager')
  4. ProjectOptionsHandler = require('../../../js/Features/Project/ProjectOptionsHandler')
  5. ProjectRootDocManager = require('../../../js/Features/Project/ProjectRootDocManager')
  6. ProjectDetailsHandler = require('../../../js/Features/Project/ProjectDetailsHandler')
  7. AuthenticationController = require('../../../js/Features/Authentication/AuthenticationController')
  8. settings = require('settings-sharelatex')
  9. fs = require('fs')
  10. request = require('request')
  11. uuid = require('uuid')
  12. logger = require('logger-sharelatex')
  13. async = require("async")
  14. ENGINE_TO_COMPILER_MAP = {
  15. latex_dvipdf: "latex"
  16. pdflatex: "pdflatex"
  17. xelatex: "xelatex"
  18. lualatex: "lualatex"
  19. }
  20. module.exports = TemplatesController =
  21. getV1Template: (req, res)->
  22. templateVersionId = req.params.Template_version_id
  23. templateId = req.query.id
  24. if !/^[0-9]+$/.test(templateVersionId) || !/^[0-9]+$/.test(templateId)
  25. logger.err templateVersionId:templateVersionId, templateId: templateId, "invalid template id or version"
  26. return res.sendStatus 400
  27. data = {}
  28. data.templateVersionId = templateVersionId
  29. data.templateId = templateId
  30. data.name = req.query.templateName
  31. data.compiler = ENGINE_TO_COMPILER_MAP[req.query.latexEngine]
  32. data.mainFile = req.query.mainFile
  33. data.brandVariationId = req.query.brandVariationId
  34. res.render path.resolve(__dirname, "../../../views/project/editor/new_from_template"), data
  35. createProjectFromV1Template: (req, res)->
  36. currentUserId = AuthenticationController.getLoggedInUserId(req)
  37. zipUrl = "#{settings.apis.v1.url}/api/v1/sharelatex/templates/#{req.body.templateVersionId}"
  38. zipReq = request(zipUrl, {
  39. 'auth': {
  40. 'user': settings.apis.v1.user,
  41. 'pass': settings.apis.v1.pass
  42. }
  43. })
  44. TemplatesController.createFromZip(
  45. zipReq,
  46. {
  47. templateName: req.body.templateName,
  48. currentUserId: currentUserId,
  49. compiler: req.body.compiler
  50. docId: req.body.docId
  51. mainFile: req.body.mainFile
  52. templateId: req.body.templateId
  53. templateVersionId: req.body.templateVersionId
  54. brandVariationId: req.body.brandVariationId
  55. image: 'wl_texlive:2018.1'
  56. },
  57. req,
  58. res
  59. )
  60. createFromZip: (zipReq, options, req, res)->
  61. # remove any invalid characters from template name
  62. projectName = ProjectDetailsHandler.fixProjectName(options.templateName)
  63. dumpPath = "#{settings.path.dumpFolder}/#{uuid.v4()}"
  64. writeStream = fs.createWriteStream(dumpPath)
  65. zipReq.on "error", (error) ->
  66. logger.error err: error, "error getting zip from template API"
  67. zipReq.pipe(writeStream)
  68. writeStream.on 'close', ->
  69. ProjectUploadManager.createProjectFromZipArchive options.currentUserId, projectName, dumpPath, (err, project)->
  70. if err?
  71. logger.err err:err, zipReq:zipReq, "problem building project from zip"
  72. return res.sendStatus 500
  73. setCompiler project._id, options.compiler, ->
  74. setImage project._id, options.image, ->
  75. setMainFile project._id, options.mainFile, ->
  76. setBrandVariationId project._id, options.brandVariationId, ->
  77. fs.unlink dumpPath, ->
  78. delete req.session.templateData
  79. conditions = {_id:project._id}
  80. update = {
  81. fromV1TemplateId:options.templateId,
  82. fromV1TemplateVersionId:options.templateVersionId
  83. }
  84. Project.update conditions, update, {}, (err)->
  85. res.redirect "/project/#{project._id}"
  86. setCompiler = (project_id, compiler, callback)->
  87. if compiler?
  88. ProjectOptionsHandler.setCompiler project_id, compiler, callback
  89. else
  90. callback()
  91. setImage = (project_id, imageName, callback)->
  92. if imageName?
  93. ProjectOptionsHandler.setImageName project_id, imageName, callback
  94. else
  95. callback()
  96. setMainFile = (project_id, mainFile, callback) ->
  97. if mainFile?
  98. ProjectRootDocManager.setRootDocFromName project_id, mainFile, callback
  99. else
  100. callback()
  101. setBrandVariationId = (project_id, brandVariationId, callback) ->
  102. if brandVariationId?
  103. ProjectOptionsHandler.setBrandVariationId project_id, brandVariationId, callback
  104. else
  105. callback()