* add parse-graph-ql configuration for class schema customisation Not yet tested - essentially an RFC * refactor and add graphql router, controller and config cache * fix(GraphQLController): add missing check isEnabled * chore(GraphQLController): remove awaits from cache put * chore(GraphQLController): remove check for if its enabled * refactor(GraphQLController): only use cache if mounted * chore(GraphQLController): group all validation errors and throw at once * chore(GraphQLSchema): move transformations into controller validation * refactor(GraphQL): improve ctrl validation and fix schema usage of config * refactor(GraphQLSchema): remove code related to additional schema This code has been moved into a separate feature branch. * fix(GraphQLSchema): fix incorrect default return type for class configs * refactor(GraphQLSchema): update staleness check code to account for config * fix(GraphQLServer): fix regressed tests due to internal schema changes This will be followed up with a backwards compatability fix for the `ClassFields` issue to avoid breakages for our users * refactor: rename to ParseGraphQLController for consistency * fix(ParseGraphQLCtrl): numerous fixes for validity checking Also includes some minor code refactoring * chore(GraphQL): minor syntax cleanup * fix(SchemaController): add _GraphQLConfig to volatile classes * refactor(ParseGraphQLServer): return update config value in setGraphQLConfig * testing(ParseGraphQL): add test cases for new graphQLConfig * fix(GraphQLController): fix issue where config with multiple items was not being mapped to the db * fix(postgres): add _GraphQLConfig default schema on load fixes failing postgres tests * GraphQL @mock directive (#5836) * Add mock directive * Include tests for @mock directive * Fix existing tests due to the change from ClassFields to ClassCreateFields * fix(parseClassMutations): safer type transformation based on input type * fix(parseClassMutations): only define necessary input fields * fix(GraphQL): fix incorrect import paths
79 lines
2.2 KiB
JavaScript
79 lines
2.2 KiB
JavaScript
import { GraphQLNonNull, GraphQLObjectType } from 'graphql';
|
|
import getFieldNames from 'graphql-list-fields';
|
|
import Parse from 'parse/node';
|
|
import rest from '../../rest';
|
|
import Auth from '../../Auth';
|
|
import { extractKeysAndInclude } from './parseClassTypes';
|
|
|
|
const load = parseGraphQLSchema => {
|
|
if (parseGraphQLSchema.isUsersClassDisabled) {
|
|
return;
|
|
}
|
|
const fields = {};
|
|
|
|
fields.me = {
|
|
description: 'The Me query can be used to return the current user data.',
|
|
type: new GraphQLNonNull(parseGraphQLSchema.meType),
|
|
async resolve(_source, _args, context, queryInfo) {
|
|
try {
|
|
const { config, info } = context;
|
|
|
|
if (!info || !info.sessionToken) {
|
|
throw new Parse.Error(
|
|
Parse.Error.INVALID_SESSION_TOKEN,
|
|
'Invalid session token'
|
|
);
|
|
}
|
|
const sessionToken = info.sessionToken;
|
|
const selectedFields = getFieldNames(queryInfo);
|
|
|
|
const { include } = extractKeysAndInclude(selectedFields);
|
|
const response = await rest.find(
|
|
config,
|
|
Auth.master(config),
|
|
'_Session',
|
|
{ sessionToken },
|
|
{
|
|
include: include
|
|
.split(',')
|
|
.map(included => `user.${included}`)
|
|
.join(','),
|
|
},
|
|
info.clientVersion
|
|
);
|
|
if (
|
|
!response.results ||
|
|
response.results.length == 0 ||
|
|
!response.results[0].user
|
|
) {
|
|
throw new Parse.Error(
|
|
Parse.Error.INVALID_SESSION_TOKEN,
|
|
'Invalid session token'
|
|
);
|
|
} else {
|
|
const user = response.results[0].user;
|
|
user.sessionToken = sessionToken;
|
|
return user;
|
|
}
|
|
} catch (e) {
|
|
parseGraphQLSchema.handleError(e);
|
|
}
|
|
},
|
|
};
|
|
|
|
const usersQuery = new GraphQLObjectType({
|
|
name: 'UsersQuery',
|
|
description: 'UsersQuery is the top level type for users queries.',
|
|
fields,
|
|
});
|
|
parseGraphQLSchema.graphQLTypes.push(usersQuery);
|
|
|
|
parseGraphQLSchema.graphQLQueries.users = {
|
|
description: 'This is the top level for users queries.',
|
|
type: usersQuery,
|
|
resolve: () => new Object(),
|
|
};
|
|
};
|
|
|
|
export { load };
|