import { Module, UnauthorizedException } from '@nestjs/common'; import { PrismaModule } from './prisma/prisma.module'; import { GraphQLModule } from '@nestjs/graphql'; import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { ResolverModule } from './resolvers/resolver.module'; import { TelegramModule } from './telegram/telegram.module'; import { Context } from 'graphql-ws'; import { ModuleRef } from '@nestjs/core'; @Module({ imports: [ PrismaModule, GraphQLModule.forRootAsync<ApolloDriverConfig>({ inject: [ModuleRef], useFactory: (ref: ModuleRef) => ({ driver: ApolloDriver, autoSchemaFile: true, playground: true, subscriptions: { 'graphql-ws': { onConnect: (context: Context<any, any>) => { const { connectionParams, extra } = context; const token = connectionParams.authorization; if (!token) throw new UnauthorizedException( 'Missing token in websocket auth', ); extra.token = token; }, }, }, context: (ctx) => { if (ctx.req) return { req: ctx.req, ref }; if (ctx.request) return { req: ctx.request, ref }; const token = ctx?.extra?.token; return { req: { headers: { authorization: token, }, }, ref, }; }, }), }), ResolverModule, TelegramModule, ], }) export class AppModule {}