import_user_collabratec_ids.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /* eslint-disable max-len */
  2. /**
  3. * run with: node import_user_collabratec_ids /path/user_collabratec_ids.csv
  4. *
  5. * where csv is generated from v1 with sql statement like:
  6. *
  7. * \copy ( SELECT ut.user_id, u.email, u.confirmed_at, ut.team_user_id AS collabratec_id FROM user_teams ut JOIN teams t ON ut.team_id = t.id JOIN users u ON ut.user_id = u.id WHERE t.name = 'IEEECollabratec' AND ut.removed_at IS NULL AND ut.team_user_id IS NOT NULL ) to 'user_collabratec_ids.csv' WITH CSV HEADER;
  8. */
  9. /* eslint-enable */
  10. 'use strict'
  11. const UserMapper = require('../../modules/overleaf-integration/app/src/OverleafUsers/UserMapper')
  12. const User = require('../../app/src/models/User').User
  13. const UserStub = require('../../app/src/models/UserStub').UserStub
  14. const async = require('async')
  15. const csvParser = require('csv-parser')
  16. const fs = require('fs')
  17. const minimist = require('minimist')
  18. const argv = minimist(process.argv.slice(2))
  19. let lineNum = 0
  20. const records = []
  21. fs.createReadStream(argv._[0])
  22. .pipe(csvParser())
  23. .on('data', data => {
  24. data.lineNum = ++lineNum
  25. records.push(data)
  26. })
  27. .on('end', () => {
  28. async.mapSeries(records, loadRecord, function(err) {
  29. if (err) console.error(err)
  30. process.exit()
  31. })
  32. })
  33. function loadRecord(record, cb) {
  34. const overleafId = parseInt(record.user_id)
  35. User.findOne(
  36. { 'overleaf.id': overleafId },
  37. { _id: 1, thirdPartyIdentifiers: 1 },
  38. function(err, user) {
  39. if (err) return cb(err)
  40. const query = {
  41. 'thirdPartyIdentifiers.providerId': {
  42. $ne: 'collabratec'
  43. }
  44. }
  45. const update = {
  46. $push: {
  47. thirdPartyIdentifiers: {
  48. externalUserId: record.collabratec_id,
  49. externalData: {},
  50. providerId: 'collabratec'
  51. }
  52. }
  53. }
  54. if (user) {
  55. console.log(record.lineNum + ': setting TPI for User ' + user._id)
  56. query._id = user._id
  57. User.update(query, update, cb)
  58. } else {
  59. // create user stub
  60. const olUser = {
  61. confirmed_at: record.confirmed_at,
  62. email: record.email,
  63. id: overleafId
  64. }
  65. console.log(record.lineNum + ': User not found for ' + record.user_id)
  66. return UserMapper.getSlIdFromOlUser(olUser, function(err, userStubId) {
  67. if (err) return cb(err)
  68. console.log(
  69. record.lineNum + ': setting TPI for UserStub ' + userStubId
  70. )
  71. query._id = userStubId
  72. UserStub.update(query, update, cb)
  73. })
  74. }
  75. }
  76. )
  77. }