Skip to content

Commit 6b5e10d

Browse files
authored
Merge pull request #9 from StephixOne/consistent-users-on-posts
Generate 1000 users on app run, then pull from those for posts
2 parents 28e503b + 68cbe7c commit 6b5e10d

File tree

2 files changed

+120
-105
lines changed

2 files changed

+120
-105
lines changed

src/resolvers/index.ts

Lines changed: 73 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,168 +1,166 @@
1-
import * as scuid from 'scuid';
1+
import * as scuid from 'scuid'
22

3-
import { generateAuthToken, getUserId, likelyTopics } from '../utils';
3+
import {
4+
generateAuthToken,
5+
getUserId,
6+
likelyTopics,
7+
predefinedUsers,
8+
} from '../utils'
49

5-
const DEFAULT_COUNT = 25;
10+
const DEFAULT_COUNT = 25
611

712
export default {
813
Query: {
914
me: (parent, args, ctx) => {
10-
const userId = getUserId(ctx);
11-
const { faker } = ctx;
15+
const userId = getUserId(ctx)
16+
const { faker } = ctx
1217

1318
return {
1419
id: userId,
1520
firstName: faker.name.firstName(),
1621
lastName: faker.name.lastName(),
1722
email: faker.internet.email(),
18-
avatar: faker.image.avatar()
19-
};
23+
avatar: faker.image.avatar(),
24+
}
2025
},
2126

22-
allUsers(parent, { count = DEFAULT_COUNT }, { faker }) {
23-
return new Array(count).fill(0).map(_ => ({
24-
id: scuid(),
27+
allUsers: (parent, { count = DEFAULT_COUNT }, { faker }) =>
28+
predefinedUsers.slice(0, count),
29+
30+
User: (parent, { id }, { faker }) =>
31+
predefinedUsers.filter((user) => user.id === id)[0] || {
32+
id,
2533
firstName: faker.name.firstName(),
2634
lastName: faker.name.lastName(),
2735
email: faker.internet.email(),
28-
avatar: faker.image.avatar()
29-
}));
30-
},
31-
32-
User: (parent, { id }, { faker }) => ({
33-
id,
34-
firstName: faker.name.firstName(),
35-
lastName: faker.name.lastName(),
36-
email: faker.internet.email(),
37-
avatar: faker.image.avatar()
38-
}),
36+
avatar: faker.image.avatar(),
37+
},
3938

4039
allProducts: (parent, { count = DEFAULT_COUNT }, { faker }) => {
41-
return new Array(count).fill(0).map(_ => ({
40+
return new Array(count).fill(0).map((_) => ({
4241
id: scuid(),
4342
price: faker.commerce.price(),
44-
name: faker.commerce.productName()
45-
}));
43+
name: faker.commerce.productName(),
44+
}))
4645
},
4746

4847
Product: (parent, { id }, { faker }) => ({
4948
id,
5049
price: faker.commerce.price(),
51-
name: faker.commerce.productName()
50+
name: faker.commerce.productName(),
5251
}),
5352

5453
Todo: (parent, { id }, { faker }) => ({
5554
id,
5655
title: faker.random.words(),
57-
completed: faker.random.boolean()
56+
completed: faker.random.boolean(),
5857
}),
5958

6059
allTodos: (parent, { count = DEFAULT_COUNT }, { faker }) => {
61-
return new Array(count).fill(0).map(_ => ({
60+
return new Array(count).fill(0).map((_) => ({
6261
id: scuid(),
6362
title: faker.random.words(),
64-
completed: faker.random.boolean()
65-
}));
63+
completed: faker.random.boolean(),
64+
}))
6665
},
6766

6867
// refactor user relation into Class
6968
Post: (parent, { id }, { faker }) => {
70-
const title = faker.random.words();
71-
const body = faker.lorem.paragraphs();
72-
const firstName = faker.name.firstName();
73-
const lastName = faker.name.lastName();
69+
const title = faker.random.words()
70+
const body = faker.lorem.paragraphs()
71+
const firstName = faker.name.firstName()
72+
const lastName = faker.name.lastName()
7473
return {
7574
id,
7675
title,
7776
body,
7877
published: faker.random.boolean(),
79-
createdAt: faker.date.past(),
78+
createdAt: faker.date.between(
79+
new Date('2019-01-01'),
80+
new Date('2019-12-31'),
81+
),
8082
author: {
8183
id: scuid(),
8284
firstName,
8385
lastName,
8486
email: faker.internet.email(),
85-
avatar: faker.image.avatar()
87+
avatar: faker.image.avatar(),
8688
},
87-
likelyTopics: likelyTopics(
88-
`${firstName} ${lastName}`,
89-
title, body
90-
)
91-
};
89+
likelyTopics: likelyTopics(`${firstName} ${lastName}`, title, body),
90+
}
9291
},
9392

