20210727150530_ce_sp_backfill_deleted_docs.mjs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { batchedUpdate } from '@overleaf/mongo-utils/batchedUpdate.js'
  2. import { db } from './lib/mongodb.mjs'
  3. import { promiseMapWithLimit } from '@overleaf/promise-utils'
  4. const tags = ['server-ce', 'server-pro', 'saas']
  5. const migrate = async client => {
  6. await batchedUpdate(
  7. db.projects,
  8. // array is not empty ~ array has one item
  9. { 'deletedDocs.0': { $exists: true } },
  10. async projects => {
  11. await processBatch(projects)
  12. },
  13. { _id: 1, deletedDocs: 1 }
  14. )
  15. }
  16. async function processBatch(projects) {
  17. await promiseMapWithLimit(10, projects, async project => {
  18. await processProject(project)
  19. })
  20. }
  21. async function processProject(project) {
  22. for (const doc of project.deletedDocs) {
  23. await backFillDoc(doc)
  24. }
  25. await cleanupProject(project)
  26. }
  27. async function backFillDoc(doc) {
  28. const { name, deletedAt } = doc
  29. await db.docs.updateOne({ _id: doc._id }, { $set: { name, deletedAt } })
  30. }
  31. async function cleanupProject(project) {
  32. await db.projects.updateOne(
  33. { _id: project._id },
  34. { $set: { deletedDocs: [] } }
  35. )
  36. }
  37. const rollback = async client => {}
  38. export default {
  39. tags,
  40. migrate,
  41. rollback,
  42. }