Просмотр исходного кода

:sparkles: adding generator run command | random email | random user name | insuring 1 user is_poster | generating extra profiles and matching responses for is_poster

tags/0.0.1
j 4 лет назад
Родитель
Сommit
66db1050e4
3 измененных файлов: 98 добавлений и 25 удалений
  1. 0
    7
      backend/db/_generated.sample.js
  2. 97
    18
      backend/db/generator.js
  3. 1
    0
      backend/package.json

+ 0
- 7
backend/db/_generated.sample.js Просмотреть файл

@@ -1,7 +0,0 @@
1
-/**
2
- * Generated mock data to copy
3
- * into the db with npm run seed
4
- *
5
- * You MUST first rename this file _generated.js
6
- * then you can run npm run generate!
7
- */

+ 97
- 18
backend/db/generator.js Просмотреть файл

@@ -1,14 +1,15 @@
1 1
 const fs = require('fs')
2
-const mockPath = './backend/db/_generated.js'
2
+const mockOutputPath = './db/_generated.js'
3 3
 
4 4
 // Insert here how many users you would like to generate:
5 5
 const total = 100
6
+let extraProfilesToGenerate = 0
6 7
 
7 8
 // Amount of responses for a complete survey
8 9
 const questions = 13
9 10
 
10 11
 // Seekers per 100 profiles
11
-const percentageOfSeekers = 95
12
+const percentageOfSeekers = 90
12 13
 
13 14
 // Values for responses
