find_malformed_filetrees.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const { ReadPreference } = require('mongodb')
  2. const { db, waitForDb } = require('../app/src/infrastructure/mongodb')
  3. async function main() {
  4. await waitForDb()
  5. const projects = db.projects.find(
  6. {},
  7. { projection: { rootFolder: 1 }, readPreference: ReadPreference.SECONDARY }
  8. )
  9. let projectsProcessed = 0
  10. for await (const project of projects) {
  11. projectsProcessed += 1
  12. if (projectsProcessed % 100000 === 0) {
  13. console.log(projectsProcessed, 'projects processed')
  14. }
  15. processProject(project)
  16. }
  17. }
  18. function processProject(project) {
  19. if (!project.rootFolder || !Array.isArray(project.rootFolder)) {
  20. console.log('BAD PATH:', project._id, 'rootFolder')
  21. return
  22. }
  23. if (!project.rootFolder[0]) {
  24. console.log('BAD PATH:', project._id, 'rootFolder.0')
  25. return
  26. }
  27. const badPaths = findBadPaths(project.rootFolder[0])
  28. for (const path of badPaths) {
  29. console.log('BAD PATH:', project._id, `rootFolder.0.${path}`)
  30. }
  31. }
  32. function findBadPaths(folder) {
  33. const result = []
  34. for (const attr of ['docs', 'fileRefs', 'folders']) {
  35. if (folder[attr] && !Array.isArray(folder[attr])) {
  36. result.push(attr)
  37. }
  38. }
  39. if (folder.folders && Array.isArray(folder.folders)) {
  40. for (const [i, subfolder] of folder.folders.entries()) {
  41. if (!subfolder) {
  42. result.push(`folders.${i}`)
  43. continue
  44. }
  45. for (const badPath of findBadPaths(subfolder)) {
  46. result.push(`folders.${i}.${badPath}`)
  47. }
  48. }
  49. }
  50. return result
  51. }
  52. main()
  53. .then(() => {
  54. process.exit(0)
  55. })
  56. .catch(err => {
  57. console.error(err)
  58. process.exit(1)
  59. })