import { Global, Module } from '@nestjs/common' import { AdminNoteModule } from '../AdminNote/adminnote.module' import { ApolloDriverConfig } from '@nestjs/apollo' import { AppConfigModule } from '../AppConfig/appconfig.module' import { Builder } from './graphql.builder' import { CategoryModule } from '../Category/category.module' import { CenterMentorModule } from '../CenterMentor/centermentor.module' import { CenterModule } from '../Center/center.module' import { ChatroomModule } from '../ChatRoom/chatroom.module' import { CommonModule } from '../common/common.module' import { ConfigModule } from '@nestjs/config' import { GraphQLModule } from '@nestjs/graphql' import { GraphqlService } from './graphql.service' import { ManagedServiceModule } from '../ManagedService/managedservice.module' import { MessageModule } from '../Message/message.module' import { MilestoneModule } from '../Milestone/milestone.module' import { OrderModule } from '../Order/order.module' import { PaymentModule } from '../Payment/payment.module' import { PothosApolloDriver } from '@smatch-corp/nestjs-pothos-apollo-driver' import { PothosModule } from '@smatch-corp/nestjs-pothos' import { PrismaCrudGenerator } from './graphql.generator' import { PrismaModule } from '../Prisma/prisma.module' import { PrismaService } from '../Prisma/prisma.service' import { RedisModule } from 'src/Redis/redis.module' import { RedisService } from 'src/Redis/redis.service' import { RefundTicketModule } from '../RefundTicket/refundticket.module' import { Request } from 'express' import { ResumeModule } from '../Resume/resume.module' import { ScheduleModule } from '../Schedule/schedule.module' import { ServiceAndCategoryModule } from '../ServiceAndCategory/serviceandcategory.module' import { ServiceFeedbackModule } from '../ServiceFeedback/servicefeedback.module' import { ServiceMeetingRoomModule } from '../ServiceMeetingRoom/servicemeetingroom.module' import { ServiceModule } from '../Service/service.module' import { UploadedFileModule } from '../UploadedFile/uploadedfile.module' import { UserModule } from '../User/user.module' import { WorkshopMeetingRoomModule } from '../WorkshopMeetingRoom/workshopmeetingroom.module' import { WorkshopModule } from '../Workshop/workshop.module' import { WorkshopOrganizationModule } from '../WorkshopOrganization/workshoporganization.module' import { WorkshopSubscriptionModule } from '../WorkshopSubscription/workshopsubscription.module' import { initContextCache } from '@pothos/core' import { PubSub, PubSubOptions } from 'graphql-subscriptions' @Global() @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, }), CommonModule, PrismaModule, RedisModule, AppConfigModule, UserModule, CenterModule, ServiceModule, ChatroomModule, CenterMentorModule, ResumeModule, WorkshopModule, WorkshopOrganizationModule, WorkshopSubscriptionModule, PaymentModule, OrderModule, RefundTicketModule, ServiceAndCategoryModule, CategoryModule, ServiceFeedbackModule, MilestoneModule, ScheduleModule, MessageModule, ServiceMeetingRoomModule, UploadedFileModule, ManagedServiceModule, WorkshopMeetingRoomModule, AdminNoteModule, PothosModule.forRoot({ builder: { inject: [PrismaService], useFactory: (prisma: PrismaService) => new Builder(prisma), }, }), GraphQLModule.forRootAsync({ driver: PothosApolloDriver, inject: [GraphqlService, 'PUB_SUB'], useFactory: async (graphqlService: GraphqlService, pubsub: PubSub) => ({ path: process.env.API_PATH + '/graphql', debug: process.env.NODE_ENV === 'development' || false, playground: process.env.NODE_ENV === 'development' || false, introspection: process.env.NODE_ENV === 'development' || false, subscriptions: { 'graphql-ws': true, }, context: async ({ req, subscriptions, extra, // biome-ignore lint/suspicious/noExplicitAny: }: { req?: Request; subscriptions?: any; extra?: any }) => { initContextCache() if (subscriptions) { return { isSubscription: true, websocket: { req: extra.request, pubSub: pubsub, me: await graphqlService.acquireContext( extra.request.headers['x-session-id'], ), }, } } return { isSubscription: false, http: { req, me: req ? await graphqlService.acquireContext(req) : null, pubSub: pubsub, invalidateCache: () => graphqlService.invalidateCache( req?.headers['x-session-id'] as string, ), }, } }, }), }), ], providers: [ RedisService, { provide: GraphqlService, useFactory: (prisma: PrismaService, redis: RedisService) => new GraphqlService(prisma, redis), inject: [PrismaService, 'REDIS_CLIENT'], }, { provide: Builder, useFactory: (prisma: PrismaService) => new Builder(prisma), inject: [PrismaService], }, { provide: PrismaCrudGenerator, useFactory: (builder: Builder) => new PrismaCrudGenerator(builder), inject: [Builder], }, { provide: 'PUB_SUB', useFactory: () => new PubSub(), }, ], exports: [ Builder, PrismaCrudGenerator, GraphqlService, RedisService, 'PUB_SUB', ], }) export class GraphqlModule {}