* GraphQL boilerplate
* Create GraphQL schema without using gql
* Introducing loaders
* Generic create mutation
* create mutation is now working for any data type
* Create mutation for each parse class - partial
* Adding more data types to the class
* Get parse class query
* Generic get query
* Generic delete mutation
* Parse class delete mutation
* Parse class find mutation
* Generic update mutation
* Parse class update mutation
* Fixing initialization problems
* Installing node-fetch again
* Basic implementation for Pointer
* Constructor tests
* API tests boilerplate
* _getGraphQLOptions
* applyGraphQL tests
* GraphQL API initial tests
* applyPlayground tests
* createSubscriptions tests
* ParseGrapjQLSchema tests file
* ParseGraphQLSchema tests
* TypeValidationError
* TypeValidationError
* parseStringValue test
* parseIntValue tests
* parseBooleanValue tests
* parseDateValue tests
* parseValue tests
* parseListValues tests
* parseObjectFields tests
* Default types tests
* Get tests
* First permission test at generic Get operation
* Fixing prepare data
* ApolloClient does not work well with different queries runnning in paralell with different headers
* ApolloClient does not work well with different queries runnning in paralell with different headers
* User 3 tests
* User 3 tests
* Get level permission tests
* Get User specific tests
* Get now support keys argument
* Get now supports include argument
* Get now supports read preferences
* Adding tests for read preference enum type
* Find basic test
* Find permissions test
* Find where argument test
* Order, skip and limit tests
* Error handler
* Find now supports count
* Test for FindResult type
* Improving find count
* Find max limit test
* Find now supports keys, include and includeAll
* Find now supports read preferences
* Basic Create test
* Generic create mutation tests
* Basic update test
* UpdateResult object type test
* Update level permissions tests
* Error handler for default mutations
* Delete mutation basic test
* Delete mutation level permission tests
* Test for string
* String test
* Date test
* Pointer test
* Relation tests
* Changing objects mutations location
* Changing objects queries location
* Create file mutation
* Test for file fields
* Test for null values
* Changing parse classes operations location
* Objects mutations refactoring
* Class specific create object mutation now working
* Update class specific mutation now working
* Specific class delete mutation now working
* Get class specific mutation now working
* Find class specific query now working without where and sort
* Find query for custom classes working with where partially
* Almost all data types working for specfic class find where
* Now only missing relation, geopoint, file and ACL
* Additional tests with Parse classes queries and mutations
* Now only missing relation, geopoint, file and ACL
* Files
* Fiels are now working
* Excluding missing order test temporarly
* Refactoring dates
* Refactoring files
* Default types review
* Refeactoring object queries
* Refactoring class scalar type
* Refactoring class types
* Geo queries are now working
* Fixing centerSphere
* Allow sort on class specific queries
* Supporting bytes
* ACL constraint
* Temporarly removing xit tests
* Fixing some tests because of schema cache
* Removing session token from users
* Parse.User queries and mutations
* Remove test using fit
* Fixing include test that was failing because of schema cache
* Fixing count test for postgres. Postgres does not count with where={} (legacy problem). We should solve it later
* Fix null values test for postgres. It is evaluating null as undefined (legacy problem) and we should fix is later.
* Fixing schema change test that was failing because of schema cache
* Add GraphQL File type parseLiteral tests
* Refeactoring users
* Including sign up mutation
* Fix failing test
* Improve default GraphQL types tests coverage
* Including some tests for data types
* Including additional pointer test:
* Fixing some tests
* more data type tests
* Include Bytes and Polygon data types tests
* Polygons test
* Merging other tests
* Fixing some postgres tests
118 lines
3.7 KiB
JavaScript
118 lines
3.7 KiB
JavaScript
import Parse from 'parse/node';
|
|
import { GraphQLSchema, GraphQLObjectType } from 'graphql';
|
|
import { ApolloError } from 'apollo-server-core';
|
|
import requiredParameter from '../requiredParameter';
|
|
import * as defaultGraphQLTypes from './loaders/defaultGraphQLTypes';
|
|
import * as parseClassTypes from './loaders/parseClassTypes';
|
|
import * as parseClassQueries from './loaders/parseClassQueries';
|
|
import * as parseClassMutations from './loaders/parseClassMutations';
|
|
import * as defaultGraphQLQueries from './loaders/defaultGraphQLQueries';
|
|
import * as defaultGraphQLMutations from './loaders/defaultGraphQLMutations';
|
|
|
|
class ParseGraphQLSchema {
|
|
constructor(databaseController, log) {
|
|
this.databaseController =
|
|
databaseController ||
|
|
requiredParameter('You must provide a databaseController instance!');
|
|
this.log = log || requiredParameter('You must provide a log instance!');
|
|
}
|
|
|
|
async load() {
|
|
const schemaController = await this.databaseController.loadSchema();
|
|
const parseClasses = await schemaController.getAllClasses();
|
|
const parseClassesString = JSON.stringify(parseClasses);
|
|
|
|
if (this.graphQLSchema) {
|
|
if (this.parseClasses === parseClasses) {
|
|
return this.graphQLSchema;
|
|
}
|
|
|
|
if (this.parseClassesString === parseClassesString) {
|
|
this.parseClasses = parseClasses;
|
|
return this.graphQLSchema;
|
|
}
|
|
}
|
|
|
|
this.parseClasses = parseClasses;
|
|
this.parseClassesString = parseClassesString;
|
|
this.parseClassTypes = {};
|
|
this.meType = null;
|
|
this.graphQLSchema = null;
|
|
this.graphQLTypes = [];
|
|
this.graphQLObjectsQueries = {};
|
|
this.graphQLQueries = {};
|
|
this.graphQLObjectsMutations = {};
|
|
this.graphQLMutations = {};
|
|
this.graphQLSubscriptions = {};
|
|
|
|
defaultGraphQLTypes.load(this);
|
|
|
|
parseClasses.forEach(parseClass => {
|
|
parseClassTypes.load(this, parseClass);
|
|
|
|
parseClassQueries.load(this, parseClass);
|
|
|
|
parseClassMutations.load(this, parseClass);
|
|
});
|
|
|
|
defaultGraphQLQueries.load(this);
|
|
|
|
defaultGraphQLMutations.load(this);
|
|
|
|
let graphQLQuery = undefined;
|
|
if (Object.keys(this.graphQLQueries).length > 0) {
|
|
graphQLQuery = new GraphQLObjectType({
|
|
name: 'Query',
|
|
description: 'Query is the top level type for queries.',
|
|
fields: this.graphQLQueries,
|
|
});
|
|
this.graphQLTypes.push(graphQLQuery);
|
|
}
|
|
|
|
let graphQLMutation = undefined;
|
|
if (Object.keys(this.graphQLMutations).length > 0) {
|
|
graphQLMutation = new GraphQLObjectType({
|
|
name: 'Mutation',
|
|
description: 'Mutation is the top level type for mutations.',
|
|
fields: this.graphQLMutations,
|
|
});
|
|
this.graphQLTypes.push(graphQLMutation);
|
|
}
|
|
|
|
let graphQLSubscription = undefined;
|
|
if (Object.keys(this.graphQLSubscriptions).length > 0) {
|
|
graphQLSubscription = new GraphQLObjectType({
|
|
name: 'Subscription',
|
|
description: 'Subscription is the top level type for subscriptions.',
|
|
fields: this.graphQLSubscriptions,
|
|
});
|
|
this.graphQLTypes.push(graphQLSubscription);
|
|
}
|
|
|
|
this.graphQLSchema = new GraphQLSchema({
|
|
types: this.graphQLTypes,
|
|
query: graphQLQuery,
|
|
mutation: graphQLMutation,
|
|
subscription: graphQLSubscription,
|
|
});
|
|
|
|
return this.graphQLSchema;
|
|
}
|
|
|
|
handleError(error) {
|
|
let code, message;
|
|
if (error instanceof Parse.Error) {
|
|
this.log.error('Parse error: ', error);
|
|
code = error.code;
|
|
message = error.message;
|
|
} else {
|
|
this.log.error('Uncaught internal server error.', error, error.stack);
|
|
code = Parse.Error.INTERNAL_SERVER_ERROR;
|
|
message = 'Internal server error.';
|
|
}
|
|
throw new ApolloError(message, code);
|
|
}
|
|
}
|
|
|
|
export { ParseGraphQLSchema };
|