From 1a170b9b4b61bd198ba9cfe47168fd958895c858 Mon Sep 17 00:00:00 2001 From: Niko Sams Date: Tue, 28 Nov 2023 15:28:08 +0100 Subject: [PATCH] API Generator: Use correct type for `where` when `getFindCondition` service method is not used (#1436) This caused problems if scope is used which is not possible to assign to {}. Before: `const where = {};` Now: `const where: ObjectQuery = {};` If find/search is used: `const where = this.xxService.getFindCondition(...);` which also returns an ObjectQuery --------- Co-authored-by: Johannes Obermair <48853629+johnnyomair@users.noreply.github.com> --- .changeset/fair-clouds-poke.md | 5 ++ .../generate-crud-without-find.spec.ts | 49 +++++++++++++++++++ .../cms-api/src/generator/generate-crud.ts | 6 +-- 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 .changeset/fair-clouds-poke.md create mode 100644 packages/api/cms-api/src/generator/generate-crud-without-find.spec.ts diff --git a/.changeset/fair-clouds-poke.md b/.changeset/fair-clouds-poke.md new file mode 100644 index 0000000000..b88df66dc8 --- /dev/null +++ b/.changeset/fair-clouds-poke.md @@ -0,0 +1,5 @@ +--- +"@comet/cms-api": patch +--- + +API Generator: Use correct type for `where` when `getFindCondition` service method is not used diff --git a/packages/api/cms-api/src/generator/generate-crud-without-find.spec.ts b/packages/api/cms-api/src/generator/generate-crud-without-find.spec.ts new file mode 100644 index 0000000000..196ece2939 --- /dev/null +++ b/packages/api/cms-api/src/generator/generate-crud-without-find.spec.ts @@ -0,0 +1,49 @@ +import { BaseEntity, Embeddable, Embedded, Entity, PrimaryKey, Property } from "@mikro-orm/core"; +import { MikroORM } from "@mikro-orm/postgresql"; +import { LazyMetadataStorage } from "@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage"; +import { v4 as uuid } from "uuid"; + +import { generateCrud } from "./generate-crud"; +import { lintGeneratedFiles, parseSource } from "./utils/test-helper"; + +@Embeddable() +export class TestEntityScope { + @Property({ columnType: "text" }) + language: string; +} + +@Entity() +export class TestEntity extends BaseEntity { + @PrimaryKey({ type: "uuid" }) + id: string = uuid(); + + @Embedded(() => TestEntityScope) + scope: TestEntityScope; +} + +describe("GenerateCrud without find condition", () => { + it("where should be typed as ObjectQuery as it is when findCondition is used", async () => { + LazyMetadataStorage.load(); + const orm = await MikroORM.init({ + type: "postgresql", + dbName: "test-db", + entities: [TestEntity, TestEntityScope], + }); + + const out = await generateCrud({ targetDirectory: __dirname }, orm.em.getMetadata().get("TestEntity")); + const lintedOut = await lintGeneratedFiles(out); + + { + const file = lintedOut.find((file) => file.name === "test-entity.resolver.ts"); + if (!file) throw new Error("File not found"); + const source = parseSource(file.content); + + const cls = source.getClassOrThrow("TestEntityResolver"); + const testEntitiesQuery = cls.getInstanceMethodOrThrow("testEntities"); + const bodyText = testEntitiesQuery.getBodyText(); + expect(bodyText).toContain("const where: ObjectQuery = {};"); + } + + orm.close(); + }); +}); diff --git a/packages/api/cms-api/src/generator/generate-crud.ts b/packages/api/cms-api/src/generator/generate-crud.ts index 4c8e50123a..55aa43ed7e 100644 --- a/packages/api/cms-api/src/generator/generate-crud.ts +++ b/packages/api/cms-api/src/generator/generate-crud.ts @@ -755,10 +755,10 @@ function generateResolver({ generatorOptions, metadata }: { generatorOptions: Cr hasSortArg ? `sort, ` : "" }offset, limit }: ${argsClassName}${hasOutputRelations ? `, @Info() info: GraphQLResolveInfo` : ""} ): Promise { - const where = ${ + const where${ hasSearchArg || hasFilterArg - ? `this.${instanceNamePlural}Service.getFindCondition({ ${hasSearchArg ? `search, ` : ""}${hasFilterArg ? `filter, ` : ""} });` - : "{}" + ? ` = this.${instanceNamePlural}Service.getFindCondition({ ${hasSearchArg ? `search, ` : ""}${hasFilterArg ? `filter, ` : ""} });` + : `: ObjectQuery<${metadata.className}> = {}` } ${scopeProp ? `where.scope = scope;` : ""}