TemplatesController.coffee 2.8 KB

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