Skip to content

Commit 3677c4e

Browse files
authored
Introduce ReadOptionsInput (parse-community#6030)
1 parent 64139cf commit 3677c4e

File tree

4 files changed

+97
-67
lines changed

4 files changed

+97
-67
lines changed

spec/ParseGraphQLServer.spec.js

Lines changed: 70 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3069,57 +3069,65 @@ describe('ParseGraphQLServer', () => {
30693069

30703070
describe_only_db('mongo')('read preferences', () => {
30713071
it('should read from primary by default', async () => {
3072-
await prepareData();
3072+
try {
3073+
await prepareData();
30733074

3074-
await parseGraphQLServer.parseGraphQLSchema.databaseController.schemaCache.clear();
3075+
await parseGraphQLServer.parseGraphQLSchema.databaseController.schemaCache.clear();
30753076

3076-
const databaseAdapter =
3077-
parseServer.config.databaseController.adapter;
3078-
spyOn(
3079-
databaseAdapter.database.serverConfig,
3080-
'cursor'
3081-
).and.callThrough();
3077+
const databaseAdapter =
3078+
parseServer.config.databaseController.adapter;
3079+
spyOn(
3080+
databaseAdapter.database.serverConfig,
3081+
'cursor'
3082+
).and.callThrough();
30823083

3083-
await apolloClient.query({
3084-
query: gql`
3085-
query GetSomeObject($id: ID!) {
3086-
graphQLClass(id: $id) {
3087-
pointerToUser {
3088-
username
3084+
await apolloClient.query({
3085+
query: gql`
3086+
query GetSomeObject($id: ID!) {
3087+
graphQLClass(id: $id) {
3088+
pointerToUser {
3089+
username
3090+
}
30893091
}
30903092
}
3091-
}
3092-
`,
3093-
variables: {
3094-
id: object3.id,
3095-
},
3096-
context: {
3097-
headers: {
3098-
'X-Parse-Session-Token': user1.getSessionToken(),
3093+
`,
3094+
variables: {
3095+
id: object3.id,
3096+
},
3097+
context: {
3098+
headers: {
3099+
'X-Parse-Session-Token': user1.getSessionToken(),
3100+
},
30993101
},
3100-
},
3101-
});
3102-
3103-
let foundGraphQLClassReadPreference = false;
3104-
let foundUserClassReadPreference = false;
3105-
databaseAdapter.database.serverConfig.cursor.calls
3106-
.all()
3107-
.forEach(call => {
3108-
if (call.args[0].ns.collection.indexOf('GraphQLClass') >= 0) {
3109-
foundGraphQLClassReadPreference = true;
3110-
expect(call.args[0].options.readPreference.mode).toBe(
3111-
ReadPreference.PRIMARY
3112-
);
3113-
} else if (call.args[0].ns.collection.indexOf('_User') >= 0) {
3114-
foundUserClassReadPreference = true;
3115-
expect(call.args[0].options.readPreference.mode).toBe(
3116-
ReadPreference.PRIMARY
3117-
);
3118-
}
31193102
});
31203103

3121-
expect(foundGraphQLClassReadPreference).toBe(true);
3122-
expect(foundUserClassReadPreference).toBe(true);
3104+
let foundGraphQLClassReadPreference = false;
3105+
let foundUserClassReadPreference = false;
3106+
databaseAdapter.database.serverConfig.cursor.calls
3107+
.all()
3108+
.forEach(call => {
3109+
if (
3110+
call.args[0].ns.collection.indexOf('GraphQLClass') >= 0
3111+
) {
3112+
foundGraphQLClassReadPreference = true;
3113+
expect(call.args[0].options.readPreference.mode).toBe(
3114+
ReadPreference.PRIMARY
3115+
);
3116+
} else if (
3117+
call.args[0].ns.collection.indexOf('_User') >= 0
3118+
) {
3119+
foundUserClassReadPreference = true;
3120+
expect(call.args[0].options.readPreference.mode).toBe(
3121+
ReadPreference.PRIMARY
3122+
);
3123+
}
3124+
});
3125+
3126+
expect(foundGraphQLClassReadPreference).toBe(true);
3127+
expect(foundUserClassReadPreference).toBe(true);
3128+
} catch (e) {
3129+
handleError(e);
3130+
}
31233131
});
31243132

31253133
it('should support readPreference argument', async () => {
@@ -3137,7 +3145,10 @@ describe('ParseGraphQLServer', () => {
31373145
await apolloClient.query({
31383146
query: gql`
31393147
query GetSomeObject($id: ID!) {
3140-
graphQLClass(id: $id, readPreference: SECONDARY) {
3148+
graphQLClass(
3149+
id: $id
3150+
options: { readPreference: SECONDARY }
3151+
) {
31413152
pointerToUser {
31423153
username
31433154
}
@@ -3193,8 +3204,10 @@ describe('ParseGraphQLServer', () => {
31933204
query GetSomeObject($id: ID!) {
31943205
graphQLClass(
31953206
id: $id
3196-
readPreference: SECONDARY
3197-
includeReadPreference: NEAREST
3207+
options: {
3208+
readPreference: SECONDARY
3209+
includeReadPreference: NEAREST
3210+
}
31983211
) {
31993212
pointerToUser {
32003213
username
@@ -3904,7 +3917,9 @@ describe('ParseGraphQLServer', () => {
39043917
await apolloClient.query({
39053918
query: gql`
39063919
query FindSomeObjects {
3907-
find: graphQLClasses(readPreference: SECONDARY) {
3920+
find: graphQLClasses(
3921+
options: { readPreference: SECONDARY }
3922+
) {
39083923
results {
39093924
pointerToUser {
39103925
username
@@ -3958,8 +3973,10 @@ describe('ParseGraphQLServer', () => {
39583973
query: gql`
39593974
query FindSomeObjects {
39603975
graphQLClasses(
3961-
readPreference: SECONDARY
3962-
includeReadPreference: NEAREST
3976+
options: {
3977+
readPreference: SECONDARY
3978+
includeReadPreference: NEAREST
3979+
}
39633980
) {
39643981
results {
39653982
pointerToUser {
@@ -4016,8 +4033,10 @@ describe('ParseGraphQLServer', () => {
40164033
query FindSomeObjects($where: GraphQLClassWhereInput) {
40174034
find: graphQLClasses(
40184035
where: $where
4019-
readPreference: SECONDARY
4020-
subqueryReadPreference: NEAREST
4036+
options: {
4037+
readPreference: SECONDARY
4038+
subqueryReadPreference: NEAREST
4039+
}
40214040
) {
40224041
results {
40234042
id

src/GraphQL/loaders/defaultGraphQLTypes.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,22 @@ const SUBQUERY_READ_PREFERENCE_ATT = {
483483
type: READ_PREFERENCE,
484484
};
485485

486+
const READ_OPTIONS_INPUT = new GraphQLInputObjectType({
487+
name: 'ReadOptionsInput',
488+
description:
489+
'The ReadOptionsInputt type is used in queries in order to set the read preferences.',
490+
fields: {
491+
readPreference: READ_PREFERENCE_ATT,
492+
includeReadPreference: INCLUDE_READ_PREFERENCE_ATT,
493+
subqueryReadPreference: SUBQUERY_READ_PREFERENCE_ATT,
494+
},
495+
});
496+
497+
const READ_OPTIONS_ATT = {
498+
description: 'The read options for the query to be executed.',
499+
type: READ_OPTIONS_INPUT,
500+
};
501+
486502
const WHERE_ATT = {
487503
description:
488504
'These are the conditions that the objects need to match in order to be found',
@@ -1034,6 +1050,7 @@ const load = parseGraphQLSchema => {
10341050
parseGraphQLSchema.addGraphQLType(GEO_POINT, true);
10351051
parseGraphQLSchema.addGraphQLType(PARSE_OBJECT, true);
10361052
parseGraphQLSchema.addGraphQLType(READ_PREFERENCE, true);
1053+
parseGraphQLSchema.addGraphQLType(READ_OPTIONS_INPUT, true);
10371054
parseGraphQLSchema.addGraphQLType(SUBQUERY_INPUT, true);
10381055
parseGraphQLSchema.addGraphQLType(SELECT_INPUT, true);
10391056
parseGraphQLSchema.addGraphQLType(SEARCH_INPUT, true);
@@ -1098,6 +1115,8 @@ export {
10981115
READ_PREFERENCE_ATT,
10991116
INCLUDE_READ_PREFERENCE_ATT,
11001117
SUBQUERY_READ_PREFERENCE_ATT,
1118+
READ_OPTIONS_INPUT,
1119+
READ_OPTIONS_ATT,
11011120
WHERE_ATT,
11021121
SKIP_ATT,
11031122
LIMIT_ATT,

src/GraphQL/loaders/parseClassQueries.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ const getParseClassQueryConfig = function(
1414
};
1515

1616
const getQuery = async (className, _source, args, context, queryInfo) => {
17-
const { id, readPreference, includeReadPreference } = args;
17+
const { id, options } = args;
18+
const { readPreference, includeReadPreference } = options || {};
1819
const { config, auth, info } = context;
1920
const selectedFields = getFieldNames(queryInfo);
2021

@@ -58,8 +59,7 @@ const load = function(
5859
description: `The ${getGraphQLQueryName} query can be used to get an object of the ${graphQLClassName} class by its id.`,
5960
args: {
6061
id: defaultGraphQLTypes.OBJECT_ID_ATT,
61-
readPreference: defaultGraphQLTypes.READ_PREFERENCE_ATT,
62-
includeReadPreference: defaultGraphQLTypes.INCLUDE_READ_PREFERENCE_ATT,
62+
options: defaultGraphQLTypes.READ_OPTIONS_ATT,
6363
},
6464
type: new GraphQLNonNull(
6565
classGraphQLOutputType || defaultGraphQLTypes.OBJECT
@@ -86,15 +86,12 @@ const load = function(
8686
),
8787
async resolve(_source, args, context, queryInfo) {
8888
try {
89+
const { where, order, skip, limit, options } = args;
8990
const {
90-
where,
91-
order,
92-
skip,
93-
limit,
9491
readPreference,
9592
includeReadPreference,
9693
subqueryReadPreference,
97-
} = args;
94+
} = options || {};
9895
const { config, auth, info } = context;
9996
const selectedFields = getFieldNames(queryInfo);
10097

src/GraphQL/loaders/parseClassTypes.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,7 @@ const load = (
366366
},
367367
skip: defaultGraphQLTypes.SKIP_ATT,
368368
limit: defaultGraphQLTypes.LIMIT_ATT,
369-
readPreference: defaultGraphQLTypes.READ_PREFERENCE_ATT,
370-
includeReadPreference: defaultGraphQLTypes.INCLUDE_READ_PREFERENCE_ATT,
371-
subqueryReadPreference: defaultGraphQLTypes.SUBQUERY_READ_PREFERENCE_ATT,
369+
options: defaultGraphQLTypes.READ_OPTIONS_ATT,
372370
};
373371

374372
const classGraphQLOutputTypeName = `${graphQLClassName}`;
@@ -395,15 +393,12 @@ const load = (
395393
type,
396394
async resolve(source, args, context, queryInfo) {
397395
try {
396+
const { where, order, skip, limit, options } = args;
398397
const {
399-
where,
400-
order,
401-
skip,
402-
limit,
403398
readPreference,
404399
includeReadPreference,
405400
subqueryReadPreference,
406-
} = args;
401+
} = options || {};
407402
const { config, auth, info } = context;
408403
const selectedFields = getFieldNames(queryInfo);
409404

0 commit comments

Comments
 (0)