9493
// refactor user relation into Class
9594
allPosts: (parent, { count }, { faker }) => {
96-
return new Array(count).fill(0).map(_ => {
97-
const title = faker.random.words();
98-
const body = faker.lorem.paragraphs();
99-
const firstName = faker.name.firstName();
100-
const lastName = faker.name.lastName();
95+
const usersToUse = predefinedUsers.slice(
96+
0,
97+
count > 200 ? Math.ceil(count / 50) : Math.ceil(count / 20),
98+
)
99+
return new Array(count).fill(0).map((_) => {
100+
const title = faker.random.words()
101+
const body = faker.lorem.paragraphs()
102+
const user = usersToUse[Math.floor(Math.random() * usersToUse.length)]
103+
const firstName = user.firstName
104+
const lastName = user.lastName
101105
return {
102106
id: scuid(),
103107
title,
104108
body,
105109
published: faker.random.boolean(),
106-
createdAt: faker.date.past(),
107-
author: {
108-
id: scuid(),
109-
firstName,
110-
lastName,
111-
email: faker.internet.email(),
112-
avatar: faker.image.avatar()
113-
},
114-
likelyTopics: likelyTopics(
115-
`${firstName} ${lastName}`,
116-
title, body
117-
)
110+
createdAt: faker.date.between(
111+
new Date('2019-01-01'),
112+
new Date('2019-12-31'),
113+
),
114+
author: user,
115+
likelyTopics: likelyTopics(`${firstName} ${lastName}`, title, body),
118116
}
119-
});
120-
}
117+
})
118+
},
121119
},
122120

123121
Mutation: {
124122
register: async (
125123
parent,
126124
{ email, password, expiresIn = '2d' },
127125
{ jwtSecret },
128-
info
126+
info,
129127
) => ({
130128
token: await generateAuthToken(
131129
{ userId: scuid(), email },
132130
jwtSecret,
133-
expiresIn
134-
)
131+
expiresIn,
132+
),
135133
}),
136134

137135
login: async (
138136
parent,
139137
{ email, password, expiresIn = '2d' },
140138
{ jwtSecret },
141-
info
139+
info,
142140
) => ({
143141
token: await generateAuthToken(
144142
{ email, userId: scuid() },
145143
jwtSecret,
146-
expiresIn
147-
)
144+
expiresIn,
145+
),
148146
}),
149147

150148
updateUser: (parent, { id, firstName, lastName, email, avatar }, ctx) => {
151-
const userId = getUserId(ctx);
152-
const { faker } = ctx;
149+
const userId = getUserId(ctx)
150+
const { faker } = ctx
153151

154152
return {
155153
id: userId,
156154
firstName: firstName === undefined ? faker.name.firstName() : firstName,
157155
lastName: lastName === undefined ? faker.name.lastName() : lastName,
158156
email: email === undefined ? faker.internet.email() : email,
159-
avatar: avatar === undefined ? faker.image.avatar() : avatar
160-
};
157+
avatar: avatar === undefined ? faker.image.avatar() : avatar,
158+
}
161159
},
162160

163161
// No authentication for demo purposes
164162
createTodo: (parent, { title, completed }, { faker }) => {
165-
const id = scuid();
163+
const id = scuid()
166164

167165
// pubsub.publish('todoAdded', {
168166
// todoAdded: {
@@ -175,10 +173,10 @@ export default {
175173
return {
176174
id,
177175
title,
178-
completed: completed === undefined ? faker.random.boolean() : completed
179-
};
180-
}
181-
}
176+
completed: completed === undefined ? faker.random.boolean() : completed,
177+
}
178+
},
179+
},
182180

