extract_onboardingdatacollection_csv.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. const csv = require('csv')
  2. const fs = require('fs')
  3. const {
  4. OnboardingDataCollection,
  5. } = require('../app/src/models/OnboardingDataCollection')
  6. /**
  7. * This script extracts the OnboardingDataCollection collection from the database
  8. * and writes it to a CSV file.
  9. *
  10. * Usage:
  11. * - Locally:
  12. * - docker compose exec web bash
  13. * - node services/web/scripts/extract_onboardingdatacollection_csv.js
  14. * - On the server:
  15. * - rake connect:app[staging,web]
  16. * - node web/scripts/extract_onboardingdatacollection_csv.js
  17. * - exit
  18. * - kubectl cp web-standalone-prod-XXXXX:/tmp/onboardingDataCollection.csv ~/onboardingDataCollection.csv
  19. *
  20. */
  21. const mapFields = doc => {
  22. return {
  23. primaryOccupation: doc.primaryOccupation,
  24. usedLatex: doc.usedLatex,
  25. companyDivisionDepartment: doc.companyDivisionDepartment,
  26. companyJobTitle: doc.companyJobTitle,
  27. governmentJobTitle: doc.governmentJobTitle,
  28. institutionName: doc.institutionName,
  29. otherJobTitle: doc.otherJobTitle,
  30. nonprofitDivisionDepartment: doc.nonprofitDivisionDepartment,
  31. nonprofitJobTitle: doc.nonprofitJobTitle,
  32. role: doc.role,
  33. subjectArea: doc.subjectArea,
  34. updatedAt: new Date(doc.updatedAt).toISOString(),
  35. userId: doc._id.toString(), // _id is set as the userId
  36. firstName: Boolean(doc.firstName).toString(),
  37. lastName: Boolean(doc.lastName).toString(),
  38. }
  39. }
  40. const runScript = async () => {
  41. console.time('CSV Writing Duration')
  42. console.log('Starting to write to csv file...')
  43. const cursor = OnboardingDataCollection.find().cursor()
  44. const csvWriter = csv.stringify({
  45. header: true,
  46. columns: [
  47. 'primaryOccupation',
  48. 'usedLatex',
  49. 'companyDivisionDepartment',
  50. 'companyJobTitle',
  51. 'governmentJobTitle',
  52. 'institutionName',
  53. 'otherJobTitle',
  54. 'nonprofitDivisionDepartment',
  55. 'nonprofitJobTitle',
  56. 'role',
  57. 'subjectArea',
  58. 'updatedAt',
  59. 'userId',
  60. 'firstName',
  61. 'lastName',
  62. ],
  63. })
  64. const writeStream = fs.createWriteStream('/tmp/onboardingDataCollection.csv')
  65. csvWriter.pipe(writeStream)
  66. let lineCount = 0
  67. for (let doc = await cursor.next(); doc != null; doc = await cursor.next()) {
  68. lineCount++
  69. csvWriter.write(mapFields(doc))
  70. }
  71. csvWriter.end()
  72. writeStream.on('finish', () => {
  73. console.log(`Done writing to csv file. Total lines written: ${lineCount}`)
  74. console.timeEnd('CSV Writing Duration')
  75. process.exit()
  76. })
  77. writeStream.on('error', err => console.error('Write Stream Error:', err))
  78. csvWriter.on('error', err => console.error('CSV Writer Error:', err))
  79. }
  80. runScript().catch(err => {
  81. console.error(err)
  82. process.exit(1)
  83. })