14 15
 const possibleResponses = {
@@ -42,6 +43,32 @@ const randomNumber = max => {
42 43
 }
43 44
 
44 45
 const randomValFrom = arr => arr[randomNumber(arr.length)]
46
+const randomEmail = (length = 5) => {
47
+    let chars =
48
+        'abcdefghijklmnopqrstuvwxyz-_abcdefghijklmnopqrstuvwxyz0123456789'
49
+    let str = ''
50
+    for (let i = 0; i < length + randomNumber(9); i++) {
51
+        str += chars.charAt(Math.floor(Math.random() * chars.length))
52
+    }
53
+    const suffixs = [
54
+        '@gmail.com',
55
+        '@aol.com',
56
+        '@yahoo.com',
57
+        '@apple.com',
58
+        '@hotmail.com',
59
+        '@rocket-mail.com',
60
+        '@mail.com',
61
+    ]
62
+    return str + randomValFrom(suffixs)
63
+}
64
+const randomName = (length = 4) => {
65
+    let chars = 'aeiouaeiouabcdefghijklmnoprstuvwyabcdefghijklmnopqrstuvwxyz'
66
+    let str = ''
67
+    for (let i = 0; i < length + randomNumber(9); i++) {
68
+        str += chars.charAt(Math.floor(Math.random() * chars.length))
69
+    }
70
+    return str
71
+}
45 72
 
46 73
 const generate = (classObj, amount, meta) => {
47 74
     const instances = []
@@ -61,9 +88,9 @@ class User {
61 88
     }
62 89
 }
63 90
 class Profile {
64
-    constructor(id) {
65
-        this.user_id = id
66
-        this.profile_id = id
91
+    constructor(id, override) {
92
+        this.user_id = override ? override.user_id : id
93
+        this.profile_id = override ? override.profile_id + id : id
67 94
     }
68 95
 }
69 96
 class Response {
@@ -76,14 +103,51 @@ class Response {
76 103
 }
77 104
 
78 105
 const users = generate(User, total)
79
-users.forEach(
80
-    user => (user.is_poster = randomNumber(100) > percentageOfSeekers ? 1 : 0),
81
-)
106
+users.forEach(user => {
107
+    user.is_poster = randomNumber(100) > percentageOfSeekers ? 1 : 0
108
+    if (user.is_poster) {
109
+        extraProfilesToGenerate = extraProfilesToGenerate + randomNumber(2)
110
+    }
111
+    user.user_name = randomName() + ' ' + randomName()
112
+    user.user_email = randomEmail()
113
+})
114
+let jobPosterIds = users
115
+    .filter(user => user.is_poster > 0)
116
+    .map(user => user.user_id)
117
+
118
+// Guarentee ONE job poster
119
+if (!jobPosterIds.length) {
120
+    randomValFrom(users).is_poster = 1
121
+    jobPosterIds = users
122
+        .filter(user => user.is_poster > 0)
123
+        .map(user => user.user_id)
124
+}
82 125
 
83 126
 const profiles = generate(Profile, total)
84 127
 
128
+// Generate extra job posting profiles
129
+// attributed to random user.is_poster === true
130
+// TODO: Clean this up. Hard to read...
131
+if (extraProfilesToGenerate > 0) {
132
+    let extras = []
133
+    for (let l = 0; l < extraProfilesToGenerate; l++) {
134
+        const generatedExtraProfiles = generate(Profile, 1, {
135
+            user_id:
136
+                jobPosterIds.length > 1
137
+                    ? randomValFrom(jobPosterIds)
138
+                    : jobPosterIds[0],
139
+            profile_id: profiles.length + l,
140
+        })
141
+        extras = [...extras, ...generatedExtraProfiles]
142
+    }
143
+    extras.forEach(profile => profiles.push(profile))
144
+}
145
+
85 146
 // Generate responses, then fill in details
86
-const responses = generate(Response, total * questions)
147
+const responses = generate(
148
+    Response,
149
+    (total + extraProfilesToGenerate) * questions,
150
+)
87 151
 profiles.forEach((profile, i) => {
88 152
     const startingIndex = i * questions
89 153
     for (let k = 0; k < questions; k++) {
@@ -97,18 +161,33 @@ profiles.forEach((profile, i) => {
97 161
     }
98 162
 })
99 163
 
100
-// console.log(responses)
101
-// console.log(users)
164
+/**
165
+ * Our output format
166
+ */
167
+const outputDataObject = { users, profiles, responses }
168
+
169
+const jobPostings = profiles.filter(profile =>
170
+    jobPosterIds.includes(profile.user_id),
171
+).length
102 172
 const jobPosters = users.filter(user => user.is_poster > 0).length
173
+const header = `/**
174
+ * GENERATED MOCK SIIMEE DATA
175
+ * Generated at: ${Date.now()}
176
+ * ---
177
+ * ${jobPostings} positions listed by ${jobPosters} job posters
178
+ * ${total + extraProfilesToGenerate - jobPostings} candidate profiles by ${
179
+    total + extraProfilesToGenerate - jobPostings
180
+} job seekers
181
+ * ---
182
+ * ${total + extraProfilesToGenerate} Profiles
183
+ * ${total} Users
184
+ */
185
+`
103 186
 const write = async () => {
104
-    await fs.writeFile(mockPath, '', () => {})
187
+    await fs.writeFile(mockOutputPath, '', () => {})
105 188
     fs.appendFile(
106
-        mockPath,
107
-        `/**\n * Generated ${total} profiles @${Date.now()}\n * ${jobPosters}:${
108
-            total - jobPosters
109
-        } posters|seekers\n * ---\n */\n\n` +
110
-            'module.exports = ' +
111
-            JSON.stringify({ users, responses }),
189
+        mockOutputPath,
190
+        header + 'module.exports = ' + JSON.stringify(outputDataObject),
112 191
         err => {
113 192
             if (err) {
114 193
                 console.error(err)

+ 1
- 0
backend/package.json Просмотреть файл

@@ -7,6 +7,7 @@
7 7
     "start": "nodemon server",
8 8
     "migrate": "knex migrate:latest",
9 9
     "unmigrate": "knex migrate:down",
10
+    "generate": "node ./db/generator.js",
10 11
     "seed": "knex seed:run",
11 12
     "test": "nyc ava --timeout=3000"
12 13
   },

Загрузка…
Отмена
Сохранить