ProjectZipStreamManager.coffee 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. archiver = require "archiver"
  2. async = require "async"
  3. logger = require "logger-sharelatex"
  4. ProjectEntityHandler = require "../Project/ProjectEntityHandler"
  5. FileStoreHandler = require("../FileStore/FileStoreHandler")
  6. module.exports = ProjectZipStreamManager =
  7. createZipStreamForProject: (project_id, callback = (error, stream) ->) ->
  8. archive = archiver("zip")
  9. # return stream immediately before we start adding things to it
  10. callback(null, archive)
  11. @addAllDocsToArchive project_id, archive, (error) =>
  12. if error?
  13. logger.error err: error, project_id: project_id, "error adding docs to zip stream"
  14. @addAllFilesToArchive project_id, archive, (error) =>
  15. if error?
  16. logger.error err: error, project_id: project_id, "error adding files to zip stream"
  17. archive.finalize()
  18. addAllDocsToArchive: (project_id, archive, callback = (error) ->) ->
  19. ProjectEntityHandler.getAllDocs project_id, (error, docs) ->
  20. return callback(error) if error?
  21. jobs = []
  22. for path, doc of docs
  23. do (path, doc) ->
  24. path = path.slice(1) if path[0] == "/"
  25. jobs.push (callback) ->
  26. logger.log project_id: project_id, "Adding doc"
  27. archive.append doc.lines.join("\n"), name: path, callback
  28. async.series jobs, callback
  29. addAllFilesToArchive: (project_id, archive, callback = (error) ->) ->
  30. ProjectEntityHandler.getAllFiles project_id, (error, files) ->
  31. return callback(error) if error?
  32. jobs = []
  33. for path, file of files
  34. do (path, file) ->
  35. jobs.push (callback) ->
  36. FileStoreHandler.getFileStream project_id, file._id, {}, (error, stream) ->
  37. if error?
  38. logger.err err:error, project_id:project_id, file_id:file._id, "something went wrong adding file to zip archive"
  39. return callback(err)
  40. path = path.slice(1) if path[0] == "/"
  41. archive.append stream, name: path, callback
  42. async.series jobs, callback