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.

index.js 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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 = 0
  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. await fs.writeFile(`${config.mockOutputPath}_${batchNum}.js`, '', () => {})
  28. fs.appendFile(
  29. `${config.mockOutputPath}_${batchNum}.js`,
  30. config.header + 'export default ' + JSON.stringify(outputDataObject),
  31. err => {
  32. if (err) {
  33. console.error(err)
  34. return
  35. }
  36. },
  37. )
  38. }
  39. // Helper functions
  40. // const preComputedScores = score.precomputed
  41. const generate = (classObj, amount, meta) => {
  42. const instances = []
  43. for (let i = 0; i < amount; i++) {
  44. let startFrom = meta?.starting ? meta.starting - config.batchSize : 0
  45. instances.push(new classObj(i + startFrom + 1, meta))
  46. }
  47. return instances
  48. }
  49. console.log('\nStarting...\n---')
  50. /**
  51. * Generate Users
  52. */
  53. const generateUsers = () => {
  54. let users = generate(classes.User, config.batchSize, {
  55. starting: config.batchSize * batchCount,
  56. })
  57. users.forEach(user => {
  58. user.is_poster = random.number(100) > config.percentageOfSeekers ? 1 : 0
  59. if (user.is_poster) {
  60. extraProfilesToGenerate = extraProfilesToGenerate + random.number(2)
  61. }
  62. user.user_name = random.name() + ' ' + random.name()
  63. user.user_email = random.email()
  64. var mediaArray = []
  65. for (let i=0; i < 3; i++) {
  66. }
  67. user.user_media = random.media()
  68. })
  69. console.log('COMPLETED: Generated Users...')
  70. return users
  71. }
  72. /**
  73. * Generate Profiles
  74. */
  75. const generateProfiles = jobPosterIds => {
  76. let profiles = generate(classes.Profile, config.batchSize, {
  77. starting: config.batchSize * batchCount,
  78. profile_id: extraProfileCount,
  79. })
  80. // Generate extra job posting profiles
  81. // attributed to random user.is_poster === true
  82. // TODO: Clean this up. Hard to read...
  83. if (extraProfilesToGenerate > 0) {
  84. let extras = []
  85. for (let l = 0; l < extraProfilesToGenerate; l++) {
  86. const generatedExtraProfiles = generate(classes.Profile, 1, {
  87. user_id:
  88. jobPosterIds.length > 1
  89. ? random.valFrom(jobPosterIds)
  90. : jobPosterIds[0],
  91. profile_id:
  92. config.batchSize * batchCount + extraProfileCount + l,
  93. })
  94. extras = [...extras, ...generatedExtraProfiles]
  95. }
  96. extras.forEach(profile => {
  97. profiles.push(profile)
  98. extraProfileCount++
  99. })
  100. }
  101. console.log('COMPLETED: Generated Profiles...')
  102. return profiles
  103. }
  104. /**
  105. * Generate Responses
  106. */
  107. const generateResponses = profiles => {
  108. // Generate responses first, before filling in details
  109. let responses = generate(
  110. classes.Response,
  111. (config.batchSize + extraProfilesToGenerate) * config.questions,
  112. { starting: generatedResponseCount + config.batchSize },
  113. )
  114. profiles.forEach((profile, i) => {
  115. const startingIndex = i * config.questions
  116. for (let k = 0; k < config.questions; k++) {
  117. const resToEdit = responses[startingIndex + k]
  118. resToEdit.response_key_id = k + 1
  119. resToEdit.profile_id = profile.profile_id
  120. resToEdit.val =
  121. k + 1 == config.questions
  122. ? random.valFrom(config.possibleZipcodes)
  123. : random.valFrom(Object.values(possibleResponses))
  124. }
  125. })
  126. generatedResponseCount = generatedResponseCount + responses.length
  127. console.log('COMPLETED: Generated Responses...')
  128. return responses
  129. }
  130. /**
  131. * Our main generator loop
  132. */
  133. for (
  134. let batch = config.batchSize;
  135. batch <= config.total;
  136. batch += config.batchSize
  137. ) {
  138. const users = generateUsers()
  139. let jobPosterIds = users
  140. .filter(user => user.is_poster > 0)
  141. .map(user => user.user_id)
  142. // Guarentee ONE job poster
  143. if (!jobPosterIds.length) {
  144. random.valFrom(users).is_poster = 1
  145. jobPosterIds = users
  146. .filter(user => user.is_poster > 0)
  147. .map(user => user.user_id)
  148. }
  149. const profiles = generateProfiles(jobPosterIds)
  150. const responses = generateResponses(profiles)
  151. write(config.batchSize * batchCount, { users, profiles, responses })
  152. batchCount++
  153. }
  154. /**
  155. * Score all the profiles!
  156. */
  157. // const compareProfileResponses = (seeker, potentialMatch) => {
  158. // const checkValCb = res => {
  159. // const val = parseInt(res.val)
  160. // return isNaN(val) ? 0 : val
  161. // }
  162. // const filterBy = idToCheckFor => {
  163. // return responses
  164. // .filter(
  165. // response =>
  166. // response.profile_id == idToCheckFor &&
  167. // response.val.length < 4,
  168. // )
  169. // .map(checkValCb)
  170. // }
  171. // const seekerResponses = filterBy(seeker.profile_id)
  172. // const potentialMatchResponses = filterBy(potentialMatch.profile_id)
  173. // const cachedScores = []
  174. // seekerResponses.forEach(seekerResponse => {
  175. // potentialMatchResponses.forEach(potentialResponse => {
  176. // cachedScores.push(
  177. // preComputedScores[seekerResponse][potentialResponse],
  178. // )
  179. // })
  180. // })
  181. // return Math.round(
  182. // cachedScores.reduce((a, b) => a + b) / cachedScores.length,
  183. // )
  184. // }
  185. // const scoreProfile = (profile, potentialMatchList) => {
  186. // return potentialMatchList
  187. // .map(profileToCompare => {
  188. // return {
  189. // match_queue_id: null,
  190. // profile_id: profile.profile_id,
  191. // target_id: profileToCompare.profile_id,
  192. // is_deleted: false,
  193. // score: compareProfileResponses(profile, profileToCompare),
  194. // }
  195. // })
  196. // .sort((a, b) => a.score - b.score)
  197. // }
  198. // const scoreAll = () => {
  199. // process.stdout.write('\nScoring Profiles')
  200. // let scores = []
  201. // const posterProfiles = profiles.filter(profile =>
  202. // jobPosterIds.includes(profile.user_id),
  203. // )
  204. // const seekerProfiles = profiles.filter(
  205. // profile => !jobPosterIds.includes(profile.user_id),
  206. // )
  207. // process.stdout.write('.')
  208. // for (let i = 0; i < seekerProfiles.length; i++) {
  209. // const scored = scoreProfile(seekerProfiles[i], posterProfiles)
  210. // scores.push(...scored)
  211. // }
  212. // process.stdout.write('.')
  213. // for (let j = 0; j < posterProfiles.length; j++) {
  214. // const scored = scoreProfile(posterProfiles[j], seekerProfiles)
  215. // scores.push(...scored)
  216. // }
  217. // process.stdout.write('.')
  218. // console.log('\n\nCOMPLETED: Scoring Profiles...')
  219. // return scores.reverse()
  220. // }
  221. // const match_queues = scoreAll().map((score, i) => {
  222. // score.match_queue_id = i + 1
  223. // // Comment out next line to see the scores
  224. // delete score.score
  225. // return score
  226. // })
  227. console.log('---\nFINISHED...\n===\n')