فهرست منبع

create script to backfill secondary emails

Tim Alby 8 سال پیش
والد
کامیت
458650d456
1فایلهای تغییر یافته به همراه61 افزوده شده و 0 حذف شده
  1. 61 0
      services/web/scripts/add_multiple_emails.js

+ 61 - 0
services/web/scripts/add_multiple_emails.js

@@ -0,0 +1,61 @@
+const mongojs = require('../app/js/infrastructure/mongojs')
+const { db } = mongojs
+const async = require('async')
+const minilist = require('minimist')
+
+const updateUser = function (user, callback) {
+  console.log(`Updating user ${user._id}`)
+  const update = {
+    $set: {
+      emails: [{
+        email: user.email,
+        createdAt: new Date()
+      }]
+    }
+  }
+  db.users.update({_id: user._id}, update, callback)
+}
+
+const updateUsers = (users, callback) =>
+  async.eachLimit(users, ASYNC_LIMIT, updateUser, function (error) {
+    if (error) {
+      callback(error)
+      return
+    }
+    counter += users.length
+    console.log(`${counter} users updated`)
+    loopForUsers(callback)
+  })
+
+var loopForUsers = callback =>
+  db.users.find(
+    { emails: {$exists: false} },
+    { email: 1 }
+  ).limit(FETCH_LIMIT, function (error, users) {
+    if (error) {
+      callback(error)
+      return
+    }
+    if (users.length === 0) {
+      console.log(`DONE (${counter} users updated)`)
+      return callback()
+    }
+    updateUsers(users, callback)
+  })
+
+var counter = 0
+var run = () =>
+  loopForUsers(function (error) {
+    if (error) { throw error }
+    process.exit()
+  })
+
+let FETCH_LIMIT, ASYNC_LIMIT
+var setup = function () {
+  let args = minilist(process.argv.slice(2))
+  FETCH_LIMIT = (args.fetch) ? args.fetch : 100
+  ASYNC_LIMIT = (args.async) ? args.async : 10
+}
+
+setup()
+run()