import { Global, Logger, MiddlewareConsumer, Module } from '@nestjs/common'; import { ApolloDriverConfig } from '@nestjs/apollo'; import { Builder } from './graphql.builder'; import { CategoryModule } from '../Category/category.module'; import { CenterModule } from '../Center/center.module'; import { CenterStaffModule } from '../CenterStaff/centerstaff.module'; import { ChatroomModule } from '../ChatRoom/chatroom.module'; import { CommonModule } from '../common/common.module'; import { GraphQLModule } from '@nestjs/graphql'; import { GraphQLValidationMiddleware } from '../middlewares/graphql.middleware'; 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 { 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'; @Global() @Module({ imports: [ CommonModule, PrismaModule, UserModule, CenterModule, ServiceModule, ChatroomModule, CenterStaffModule, ResumeModule, WorkshopModule, WorkshopOrganizationModule, WorkshopSubscriptionModule, PaymentModule, OrderModule, RefundTicketModule, ServiceAndCategoryModule, CategoryModule, ServiceFeedbackModule, MilestoneModule, ScheduleModule, MessageModule, ServiceMeetingRoomModule, UploadedFileModule, ManagedServiceModule, WorkshopMeetingRoomModule, PothosModule.forRoot({ builder: { inject: [PrismaService], useFactory: (prisma: PrismaService) => new Builder(prisma), }, }), GraphQLModule.forRoot({ driver: PothosApolloDriver, 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, installSubscriptionHandlers: true, subscriptions: { 'graphql-ws': true, }, context: async ({ req }: { req: Request }) => ({ ...initContextCache(), me: await new GraphqlService(new PrismaService()).acquireContext(req), }), }), ], providers: [ { provide: GraphqlService, useFactory: (prisma: PrismaService) => new GraphqlService(prisma), inject: [PrismaService], }, { provide: Builder, useFactory: (prisma: PrismaService) => new Builder(prisma), inject: [PrismaService], }, { provide: PrismaCrudGenerator, useFactory: (builder: Builder) => new PrismaCrudGenerator(builder), inject: [Builder], }, ], exports: [Builder, PrismaCrudGenerator], }) export class GraphqlModule { configure(consumer: MiddlewareConsumer) { consumer .apply(GraphQLValidationMiddleware) // Apply the custom middleware .forRoutes(process.env.API_PATH + '/graphql'); // Ensure it only applies to the /graphql endpoint } }