10_update_project_tokens.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. const Settings = require('settings-sharelatex')
  2. const Async = require('async')
  3. const mongojs = require('mongojs')
  4. const db = mongojs(Settings.mongo.url, ['users'])
  5. const indexKeys = { 'tokens.readAndWritePrefix': 1 }
  6. const indexOpts = {
  7. unique: true,
  8. partialFilterExpression: {
  9. 'tokens.readAndWritePrefix': { $exists: true }
  10. },
  11. background: true
  12. }
  13. // Index on Prefix
  14. const addReadAndWritePrefixIndex = (db, callback) => {
  15. db.projects.ensureIndex(indexKeys, indexOpts, callback)
  16. }
  17. const removeReadAndWritePrefixIndex = (db, callback) => {
  18. db.projects.dropIndex(indexKeys, callback)
  19. }
  20. // Extract prefix data
  21. const extractPrefix = (db, callback) => {
  22. db.projects.find(
  23. {
  24. 'tokens.readAndWrite': { $exists: true },
  25. 'tokens.readAndWritePrefix': { $exists: false }
  26. },
  27. { tokens: 1 },
  28. (err, projects) => {
  29. if (err) {
  30. return callback(err)
  31. }
  32. console.log(`>> Updating ${projects.length} projects`)
  33. Async.eachLimit(
  34. projects,
  35. 5,
  36. (project, cb) => {
  37. const rwToken = project.tokens.readAndWrite
  38. const prefixMatch = rwToken.match(/^(\d+).*$/)
  39. if (!prefixMatch) {
  40. const err = new Error(
  41. `no prefix on token: ${project._id}, ${rwToken}`
  42. )
  43. console.log(`>> Error, ${err.message}`)
  44. return cb(err)
  45. }
  46. db.projects.update(
  47. { _id: project._id },
  48. { $set: { 'tokens.readAndWritePrefix': prefixMatch[1] } },
  49. cb
  50. )
  51. },
  52. err => {
  53. if (err) {
  54. return callback(err)
  55. }
  56. console.log('>> done')
  57. callback()
  58. }
  59. )
  60. }
  61. )
  62. }
  63. const erasePrefix = (db, callback) => {
  64. db.projects.update({$unset: 'tokens.readAndWritePrefix'}, callback)
  65. }
  66. // Migrations
  67. exports.migrate = (client, done) => {
  68. console.log(`>> Adding index to projects: ${JSON.stringify(indexKeys)}, with options: ${JSON.stringify(indexOpts)}`)
  69. addReadAndWritePrefixIndex(db, (err) => {
  70. if(err) {
  71. console.log(">> Error while adding index")
  72. return done(err)
  73. }
  74. console.log(">> Extracting tokens.readAndWritePrefix field for existing projects")
  75. extractPrefix(db, (err) => {
  76. if(err) {
  77. console.log(">> Error while extracting prefix data")
  78. return done(err)
  79. }
  80. done()
  81. })
  82. })
  83. }
  84. exports.rollback = (client, done) => {
  85. console.log(`>> Dropping index on projects: ${JSON.stringify(indexKeys)}`)
  86. removeReadAndWritePrefixIndex(db, (err) => {
  87. if(err) {
  88. console.log(">> Error while dropping index")
  89. return done(err)
  90. }
  91. console.log(">> Erasing tokens.readAndWritePrefix field for existing projects")
  92. erasePrefix(db, (err) => {
  93. if(err) {
  94. console.log(">> Error while erasing prefix data")
  95. return done(err)
  96. }
  97. done()
  98. })
  99. })
  100. }