1422460849371-doc-lines.coffee 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. fs = require("fs")
  2. mongojs = require("mongojs")
  3. ObjectId = mongojs.ObjectId
  4. db = mongojs('sharelatex', ['projects', 'docs'])
  5. _ = require("lodash")
  6. async = require("async")
  7. exec = require("child_process").exec
  8. finished_projects_path = "/tmp/finished-projects"
  9. all_projects_path = "/tmp/all-projects"
  10. printProgress = ->
  11. exec "wc #{finished_projects_path}", (error, results) ->
  12. #console.log results
  13. setTimeout printProgress, 1000 * 30
  14. checkIfFileHasBeenProccessed = (project_id, callback)->
  15. exec "grep #{project_id} #{finished_projects_path}", (error, results) ->
  16. hasBeenProcessed = _.include(results, project_id)
  17. #console.log hasBeenProcessed, project_id
  18. callback(null, hasBeenProcessed)
  19. loadProjectIds = (callback)->
  20. fs.readFile all_projects_path, "utf-8", (err, data)->
  21. console.log data.length
  22. ids = data.split("\n")
  23. console.log ids.length
  24. callback err, ids
  25. getAndWriteProjectids = (callback)->
  26. console.log "finding all project id's - #{new Date().toString()}"
  27. db.projects.find {}, {_id:1}, (err, ids)->
  28. console.log "total found projects in mongo #{ids.length} - #{new Date().toString()}"
  29. ids = _.pluck ids, '_id'
  30. ids = _.filter ids, (id)-> id?
  31. fileData = ids.join("\n")
  32. fs.writeFile all_projects_path, fileData, ->
  33. callback(err, ids)
  34. getProjectIds = (callback)->
  35. exists = fs.existsSync all_projects_path
  36. if exists
  37. loadProjectIds callback
  38. else
  39. getAndWriteProjectids callback
  40. markProjectAsProcessed = (project_id, callback)->
  41. fs.appendFile finished_projects_path, "#{project_id}\n", callback
  42. getAllDocs = (project_id, callback = (error, docs) ->) ->
  43. db.projects.findOne _id:ObjectId(project_id), (error, project) ->
  44. return callback(error) if error?
  45. if !project?
  46. console.error("No such project: #{project_id}")
  47. return callback("no such project #{project_id}")
  48. findAllDocsInProject project, (error, docs) ->
  49. return callback(error) if error?
  50. return callback null, docs
  51. findAllDocsInProject = (project, callback = (error, docs) ->) ->
  52. callback null, _findAllDocsInFolder project.rootFolder[0]
  53. _findDocInFolder = (folder = {}, doc_id, currentPath) ->
  54. for doc, i in folder.docs or []
  55. if doc?._id? and doc._id.toString() == doc_id.toString()
  56. return {
  57. doc: doc
  58. mongoPath: "#{currentPath}.docs.#{i}"
  59. }
  60. for childFolder, i in folder.folders or []
  61. result = _findDocInFolder childFolder, doc_id, "#{currentPath}.folders.#{i}"
  62. return result if result?
  63. return null
  64. _findAllDocsInFolder = (folder = {}) ->
  65. docs = folder.docs or []
  66. for childFolder in folder.folders or []
  67. docs = docs.concat _findAllDocsInFolder childFolder
  68. return docs
  69. insertDocIntoDocCollection = (project_id, doc_id, lines, oldRev, callback)->
  70. update = {}
  71. update["_id"] = ObjectId(doc_id)
  72. update["lines"] = lines
  73. update["project_id"] = ObjectId(project_id)
  74. update["rev"] = oldRev
  75. db.docs.insert _id: ObjectId(doc_id), callback
  76. saveDocsIntoMongo = (project_id, docs, callback)->
  77. jobs = _.map docs, (doc)->
  78. (cb)->
  79. insertDocIntoDocCollection project_id, doc._id, project_id.lines, doc.rev, cb
  80. async.series jobs, callback
  81. processNext = (project_id, callback)->
  82. checkIfFileHasBeenProccessed project_id, (err, hasBeenProcessed)->
  83. if hasBeenProcessed
  84. console.log "#{project_id} already procssed, skipping"
  85. return callback()
  86. getAllDocs project_id, (err, docs)->
  87. if err?
  88. console.error err, project_id, "could not get all docs"
  89. return callback()
  90. saveDocsIntoMongo project_id, docs, ->
  91. if err?
  92. console.error err, project_id, "could not save docs into mongo"
  93. return callback()
  94. markProjectAsProcessed project_id, ->
  95. callback()
  96. getProjectIds (err, ids)->
  97. printProgress()
  98. jobs = _.map ids, (id)->
  99. return (cb)->
  100. processNext(id, cb)
  101. async.series jobs, (err)->
  102. if err?
  103. console.error err, "at end of jobs"
  104. else
  105. console.log "finished"
  106. process.exit()
  107. exports.up = (next)->
  108. next()
  109. exports.down = (next)->
  110. next()