UNPKG

apollo-flash

Version:

A smart and efficient toolkit to quickly bootstrap an apollo-server project.

86 lines (79 loc) 2.24 kB
// @ts-ignore import { IResolvers } from "apollo-server-express"; import { Request, Response } from "express"; import withAuth from "graphql-auth"; import ContextBuilder from "./ContextBuilder"; import ImportsAutoloader from "./ImportsAutoloader"; import { ApolloFlashConfig, ApolloFlashContext } from "./typings"; /** * Helper orchestrator to load you resolver / types definition. * * Also handle authentication using a jwt cookie / header. * * For typescript users : * - AuthScopeEnum is a string enumeration for authentication scope with graphql-auth * - User is your user class / interface. * * @export * @class ApolloFlash * @template AuthScopeEnum * @template User */ export default class ApolloFlash<AuthScopeEnum, User> { private config: ApolloFlashConfig<AuthScopeEnum, User>; private autoImporter: ImportsAutoloader; private contextBuilder: ContextBuilder<AuthScopeEnum, User>; constructor(config: ApolloFlashConfig<AuthScopeEnum, User>) { this.config = config; this.autoImporter = new ImportsAutoloader( config.typeDefsFolderPath, config.resolversFolderPath, ); this.contextBuilder = new ContextBuilder(); } /** * Generate type definition from the graphQL server. * * @returns * @memberof ApolloFlash */ generateTypeDefs() { return this.autoImporter.generateTypeDefs(); } /** * Generate * * @returns * @memberof ApolloFlash */ generateRootResolver(): IResolvers { return this.autoImporter.generateRootResolver(); } /** * Build apollo-flash required context. * You should merge it with your context. * * Conflict keys are ['auth', 'response'] * * @returns {ApolloFlashContextBuilder<AuthScopeEnum, User>} * @memberof ApolloFlash */ async buildContext(params: { req: Request; res: Response; }): Promise<ApolloFlashContext<AuthScopeEnum, User>> { return { auth: await this.contextBuilder.getAuthorization( params.req, this.config.getUserFromId, this.config.getScopeFromUser, this.config.jwtSigningKey, this.config.verifyOpts, ), response: params.res, }; } } // Export types export * from "./typings"; export { withAuth };