@neo4j/graphql
Version:
A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations
121 lines • 7.48 kB
JavaScript
"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