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:
Frane Polić
2023-12-22 13:05:36 +01:00
committed by GitHub
parent b5a07cfcf4
commit 76332ca6c1
28 changed files with 662 additions and 89 deletions

View File

@@ -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
}