UNPKG

@neo4j/graphql

Version:

A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations

121 lines 7.48 kB
"use strict"; /* * Copyright (c) "Neo4j" * Neo4j Sweden AB [http://neo4j.com] * * This file is part of Neo4j. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.validateUserDefinition = validateUserDefinition; const graphql_1 = require("graphql"); const specifiedRules_1 = require("graphql/validation/specifiedRules"); const authentication_1 = require("../../graphql/directives/type-dependant-directives/authentication"); const get_static_auth_definitions_1 = require("../../graphql/directives/type-dependant-directives/get-static-auth-definitions"); const BigIntScalarFilters_1 = require("../../graphql/input-objects/generic-operators/BigIntScalarFilters"); const BooleanScalarFilters_1 = require("../../graphql/input-objects/generic-operators/BooleanScalarFilters"); const CartesianPointFilters_1 = require("../../graphql/input-objects/generic-operators/CartesianPointFilters"); const DateScalarFilters_1 = require("../../graphql/input-objects/generic-operators/DateScalarFilters"); const DateTimeScalarFilters_1 = require("../../graphql/input-objects/generic-operators/DateTimeScalarFilters"); const DurationScalarFilters_1 = require("../../graphql/input-objects/generic-operators/DurationScalarFilters"); const FloatScalarFilters_1 = require("../../graphql/input-objects/generic-operators/FloatScalarFilters"); const IDScalarFilters_1 = require("../../graphql/input-objects/generic-operators/IDScalarFilters"); const IntScalarFilters_1 = require("../../graphql/input-objects/generic-operators/IntScalarFilters"); const LocalTimeScalarFilters_1 = require("../../graphql/input-objects/generic-operators/LocalTimeScalarFilters"); const PointFilters_1 = require("../../graphql/input-objects/generic-operators/PointFilters"); const StringScalarFilters_1 = require("../../graphql/input-objects/generic-operators/StringScalarFilters"); const TimeScalarFilters_1 = require("../../graphql/input-objects/generic-operators/TimeScalarFilters"); const EnricherContext_1 = require("./EnricherContext"); const replace_wildcard_value_1 = require("./custom-rules/replace-wildcard-value"); const validate_authorization_like_directives_1 = require("./custom-rules/validate-authorization-like-directives"); const authentication_2 = require("./enrichers/authentication"); const authorization_1 = require("./enrichers/authorization"); const subscriptions_authorization_1 = require("./enrichers/subscriptions-authorization"); const validate_sdl_1 = require("./validate-sdl"); function getAdditionalDefinitions(userDocument, jwt) { return [...(0, get_static_auth_definitions_1.getStaticAuthorizationDefinitions)(userDocument, jwt), (0, authentication_1.createAuthenticationDirectiveDefinition)()]; } function enrichDocument(enrichers, additionalDefinitions, document) { return { ...document, definitions: enrichers .reduce((definitions, enricher) => definitions.reduce(enricher, []), document.definitions) .concat(...additionalDefinitions), }; } function makeValidationDocument(userDocument, augmentedDocument, jwt) { const enricherContext = new EnricherContext_1.EnricherContext(userDocument, augmentedDocument); const enrichers = []; enrichers.push((0, authorization_1.authorizationDefinitionsEnricher)(enricherContext)); // Add Authorization directive definitions, for instance UserAuthorization enrichers.push((0, authorization_1.authorizationDirectiveEnricher)(enricherContext)); // Apply the previously generated directive definitions to the authorized types enrichers.push((0, subscriptions_authorization_1.subscriptionsAuthorizationDefinitionsEnricher)(enricherContext)); // Add SubscriptionsAuthorization directive definitions, for instance UserSubscriptionsAuthorization enrichers.push((0, subscriptions_authorization_1.subscriptionsAuthorizationDirectiveEnricher)(enricherContext)); // Apply the previously generated directive definitions to the authorized types enrichers.push((0, authentication_2.authenticationDirectiveEnricher)(enricherContext)); // Apply the previously generated directive definitions to the authenticated types const additionalDefinitions = getAdditionalDefinitions(userDocument, jwt); return enrichDocument(enrichers, additionalDefinitions, augmentedDocument); } function validateUserDefinition({ userDocument, augmentedDocument, additionalDirectives = [], additionalTypes = [], jwt, features, }) { const rules = [...specifiedRules_1.specifiedSDLRules, validate_authorization_like_directives_1.ValidateAuthorizationLikeDirectives]; let validationDocument = makeValidationDocument(userDocument, augmentedDocument, jwt); const genericFiltersName = [ BooleanScalarFilters_1.BooleanScalarFilters, BooleanScalarFilters_1.BooleanListFilters, (0, IDScalarFilters_1.getIDScalarFilters)(features), IDScalarFilters_1.IDListFilters, (0, StringScalarFilters_1.getStringScalarFilters)(features), StringScalarFilters_1.StringListFilters, FloatScalarFilters_1.FloatScalarFilters, FloatScalarFilters_1.FloatListFilters, IntScalarFilters_1.IntScalarFilters, IntScalarFilters_1.IntListFilters, BigIntScalarFilters_1.BigIntScalarFilters, BigIntScalarFilters_1.BigIntListFilters, TimeScalarFilters_1.TimeScalarFilters, DateTimeScalarFilters_1.DateTimeScalarFilters, DateScalarFilters_1.DateScalarFilters, DateScalarFilters_1.DateListFilters, DurationScalarFilters_1.DurationScalarFilters, LocalTimeScalarFilters_1.LocalTimeScalarFilters, PointFilters_1.PointFilters, PointFilters_1.PointListFilters, CartesianPointFilters_1.CartesianPointFilters, CartesianPointFilters_1.CartesianPointListFilters, ]; const schemaToExtend = new graphql_1.GraphQLSchema({ directives: [...graphql_1.specifiedDirectives, ...additionalDirectives], types: [...genericFiltersName, ...additionalTypes], }); const replaceWildcardValue = (0, replace_wildcard_value_1.makeReplaceWildcardVisitor)({ jwt, schema: schemaToExtend }); validationDocument = removeDuplicateTypes(validationDocument, schemaToExtend.getTypeMap()); validationDocument = (0, graphql_1.visit)(validationDocument, replaceWildcardValue()); const errors = (0, validate_sdl_1.validateSDL)(validationDocument, rules, schemaToExtend); if (errors.length) { throw errors; } } function removeDuplicateTypes(doc, extraTypes) { return { ...doc, // Remove duplicate types generated by genericFiltersName definitions: doc.definitions.filter((def) => { if (def["name"] !== undefined) { if (extraTypes[def.name.value]) { return false; } } return true; }), }; } //# sourceMappingURL=schema-validation.js.map