find_malformed_filetrees.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. }
  44. for (const badPath of findBadPaths(subfolder)) {
  45. result.push(`folders.${i}.${badPath}`)
  46. }
  47. }
  48. }
  49. return result
  50. }
  51. main()
  52. .then(() => {
  53. process.exit(0)
  54. })
  55. .catch(err => {
  56. console.error(err)
  57. process.exit(1)
  58. })