Преглед изворни кода

: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 година
родитељ
комит
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
-/**
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
 const fs = require('fs')
1
 const fs = require('fs')
2
-const mockPath = './backend/db/_generated.js'
2
+const mockOutputPath = './db/_generated.js'
3
 
3
 
4
 // Insert here how many users you would like to generate:
4
 // Insert here how many users you would like to generate:
5
 const total = 100
5
 const total = 100
6
+let extraProfilesToGenerate = 0
6
 
7
 
7
 // Amount of responses for a complete survey
8
 // Amount of responses for a complete survey
8
 const questions = 13
9
 const questions = 13
9
 
10
 
10
 // Seekers per 100 profiles
11
 // Seekers per 100 profiles
11
-const percentageOfSeekers = 95
12
+const percentageOfSeekers = 90
12
 
13
 
13
 // Values for responses
14
 // Values for responses
14
 const possibleResponses = {
15
 const possibleResponses = {
42
 }
43
 }
43
 
44
 
44
 const randomValFrom = arr => arr[randomNumber(arr.length)]
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
 const generate = (classObj, amount, meta) => {
73
 const generate = (classObj, amount, meta) => {
47
     const instances = []
74
     const instances = []
61
     }
88
     }
62
 }
89
 }
63
 class Profile {
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
 class Response {
96
 class Response {
76
 }
103
 }
77
 
104
 
78
 const users = generate(User, total)
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
 const profiles = generate(Profile, total)
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
 // Generate responses, then fill in details
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
 profiles.forEach((profile, i) => {
151
 profiles.forEach((profile, i) => {
88
     const startingIndex = i * questions
152
     const startingIndex = i * questions
89
     for (let k = 0; k < questions; k++) {
153
     for (let k = 0; k < questions; k++) {
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
 const jobPosters = users.filter(user => user.is_poster > 0).length
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
 const write = async () => {
186
 const write = async () => {
104
-    await fs.writeFile(mockPath, '', () => {})
187
+    await fs.writeFile(mockOutputPath, '', () => {})
105
     fs.appendFile(
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
         err => {
191
         err => {
113
             if (err) {
192
             if (err) {
114
                 console.error(err)
193
                 console.error(err)

+ 1
- 0
backend/package.json Прегледај датотеку

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

Loading…
Откажи
Сачувај