kapix-typegraphql-prisma
Version:

143 lines • 7.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateCrudResolverClassMethodDeclaration = void 0;
const ts_morph_1 = require("ts-morph");
const types_1 = require("../dmmf/types");
const imports_1 = require("../imports");
function generateCrudResolverClassMethodDeclaration(action, mapping, dmmfDocument, generatorOptions, hasGeom) {
const isFindMany = action.kind === types_1.DMMF.ModelAction.findMany;
const listResultName = (0, imports_1.getListResultTypeName)(mapping.modelTypeName);
return {
name: action.name,
isAsync: true,
returnType: `Promise<${isFindMany ? listResultName : action.returnTSType}>`,
decorators: [
{
name: `TypeGraphQL.${action.operation}`,
arguments: [
`_returns => ${isFindMany ? listResultName : action.typeGraphQLType}`,
ts_morph_1.Writers.object({
nullable: `${!action.method.isRequired}`,
}),
],
},
],
parameters: [
{
name: "ctx",
// TODO: import custom `ContextType`
type: "any",
decorators: [{ name: "TypeGraphQL.Ctx", arguments: [] }],
},
{
name: "info",
type: "GraphQLResolveInfo",
decorators: [{ name: "TypeGraphQL.Info", arguments: [] }],
},
...(!action.argsTypeName
? []
: [
{
name: "args",
type: action.argsTypeName,
decorators: [
{
name: "TypeGraphQL.Args",
arguments: generatorOptions.emitRedundantTypesInfo
? [`_type => ${action.argsTypeName}`]
: [],
},
],
},
]),
],
statements: action.kind === types_1.DMMF.ModelAction.aggregate
? [
/* ts */ ` await onIntercept('${mapping.modelName}', '${action.name}', 'onBefore', '${action.prismaMethod}', ctx, args)
const prisma = getPrismaFromContext(ctx)
const result = prisma.${mapping.collectionName}.${action.prismaMethod}({
...args,
...transformInfoIntoPrismaArgs(info)
})
const afterInterceptResult = await onIntercept('${mapping.modelName}', '${action.name}', 'onAfter', '${action.prismaMethod}', ctx, args, result)
return afterInterceptResult ?? result`,
]
: action.kind === types_1.DMMF.ModelAction.groupBy
? [
/* ts */ ` const { _count, _avg, _sum, _min, _max } = transformInfoIntoPrismaArgs(info)
await onIntercept('${mapping.modelName}', '${action.name}', 'onBefore', '${action.prismaMethod}', ctx, args)
const prisma = getPrismaFromContext(ctx)
const result = prisma.${mapping.collectionName}.${action.prismaMethod}({
...args,
...Object.fromEntries(
Object.entries({ _count, _avg, _sum, _min, _max }).filter(([_, v]) => v != null)
)
})
const afterInterceptResult = await onIntercept('${mapping.modelName}', '${action.name}', 'onAfter', '${action.prismaMethod}', ctx, args, result)
return afterInterceptResult ?? result`,
]
: isFindMany
? [
/* ts */ ` const selector = transformInfoIntoPrismaArgs(info)
const { items, count } = selector
await onIntercept('${mapping.modelName}', '${action.name}', 'onBefore', '${action.prismaMethod}', ctx, args)
const prisma = getPrismaFromContext(ctx)
let result, countResult
${hasGeom
? `const [idWithDistance, take] = await applyGeomPointFilter(geomFieldsList, args, '${mapping.modelName}', 'id', prisma)`
: ""}
if (items && count) {
[result, countResult] = await prisma.$transaction([
prisma.${mapping.collectionName}.${action.prismaMethod}({
...args,
...(items._count && transformCountFieldIntoSelectRelationsCount(items._count))
}),
prisma.${mapping.collectionName}.count({ where: args.where })
]);
} ${hasGeom
? `else if (count && idWithDistance) {
[result, countResult] = await prisma.$transaction([
prisma.${mapping.collectionName}.${action.prismaMethod}({
...args,
...(selector._count && transformCountFieldIntoSelectRelationsCount(selector._count))
}),
prisma.${mapping.collectionName}.count({ where: args.where })
]);
}`
: ""} else if (items) {
result = await prisma.${mapping.collectionName}.${action.prismaMethod}({
...args,
...(items._count && transformCountFieldIntoSelectRelationsCount(items._count))
})
} else if (count) {
countResult = await prisma.${mapping.collectionName}.count({ where: args.where })
}
${hasGeom
? "result = filterGeomByIds(idWithDistance, result, args, take);"
: ""}
const afterInterceptResult = await onIntercept('${mapping.modelName}', '${action.name}', 'onAfter', '${action.prismaMethod}', ctx, args, result)
return {
items: afterInterceptResult ?? result,
count: countResult
}`,
]
: [
/* ts */ ` const { _count } = transformInfoIntoPrismaArgs(info)
await onIntercept('${mapping.modelName}', '${action.name}', 'onBefore', '${action.prismaMethod}', ctx, args)
const prisma = getPrismaFromContext(ctx)
const result = await prisma.${mapping.collectionName}.${action.prismaMethod}({
...args,
...(_count && transformCountFieldIntoSelectRelationsCount(_count))
})
${hasGeom &&
(action.kind === types_1.DMMF.ModelAction.createOne ||
action.kind === types_1.DMMF.ModelAction.updateOne)
? `await updateGeomFields(result.id, args, prisma, '${mapping.modelName}', geomFieldsList)`
: ""}
const afterInterceptResult = await onIntercept('${mapping.modelName}', '${action.name}', 'onAfter', '${action.prismaMethod}', ctx, args, result)
return afterInterceptResult ?? result`,
],
};
}
exports.generateCrudResolverClassMethodDeclaration = generateCrudResolverClassMethodDeclaration;
//# sourceMappingURL=helpers.js.map