Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: unable to use objectId size higher than 19 on GraphQL API #7627

Merged
merged 12 commits into from
Nov 27, 2021
Merged
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"follow-redirects": "1.14.5",
"graphql": "15.7.0",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.9.0",
"graphql-relay": "0.7.0",
"graphql-tag": "2.12.5",
"graphql-upload": "11.0.0",
"intersect": "1.0.1",
Expand Down
29 changes: 24 additions & 5 deletions spec/ParseGraphQLServer.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2287,8 +2287,7 @@ describe('ParseGraphQLServer', () => {
expect(nodeResult.data.node2.objectId).toBe(obj2.id);
expect(nodeResult.data.node2.someField).toBe('some value 2');
});
// TODO: (moumouls, davimacedo) Fix flaky test
xit('Id inputs should work either with global id or object id', async () => {
it('Id inputs should work either with global id or object id', async () => {
try {
await apolloClient.mutate({
mutation: gql`
Expand Down Expand Up @@ -2595,9 +2594,12 @@ describe('ParseGraphQLServer', () => {
.map(value => value.node.someField)
.sort()
).toEqual(['some value 22', 'some value 44']);
expect(
findSecondaryObjectsResult.data.secondaryObjects.edges[0].node.id
).toBeLessThan(findSecondaryObjectsResult.data.secondaryObjects.edges[1].node.id);
// NOTE: Here @davimacedo tried to test RelayID order, but the test is wrong since
// "objectId1" < "objectId2" do not always keep the order when objectId is transformed
// to base64 by Relay
// "SecondaryObject:bBRgmzIRRM" < "SecondaryObject:nTMcuVbATY" true
// base64("SecondaryObject:bBRgmzIRRM"") < base64(""SecondaryObject:nTMcuVbATY"") false
// "U2Vjb25kYXJ5T2JqZWN0OmJCUmdteklSUk0=" < "U2Vjb25kYXJ5T2JqZWN0Om5UTWN1VmJBVFk=" false
expect(
findSecondaryObjectsResult.data.secondaryObjects.edges[0].node.objectId
).toBeLessThan(
Expand Down Expand Up @@ -2763,6 +2765,23 @@ describe('ParseGraphQLServer', () => {
handleError(e);
}
});
it('Id inputs should work either with global id or object id with objectId higher than 19', async () => {
await reconfigureServer({ objectIdSize: 20 });
const obj = new Parse.Object('SomeClass');
await obj.save({ name: 'aname', type: 'robot' });
const result = await apolloClient.query({
query: gql`
query getSomeClass($id: ID!) {
someClass(id: $id) {
objectId
id
}
}
`,
variables: { id: obj.id },
});
expect(result.data.someClass.objectId).toEqual(obj.id);
});
});
});

Expand Down
8 changes: 7 additions & 1 deletion src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -1807,7 +1807,13 @@ export class PostgresStorageAdapter implements StorageAdapter {
if (key === 'ACL') {
memo.push('_rperm');
memo.push('_wperm');
} else if (key.length > 0) {
} else if (
key.length > 0 &&
// Remove selected field not referenced in the schema
// Relation is not a column in postgres
// $score is a Parse special field and is also not a column
((schema.fields[key] && schema.fields[key].type !== 'Relation') || key === '$score')
mtrezza marked this conversation as resolved.
Show resolved Hide resolved
) {
memo.push(key);
}
return memo;
Expand Down