Files
epess-web-backend/src/Graphql/graphql.module.ts

161 lines
5.6 KiB
TypeScript

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<ApolloDriverConfig>({
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: <explanation>
}: { 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 {}