You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. const fs = require('fs')
  2. const config = require('./config')
  3. const random = require('./random')
  4. const classes = require('./classes')
  5. const mock = require('./mock')
  6. let batchCount = 1 // Counter to track how many things we've generated
  7. let extraProfilesToGenerate = 1
  8. let extraProfileCount = 0 // Counter to track how many EXTRA profiles we've generated
  9. let generatedResponseCount = 0 // Counter to track every response generated
  10. // Values for responsess as strings
  11. const possibleResponses = {
  12. not_important: null,
  13. some_what_important: null,
  14. important: null,
  15. very_important: null,
  16. extremely_important: null,
  17. mandatory: null,
  18. }
  19. for (let i = 0; i < Object.keys(possibleResponses).length; i++) {
  20. const key = Object.keys(possibleResponses)[i]
  21. possibleResponses[key] = config.scoreVals[i].toString()
  22. }
  23. /**
  24. * Our initial file setup
  25. */
  26. const write = async (batchNum, outputDataObject) => {
  27. const filename = `_batch_${batchNum}.js`
  28. await fs.writeFile(`${config.mockOutputPath}/${filename}`, '', () => {})
  29. fs.appendFile(
  30. `${config.mockOutputPath}/${filename}`,
  31. config.header +
  32. 'module.exports = ' +
  33. JSON.stringify(outputDataObject, null, ' '),
  34. err => {
  35. if (err) {
  36. console.error(err)
  37. return
  38. }
  39. },
  40. )
  41. }
  42. // Helper functions
  43. const generate = (classObj, amount, meta) => {
  44. const instances = []
  45. for (let i = 0; i < amount; i++) {
  46. let startFrom = meta?.starting ? meta.starting - config.batchSize : 0
  47. instances.push(new classObj(i + startFrom + 1, meta))
  48. }
  49. return instances
  50. }
  51. console.log('\nStarting...\n---')
  52. /**
  53. * Generate Users
  54. */
  55. const generateUsers = () => {
  56. let users = generate(classes.User, config.batchSize, {
  57. starting: config.batchSize * batchCount,
  58. })
  59. users.forEach(user => {
  60. user.is_poster = random.number(100) > config.percentageOfSeekers ? 1 : 0
  61. if (user.is_poster) {
  62. extraProfilesToGenerate = extraProfilesToGenerate + random.number(2)
  63. }
  64. user.user_name = random.name() + ' ' + random.name()
  65. user.user_email = random.email()
  66. })
  67. console.log('COMPLETED: Generated Users...')
  68. return users
  69. }
  70. /**
  71. * Generate Profiles
  72. */
  73. const generateProfiles = jobPosterIds => {
  74. let profiles = generate(classes.Profile, config.batchSize, {
  75. starting: config.batchSize * batchCount,
  76. profile_id: extraProfileCount,
  77. })
  78. profiles.forEach(profile => {
  79. profile.user_media = random.media()
  80. })
  81. // Generate extra job posting profiles
  82. // attributed to random user.is_poster === true
  83. // TODO: Clean this up. Hard to read...
  84. if (extraProfilesToGenerate > 0) {
  85. let extras = []
  86. for (let l = 0; l < extraProfilesToGenerate; l++) {
  87. const generatedExtraProfiles = generate(classes.Profile, 1, {
  88. user_id:
  89. jobPosterIds.length > 1
  90. ? random.valFrom(jobPosterIds)
  91. : jobPosterIds[0],
  92. profile_id:
  93. config.batchSize * batchCount + extraProfileCount + l,
  94. })
  95. extras = [...extras, ...generatedExtraProfiles]
  96. }
  97. extras.forEach(profile => {
  98. profile.user_media = random.media()
  99. profiles.push(profile)
  100. extraProfileCount++
  101. })
  102. }
  103. console.log('COMPLETED: Generated Profiles...')
  104. return profiles
  105. }
  106. /**
  107. * Generate Responses
  108. */
  109. const _ZIPCODEKEY = 7
  110. const generateResponses = profiles => {
  111. // Generate responses first, before filling in details
  112. let responses = generate(
  113. classes.Response,
  114. (config.batchSize + extraProfilesToGenerate) * mock.response_keys.length,
  115. { starting: generatedResponseCount + config.batchSize },
  116. )
  117. profiles.forEach((profile, i) => {
  118. const startingIndex = i * mock.response_keys.length
  119. for (let k = 0; k < mock.response_keys.length; k++) {
  120. const resToEdit = responses[startingIndex + k]
  121. resToEdit.response_key_id = k + 1
  122. resToEdit.profile_id = profile.profile_id
  123. if(resToEdit.response_key_id < _ZIPCODEKEY) {
  124. resToEdit.val = random.valFrom(Object.values(possibleResponses))
  125. }
  126. else if(resToEdit.response_key_id == _ZIPCODEKEY) {
  127. resToEdit.val = random.valFrom(config.possibleZipcodes)
  128. }
  129. else {
  130. switch (resToEdit.response_key_id) {
  131. case 8:
  132. resToEdit.val = random.media()
  133. break
  134. case 9:
  135. resToEdit.val = random.language()
  136. break
  137. case 10:
  138. resToEdit.val = random.duration()
  139. break
  140. case 11:
  141. resToEdit.val = random.location()
  142. break
  143. case 12:
  144. resToEdit.val = random.blurb()
  145. break
  146. }
  147. }
  148. }
  149. })
  150. generatedResponseCount = generatedResponseCount + responses.length
  151. console.log('COMPLETED: Generated Responses...')
  152. return responses
  153. }
  154. /**
  155. * Our main generator loop
  156. */
  157. for (
  158. let batch = config.batchSize;
  159. batch <= config.total;
  160. batch += config.batchSize
  161. ) {
  162. const users = generateUsers()
  163. let jobPosterIds = users
  164. .filter(user => user.is_poster > 0)
  165. .map(user => user.user_id)
  166. // Guarentee ONE job poster
  167. if (!jobPosterIds.length) {
  168. random.valFrom(users).is_poster = 1
  169. jobPosterIds = users
  170. .filter(user => user.is_poster > 0)
  171. .map(user => user.user_id)
  172. }
  173. const profiles = generateProfiles(jobPosterIds)
  174. const responses = generateResponses(profiles)
  175. write(config.batchSize * batchCount, { users, profiles, responses })
  176. batchCount++
  177. }
  178. console.log('---\nFINISHED...\n===\n')