import { OptionalKind, MethodDeclarationStructure, Writers } from "ts-morph"; import { DmmfDocument } from "../dmmf/dmmf-document"; import { DMMF } from "../dmmf/types"; export function generateCrudResolverClassMethodDeclaration( action: DMMF.Action, mapping: DMMF.ModelMapping, dmmfDocument: DmmfDocument, ): OptionalKind { return { name: action.name, isAsync: true, returnType: `Promise<${action.returnTSType}>`, decorators: [ { name: `NestJS.${action.operation}`, arguments: [ `_returns => ${action.nestJSType}`, Writers.object({ nullable: `${!action.method.isRequired}`, }), ], }, ], parameters: [ { name: "ctx", // TODO: import custom `ContextType` type: "any", decorators: [{ name: "NestJS.Context", arguments: [] }], }, { name: "info", type: "GraphQLResolveInfo", decorators: [{ name: "NestJS.Info", arguments: [] }], }, ...(!action.argsTypeName ? [] : [ { name: "args", type: action.argsTypeName, decorators: [{ name: "NestJS.Args", arguments: [] }], }, ]), ], statements: action.kind === DMMF.ModelAction.aggregate ? [ /* ts */ ` return getPrismaFromContext(ctx).${mapping.collectionName}.${action.prismaMethod}({ ...args, ...transformInfoIntoPrismaArgs(info), });`, ] : action.kind === DMMF.ModelAction.groupBy ? [ /* ts */ ` const { count, avg, sum, min, max } = transformInfoIntoPrismaArgs(info);`, /* ts */ ` return getPrismaFromContext(ctx).${mapping.collectionName}.${action.prismaMethod}({ ...args, ...Object.fromEntries( Object.entries({ count, avg, sum, min, max }).filter(([_, v]) => v != null) ), });`, ] : [ /* ts */ ` const { _count } = transformInfoIntoPrismaArgs(info); return getPrismaFromContext(ctx).${mapping.collectionName}.${action.prismaMethod}({ ...args, ...(_count && transformCountFieldIntoSelectRelationsCount(_count)), });`, ], }; }