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
co-authored by Carlos R. L. Rodrigues Riqwan Thamir
parent b5a07cfcf4
commit 76332ca6c1
28 changed files with 662 additions and 89 deletions
@@ -0,0 +1,29 @@
import { BeforeInsert, Column, Index, PrimaryColumn } from "typeorm"
import { MedusaV2Flag, SalesChannelFeatureFlag } from "@medusajs/utils"
import { generateEntityId } from "../utils"
import { SoftDeletableEntity } from "../interfaces"
import { FeatureFlagEntity } from "../utils/feature-flag-decorators"
@FeatureFlagEntity([MedusaV2Flag.key, SalesChannelFeatureFlag.key])
export class CartSalesChannel extends SoftDeletableEntity {
@Column()
id: string
@Index("cart_sales_channel_cart_id_unique", {
unique: true,
})
@PrimaryColumn()
cart_id: string
@PrimaryColumn()
sales_channel_id: string
/**
* @apiIgnore
*/
@BeforeInsert()
private beforeInsert(): void {
this.id = generateEntityId(this.id, "cartsc")
}
}
+61 -14
View File
@@ -233,6 +233,7 @@
import {
AfterLoad,
BeforeInsert,
BeforeUpdate,
Column,
Entity,
Index,
@@ -241,13 +242,10 @@ import {
ManyToMany,
ManyToOne,
OneToMany,
OneToOne
OneToOne,
} from "typeorm"
import { MedusaV2Flag, SalesChannelFeatureFlag } from "@medusajs/utils"
import { DbAwareColumn, resolveDbType } from "../utils/db-aware-column"
import {
FeatureFlagColumn,
FeatureFlagDecorators,
} from "../utils/feature-flag-decorators"
import { SoftDeletableEntity } from "../interfaces/models/soft-deletable-entity"
import { generateEntityId } from "../utils/generate-entity-id"
@@ -261,6 +259,10 @@ import { PaymentSession } from "./payment-session"
import { Region } from "./region"
import { SalesChannel } from "./sales-channel"
import { ShippingMethod } from "./shipping-method"
import {
FeatureFlagColumn,
FeatureFlagDecorators,
} from "../utils/feature-flag-decorators"
export enum CartType {
DEFAULT = "default",
@@ -387,15 +389,37 @@ export class Cart extends SoftDeletableEntity {
@DbAwareColumn({ type: "jsonb", nullable: true })
metadata: Record<string, unknown>
@FeatureFlagColumn("sales_channels", { type: "varchar", nullable: true })
@FeatureFlagColumn(SalesChannelFeatureFlag.key, {
type: "varchar",
nullable: true,
})
sales_channel_id: string | null
@FeatureFlagDecorators("sales_channels", [
@FeatureFlagDecorators(SalesChannelFeatureFlag.key, [
ManyToOne(() => SalesChannel),
JoinColumn({ name: "sales_channel_id" }),
])
sales_channel: SalesChannel
@FeatureFlagDecorators(
[MedusaV2Flag.key, SalesChannelFeatureFlag.key],
[
ManyToMany(() => SalesChannel, { cascade: ["remove", "soft-remove"] }),
JoinTable({
name: "cart_sales_channel",
joinColumn: {
name: "cart_id",
referencedColumnName: "id",
},
inverseJoinColumn: {
name: "sales_channel_id",
referencedColumnName: "id",
},
}),
]
)
sales_channels?: SalesChannel[]
shipping_total?: number
discount_total?: number
raw_discount_total?: number
@@ -412,18 +436,41 @@ export class Cart extends SoftDeletableEntity {
/**
* @apiIgnore
*/
@AfterLoad()
private afterLoad(): void {
if (this.payment_sessions) {
this.payment_session = this.payment_sessions.find((p) => p.is_selected)!
@BeforeInsert()
private beforeInsert(): void {
this.id = generateEntityId(this.id, "cart")
if (this.sales_channel_id || this.sales_channel) {
this.sales_channels = [
{ id: this.sales_channel_id || this.sales_channel?.id },
] as SalesChannel[]
}
}
/**
* @apiIgnore
*/
@BeforeInsert()
private beforeInsert(): void {
this.id = generateEntityId(this.id, "cart")
@BeforeUpdate()
private beforeUpdate(): void {
if (this.sales_channel_id || this.sales_channel) {
this.sales_channels = [
{ id: this.sales_channel_id || this.sales_channel?.id },
] as SalesChannel[]
}
}
/**
* @apiIgnore
*/
@AfterLoad()
private afterLoad(): void {
if (this.payment_sessions) {
this.payment_session = this.payment_sessions.find((p) => p.is_selected)!
}
if (this.sales_channels) {
this.sales_channel = this.sales_channels?.[0]
this.sales_channel_id = this.sales_channel?.id
delete this.sales_channels
}
}
}
+22 -1
View File
@@ -1,10 +1,15 @@
import { BeforeInsert, Column, JoinTable, ManyToMany, OneToMany } from "typeorm"
import { FeatureFlagEntity } from "../utils/feature-flag-decorators"
import { MedusaV2Flag } from "@medusajs/utils"
import {
FeatureFlagDecorators,
FeatureFlagEntity,
} from "../utils/feature-flag-decorators"
import { SoftDeletableEntity } from "../interfaces"
import { DbAwareColumn, generateEntityId } from "../utils"
import { SalesChannelLocation } from "./sales-channel-location"
import { Product } from "./product"
import { Cart } from "./cart"
@FeatureFlagEntity("sales_channels")
export class SalesChannel extends SoftDeletableEntity {
@@ -34,6 +39,22 @@ export class SalesChannel extends SoftDeletableEntity {
})
products: Product[]
@FeatureFlagDecorators(MedusaV2Flag.key, [
ManyToMany(() => Cart),
JoinTable({
name: "cart_sales_channel",
joinColumn: {
name: "sales_channel_id",
referencedColumnName: "id",
},
inverseJoinColumn: {
name: "cart_id",
referencedColumnName: "id",
},
}),
])
carts: Cart[]
@OneToMany(
() => SalesChannelLocation,
(scLocation) => scLocation.sales_channel,