183181
// Subscription: {
184182
// todoAdded: {
@@ -196,4 +194,4 @@ export default {
196194
// }
197195
// }
198196
// }
199-
};
197+
}

src/utils.ts

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
1-
import * as jwt from 'jsonwebtoken';
1+
import * as scuid from 'scuid'
2+
import * as jwt from 'jsonwebtoken'
3+
import * as faker from 'faker/locale/en'
4+
import { create } from 'domain'
25

36
export const generateAuthToken = (payload, secret, expiresIn) =>
47
jwt.sign(payload, secret, {
5-
expiresIn
6-
});
8+
expiresIn,
9+
})
710

8-
export const getUserId = ctx => {
9-
const Authorization = ctx.request.get('Authorization');
11+
export const getUserId = (ctx) => {
12+
const Authorization = ctx.request.get('Authorization')
1013

1114
if (Authorization) {
12-
const token = Authorization.replace('Bearer ', '');
13-
const { userId } = jwt.verify(token, process.env.JWT_SECRET);
14-
return userId;
15+
const token = Authorization.replace('Bearer ', '')
16+
const { userId } = jwt.verify(token, process.env.JWT_SECRET)
17+
return userId
1518
}
1619

17-
throw new Error('Not Authorized');
18-
};
20+
throw new Error('Not Authorized')
21+
}
1922

2023
// Ten randomly-chosen but consistent topic nouns.
2124
export const topicWords = [
@@ -28,37 +31,51 @@ export const topicWords = [
2831
'community',
2932
'celebrity',
3033
'birthday',
31-
'potato'
32-
];
34+
'potato',
35+
]
3336

3437
export const likelyTopics = (user, title, body) => {
3538
// create a custom order over the topics, based on letters as they appear in
3639
// the user's name, post title, and post body, for variability
37-
const alphabet = `${title} ${user} ${body}`;
40+
const alphabet = `${title} ${user} ${body}`
3841
const topicLabels = topicWords.sort((a, b) => {
3942
for (let i = 0; i < Math.min(a.length, b.length); i++) {
40-
const aValue = alphabet.indexOf(a[i]);
41-
const bValue = alphabet.indexOf(b[i]);
43+
const aValue = alphabet.indexOf(a[i])
44+
const bValue = alphabet.indexOf(b[i])
4245
if (aValue !== bValue) {
43-
return bValue - aValue;
46+
return bValue - aValue
4447
}
4548
}
46-
return b.length - a.length;
49+
return b.length - a.length
4750
})
4851
// compute a biased probability distribution
49-
const likelihoods = [];
50-
let total = 0;
52+
const likelihoods = []
53+
let total = 0
5154
for (let i = 0; i < topicLabels.length; i++) {
52-
const weight = Math.random() * Math.log(i + 2);
53-
total += weight;
54-
likelihoods.push(weight);
55+
const weight = Math.random() * Math.log(i + 2)
56+
total += weight
57+
likelihoods.push(weight)
5558
}
56-
likelihoods.reverse();
59+
likelihoods.reverse()
5760
// and associate each likelihood with a probability
58-
return likelihoods.map((weight, i) => {
59-
return {
60-
likelihood: weight / total,
61-
label: topicLabels[i]
62-
}
63-
}).sort((a, b) => b.likelihood - a.likelihood);
64-
};
61+
return likelihoods
62+
.map((weight, i) => {
63+
return {
64+
likelihood: weight / total,
65+
label: topicLabels[i],
66+
}
67+
})
68+
.sort((a, b) => b.likelihood - a.likelihood)
69+
}
70+
71+
export const createFullUser = () => ({
72+
id: scuid(),
73+
firstName: faker.name.firstName(),
74+
lastName: faker.name.lastName(),
75+
email: faker.internet.email(),
76+
avatar: faker.image.avatar(),
77+
})
78+
79+
export const predefinedUsers = new Array(1000)
80+
.fill(null)
81+
.map((_) => createFullUser())

0 commit comments

Comments
 (0)