Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

index.js 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. mediaArray.push(random.media())
  67. }
  68. user.user_media = mediaArray
  69. })
  70. console.log('COMPLETED: Generated Users...')
  71. return users
  72. }
  73. /**
  74. * Generate Profiles
  75. */
  76. const generateProfiles = jobPosterIds => {
  77. let profiles = generate(classes.Profile, config.batchSize, {
  78. starting: config.batchSize * batchCount,
  79. profile_id: extraProfileCount,
  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. profiles.push(profile)
  99. extraProfileCount++
  100. })
  101. }
  102. console.log('COMPLETED: Generated Profiles...')
  103. return profiles
  104. }
  105. /**
  106. * Generate Responses
  107. */
  108. const generateResponses = profiles => {
  109. // Generate responses first, before filling in details
  110. let responses = generate(
  111. classes.Response,
  112. (config.batchSize + extraProfilesToGenerate) * config.questions,
  113. { starting: generatedResponseCount + config.batchSize },
  114. )
  115. profiles.forEach((profile, i) => {
  116. const startingIndex = i * config.questions
  117. for (let k = 0; k < config.questions; k++) {
  118. const resToEdit = responses[startingIndex + k]
  119. resToEdit.response_key_id = k + 1
  120. resToEdit.profile_id = profile.profile_id
  121. resToEdit.val =
  122. k + 1 == config.questions
  123. ? random.valFrom(config.possibleZipcodes)
  124. : random.valFrom(Object.values(possibleResponses))
  125. }
  126. })
  127. generatedResponseCount = generatedResponseCount + responses.length
  128. console.log('COMPLETED: Generated Responses...')
  129. return responses
  130. }
  131. /**
  132. * Our main generator loop
  133. */
  134. for (
  135. let batch = config.batchSize;
  136. batch <= config.total;
  137. batch += config.batchSize
  138. ) {
  139. const users = generateUsers()
  140. let jobPosterIds = users
  141. .filter(user => user.is_poster > 0)
  142. .map(user => user.user_id)
  143. // Guarentee ONE job poster
  144. if (!jobPosterIds.length) {
  145. random.valFrom(users).is_poster = 1
  146. jobPosterIds = users
  147. .filter(user => user.is_poster > 0)
  148. .map(user => user.user_id)
  149. }
  150. const profiles = generateProfiles(jobPosterIds)
  151. const responses = generateResponses(profiles)
  152. write(config.batchSize * batchCount, { users, profiles, responses })
  153. batchCount++
  154. }
  155. /**
  156. * Score all the profiles!
  157. */
  158. // const compareProfileResponses = (seeker, potentialMatch) => {
  159. // const checkValCb = res => {
  160. // const val = parseInt(res.val)
  161. // return isNaN(val) ? 0 : val
  162. // }
  163. // const filterBy = idToCheckFor => {
  164. // return responses
  165. // .filter(
  166. // response =>
  167. // response.profile_id == idToCheckFor &&
  168. // response.val.length < 4,
  169. // )
  170. // .map(checkValCb)
  171. // }
  172. // const seekerResponses = filterBy(seeker.profile_id)
  173. // const potentialMatchResponses = filterBy(potentialMatch.profile_id)
  174. // const cachedScores = []
  175. // seekerResponses.forEach(seekerResponse => {
  176. // potentialMatchResponses.forEach(potentialResponse => {
  177. // cachedScores.push(
  178. // preComputedScores[seekerResponse][potentialResponse],
  179. // )
  180. // })
  181. // })
  182. // return Math.round(
  183. // cachedScores.reduce((a, b) => a + b) / cachedScores.length,
  184. // )
  185. // }
  186. // const scoreProfile = (profile, potentialMatchList) => {
  187. // return potentialMatchList
  188. // .map(profileToCompare => {
  189. // return {
  190. // match_queue_id: null,
  191. // profile_id: profile.profile_id,
  192. // target_id: profileToCompare.profile_id,
  193. // is_deleted: false,
  194. // score: compareProfileResponses(profile, profileToCompare),
  195. // }
  196. // })
  197. // .sort((a, b) => a.score - b.score)
  198. // }
  199. // const scoreAll = () => {
  200. // process.stdout.write('\nScoring Profiles')
  201. // let scores = []
  202. // const posterProfiles = profiles.filter(profile =>
  203. // jobPosterIds.includes(profile.user_id),
  204. // )
  205. // const seekerProfiles = profiles.filter(
  206. // profile => !jobPosterIds.includes(profile.user_id),
  207. // )
  208. // process.stdout.write('.')
  209. // for (let i = 0; i < seekerProfiles.length; i++) {
  210. // const scored = scoreProfile(seekerProfiles[i], posterProfiles)
  211. // scores.push(...scored)
  212. // }
  213. // process.stdout.write('.')
  214. // for (let j = 0; j < posterProfiles.length; j++) {
  215. // const scored = scoreProfile(posterProfiles[j], seekerProfiles)
  216. // scores.push(...scored)
  217. // }
  218. // process.stdout.write('.')
  219. // console.log('\n\nCOMPLETED: Scoring Profiles...')
  220. // return scores.reverse()
  221. // }
  222. // const match_queues = scoreAll().map((score, i) => {
  223. // score.match_queue_id = i + 1
  224. // // Comment out next line to see the scores
  225. // delete score.score
  226. // return score
  227. // })
  228. console.log('---\nFINISHED...\n===\n')