From 667c8609ccf3850f5df8cf784723a95bd0d6d2a6 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Sun, 7 Apr 2024 16:07:31 +0200 Subject: [PATCH] fix(modules-sdk): Fix remote query selection (#6989) Fix remote query selection for different relations levels as part of a single processed query --- .changeset/tender-timers-compete.md | 5 + .../src/__tests__/remote-quer.spec.ts | 47 -------- .../src/__tests__/remote-query.spec.ts | 109 ++++++++++++++++++ packages/modules-sdk/src/remote-query.ts | 12 +- 4 files changed, 124 insertions(+), 49 deletions(-) create mode 100644 .changeset/tender-timers-compete.md delete mode 100644 packages/modules-sdk/src/__tests__/remote-quer.spec.ts create mode 100644 packages/modules-sdk/src/__tests__/remote-query.spec.ts diff --git a/.changeset/tender-timers-compete.md b/.changeset/tender-timers-compete.md new file mode 100644 index 0000000000..b23a3f753c --- /dev/null +++ b/.changeset/tender-timers-compete.md @@ -0,0 +1,5 @@ +--- +"@medusajs/modules-sdk": patch +--- + +fix(modules-sdk): Fix remote query selection diff --git a/packages/modules-sdk/src/__tests__/remote-quer.spec.ts b/packages/modules-sdk/src/__tests__/remote-quer.spec.ts deleted file mode 100644 index 03735bc1b1..0000000000 --- a/packages/modules-sdk/src/__tests__/remote-quer.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { RemoteQuery } from "../remote-query" - -describe("Remote query", () => { - it("should properly handle fields and relations transformation", () => { - const expand = { - fields: ["name", "age"], - expands: { - friend: { - fields: ["name"], - expands: { - ball: { - fields: ["*"], - }, - }, - }, - }, - } - - const result = RemoteQuery.getAllFieldsAndRelations(expand) - - expect(result).toEqual({ - select: ["name", "age", "friend.name"], - relations: ["friend", "friend.ball"], - args: { - "": undefined, - friend: undefined, - "friend.ball": undefined, - }, - }) - }) - - it("should properly handle fields and relations transformation for top level entity", () => { - const expand = { - fields: ["*"], - } - - const result = RemoteQuery.getAllFieldsAndRelations(expand) - - expect(result).toEqual({ - select: undefined, - relations: [], - args: { - "": undefined, - }, - }) - }) -}) diff --git a/packages/modules-sdk/src/__tests__/remote-query.spec.ts b/packages/modules-sdk/src/__tests__/remote-query.spec.ts new file mode 100644 index 0000000000..daccb3f277 --- /dev/null +++ b/packages/modules-sdk/src/__tests__/remote-query.spec.ts @@ -0,0 +1,109 @@ +import { RemoteQuery } from "../remote-query" + +describe("Remote query", () => { + it("should properly handle fields and relations transformation", () => { + let expand = { + fields: ["name", "age"], + expands: { + friend: { + fields: ["name"], + expands: { + ball: { + fields: ["*"], + }, + }, + }, + }, + } + + let result = RemoteQuery.getAllFieldsAndRelations(expand) + + expect(result).toEqual({ + select: ["name", "age", "friend.name"], + relations: ["friend", "friend.ball"], + args: { + "": undefined, + friend: undefined, + "friend.ball": undefined, + }, + }) + + expand = { + fields: [], + expands: { + friend: { + fields: ["name"], + expands: { + ball: { + fields: ["*"], + }, + }, + }, + }, + } + + result = RemoteQuery.getAllFieldsAndRelations(expand) + + expect(result).toEqual({ + select: ["friend.name"], + relations: ["friend", "friend.ball"], + args: { + "": undefined, + friend: undefined, + "friend.ball": undefined, + }, + }) + + expand = { + fields: [], + expands: { + friend: { + fields: ["*"], + expands: { + ball: { + fields: ["*"], + }, + }, + }, + }, + } + + result = RemoteQuery.getAllFieldsAndRelations(expand) + + expect(result).toEqual({ + select: [], + relations: ["friend", "friend.ball"], + args: { + "": undefined, + friend: undefined, + "friend.ball": undefined, + }, + }) + + expand = { + fields: [], + expands: { + friend: { + fields: [], + expands: { + ball: { + fields: ["*"], + }, + }, + }, + }, + } + + result = RemoteQuery.getAllFieldsAndRelations(expand) + + expect(result).toEqual({ + select: [], + relations: ["friend", "friend.ball"], + args: { + "": undefined, + friend: undefined, + "friend.ball": undefined, + }, + }) + }) +}) diff --git a/packages/modules-sdk/src/remote-query.ts b/packages/modules-sdk/src/remote-query.ts index 5be5c40375..a08b9e1e7a 100644 --- a/packages/modules-sdk/src/remote-query.ts +++ b/packages/modules-sdk/src/remote-query.ts @@ -93,9 +93,11 @@ export class RemoteQuery { let fields: Set = new Set() let relations: string[] = [] + let shouldSelectAll = false + for (const field of expand.fields ?? []) { if (field === "*") { - expand.fields = undefined + shouldSelectAll = true break } fields.add(prefix ? `${prefix}.${field}` : field) @@ -120,7 +122,13 @@ export class RemoteQuery { } const allFields = Array.from(fields) - return { select: allFields.length ? allFields : undefined, relations, args } + const select = + allFields.length && !shouldSelectAll + ? allFields + : shouldSelectAll + ? undefined + : [] + return { select, relations, args } } private hasPagination(options: { [attr: string]: unknown }): boolean {