extract_onboardingdatacollection_csv.mjs 2.7 KB

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