Skip to content

Commit 3422419

Browse files
committed
Improve Viewer type
1 parent 8a68f19 commit 3422419

File tree

5 files changed

+99
-38
lines changed

5 files changed

+99
-38
lines changed

spec/ParseGraphQLServer.spec.js

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6155,9 +6155,11 @@ describe('ParseGraphQLServer', () => {
61556155
query: gql`
61566156
query GetCurrentUser {
61576157
viewer {
6158-
id
6159-
username
6160-
email
6158+
user {
6159+
id
6160+
username
6161+
email
6162+
}
61616163
}
61626164
}
61636165
`,
@@ -6172,7 +6174,7 @@ describe('ParseGraphQLServer', () => {
61726174
id,
61736175
username: resultUserName,
61746176
email: resultEmail,
6175-
} = result.data.viewer;
6177+
} = result.data.viewer.user;
61766178
expect(id).toBeDefined();
61776179
expect(resultUserName).toEqual(userName);
61786180
expect(resultEmail).toEqual(email);
@@ -6200,11 +6202,13 @@ describe('ParseGraphQLServer', () => {
62006202
query: gql`
62016203
query GetCurrentUser {
62026204
viewer {
6203-
id
6204-
objectId
62056205
sessionToken
6206-
userFoo {
6207-
bar
6206+
user {
6207+
id
6208+
objectId
6209+
userFoo {
6210+
bar
6211+
}
62086212
}
62096213
}
62106214
}
@@ -6216,11 +6220,8 @@ describe('ParseGraphQLServer', () => {
62166220
},
62176221
});
62186222

6219-
const {
6220-
objectId,
6221-
sessionToken,
6222-
userFoo: resultFoo,
6223-
} = result.data.viewer;
6223+
const sessionToken = result.data.viewer.sessionToken;
6224+
const { objectId, userFoo: resultFoo } = result.data.viewer.user;
62246225
expect(objectId).toEqual(user.id);
62256226
expect(sessionToken).toBeDefined();
62266227
expect(resultFoo).toBeDefined();
@@ -6242,7 +6243,9 @@ describe('ParseGraphQLServer', () => {
62426243
clientMutationId
62436244
viewer {
62446245
sessionToken
6245-
someField
6246+
user {
6247+
someField
6248+
}
62466249
}
62476250
}
62486251
}
@@ -6261,7 +6264,7 @@ describe('ParseGraphQLServer', () => {
62616264

62626265
expect(result.data.signUp.clientMutationId).toEqual(clientMutationId);
62636266
expect(result.data.signUp.viewer.sessionToken).toBeDefined();
6264-
expect(result.data.signUp.viewer.someField).toEqual('someValue');
6267+
expect(result.data.signUp.viewer.user.someField).toEqual('someValue');
62656268
expect(typeof result.data.signUp.viewer.sessionToken).toBe('string');
62666269
});
62676270

@@ -6281,7 +6284,9 @@ describe('ParseGraphQLServer', () => {
62816284
clientMutationId
62826285
viewer {
62836286
sessionToken
6284-
someField
6287+
user {
6288+
someField
6289+
}
62856290
}
62866291
}
62876292
}
@@ -6297,7 +6302,7 @@ describe('ParseGraphQLServer', () => {
62976302

62986303
expect(result.data.logIn.clientMutationId).toEqual(clientMutationId);
62996304
expect(result.data.logIn.viewer.sessionToken).toBeDefined();
6300-
expect(result.data.logIn.viewer.someField).toEqual('someValue');
6305+
expect(result.data.logIn.viewer.user.someField).toEqual('someValue');
63016306
expect(typeof result.data.logIn.viewer.sessionToken).toBe('string');
63026307
});
63036308

@@ -6415,7 +6420,9 @@ describe('ParseGraphQLServer', () => {
64156420
query: gql`
64166421
query GetCurrentUser {
64176422
viewer {
6418-
username
6423+
user {
6424+
username
6425+
}
64196426
}
64206427
}
64216428
`,
@@ -6444,7 +6451,9 @@ describe('ParseGraphQLServer', () => {
64446451
query: gql`
64456452
query GetCurrentUser {
64466453
viewer {
6447-
username
6454+
user {
6455+
username
6456+
}
64486457
}
64496458
cars {
64506459
results {

src/GraphQL/loaders/defaultGraphQLTypes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ const PARSE_OBJECT = new GraphQLInterfaceType({
455455
});
456456

457457
const SESSION_TOKEN_ATT = {
458-
description: 'The user session token',
458+
description: 'The current user session token.',
459459
type: new GraphQLNonNull(GraphQLString),
460460
};
461461

src/GraphQL/loaders/parseClassTypes.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -561,14 +561,16 @@ const load = (
561561
const viewerType = new GraphQLObjectType({
562562
name: 'Viewer',
563563
description: `The Viewer object type is used in operations that involve outputting the current user data.`,
564-
interfaces,
565564
fields: () => ({
566-
...outputFields(),
567565
sessionToken: defaultGraphQLTypes.SESSION_TOKEN_ATT,
566+
user: {
567+
description: 'This is the current user.',
568+
type: new GraphQLNonNull(classGraphQLOutputType),
569+
},
568570
}),
569571
});
570-
parseGraphQLSchema.viewerType = viewerType;
571572
parseGraphQLSchema.addGraphQLType(viewerType, true, true);
573+
parseGraphQLSchema.viewerType = viewerType;
572574
}
573575
};
574576

src/GraphQL/loaders/usersMutations.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,13 @@ const load = parseGraphQLSchema => {
4646
info.sessionToken = sessionToken;
4747

4848
return {
49-
viewer: await getUserFromSessionToken(config, info, mutationInfo),
49+
viewer: await getUserFromSessionToken(
50+
config,
51+
info,
52+
mutationInfo,
53+
'viewer.user.',
54+
true
55+
),
5056
};
5157
} catch (e) {
5258
parseGraphQLSchema.handleError(e);
@@ -101,7 +107,13 @@ const load = parseGraphQLSchema => {
101107
info.sessionToken = sessionToken;
102108

103109
return {
104-
viewer: await getUserFromSessionToken(config, info, mutationInfo),
110+
viewer: await getUserFromSessionToken(
111+
config,
112+
info,
113+
mutationInfo,
114+
'viewer.user.',
115+
true
116+
),
105117
};
106118
} catch (e) {
107119
parseGraphQLSchema.handleError(e);
@@ -134,7 +146,9 @@ const load = parseGraphQLSchema => {
134146
const viewer = await getUserFromSessionToken(
135147
config,
136148
info,
137-
mutationInfo
149+
mutationInfo,
150+
'viewer.user.',
151+
true
138152
);
139153

140154
await usersRouter.handleLogOut({

src/GraphQL/loaders/usersQueries.js

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,56 @@ import rest from '../../rest';
55
import Auth from '../../Auth';
66
import { extractKeysAndInclude } from './parseClassTypes';
77

8-
const getUserFromSessionToken = async (config, info, queryInfo) => {
8+
const getUserFromSessionToken = async (
9+
config,
10+
info,
11+
queryInfo,
12+
keysPrefix,
13+
validatedToken
14+
) => {
915
if (!info || !info.sessionToken) {
1016
throw new Parse.Error(
1117
Parse.Error.INVALID_SESSION_TOKEN,
1218
'Invalid session token'
1319
);
1420
}
1521
const sessionToken = info.sessionToken;
16-
const selectedFields = getFieldNames(queryInfo);
22+
const selectedFields = getFieldNames(queryInfo)
23+
.filter(field => field.startsWith(keysPrefix))
24+
.map(field => field.replace(keysPrefix, ''));
25+
26+
const keysAndInclude = extractKeysAndInclude(selectedFields);
27+
const { keys } = keysAndInclude;
28+
let { include } = keysAndInclude;
29+
30+
if (validatedToken && !keys && !include) {
31+
return {
32+
sessionToken,
33+
};
34+
} else if (keys && !include) {
35+
include = 'user';
36+
}
37+
38+
const options = {};
39+
if (keys) {
40+
options.keys = keys
41+
.split(',')
42+
.map(key => `user.${key}`)
43+
.join(',');
44+
}
45+
if (include) {
46+
options.include = include
47+
.split(',')
48+
.map(included => `user.${included}`)
49+
.join(',');
50+
}
1751

18-
const { include } = extractKeysAndInclude(selectedFields);
1952
const response = await rest.find(
2053
config,
2154
Auth.master(config),
2255
'_Session',
2356
{ sessionToken },
24-
{
25-
include: include
26-
.split(',')
27-
.map(included => `user.${included}`)
28-
.join(','),
29-
},
57+
options,
3058
info.clientVersion
3159
);
3260
if (
@@ -40,8 +68,10 @@ const getUserFromSessionToken = async (config, info, queryInfo) => {
4068
);
4169
} else {
4270
const user = response.results[0].user;
43-
user.sessionToken = sessionToken;
44-
return user;
71+
return {
72+
sessionToken,
73+
user,
74+
};
4575
}
4676
};
4777

@@ -59,7 +89,13 @@ const load = parseGraphQLSchema => {
5989
async resolve(_source, _args, context, queryInfo) {
6090
try {
6191
const { config, info } = context;
62-
return await getUserFromSessionToken(config, info, queryInfo);
92+
return await getUserFromSessionToken(
93+
config,
94+
info,
95+
queryInfo,
96+
'user.',
97+
false
98+
);
6399
} catch (e) {
64100
parseGraphQLSchema.handleError(e);
65101
}

0 commit comments

Comments
 (0)