UNPKG

type-graphql

Version:

Create GraphQL schema and resolvers with TypeScript, using classes and decorators!

82 lines (81 loc) 5.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapResolverWithAuthChecker = exports.createBasicFieldResolver = exports.createAdvancedFieldResolver = exports.createHandlerResolver = void 0; const auth_middleware_1 = require("../helpers/auth-middleware"); const types_1 = require("../helpers/types"); const build_context_1 = require("../schema/build-context"); const isPromiseLike_1 = require("../utils/isPromiseLike"); const helpers_1 = require("./helpers"); function createHandlerResolver(resolverMetadata) { const { validate: globalValidate, validateFn, authChecker, authMode, globalMiddlewares, container, } = build_context_1.BuildContext; const middlewares = globalMiddlewares.concat(resolverMetadata.middlewares); (0, helpers_1.applyAuthChecker)(middlewares, authChecker, container, authMode, resolverMetadata.roles); return (root, args, context, info) => { const resolverData = { root, args, context, info }; const targetInstanceOrPromise = container.getInstance(resolverMetadata.target, resolverData); if ((0, isPromiseLike_1.isPromiseLike)(targetInstanceOrPromise)) { return targetInstanceOrPromise.then(targetInstance => (0, helpers_1.applyMiddlewares)(container, resolverData, middlewares, () => { const params = (0, helpers_1.getParams)(resolverMetadata.params, resolverData, globalValidate, validateFn); if ((0, isPromiseLike_1.isPromiseLike)(params)) { return params.then(resolvedParams => targetInstance[resolverMetadata.methodName].apply(targetInstance, resolvedParams)); } return targetInstance[resolverMetadata.methodName].apply(targetInstance, params); })); } return (0, helpers_1.applyMiddlewares)(container, resolverData, middlewares, () => { const params = (0, helpers_1.getParams)(resolverMetadata.params, resolverData, globalValidate, validateFn); const targetInstance = targetInstanceOrPromise; if ((0, isPromiseLike_1.isPromiseLike)(params)) { return params.then(resolvedParams => targetInstance[resolverMetadata.methodName].apply(targetInstance, resolvedParams)); } return targetInstance[resolverMetadata.methodName].apply(targetInstance, params); }); }; } exports.createHandlerResolver = createHandlerResolver; function createAdvancedFieldResolver(fieldResolverMetadata) { if (fieldResolverMetadata.kind === "external") { return createHandlerResolver(fieldResolverMetadata); } const targetType = fieldResolverMetadata.getObjectType(); const { validate: globalValidate, validateFn, authChecker, authMode, globalMiddlewares, container, } = build_context_1.BuildContext; const middlewares = globalMiddlewares.concat(fieldResolverMetadata.middlewares); (0, helpers_1.applyAuthChecker)(middlewares, authChecker, container, authMode, fieldResolverMetadata.roles); return (root, args, context, info) => { const resolverData = { root, args, context, info }; const targetInstance = (0, types_1.convertToType)(targetType, root); return (0, helpers_1.applyMiddlewares)(container, resolverData, middlewares, () => { const handlerOrGetterValue = targetInstance[fieldResolverMetadata.methodName]; if (typeof handlerOrGetterValue !== "function") { return handlerOrGetterValue; } const params = (0, helpers_1.getParams)(fieldResolverMetadata.params, resolverData, globalValidate, validateFn); if ((0, isPromiseLike_1.isPromiseLike)(params)) { return params.then(resolvedParams => handlerOrGetterValue.apply(targetInstance, resolvedParams)); } return handlerOrGetterValue.apply(targetInstance, params); }); }; } exports.createAdvancedFieldResolver = createAdvancedFieldResolver; function createBasicFieldResolver(fieldMetadata) { const { authChecker, authMode, globalMiddlewares, container } = build_context_1.BuildContext; const middlewares = globalMiddlewares.concat(fieldMetadata.middlewares); (0, helpers_1.applyAuthChecker)(middlewares, authChecker, container, authMode, fieldMetadata.roles); return (root, args, context, info) => { const resolverData = { root, args, context, info }; return (0, helpers_1.applyMiddlewares)(container, resolverData, middlewares, () => root[fieldMetadata.name]); }; } exports.createBasicFieldResolver = createBasicFieldResolver; function wrapResolverWithAuthChecker(resolver, container, roles) { const { authChecker, authMode } = build_context_1.BuildContext; if (!authChecker || !roles) { return resolver; } return (root, args, context, info) => { const resolverData = { root, args, context, info }; return (0, auth_middleware_1.AuthMiddleware)(authChecker, container, authMode, roles)(resolverData, async () => resolver(root, args, context, info)); }; } exports.wrapResolverWithAuthChecker = wrapResolverWithAuthChecker;