www/apps/resources/app/commerce-modules/sales-channel/links-to-other-modules/page.mdx
import { CodeTabs, CodeTab, Table } from "docs-ui"
export const metadata = {
title: Links between Sales Channel Module and Other Modules,
}
This document showcases the module links defined between the Sales Channel Module and other Commerce Modules.
The Sales Channel Module has the following links to other modules:
<Note title="Tip">Read-only links are used to query data across modules, but the relations aren't stored in a pivot table in the database.
</Note> <Table> <Table.Header> <Table.Row> <Table.HeaderCell> First Data Model </Table.HeaderCell> <Table.HeaderCell> Second Data Model </Table.HeaderCell> <Table.HeaderCell> Type </Table.HeaderCell> <Table.HeaderCell> Description </Table.HeaderCell> </Table.Row> </Table.Header> <Table.Body> <Table.Row> <Table.Cell> [ApiKey](/references/api-key/models/ApiKey) in [API Key Module](../../api-key/page.mdx) </Table.Cell> <Table.Cell> [SalesChannel](/references/sales-channel/models/SalesChannel) </Table.Cell> <Table.Cell> Stored - many-to-many </Table.Cell> <Table.Cell> [Learn more](#api-key-module) </Table.Cell> </Table.Row> <Table.Row> <Table.Cell> [Cart](/references/cart/models/Cart) in [Cart Module](../../cart/page.mdx) </Table.Cell> <Table.Cell> [SalesChannel](/references/sales-channel/models/SalesChannel) </Table.Cell> <Table.Cell> Read-only - has one </Table.Cell> <Table.Cell> [Learn more](#cart-module) </Table.Cell> </Table.Row> <Table.Row> <Table.Cell> [Order](/references/order/models/Order) in [Order Module](../../order/page.mdx) </Table.Cell> <Table.Cell> [SalesChannel](/references/sales-channel/models/SalesChannel) </Table.Cell> <Table.Cell> Read-only - has one </Table.Cell> <Table.Cell> [Learn more](#order-module) </Table.Cell> </Table.Row> <Table.Row> <Table.Cell> [Product](/references/product/models/Product) in [Product Module](../../product/page.mdx) </Table.Cell> <Table.Cell> [SalesChannel](/references/sales-channel/models/SalesChannel) </Table.Cell> <Table.Cell> Stored - many-to-many </Table.Cell> <Table.Cell> [Learn more](#product-module) </Table.Cell> </Table.Row> <Table.Row> <Table.Cell> [SalesChannel](/references/sales-channel/models/SalesChannel) </Table.Cell> <Table.Cell> [StockLocation](/references/stock-location-next/models/StockLocation) in [Stock Location Module](../../stock-location/page.mdx) </Table.Cell> <Table.Cell> Stored - many-to-many </Table.Cell> <Table.Cell> [Learn more](#stock-location-module) </Table.Cell> </Table.Row> </Table.Body> </Table>A publishable API key allows you to easily specify the sales channel scope in a client request.
Medusa defines a link between the ApiKey and the SalesChannel data models.
To retrieve the API keys associated with a sales channel with Query, pass publishable_api_keys.* in fields:
const { data: salesChannels } = await query.graph({
entity: "sales_channel",
fields: [
"publishable_api_keys.*",
],
})
// salesChannels[0].publishable_api_keys
import { useQueryGraphStep } from "@medusajs/medusa/core-flows"
// ...
const { data: salesChannels } = useQueryGraphStep({
entity: "sales_channel",
fields: [
"publishable_api_keys.*",
],
})
// salesChannels[0].publishable_api_keys
To manage the sales channels of an API key, use Link:
<CodeTabs group="relation-link"> <CodeTab label="link.create" value="method">import { Modules } from "@medusajs/framework/utils"
// ...
await link.create({
[Modules.API_KEY]: {
publishable_key_id: "apk_123",
},
[Modules.SALES_CHANNEL]: {
sales_channel_id: "sc_123",
},
})
import { Modules } from "@medusajs/framework/utils"
import { createRemoteLinkStep } from "@medusajs/medusa/core-flows"
// ...
createRemoteLinkStep({
[Modules.API_KEY]: {
publishable_key_id: "apk_123",
},
[Modules.SALES_CHANNEL]: {
sales_channel_id: "sc_123",
},
})
Medusa defines a read-only link between the Cart Module's Cart data model and the SalesChannel data model. Because the link is read-only from the Cart's side, you can only retrieve the sales channel of a cart, and not the other way around.
To retrieve the sales channel of a cart with Query, pass sales_channel.* in fields:
const { data: carts } = await query.graph({
entity: "cart",
fields: [
"sales_channel.*",
],
})
// carts[0].sales_channel
import { useQueryGraphStep } from "@medusajs/medusa/core-flows"
// ...
const { data: carts } = useQueryGraphStep({
entity: "cart",
fields: [
"sales_channel.*",
],
})
// carts[0].sales_channel
Medusa defines a read-only link between the Order Module's Order data model and the SalesChannel data model. Because the link is read-only from the Order's side, you can only retrieve the sales channel of an order, and not the other way around.
To retrieve the sales channel of an order with Query, pass sales_channel.* in fields:
const { data: orders } = await query.graph({
entity: "order",
fields: [
"sales_channel.*",
],
})
// orders.sales_channel
import { useQueryGraphStep } from "@medusajs/medusa/core-flows"
// ...
const { data: orders } = useQueryGraphStep({
entity: "order",
fields: [
"sales_channel.*",
],
})
// orders.sales_channel
A product has different availability for different sales channels. Medusa defines a link between the Product and the SalesChannel data models.
A product can be available in more than one sales channel. You can retrieve only the products of a sales channel.
To retrieve the products of a sales channel with Query, pass products.* in fields:
const { data: salesChannels } = await query.graph({
entity: "sales_channel",
fields: [
"products.*",
],
})
// salesChannels[0].products
import { useQueryGraphStep } from "@medusajs/medusa/core-flows"
// ...
const { data: salesChannels } = useQueryGraphStep({
entity: "sales_channel",
fields: [
"products.*",
],
})
// salesChannels[0].products
To manage the sales channels of a product, use Link:
<CodeTabs group="relation-link"> <CodeTab label="link.create" value="method">import { Modules } from "@medusajs/framework/utils"
// ...
await link.create({
[Modules.PRODUCT]: {
product_id: "prod_123",
},
[Modules.SALES_CHANNEL]: {
sales_channel_id: "sc_123",
},
})
import { Modules } from "@medusajs/framework/utils"
import { createRemoteLinkStep } from "@medusajs/medusa/core-flows"
// ...
createRemoteLinkStep({
[Modules.PRODUCT]: {
product_id: "prod_123",
},
[Modules.SALES_CHANNEL]: {
sales_channel_id: "sc_123",
},
})
A stock location is associated with a sales channel. This scopes inventory quantities associated with that stock location by the associated sales channel.
Medusa defines a link between the SalesChannel and StockLocation data models.
To retrieve the stock locations of a sales channel with Query, pass stock_locations.* in fields:
const { data: salesChannels } = await query.graph({
entity: "sales_channel",
fields: [
"stock_locations.*",
],
})
// salesChannels[0].stock_locations
import { useQueryGraphStep } from "@medusajs/medusa/core-flows"
// ...
const { data: salesChannels } = useQueryGraphStep({
entity: "sales_channel",
fields: [
"stock_locations.*",
],
})
// salesChannels[0].stock_locations
To manage the stock locations of a sales channel, use Link:
<CodeTabs group="relation-link"> <CodeTab label="link.create" value="method">import { Modules } from "@medusajs/framework/utils"
// ...
await link.create({
[Modules.SALES_CHANNEL]: {
sales_channel_id: "sc_123",
},
[Modules.STOCK_LOCATION]: {
sales_channel_id: "sloc_123",
},
})
import { Modules } from "@medusajs/framework/utils"
import { createRemoteLinkStep } from "@medusajs/medusa/core-flows"
// ...
createRemoteLinkStep({
[Modules.SALES_CHANNEL]: {
sales_channel_id: "sc_123",
},
[Modules.STOCK_LOCATION]: {
sales_channel_id: "sloc_123",
},
})