TemplatesController.coffee 3.4 KB

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