import SchemaBuilder from '@pothos/core'; import PrismaPlugin, { PothosPrismaDatamodel, PrismaClient, } from '@pothos/plugin-prisma'; import PrismaUtils from '@pothos/plugin-prisma-utils'; import { Request, Response } from 'express'; import type PrismaTypes from '../types/pothos.generated'; import { getDatamodel } from '../types/pothos.generated'; import { DateTimeResolver, JSONObjectResolver } from 'graphql-scalars'; import { Injectable } from '@nestjs/common'; import { PrismaCrudGenerator } from './graphql.generator'; export interface SchemaContext { req: Request; res: Response; generator: PrismaCrudGenerator; } export interface SchemaBuilderOption { Context: SchemaContext; PrismaTypes: PrismaTypes; DataModel: PothosPrismaDatamodel; Scalars: { DateTime: { Input: Date; Output: Date; }; Json: { Input: JSON; Output: JSON; }; }; } @Injectable() export class Builder extends SchemaBuilder { public generator: PrismaCrudGenerator; constructor(private readonly prisma: PrismaClient) { super({ plugins: [PrismaPlugin, PrismaUtils], prisma: { client: prisma, exposeDescriptions: true, filterConnectionTotalCount: true, onUnusedQuery: process.env.NODE_ENV === 'production' ? null : 'warn', dmmf: getDatamodel(), }, }); this.generator = new PrismaCrudGenerator(this); this.addScalarType('DateTime', DateTimeResolver); this.addScalarType('Json', JSONObjectResolver); this.queryType({}); this.mutationType({}); } } export type BuilderTypes = PothosSchemaTypes.ExtendDefaultTypes;