ProjectZipStreamManager.coffee 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. archive.on "error", (err)->
  11. logger.err err:err, project_id:project_id, "something went wrong building archive of project"
  12. callback(null, archive)
  13. @addAllDocsToArchive project_id, archive, (error) =>
  14. if error?
  15. logger.error err: error, project_id: project_id, "error adding docs to zip stream"
  16. @addAllFilesToArchive project_id, archive, (error) =>
  17. if error?
  18. logger.error err: error, project_id: project_id, "error adding files to zip stream"
  19. archive.finalize()
  20. addAllDocsToArchive: (project_id, archive, callback = (error) ->) ->
  21. ProjectEntityHandler.getAllDocs project_id, (error, docs) ->
  22. return callback(error) if error?
  23. jobs = []
  24. for path, doc of docs
  25. do (path, doc) ->
  26. path = path.slice(1) if path[0] == "/"
  27. jobs.push (callback) ->
  28. logger.log project_id: project_id, "Adding doc"
  29. archive.append doc.lines.join("\n"), name: path
  30. callback()
  31. async.series jobs, callback
  32. addAllFilesToArchive: (project_id, archive, callback = (error) ->) ->
  33. ProjectEntityHandler.getAllFiles project_id, (error, files) ->
  34. return callback(error) if error?
  35. jobs = []
  36. for path, file of files
  37. do (path, file) ->
  38. jobs.push (callback) ->
  39. FileStoreHandler.getFileStream project_id, file._id, {}, (error, stream) ->
  40. if error?
  41. logger.err err:error, project_id:project_id, file_id:file._id, "something went wrong adding file to zip archive"
  42. return callback(err)
  43. path = path.slice(1) if path[0] == "/"
  44. archive.append stream, name: path
  45. stream.on "end", () ->
  46. callback()
  47. async.parallelLimit jobs, 5, callback