|
|
@@ -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)
|