back_fill_deleted_files.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. const WRITE_CONCURRENCY = parseInt(process.env.WRITE_CONCURRENCY, 10) || 10
  2. const { batchedUpdate } = require('./helpers/batchedUpdate')
  3. const { promiseMapWithLimit, promisify } = require('../app/src/util/promises')
  4. const { db } = require('../app/src/infrastructure/mongodb')
  5. const sleep = promisify(setTimeout)
  6. const PERFORM_CLEANUP = process.argv.pop() === '--perform-cleanup'
  7. const LET_USER_DOUBLE_CHECK_INPUTS_FOR = parseInt(
  8. process.env.LET_USER_DOUBLE_CHECK_INPUTS_FOR || 10 * 1000,
  9. 10
  10. )
  11. async function main() {
  12. await letUserDoubleCheckInputs()
  13. await batchedUpdate(
  14. 'projects',
  15. // array is not empty ~ array has one item
  16. { 'deletedFiles.0': { $exists: true } },
  17. processBatch,
  18. { _id: 1, deletedFiles: 1 }
  19. )
  20. }
  21. main()
  22. .then(() => {
  23. process.exit(0)
  24. })
  25. .catch(error => {
  26. console.error({ error })
  27. process.exit(1)
  28. })
  29. async function processBatch(_, projects) {
  30. await promiseMapWithLimit(WRITE_CONCURRENCY, projects, processProject)
  31. }
  32. async function processProject(project) {
  33. await backFillFiles(project)
  34. if (PERFORM_CLEANUP) {
  35. await cleanupProject(project)
  36. }
  37. }
  38. async function backFillFiles(project) {
  39. const projectId = project._id
  40. project.deletedFiles.forEach(file => {
  41. file.projectId = projectId
  42. })
  43. await db.deletedFiles.insertMany(project.deletedFiles)
  44. }
  45. async function cleanupProject(project) {
  46. await db.projects.updateOne(
  47. { _id: project._id },
  48. { $set: { deletedFiles: [] } }
  49. )
  50. }
  51. async function letUserDoubleCheckInputs() {
  52. if (PERFORM_CLEANUP) {
  53. console.error('BACK FILLING AND PERFORMING CLEANUP')
  54. } else {
  55. console.error(
  56. 'BACK FILLING ONLY - You will need to rerun with --perform-cleanup'
  57. )
  58. }
  59. console.error(
  60. 'Waiting for you to double check inputs for',
  61. LET_USER_DOUBLE_CHECK_INPUTS_FOR,
  62. 'ms'
  63. )
  64. await sleep(LET_USER_DOUBLE_CHECK_INPUTS_FOR)
  65. }