feat(medusa, link-modules): sales channel <> cart link (#5459)
* feat: sales channel joiner config * feat: product sales channel link config, SC list method * feat: migration * fix: refactor list SC * refactor: SC repo api * chore: changeset * feat: add dedicated FF * wip: cart<>sc link and migration * chore: changeset * fix: update migration with the cart table constraints * feat: populate the pivot table * chore: remove relation from joiner config * fix: constraint name * fix: filter out link relations when calling internal services * feat: product<> sc join entity * fix: update case * fix: add FF on in the repository, fix tests * fix: assign id when FF is on * fix: target table * feat: product service - fetch SC with RQ * feat: admin list products & SC with isolated product domain * feat: get admin product * feat: store endpoints * fix: remove duplicate import * fix: remove "name" prop * feat: typeorm entity changes * feat: pivot table, entity, on cart create changes * feat: update carts' SC * feat: cart - getValidatedSalesChannel with RQ * feat: refactor * wip: changes to create cart workflow * fix: remove join table entity due to migrations failing * fix: product seeder if FF is on * feat: attach SC handler and test * fix: env * feat: workflow compensation, cart service retrieve with RQ * fix: remote joiner implode map * chore: update changesets * fix: remove methods from SC service/repo * feat: use remote link in handlers * fix: remove SC service calls * fix: link params * fix: migration add constraint to make link upsert pass * refactor: workflow product handlers to handle remote links * fix: condition * fix: use correct method * fix: build * wip: update FF * fix: update FF in the handlers * chore: migrate to medusav2 FF * chore: uncomment test * fix: product factory * fix: unlinking SC and product * fix: use module name variable * refactor: cleanup query definitions * fix: add constraint * wip: migrate FF * fix: comments * feat: cart entity callbacks, fix tests * fix: only create SC in test * wip: services updates, changes to models * chore: rename prop * fix: add hook * fix: address comments * fix: temp sc filtering * fix: use RQ to filter by SC * fix: relations on retrieve * feat: migration sync data, remove FF * fix: revert order of queries * fix: alter migration, relations in service * fix: revert id * fix: migrations * fix: make expand work * fix: remote link method call * fix: try making tests work without id in the pivot table * test: use remote link * test: relations changes * fix: preserve channel id column * fix: seeder and factory * fix: remove sales_channels from response * feat: support feature flag arrays * fix: cover everything with correct FF * fix: remove verbose * fix: unit and plugin tests * chore: comments * fix: reenable workflow handler, add comments, split cart create workflow tests * chore: reenable link in the create mehod, update changesets * fix: address feedback * fix: revert migration * fix: change the migration to follow link module * fix: migration syntax * fix: merge conflicts * fix: typo * feat: remove store sales channel foreign key * fix: merge migrations * fix: FF keys * refactor: cart service * refactor: FF missing key * fix: comments * fix: address PR comments * fix: new changesets * fix: revert flag router changes * chore: refactor `isFeatureEnabled` --------- Co-authored-by: Carlos R. L. Rodrigues <rodrigolr@gmail.com> Co-authored-by: Riqwan Thamir <rmthamir@gmail.com>
This commit is contained in:
@@ -23,16 +23,16 @@ export type RemoteFetchDataCallback = (
|
||||
path?: string
|
||||
}>
|
||||
|
||||
type InternalImplodeMapping = {
|
||||
location: string[]
|
||||
property: string
|
||||
path: string[]
|
||||
isList?: boolean
|
||||
}
|
||||
|
||||
export class RemoteJoiner {
|
||||
private serviceConfigCache: Map<string, JoinerServiceConfig> = new Map()
|
||||
|
||||
private implodeMapping: {
|
||||
location: string[]
|
||||
property: string
|
||||
path: string[]
|
||||
isList?: boolean
|
||||
}[] = []
|
||||
|
||||
private static filterFields(
|
||||
data: any,
|
||||
fields: string[],
|
||||
@@ -355,7 +355,8 @@ export class RemoteJoiner {
|
||||
|
||||
private handleFieldAliases(
|
||||
items: any[],
|
||||
parsedExpands: Map<string, RemoteExpandProperty>
|
||||
parsedExpands: Map<string, RemoteExpandProperty>,
|
||||
implodeMapping: InternalImplodeMapping[]
|
||||
) {
|
||||
const getChildren = (item: any, prop: string) => {
|
||||
if (Array.isArray(item)) {
|
||||
@@ -373,7 +374,7 @@ export class RemoteJoiner {
|
||||
}
|
||||
|
||||
const cleanup: [any, string][] = []
|
||||
for (const alias of this.implodeMapping) {
|
||||
for (const alias of implodeMapping) {
|
||||
const propPath = alias.path
|
||||
|
||||
let itemsLocation = items
|
||||
@@ -432,7 +433,8 @@ export class RemoteJoiner {
|
||||
|
||||
private async handleExpands(
|
||||
items: any[],
|
||||
parsedExpands: Map<string, RemoteExpandProperty>
|
||||
parsedExpands: Map<string, RemoteExpandProperty>,
|
||||
implodeMapping: InternalImplodeMapping[] = []
|
||||
): Promise<void> {
|
||||
if (!parsedExpands) {
|
||||
return
|
||||
@@ -458,7 +460,7 @@ export class RemoteJoiner {
|
||||
}
|
||||
}
|
||||
|
||||
this.handleFieldAliases(items, parsedExpands)
|
||||
this.handleFieldAliases(items, parsedExpands, implodeMapping)
|
||||
}
|
||||
|
||||
private async expandProperty(
|
||||
@@ -567,13 +569,15 @@ export class RemoteJoiner {
|
||||
initialService: RemoteExpandProperty,
|
||||
query: RemoteJoinerQuery,
|
||||
serviceConfig: JoinerServiceConfig,
|
||||
expands: RemoteJoinerQuery["expands"]
|
||||
expands: RemoteJoinerQuery["expands"],
|
||||
implodeMapping: InternalImplodeMapping[]
|
||||
): Map<string, RemoteExpandProperty> {
|
||||
const parsedExpands = this.parseProperties(
|
||||
initialService,
|
||||
query,
|
||||
serviceConfig,
|
||||
expands
|
||||
expands,
|
||||
implodeMapping
|
||||
)
|
||||
|
||||
const groupedExpands = this.groupExpands(parsedExpands)
|
||||
@@ -585,7 +589,8 @@ export class RemoteJoiner {
|
||||
initialService: RemoteExpandProperty,
|
||||
query: RemoteJoinerQuery,
|
||||
serviceConfig: JoinerServiceConfig,
|
||||
expands: RemoteJoinerQuery["expands"]
|
||||
expands: RemoteJoinerQuery["expands"],
|
||||
implodeMapping: InternalImplodeMapping[]
|
||||
): Map<string, RemoteExpandProperty> {
|
||||
const parsedExpands = new Map<string, any>()
|
||||
parsedExpands.set(BASE_PATH, initialService)
|
||||
@@ -612,7 +617,7 @@ export class RemoteJoiner {
|
||||
)
|
||||
)
|
||||
|
||||
this.implodeMapping.push({
|
||||
implodeMapping.push({
|
||||
location: currentPath,
|
||||
property: prop,
|
||||
path: fullPath,
|
||||
@@ -799,6 +804,7 @@ export class RemoteJoiner {
|
||||
(arg) => !serviceConfig.primaryKeys.includes(arg.name)
|
||||
)
|
||||
|
||||
const implodeMapping: InternalImplodeMapping[] = []
|
||||
const parsedExpands = this.parseExpands(
|
||||
{
|
||||
property: "",
|
||||
@@ -809,7 +815,8 @@ export class RemoteJoiner {
|
||||
},
|
||||
queryObj,
|
||||
serviceConfig,
|
||||
queryObj.expands!
|
||||
queryObj.expands!,
|
||||
implodeMapping
|
||||
)
|
||||
|
||||
const root = parsedExpands.get(BASE_PATH)!
|
||||
@@ -823,7 +830,11 @@ export class RemoteJoiner {
|
||||
|
||||
const data = response.path ? response.data[response.path!] : response.data
|
||||
|
||||
await this.handleExpands(Array.isArray(data) ? data : [data], parsedExpands)
|
||||
await this.handleExpands(
|
||||
Array.isArray(data) ? data : [data],
|
||||
parsedExpands,
|
||||
implodeMapping
|
||||
)
|
||||
|
||||
return response.data
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user