migration.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /* eslint-disable no-undef, no-var, vars-on-top, no-restricted-globals, regex/invalid */
  2. // ignore lint error because this file is js as mongoshell
  3. // ===========================================
  4. // processors for old format
  5. // ===========================================
  6. function drawioProcessor(body) {
  7. var oldDrawioRegExp = /:::\s?drawio\n(.+?)\n:::/g; // drawio old format
  8. return body.replace(oldDrawioRegExp, '``` drawio\n$1\n```');
  9. }
  10. function plantumlProcessor(body) {
  11. var oldPlantUmlRegExp = /@startuml\n([\s\S]*?)\n@enduml/g; // plantUML old format
  12. return body.replace(oldPlantUmlRegExp, '``` plantuml\n$1\n```');
  13. }
  14. function tsvProcessor(body) {
  15. var oldTsvTableRegExp = /::: tsv(-h)?\n([\s\S]*?)\n:::/g; // TSV old format
  16. return body.replace(oldTsvTableRegExp, '``` tsv$1\n$2\n```');
  17. }
  18. function csvProcessor(body) {
  19. var oldCsvTableRegExp = /::: csv(-h)?\n([\s\S]*?)\n:::/g; // CSV old format
  20. return body.replace(oldCsvTableRegExp, '``` csv$1\n$2\n```');
  21. }
  22. function bracketlinkProcessor(body) {
  23. // https://regex101.com/r/btZ4hc/1
  24. var oldBracketLinkRegExp = /(?<!\[)\[{1}(\/.*?)\]{1}(?!\])/g; // Page Link old format
  25. return body.replace(oldBracketLinkRegExp, '[[$1]]');
  26. }
  27. // ===========================================
  28. // replace method with processors
  29. // ===========================================
  30. function replaceLatestRevisions(body, processors) {
  31. var replacedBody = body;
  32. processors.forEach((processor) => {
  33. replacedBody = processor(replacedBody);
  34. });
  35. return replacedBody;
  36. }
  37. // ===========================================
  38. // main process
  39. // ===========================================
  40. var pagesCollection = db.getCollection('pages');
  41. const revisionsCollection = db.getCollection('revisions');
  42. var operations = [];
  43. var growiSyntaxLinkerProcessor = [];
  44. var userOriginalProcessor = [];
  45. var migrationType = process.env.MIGRATION_TYPE;
  46. var oldFormatProcessors;
  47. switch (migrationType) {
  48. case 'drawio':
  49. oldFormatProcessors = [drawioProcessor];
  50. break;
  51. case 'plantuml':
  52. oldFormatProcessors = [plantumlProcessor];
  53. break;
  54. case 'tsv':
  55. oldFormatProcessors = [tsvProcessor];
  56. break;
  57. case 'csv':
  58. oldFormatProcessors = [csvProcessor];
  59. break;
  60. case 'bracketlink':
  61. oldFormatProcessors = [bracketlinkProcessor];
  62. break;
  63. case 'v6':
  64. oldFormatProcessors = [drawioProcessor, plantumlProcessor, tsvProcessor, csvProcessor, bracketlinkProcessor];
  65. break;
  66. case undefined:
  67. throw Error('env var MIGRATION_TYPE is required: document link');
  68. default:
  69. throw Error('invalid MIGRATION_TYPE: document link');
  70. }
  71. var sleepTime = process.env.SLEEP_TIME ?? 5; // default 5 milliseconds
  72. pagesCollection.find({}).forEach((doc) => {
  73. if (doc.revision) {
  74. var revision = revisionsCollection.findOne({ _id: doc.revision });
  75. var replacedBody = replaceLatestRevisions(revision.body, [...oldFormatProcessors, ...growiSyntaxLinkerProcessor, ...userOriginalProcessor]);
  76. var operation = {
  77. updateOne: {
  78. filter: { _id: revision._id },
  79. update: {
  80. $set: { body: replacedBody },
  81. },
  82. },
  83. };
  84. operations.push(operation);
  85. // bulkWrite per 100 revisions
  86. if (operations.length > 99) {
  87. revisionsCollection.bulkWrite(operations);
  88. // sleep time can be set from env var
  89. sleep(sleepTime);
  90. operations = [];
  91. }
  92. }
  93. });
  94. revisionsCollection.bulkWrite(operations);
  95. print('migration complete!');