Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

index.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. const fs = require('fs')
  2. const config = require('./config')
  3. const random = require('./random')
  4. const classes = require('./classes')
  5. const score = require('./score')
  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 preComputedScores = score.precomputed
  44. const generate = (classObj, amount, meta) => {
  45. const instances = []
  46. for (let i = 0; i < amount; i++) {
  47. let startFrom = meta?.starting ? meta.starting - config.batchSize : 0
  48. instances.push(new classObj(i + startFrom + 1, meta))
  49. }
  50. return instances
  51. }
  52. console.log('\nStarting...\n---')
  53. /**
  54. * Generate Users
  55. */
  56. const generateUsers = () => {
  57. let users = generate(classes.User, config.batchSize, {
  58. starting: config.batchSize * batchCount,
  59. })
  60. users.forEach(user => {
  61. user.is_poster = random.number(100) > config.percentageOfSeekers ? 1 : 0
  62. if (user.is_poster) {
  63. extraProfilesToGenerate = extraProfilesToGenerate + random.number(2)
  64. }
  65. user.user_name = random.name() + ' ' + random.name()
  66. user.user_email = random.email()
  67. })
  68. console.log('COMPLETED: Generated Users...')
  69. return users
  70. }
  71. /**
  72. * Generate Profiles
  73. */
  74. const generateProfiles = jobPosterIds => {
  75. let profiles = generate(classes.Profile, config.batchSize, {
  76. starting: config.batchSize * batchCount,
  77. profile_id: extraProfileCount,
  78. })
  79. profiles.forEach(profile => {
  80. var mediaArray = []
  81. for (let i = 0; i < 3; i++) {
  82. mediaArray.push(random.media())
  83. }
  84. profile.user_media = mediaArray
  85. })
  86. // Generate extra job posting profiles
  87. // attributed to random user.is_poster === true
  88. // TODO: Clean this up. Hard to read...
  89. if (extraProfilesToGenerate > 0) {
  90. let extras = []
  91. for (let l = 0; l < extraProfilesToGenerate; l++) {
  92. const generatedExtraProfiles = generate(classes.Profile, 1, {
  93. user_id:
  94. jobPosterIds.length > 1
  95. ? random.valFrom(jobPosterIds)
  96. : jobPosterIds[0],
  97. profile_id:
  98. config.batchSize * batchCount + extraProfileCount + l,
  99. })
  100. extras = [...extras, ...generatedExtraProfiles]
  101. }
  102. extras.forEach(profile => {
  103. var mediaArray = []
  104. for (let i = 0; i < 3; i++) {
  105. mediaArray.push(random.media())
  106. }
  107. profile.user_media = mediaArray
  108. profiles.push(profile)
  109. extraProfileCount++
  110. })
  111. }
  112. console.log('COMPLETED: Generated Profiles...')
  113. return profiles
  114. }
  115. /**
  116. * Generate Responses
  117. */
  118. const generateResponses = profiles => {
  119. // Generate responses first, before filling in details
  120. let responses = generate(
  121. classes.Response,
  122. (config.batchSize + extraProfilesToGenerate) * config.questions,
  123. { starting: generatedResponseCount + config.batchSize },
  124. )
  125. profiles.forEach((profile, i) => {
  126. const startingIndex = i * config.questions
  127. for (let k = 0; k < config.questions; k++) {
  128. const resToEdit = responses[startingIndex + k]
  129. resToEdit.response_key_id = k + 1
  130. resToEdit.profile_id = profile.profile_id
  131. resToEdit.val =
  132. k + 1 == config.questions
  133. ? random.valFrom(config.possibleZipcodes)
  134. : random.valFrom(Object.values(possibleResponses))
  135. }
  136. })
  137. generatedResponseCount = generatedResponseCount + responses.length
  138. console.log('COMPLETED: Generated Responses...')
  139. return responses
  140. }
  141. /**
  142. * Our main generator loop
  143. */
  144. const writeBarrel = async () => {
  145. await fs.writeFile(`${config.mockOutputPath}/index.js`, '', () => {})
  146. }
  147. // writeBarrel()
  148. for (
  149. let batch = config.batchSize;
  150. batch <= config.total;
  151. batch += config.batchSize
  152. ) {
  153. const users = generateUsers()
  154. let jobPosterIds = users
  155. .filter(user => user.is_poster > 0)
  156. .map(user => user.user_id)
  157. // Guarentee ONE job poster
  158. if (!jobPosterIds.length) {
  159. random.valFrom(users).is_poster = 1
  160. jobPosterIds = users
  161. .filter(user => user.is_poster > 0)
  162. .map(user => user.user_id)
  163. }
  164. const profiles = generateProfiles(jobPosterIds)
  165. const responses = generateResponses(profiles)
  166. write(config.batchSize * batchCount, { users, profiles, responses })
  167. /**
  168. * Write barrel export
  169. */
  170. // const filename = `_batch_${config.batchSize * batchCount}.js`
  171. // fs.appendFile(
  172. // `${config.mockOutputPath}/index.js`,
  173. // `export * from './${filename}'\n`,
  174. // err => {
  175. // if (err) console.error(err)
  176. // },
  177. // )
  178. batchCount++
  179. }
  180. console.log('---\nFINISHED...\n===\n')