From 92c7baa56193e052c6af41ea240b8d2cecd9fb77 Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Mon, 7 Apr 2025 11:59:28 -0300 Subject: [PATCH] fix(orchestration): handle multiple shortcuts with same name (#12066) --- .changeset/tame-hats-crash.md | 5 ++ .../orchestration/src/joiner/remote-joiner.ts | 48 ++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 .changeset/tame-hats-crash.md diff --git a/.changeset/tame-hats-crash.md b/.changeset/tame-hats-crash.md new file mode 100644 index 0000000000..5a73344e15 --- /dev/null +++ b/.changeset/tame-hats-crash.md @@ -0,0 +1,5 @@ +--- +"@medusajs/orchestration": patch +--- + +fix(orchestration): handle multiple field aliases with same name diff --git a/packages/core/orchestration/src/joiner/remote-joiner.ts b/packages/core/orchestration/src/joiner/remote-joiner.ts index ccb75c6218..b49957d9aa 100644 --- a/packages/core/orchestration/src/joiner/remote-joiner.ts +++ b/packages/core/orchestration/src/joiner/remote-joiner.ts @@ -317,7 +317,8 @@ export class RemoteJoiner { service_.relationships?.set(aliasName, rel) } - Object.assign(service_.fieldAlias ?? {}, extend.fieldAlias) + // Multiple "fieldAlias" w/ same name need the entity to handle different paths + this.mergeFieldAlias(service_, extend) } } @@ -364,6 +365,33 @@ export class RemoteJoiner { return serviceConfigs } + private mergeFieldAlias(service_, extend) { + for (const [alias, fieldAlias] of Object.entries(extend.fieldAlias ?? {})) { + const objAlias = isString(fieldAlias) + ? { path: fieldAlias } + : (fieldAlias as object) + + if (service_.fieldAlias[alias]) { + if (!Array.isArray(service_.fieldAlias[alias])) { + service_.fieldAlias[alias] = [service_.fieldAlias[alias]] + } + + if ( + service_.fieldAlias[alias].some((f) => f.entity === extend.entity) + ) { + throw new Error( + `Cannot add alias "${alias}" for "${extend.serviceName}". It is already defined for Entity "${extend.entity}".` + ) + } + } else { + service_.fieldAlias[alias] = { + ...objAlias, + entity: extend.entity, + } + } + } + } + private getServiceConfig({ serviceName, serviceAlias, @@ -1081,7 +1109,23 @@ export class RemoteJoiner { }) { const serviceConfig = currentServiceConfig const fieldAlias = currentServiceConfig.fieldAlias ?? {} - const alias = fieldAlias[property] as any + let alias = fieldAlias[property] as any + + // Handle multiple shortcuts for the same property + if (Array.isArray(alias)) { + const currentPathEntity = parsedExpands.get( + [BASE_PATH, ...currentPath].join(".") + )?.entity + + alias = alias.find((a) => a.entity == currentPathEntity) + if (!alias) { + throw new Error( + `Cannot resolve alias path "${currentPath.join( + "." + )}" that matches entity ${currentPathEntity}.` + ) + } + } const path = isString(alias) ? alias : alias.path const fieldAliasIsList = isString(alias) ? false : !!alias.isList