docs: updates to use DML and other changes (#7834)

- Change existing data model guides and add new ones for DML
- Change module's docs around service factory + remove guides that are now necessary
- Hide/remove all mentions of module relationships, or label them as coming soon.
- Change all data model creation snippets to use DML
- use `property` instead of `field` when referring to a data model's properties.
- Fix all snippets in commerce module guides to use new method suffix (no more main model methods)
- Rework recipes, removing/hiding a lot of sections as a lot of recipes are incomplete with the current state of DML.


### Other changes

- Highlight fixes in some guides
- Remove feature flags guide
- Fix code block styles when there are no line numbers.

### Upcoming changes in other PRs

- Re-generate commerce module references (for the updates in the method names)
- Ensure that the data model references are generated correctly for models using DML.
- (probably at a very later point) revisit recipes
This commit is contained in:
Shahed Nasser authored and GitHub committed 2024-06-26 07:55:59 +00:00
1 parent 62dacdda75
commit 0462cc5acf
126 files changed
+1808 -14242

No files matched your search

@@ -12,7 +12,7 @@ There are two types of API keys:
- `publishable`: A public key used in client applications, such as a storefront.
- `secret`: A secret key used for authentication and verification purposes, such as an admin user’s authentication token or a password reset token.
The API key’s type is stored in the `type` field of the [ApiKey data model](/references/api-key/models/ApiKey).
The API key’s type is stored in the `type` property of the [ApiKey data model](/references/api-key/models/ApiKey).
---
@@ -25,7 +25,7 @@ In this guide, you’ll find common examples of how you can use the API Key Modu
const apiKeyModuleService: IApiKeyModuleService =
request.scope.resolve(ModuleRegistrationName.API_KEY)
const apiKey = await apiKeyModuleService.create({
const apiKey = await apiKeyModuleService.createApiKeys({
title: "Publishable API key",
type: "publishable",
created_by: "user_123",
@@ -50,7 +50,7 @@ In this guide, you’ll find common examples of how you can use the API Key Modu
export async function POST(request: Request) {
const apiKeyModuleService = await initializeApiKeyModule()
const apiKey = await apiKeyModuleService.create({
const apiKey = await apiKeyModuleService.createApiKeys({
title: "Publishable API key",
type: "publishable",
created_by: "user_123",
@@ -85,7 +85,7 @@ In this guide, you’ll find common examples of how you can use the API Key Modu
request.scope.resolve(ModuleRegistrationName.API_KEY)
res.json({
api_keys: await apiKeyModuleService.list(),
api_keys: await apiKeyModuleService.listApiKeys(),
})
}
```
@@ -104,7 +104,7 @@ In this guide, you’ll find common examples of how you can use the API Key Modu
const apiKeyModuleService = await initializeApiKeyModule()
return NextResponse.json({
api_keys: await apiKeyModuleService.list(),
api_keys: await apiKeyModuleService.listApiKeys(),
})
}
```
@@ -279,7 +279,7 @@ In this guide, you’ll find common examples of how you can use the API Key Modu
}
)
const newKey = await apiKeyModuleService.create({
const newKey = await apiKeyModuleService.createApiKeys({
title: revokedKey.title,
type: revokedKey.type,
created_by: revokedKey.created_by,
@@ -318,7 +318,7 @@ In this guide, you’ll find common examples of how you can use the API Key Modu
revoked_by: params.user_id,
})
const newKey = await apiKeyModuleService.create({
const newKey = await apiKeyModuleService.createApiKeys({
title: revokedKey.title,
type: revokedKey.type,
created_by: revokedKey.created_by,
@@ -19,13 +19,13 @@ Store and manage API keys in your store. You can create both publishable and sec
- Password reset tokens when a user or customer requests to reset their password.
```ts
const pubApiKey = await apiKeyModuleService.create({
const pubApiKey = await apiKeyModuleService.createApiKeys({
title: "Publishable API key",
type: "publishable",
created_by: "user_123",
})
const secretApiKey = await apiKeyModuleService.create({
const secretApiKey = await apiKeyModuleService.createApiKeys({
title: "Authentication Key",
type: "secret",
created_by: "user_123",
@@ -66,7 +66,7 @@ const revokedKey = await apiKeyModuleService.revoke("apk_1", {
revoked_by: "user_123",
})
const newKey = await apiKeyModuleService.create({
const newKey = await apiKeyModuleService.createApiKeys({
title: revokedKey.title,
type: revokedKey.type,
created_by: revokedKey.created_by,
@@ -97,7 +97,7 @@ For example:
request.scope.resolve(ModuleRegistrationName.API_KEY)
res.json({
api_keys: await apiKeyModuleService.list(),
api_keys: await apiKeyModuleService.listApiKeys(),
})
}
```
@@ -116,7 +116,7 @@ For example:
const apiKeyModuleService: IApiKeyModuleService =
container.resolve(ModuleRegistrationName.API_KEY)
const apiKeys = await apiKeyModuleService.list()
const apiKeys = await apiKeyModuleService.listApiKeys()
}
```
@@ -136,7 +136,7 @@ For example:
ModuleRegistrationName.API_KEY
)
const apiKeys = await apiKeyModuleService.list()
const apiKeys = await apiKeyModuleService.listApiKeys()
})
```
@@ -45,7 +45,7 @@ Then, the user is authenticated successfully, and their authentication details a
<Note>
Check out the [AuthIdentity](/references/auth/models/AuthIdentity) reference for the expected fields in `authIdentity`.
Check out the [AuthIdentity](/references/auth/models/AuthIdentity) reference for the expected properties in `authIdentity`.
</Note>
@@ -13,31 +13,18 @@ Before creating an actor type, you must define a data model the actor type belon
The rest of this guide uses this `Manager` data model as an example:
```ts title="src/modules/manager/models/manager.ts"
import { BaseEntity } from "@medusajs/utils"
import {
Entity,
PrimaryKey,
Property,
} from "@mikro-orm/core"
import { model } from "@medusajs/utils"
@Entity()
export class Manager extends BaseEntity {
@PrimaryKey({ columnType: "text" })
id!: string
const Manager = model.define("manager", {
id: model.id(),
firstName: model.text(),
lastName: model.text(),
email: model.text(),
})
@Property({ columnType: "text" })
first_name: string
@Property({ columnType: "text" })
last_name: string
@Property({ columnType: "text" })
email: string
}
export default Manager
```
The module’s main service must also have a `create` method to create a record of the `Manager` data model.
---
## 1. Create Workflow
@@ -45,7 +32,7 @@ The module’s main service must also have a `create` method to create a record
Start by creating a workflow that does two things:
- Create a record of the `Manager` data model.
- Sets the `app_metadata` field of the associated `AuthIdentity` record based on the new actor type.
- Sets the `app_metadata` property of the associated `AuthIdentity` record based on the new actor type.
For example, create the file `src/workflows/create-manager.ts`. with the following content:
@@ -92,7 +79,7 @@ const createManagerStep = createStep(
const managerModuleService: ManagerModuleService =
container.resolve("managerModuleService")
const manager = await managerModuleService.create(
const manager = await managerModuleService.createManager(
managerData
)
@@ -127,7 +114,7 @@ This workflow accepts the manager’s data and the associated auth identity’s
The workflow has two steps:
1. Create the manager using the `createManagerStep`.
2. Set the `app_metadata` field of the associated auth identity using the `setAuthAppMetadataStep` step imported from `@medusajs/core-flows`. You specify the actor type `manager` in the `actorType` property of the step’s input.
2. Set the `app_metadata` property of the associated auth identity using the `setAuthAppMetadataStep` step imported from `@medusajs/core-flows`. You specify the actor type `manager` in the `actorType` property of the step’s input.
---
@@ -250,13 +237,12 @@ export async function GET(
const managerModuleService: ManagerModuleService =
req.scope.resolve("managerModuleService")
const manager = await managerModuleService.retrieve(
const manager = await managerModuleService.retrieveManager(
req.auth_context.actor_id
)
res.json({ manager })
}
```
This route is only accessible by authenticated managers. You access the manager’s ID using `req.auth_context.actor_id`.
@@ -235,11 +235,12 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
const authModuleService: IAuthModuleService =
req.scope.resolve(ModuleRegistrationName.AUTH)
const authIdentity = await authModuleService.create({
provider: "emailpass",
entity_id: "user@example.com",
scope: "admin",
})
const authIdentity = await authModuleService
.createAuthIdentities({
provider: "emailpass",
entity_id: "user@example.com",
scope: "admin",
})
res.json({ auth_identity: authIdentity })
}
@@ -258,11 +259,12 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
export async function POST(request: Request) {
const authModuleService = await initializeAuthModule()
const authIdentity = await authModuleService.create({
provider: "emailpass",
entity_id: "user@example.com",
scope: "admin",
})
const authIdentity = await authModuleService
.createAuthIdentities({
provider: "emailpass",
entity_id: "user@example.com",
scope: "admin",
})
return NextResponse.json({
auth_identity: authIdentity,
@@ -293,7 +295,8 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
req.scope.resolve(ModuleRegistrationName.AUTH)
res.json({
auth_identitys: await authModuleService.list(),
auth_identitys:
await authModuleService.listAuthIdentities(),
})
}
```
@@ -312,7 +315,8 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
const authModuleService = await initializeAuthModule()
return NextResponse.json({
auth_identities: await authModuleService.list(),
auth_identities:
await authModuleService.listAuthIdentities(),
})
}
```
@@ -339,12 +343,13 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
const authModuleService: IAuthModuleService =
req.scope.resolve(ModuleRegistrationName.AUTH)
const authIdentity = await authModuleService.update({
id: "authusr_123",
provider_metadata: {
test: true,
},
})
const authIdentity = await authModuleService
.updateAuthIdentites({
id: "authusr_123",
provider_metadata: {
test: true,
},
})
res.json({
auth_identity: authIdentity,
@@ -374,15 +379,16 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
) {
const authModuleService = await initializeAuthModule()
const authIdentity = await authModuleService.update({
id: "authusr_123",
provider_metadata: {
test: true,
},
})
const authIdentity = await authModuleService
.updateAuthIdentites({
id: "authusr_123",
provider_metadata: {
test: true,
},
})
return NextResponse.json({
auth_identitys: await authModuleService.list(),
auth_identity: authIdentity,
})
}
```
@@ -409,7 +415,9 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
const authModuleService: IAuthModuleService =
req.scope.resolve(ModuleRegistrationName.AUTH)
await authModuleService.delete(["authusr_123"])
await authModuleService.deleteAuthIdentities([
"authusr_123",
])
res.status(200)
}
@@ -437,7 +445,9 @@ This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/j
) {
const authModuleService = await initializeAuthModule()
await authModuleService.delete(["authusr_123"])
await authModuleService.deleteAuthIdentities([
"authusr_123",
])
}
```
@@ -99,7 +99,8 @@ For example:
req.scope.resolve(ModuleRegistrationName.AUTH)
res.json({
authIdentitys: authModuleService.list(),
authIdentitys:
await authModuleService.listAuthIdentities(),
})
}
```
@@ -120,7 +121,8 @@ For example:
const authModuleService: IAuthModuleService =
container.resolve(ModuleRegistrationName.AUTH)
const authIdentitys = await authModuleService.list()
const authIdentitys = await authModuleService
.listAuthIdentities()
}
```
@@ -141,7 +143,8 @@ For example:
container.resolve(
ModuleRegistrationName.AUTH
)
const authIdentitys = await authModuleService.list()
const authIdentitys = await authModuleService
.listAuthIdentities()
})
```
@@ -18,7 +18,7 @@ A cart has a shipping and billing address. Both of these addresses are represent
A line item, represented by the `LineItem` data model, is a product variant added to the cart. A cart has multiple line items.
A line item stores some of the product variant’s fields, such as the `product_title` and `product_description`. It also stores data related to the item’s quantity and price.
A line item stores some of the product variant’s properties, such as the `product_title` and `product_description`. It also stores data related to the item’s quantity and price.
<Note>
@@ -36,8 +36,8 @@ If the shipping method is created from a shipping option, available through the
A shipping method can also be a custom method associated with this cart only.
### data Field
### data Property
After an order is placed, you may use a third-party fulfillment provider to fulfill its shipments. If the fulfillment provider requires additional custom data to be passed along from the checkout process, you can add this data in the `ShippingMethod`'s `data` field.
After an order is placed, you may use a third-party fulfillment provider to fulfill its shipments. If the fulfillment provider requires additional custom data to be passed along from the checkout process, you can add this data in the `ShippingMethod`'s `data` property.
The `data` field is an object used to store custom data relevant later for fulfillment.
The `data` property is an object used to store custom data relevant later for fulfillment.
@@ -25,7 +25,7 @@ In this guide, you’ll find common examples of how you can use the Cart Module
const cartModuleService: ICartModuleService =
req.scope.resolve(ModuleRegistrationName.CART)
const cart = await cartModuleService.create({
const cart = await cartModuleService.createCarts({
currency_code: "usd",
shipping_address: {
address_1: "1512 Barataria Blvd",
@@ -57,7 +57,7 @@ In this guide, you’ll find common examples of how you can use the Cart Module
export async function POST(request: Request) {
const cartModuleService = await initializeCartModule()
const cart = await cartModuleService.create({
const cart = await cartModuleService.createCarts({
currency_code: "usd",
shipping_address: {
address_1: "1512 Barataria Blvd",
@@ -100,7 +100,9 @@ In this guide, you’ll find common examples of how you can use the Cart Module
const cartModuleService: ICartModuleService =
req.scope.resolve(ModuleRegistrationName.CART)
const cart = await cartModuleService.retrieve("cart_123")
const cart = await cartModuleService.retrieveCart(
"cart_123"
)
res.json({ cart })
}
@@ -119,7 +121,9 @@ In this guide, you’ll find common examples of how you can use the Cart Module
export async function GET(request: Request) {
const cartModuleService = await initializeCartModule()
const cart = await cartModuleService.retrieve("cart_123")
const cart = await cartModuleService.retrieveCart(
"cart_123"
)
return NextResponse.json({
cart,
@@ -15,7 +15,7 @@ The Cart Module is the `@medusajs/cart` NPM package that provides cart-related f
Store and manage carts, including their addresses, line items, shipping methods, and more.
```ts
const cart = await cartModuleService.create({
const cart = await cartModuleService.createCarts({
currency_code: "usd",
shipping_address: {
address_1: "1512 Barataria Blvd",
@@ -76,7 +76,6 @@ For example:
import { MedusaRequest, MedusaResponse } from "@medusajs/medusa"
import { ICartModuleService } from "@medusajs/types"
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
import { res } from "express"
export async function GET(
req: MedusaRequest,
@@ -86,7 +85,7 @@ For example:
req.scope.resolve(ModuleRegistrationName.CART)
res.json({
carts: await cartModuleService.list(),
carts: await cartModuleService.listCarts(),
})
}
```
@@ -105,7 +104,7 @@ For example:
const cartModuleService: ICartModuleService =
container.resolve(ModuleRegistrationName.CART)
const carts = await cartModuleService.list()
const carts = await cartModuleService.listCarts()
}
```
@@ -125,7 +124,7 @@ For example:
ModuleRegistrationName.CART
)
const carts = await cartModuleService.list()
const carts = await cartModuleService.listCarts()
})
```
@@ -18,13 +18,13 @@ The `LineItemAdjustment` data model represents changes on a line item, and the `
![A diagram showcasing the relations between other data models and adjustment line models](https://res.cloudinary.com/dza7lstvk/image/upload/v1711534248/Medusa%20Resources/cart-adjustments_k4sttb.jpg)
The `amount` field of the adjustment line indicates the amount to be discounted from the original amount. Also, the ID of the applied promotion is stored in the `promotion_id` field of the adjustment line.
The `amount` property of the adjustment line indicates the amount to be discounted from the original amount. Also, the ID of the applied promotion is stored in the `promotion_id` property of the adjustment line.
---
## Discountable Option
The `LineItem` data model has an `is_discountable` field that indicates whether promotions can be applied to the line item. It’s enabled by default.
The `LineItem` data model has an `is_discountable` property that indicates whether promotions can be applied to the line item. It’s enabled by default.
When disabled, a promotion can’t be applied to a line item. In the context of the Promotion Module, the promotion isn’t applied to the line item even if it matches its rules.
@@ -50,7 +50,7 @@ import {
} from "@medusajs/types"
// retrieve the cart
const cart = await cartModuleService.retrieve("cart_123", {
const cart = await cartModuleService.retrieveCart("cart_123", {
relations: [
"items.adjustments",
"shipping_methods.adjustments",
@@ -18,7 +18,7 @@ A tax line indicates the tax rate of a line item or a shipping method. The [Line
By default, the tax amount is calculated by taking the tax rate from the line item or shipping method’s amount, and then added to the item/method’s subtotal.
However, line items and shipping methods have an `is_tax_inclusive` field that, when enabled, indicates that the item or method’s price already includes taxes.
However, line items and shipping methods have an `is_tax_inclusive` property that, when enabled, indicates that the item or method’s price already includes taxes.
So, instead of calculating the tax rate and adding it to the item/method’s subtotal, it’s calculated as part of the subtotal.
@@ -38,7 +38,7 @@ When using the Cart and Tax modules together, you can use the `getTaxLines` meth
```ts
// retrieve the cart
const cart = await cartModuleService.retrieve("cart_123", {
const cart = await cartModuleService.retrieveCart("cart_123", {
relations: [
"items.tax_lines",
"shipping_methods.tax_lines",
@@ -26,7 +26,7 @@ In this guide, you’ll find common examples of how you can use the Currency Mod
req.scope.resolve(ModuleRegistrationName.CURRENCY)
res.json({
currencies: await currencyModuleService.list(),
currencies: await currencyModuleService.listCurrencies(),
})
}
```
@@ -42,10 +42,11 @@ In this guide, you’ll find common examples of how you can use the Currency Mod
} from "@medusajs/currency"
export async function GET(request: Request) {
const currencyModuleService = await initializeCurrencyModule()
const currencyModuleService =
await initializeCurrencyModule()
return NextResponse.json({
currencies: await currencyModuleService.list(),
currencies: await currencyModuleService.listCurrencies(),
})
}
```
@@ -72,7 +73,8 @@ In this guide, you’ll find common examples of how you can use the Currency Mod
const currencyModuleService: ICurrencyModuleService =
req.scope.resolve(ModuleRegistrationName.CURRENCY)
const currency = await currencyModuleService.retrieve("usd")
const currency = await currencyModuleService
.retrieveCurrency("usd")
res.json({
currency,
@@ -95,7 +97,8 @@ In this guide, you’ll find common examples of how you can use the Currency Mod
) {
const currencyModuleService = await initializeCurrencyModule()
const currency = await currencyModuleService.retrieve("usd")
const currency = await currencyModuleService
.retrieveCurrency("usd")
return NextResponse.json({ currency })
}
@@ -15,7 +15,9 @@ The Currency Module is the `@medusajs/currency` NPM package that provides curren
List and retrieve currencies stored in your application.
```ts
const currency = await currencyModuleService.retrieve("usd")
const currency = await currencyModuleService.retrieveCurrency(
"usd"
)
```
### Support Currencies in Modules
@@ -25,8 +27,10 @@ Other commerce modules use currency codes in their data models or operations. Yo
An example with the Region Module:
```ts
const region = await regionModuleService.retrieve("reg_123")
const currency = await currencyModuleService.retrieve(
const region = await regionModuleService.retrieveCurrency(
"reg_123"
)
const currency = await currencyModuleService.retrieveCurrency(
region.currency_code
)
```
@@ -55,7 +59,7 @@ For example:
req.scope.resolve(ModuleRegistrationName.CURRENCY)
res.json({
currencies: await currencyModuleService.list(),
currencies: await currencyModuleService.listCurrencies(),
})
}
```
@@ -74,7 +78,8 @@ For example:
const currencyModuleService: ICurrencyModuleService =
container.resolve(ModuleRegistrationName.CURRENCY)
const currencies = await currencyModuleService.list()
const currencies = await currencyModuleService
.listCurrencies()
}
```
@@ -94,7 +99,8 @@ For example:
ModuleRegistrationName.CURRENCY
)
const currencies = await currencyModuleService.list()
const currencies = await currencyModuleService
.listCurrencies()
})
```
@@ -6,9 +6,9 @@ export const metadata = {
In this document, you’ll learn how registered and unregistered accounts are distinguished in the Medusa application.
## `has_account` field
## `has_account` Property
The [Customer data model](/references/customer/models/Customer) has a `has_account` field, which is a boolean that indicates whether a customer is registerd.
The [Customer data model](/references/customer/models/Customer) has a `has_account` property, which is a boolean that indicates whether a customer is registerd.
When a guest customer places an order, a new `Customer` record is created with `has_account` set to `false`.
@@ -18,6 +18,6 @@ When this or another guest customer registers an account with the same email, a
## Email Uniqueness
The above behavior means that two `Customer` records may exist of the same email. However, the main difference is the `has_account` field’s value.
The above behavior means that two `Customer` records may exist of the same email. However, the main difference is the `has_account` property's value.
So, there can only be one guest customer (having `has_account=false`) and one registered customer (having `has_account=true`) with the same email.
@@ -25,7 +25,7 @@ In this guide, you’ll find common examples of how you can use the Customer Mod
const customerModuleService: ICustomerModuleService =
request.scope.resolve(ModuleRegistrationName.CUSTOMER)
const customer = await customerModuleService.create({
const customer = await customerModuleService.createCustomers({
first_name: "Peter",
last_name: "Hayes",
email: "peter.hayes@example.com",
@@ -50,7 +50,7 @@ In this guide, you’ll find common examples of how you can use the Customer Mod
export async function POST(request: Request) {
const customerModuleService = await initializeCustomerModule()
const customer = await customerModuleService.create({
const customer = await customerModuleService.createCustomers({
first_name: "Peter",
last_name: "Hayes",
email: "peter.hayes@example.com",
@@ -85,7 +85,7 @@ In this guide, you’ll find common examples of how you can use the Customer Mod
request.scope.resolve(ModuleRegistrationName.CUSTOMER)
const customerGroup =
await customerModuleService.createCustomerGroup({
await customerModuleService.createCustomerGroups({
name: "VIP",
})
@@ -109,7 +109,7 @@ In this guide, you’ll find common examples of how you can use the Customer Mod
const customerModuleService = await initializeCustomerModule()
const customerGroup =
await customerModuleService.createCustomerGroup({
await customerModuleService.createCustomerGroups({
name: "VIP",
})
@@ -15,7 +15,7 @@ The Customer Module is the `@medusajs/customer` NPM package that provides custom
With the Customer Module, store and manage customers in your store.
```ts
const customer = await customerModuleService.create({
const customer = await customerModuleService.createCustomers({
first_name: "Peter",
last_name: "Hayes",
email: "peter.hayes@example.com",
@@ -28,7 +28,7 @@ You can organize customers into groups. This has a lot of benefits and supports
```ts
const customerGroup =
await customerModuleService.createCustomerGroup({
await customerModuleService.createCustomerGroups({
name: "VIP",
})
@@ -62,7 +62,7 @@ For example:
request.scope.resolve(ModuleRegistrationName.CUSTOMER)
res.json({
customers: await customerModuleService.list(),
customers: await customerModuleService.listCustomers(),
})
}
```
@@ -81,7 +81,7 @@ For example:
const customerModuleService: ICustomerModuleService =
container.resolve(ModuleRegistrationName.CUSTOMER)
const customers = await customerModuleService.list()
const customers = await customerModuleService.listCustomers()
}
```
@@ -99,7 +99,7 @@ For example:
const customerModuleService: ICustomerModuleService =
container.resolve(ModuleRegistrationName.CUSTOMER)
const customers = await customerModuleService.list()
const customers = await customerModuleService.listCustomers()
})
```
@@ -22,11 +22,11 @@ The fulfillment is also associated with a shipping option of that provider, whic
---
## data Field
## data Property
The `Fulfillment` data model has a `data` field that holds any necessary data for the third-party fulfillment provider to process the fulfillment.
The `Fulfillment` data model has a `data` property that holds any necessary data for the third-party fulfillment provider to process the fulfillment.
For example, the `data` field can hold the ID of the fulfillment in the third-party provider. The associated fulfillment provider then uses it whenever it retrieves the fulfillment’s details.
For example, the `data` property can hold the ID of the fulfillment in the third-party provider. The associated fulfillment provider then uses it whenever it retrieves the fulfillment’s details.
---
@@ -48,7 +48,7 @@ Once a shipment is created for the fulfillment, you can store its tracking numbe
## Fulfillment Status
The `Fulfillment` data model has three fields to keep track of the current status of the fulfillment:
The `Fulfillment` data model has three properties to keep track of the current status of the fulfillment:
- `packed_at`: The date the fulfillment was packed. If set, then the fulfillment has been packed.
- `shipped_at`: The date the fulfillment was shipped. If set, then the fulfillment has been shipped.
@@ -34,9 +34,9 @@ Service zones can be more restrictive, such as restricting to certain cities or
You can restrict shipping options by custom rules, such as the item’s weight or the customer’s group.
These rules are represented by the [ShippingOptionRule data model](/references/fulfillment/models/ShippingOptionRule). Its fields define the custom rule:
These rules are represented by the [ShippingOptionRule data model](/references/fulfillment/models/ShippingOptionRule). Its properties define the custom rule:
- `attribute`: The name of a field or table that the rule applies to. For example, `customer_group`.
- `attribute`: The name of a property or table that the rule applies to. For example, `customer_group`.
- `operator`: The operator used in the condition. For example:
- To allow multiple values, use the operator `in`, which validates that the provided values are in the rule’s values.
- To create a negation condition that considers `value` against the rule, use `nin`, which validates that the provided values aren’t in the rule’s values.
@@ -59,8 +59,8 @@ A shipping option also belongs to a shipping profile, as each shipping profile d
---
## data Field
## data Property
When fulfilling an item, you might use a third-party fulfillment provider that requires additional custom data to be passed along from the checkout or order-creation process.
The `ShippingOption` data model has a `data` field. It's an object that stores custom data relevant later when creating and processing a fulfillment.
The `ShippingOption` data model has a `data` property. It's an object that stores custom data relevant later when creating and processing a fulfillment.
@@ -20,15 +20,15 @@ The `InventoryItem` data model mainly holds details related to the underlying st
An inventory level, represented by the [InventoryLevel data model](/references/inventory/models/InventoryLevel), holds the inventory and quantity details of an inventory item in a specific location.
It has three quantity-related fields:
It has three quantity-related properties:
- `stocked_quantity`: The available stock quantity of an item in the associated location.
- `reserved_quantity`: The quantity reserved from the available `stocked_quantity`. It indicates the quantity that's still not removed from stock, but considered as unavailable when checking whether an item is in stock.
- `incoming_quantity`: The incoming stock quantity of an item into the associated location. This field doesn't play into the `stocked_quantity` or when checking whether an item is in stock.
- `incoming_quantity`: The incoming stock quantity of an item into the associated location. This property doesn't play into the `stocked_quantity` or when checking whether an item is in stock.
### Associated Location
The inventory level's location is determined by the `location_id` field. Medusa links the `InventoryLevel` data model with the `StockLocation` data model from the Stock Location Module.
The inventory level's location is determined by the `location_id` property. Medusa links the `InventoryLevel` data model with the `StockLocation` data model from the Stock Location Module.
---
@@ -26,7 +26,7 @@ In this document, you’ll find common examples of how you can use the Inventory
request.scope.resolve(ModuleRegistrationName.INVENTORY)
const inventoryItem =
await inventoryModuleService.create({
await inventoryModuleService.createInventoryItems({
sku: request.body.sku,
title: request.body.title,
requires_shipping: request.body.requires_shipping,
@@ -52,7 +52,7 @@ In this document, you’ll find common examples of how you can use the Inventory
const body = await request.json()
const inventoryItem =
await inventoryModuleService.create({
await inventoryModuleService.createInventoryItems({
sku: body.sku,
title: body.title,
requires_shipping: body.requires_shipping,
@@ -85,7 +85,7 @@ In this document, you’ll find common examples of how you can use the Inventory
request.scope.resolve(ModuleRegistrationName.INVENTORY)
const inventoryItems =
await inventoryModuleService.list({})
await inventoryModuleService.listInventoryItems({})
res.json({ inventory_items: inventoryItems })
}
@@ -106,7 +106,7 @@ In this document, you’ll find common examples of how you can use the Inventory
await initializeInventoryModule({})
const inventoryItems =
await inventoryModuleService.list({})
await inventoryModuleService.listInventoryItems({})
return NextResponse.json({ inventory_items: inventoryItems })
}
@@ -135,7 +135,7 @@ In this document, you’ll find common examples of how you can use the Inventory
request.scope.resolve(ModuleRegistrationName.INVENTORY)
const inventoryItem =
await inventoryModuleService.retrieve(
await inventoryModuleService.retrieveInventoryItem(
request.params.id
)
@@ -167,7 +167,7 @@ In this document, you’ll find common examples of how you can use the Inventory
await initializeInventoryModule({})
const inventoryItem =
await inventoryModuleService.retrieve(
await inventoryModuleService.retrieveInventoryItem(
params.id
)
@@ -8,7 +8,7 @@ This document explains how the Inventory Module is used within the Medusa applic
## Product Variant Creation
When a product variant is created and its `manage_inventory` field's value is `true`, the Medusa application creates an inventory item associated with that product variant.
When a product variant is created and its `manage_inventory` property's value is `true`, the Medusa application creates an inventory item associated with that product variant.
![A diagram showcasing how the Inventory Module is used in the product variant creation form](https://res.cloudinary.com/dza7lstvk/image/upload/v1709661511/Medusa%20Resources/inventory-product-create_khz2hk.jpg)
@@ -32,7 +32,7 @@ When an order is placed, the Medusa application creates a reservation item for e
## Order Fulfillment
When an item in an order is fulfilled and the associated variant has its `manage_inventory` field set to `true`, the Medusa application:
When an item in an order is fulfilled and the associated variant has its `manage_inventory` property set to `true`, the Medusa application:
- Subtracts the `reserved_quantity` from the `stocked_quantity` in the inventory level associated with the variant's inventory item.
- Resets the `reserved_quantity` to `0`.
@@ -44,6 +44,6 @@ When an item in an order is fulfilled and the associated variant has its `manage
## Order Return
When an item in an order is returned and the associated variant has its `manage_inventory` field set to `true`, the Medusa application increments the `stocked_quantity` of the inventory item's level with the returned quantity.
When an item in an order is returned and the associated variant has its `manage_inventory` property set to `true`, the Medusa application increments the `stocked_quantity` of the inventory item's level with the returned quantity.
![A diagram showcasing how the Inventory Module is used in the order return flow](https://res.cloudinary.com/dza7lstvk/image/upload/v1709712457/Medusa%20Resources/inventory-order-return_ihftyk.jpg)
@@ -18,7 +18,7 @@ Inventory items hold details of the underlying stock-kept item, as well as inven
```ts
const inventoryItem =
await inventoryModuleService.create({
await inventoryModuleService.createInventoryItems({
sku: "SHIRT",
title: "Green Medusa Shirt",
requires_shipping: true,
@@ -89,7 +89,7 @@ For example:
res.json({
inventory_items:
await inventoryModuleService.list({}),
await inventoryModuleService.listInventoryItems({}),
})
}
```
@@ -109,7 +109,7 @@ For example:
container.resolve(ModuleRegistrationName.INVENTORY)
const inventoryItems =
await inventoryModuleService.list({})
await inventoryModuleService.listInventoryItems({})
}
```
@@ -128,7 +128,7 @@ For example:
container.resolve(ModuleRegistrationName.INVENTORY)
const inventoryItems =
await inventoryModuleService.list({})
await inventoryModuleService.listInventoryItems({})
})
```
@@ -12,7 +12,7 @@ Each product variant has different inventory details. Medusa defines a link modu
![A diagram showcasing an example of how data models from the Inventory and Product Module are linked.](https://res.cloudinary.com/dza7lstvk/image/upload/v1709658720/Medusa%20Resources/inventory-product_ejnray.jpg)
A product variant, whose `manage_inventory` field is enabled, has an associated inventory item. Through that inventory's items relations in the Inventory Module, you can manage and check the variant's inventory quantity.
A product variant, whose `manage_inventory` property is enabled, has an associated inventory item. Through that inventory's items relations in the Inventory Module, you can manage and check the variant's inventory quantity.
---
@@ -22,13 +22,13 @@ The details of the purchased products are represented by the [LineItem data mode
An order has one or more shipping methods used to handle item shipment. Each shipping method is represented by the [ShippingMethod data model](/references/order/models/ShippingMethod) that holds its details.
### data Field
### data Property
When fulfilling the order, you may use a third-party fulfillment provider that requires additional custom data to be passed along from the order creation process.
The `ShippingMethod` data model has a `data` field. It’s an object used to store custom data relevant later for fulfillment.
The `ShippingMethod` data model has a `data` property. It’s an object used to store custom data relevant later for fulfillment.
The Medusa application passes the `data` field to the Fulfillment Module when fulfilling items.
The Medusa application passes the `data` property to the Fulfillment Module when fulfilling items.
---
@@ -35,7 +35,7 @@ Each of these actions is represented by the [OrderChangeAction data model](/refe
### Action Name
The `action` field of the `OrderChangeAction` holds the name of the action to perform. Based on the action, additional details are stored in the `details` object field of the data model.
The `action` property of the `OrderChangeAction` holds the name of the action to perform. Based on the action, additional details are stored in the `details` object property of the data model.
<Table>
<Table.Header>
@@ -162,7 +162,7 @@ The `action` field of the `OrderChangeAction` holds the name of the action to pe
Mark as received an item whose return was previously requested, but consider the items damaged.
This changes the order item’s `return_dismissed_quantity` field rather than its `return_received_quantity` field.
This changes the order item’s `return_dismissed_quantity` property rather than its `return_received_quantity` property.
</Table.Cell>
<Table.Cell>
@@ -223,7 +223,7 @@ The `action` field of the `OrderChangeAction` holds the name of the action to pe
</Table.Cell>
<Table.Cell>
Mark a quantity of an item as shipped. This modifies the shipped_quantity field of an order item.
Mark a quantity of an item as shipped. This modifies the `shipped_quantity` property of an order item.
</Table.Cell>
<Table.Cell>
@@ -243,7 +243,7 @@ The `action` field of the `OrderChangeAction` holds the name of the action to pe
</Table.Cell>
<Table.Cell>
Mark a quantity of an item as fulfilled. This modifies the fulfilled_quantity field of an order item.
Mark a quantity of an item as fulfilled. This modifies the `fulfilled_quantity` property of an order item.
</Table.Cell>
<Table.Cell>
@@ -277,7 +277,7 @@ The `action` field of the `OrderChangeAction` holds the name of the action to pe
## Order Change Confirmation
The `OrderChange` data model has a `status` field that indicates its current status. By default, it’s pending. At this point, the order change’s actions aren’t applied to the order yet.
The `OrderChange` data model has a `status` property that indicates its current status. By default, it’s pending. At this point, the order change’s actions aren’t applied to the order yet.
To apply these changes to the order, you confirm the order change. When the order change is confirmed:
@@ -12,17 +12,17 @@ Versioning means assigning a version number to a record, such as an order and it
---
## version Field
## version Property
The `Order` and `OrderSummary` data models have a `version` field that indicates the current order version. By default, its value is `1`.
The `Order` and `OrderSummary` data models have a `version` property that indicates the current order version. By default, its value is `1`.
The `OrderItem` data model also has a `version` field, but it indicates the version it belongs to. For example, original items in the order have version `1`. Then, when a new item is added, its version is `2`. If an existing item is modified, such as its quantity has been changed, its version is updated.
The `OrderItem` data model also has a `version` property, but it indicates the version it belongs to. For example, original items in the order have version `1`. Then, when a new item is added, its version is `2`. If an existing item is modified, such as its quantity has been changed, its version is updated.
---
## Order Change Versioning
The `OrderChange` and `OrderChangeAction` data models also have a `version` field. When an order change is created, the `version` field’s value is the associated order’s version incremented.
The `OrderChange` and `OrderChangeAction` data models also have a `version` property. When an order change is created, the `version` property’s value is the associated order’s version incremented.
So, if the order’s `version` is `1`, the order change’s version is `2`.
@@ -15,7 +15,7 @@ The Order Module is the `@medusajs/order` NPM package that provides order-relate
Store and manage your orders to retriev, create, cancel, and perform other operations.
```ts
const order = await orderModuleService.create({
const order = await orderModuleService.createOrders({
currency_code: "usd",
items: [
{
@@ -38,7 +38,7 @@ const order = await orderModuleService.create({
Allow merchants to create orders on behalf of their customers as draft orders that later are transformed to regular orders.
```ts
const draftOrder = await orderModuleService.create({
const draftOrder = await orderModuleService.createOrders({
currency_code: "usd",
// other details...
status: "draft",
@@ -122,7 +122,7 @@ For example:
req.scope.resolve(ModuleRegistrationName.ORDER)
res.json({
orders: await orderModuleService.list(),
orders: await orderModuleService.listOrders(),
})
}
```
@@ -141,7 +141,7 @@ For example:
const orderModuleService: IOrderModuleService =
container.resolve(ModuleRegistrationName.ORDER)
const orders = await orderModuleService.list()
const orders = await orderModuleService.listOrders()
}
```
@@ -160,7 +160,7 @@ For example:
container.resolve(
ModuleRegistrationName.ORDER
)
const orders = await orderModuleService.list()
const orders = await orderModuleService.listOrders()
})
```
@@ -18,13 +18,13 @@ The [LineItemAdjustment data model](/references/order/models/LineItemAdjustment)
![A diagram showcasing the relation between an order, its items and shipping methods, and their adjustment lines](https://res.cloudinary.com/dza7lstvk/image/upload/v1712306017/Medusa%20Resources/order-adjustments_myflir.jpg)
The `amount` field of the adjustment line indicates the amount to be discounted from the original amount. Also, the ID of the applied promotion can be stored in the `promotion_id` field of the adjustment line.
The `amount` property of the adjustment line indicates the amount to be discounted from the original amount. Also, the ID of the applied promotion can be stored in the `promotion_id` property of the adjustment line.
---
## Discountable Option
The `LineItem` data model has an `is_discountable` field that indicates whether promotions can be applied to the line item. It’s enabled by default.
The `LineItem` data model has an `is_discountable` property that indicates whether promotions can be applied to the line item. It’s enabled by default.
When disabled, a promotion can’t be applied to a line item. In the context of the Promotion Module, the promotion isn’t applied to the line item even if it matches its rules.
@@ -52,7 +52,7 @@ import {
// ...
// retrieve the order
const order = await orderModuleService.retrieve("ord_123", {
const order = await orderModuleService.retrieveOrder("ord_123", {
relations: [
"items.item.adjustments",
"shipping_methods.adjustments",
@@ -22,7 +22,7 @@ A tax line indicates the tax rate of a line item or a shipping method. The [Line
By default, the tax amount is calculated by taking the tax rate from the line item or shipping method’s amount and then adding it to the item/method’s subtotal.
However, line items and shipping methods have an `is_tax_inclusive` field that, when enabled, indicates that the item or method’s price already includes taxes.
However, line items and shipping methods have an `is_tax_inclusive` property that, when enabled, indicates that the item or method’s price already includes taxes.
So, instead of calculating the tax rate and adding it to the item/method’s subtotal, it’s calculated as part of the subtotal.
@@ -18,7 +18,7 @@ The transaction’s main purpose is to ensure a correct balance between paid and
## Checking Outstanding Amount
The order’s total is stored in the `OrderSummary`'s `total` field. To check the outstanding amount of the order, its transaction amounts are summed. Then, the following conditions are checked:
The order’s total is stored in the `OrderSummary`'s `total` property. To check the outstanding amount of the order, its transaction amounts are summed. Then, the following conditions are checked:
<Table>
<Table.Header>
@@ -73,7 +73,7 @@ The order’s total is stored in the `OrderSummary`'s `total` field. To check th
The Order Module doesn’t provide payment processing functionalities, so it doesn’t store payments that can be processed. For that, use the Payment Module or custom logic.
The `Transaction` data model has two fields that determine which data model and record holds the actual payment’s details:
The `Transaction` data model has two properties that determine which data model and record holds the actual payment’s details:
- `reference`: indicates the table’s name in the database. For example, `payment` if you’re using the Payment Module.
- `reference_id`: indicates the ID of the record in the table. For example, `pay_123`.
@@ -16,17 +16,17 @@ A payment collection can have multiple payment sessions. For example, during che
---
## data field
## data Property
Payment providers may need additional data to process the payment later. The `PaymentSession` data model has a `data` field used to store that data.
Payment providers may need additional data to process the payment later. The `PaymentSession` data model has a `data` property used to store that data.
For example, the customer's ID in Stripe is stored in the `data` field.
For example, the customer's ID in Stripe is stored in the `data` property.
---
## Payment Session Status
The `status` field of a payment session indicates its current status. Its value can be:
The `status` property of a payment session indicates its current status. Its value can be:
- `pending`: The payment session is awaiting authorization.
- `requires_more`: The payment session requires an action before it’s authorized. For example, to enter a 3DS code.
@@ -14,7 +14,7 @@ A payment carries along many of the data and relations of a payment session:
- It belongs to the same payment collection.
- It’s associated with the same payment provider, which handles further payment processing.
- It stores the payment session’s `data` field in its `data` field, as it’s still useful for the payment provider’s processing.
- It stores the payment session’s `data` property in its `data` property, as it’s still useful for the payment provider’s processing.
---
@@ -18,7 +18,7 @@ A [PriceSet](/references/pricing/models/PriceSet) represents a collection of pri
Each price within a price set can be applied for different conditions. These conditions are represented as rule types.
A [RuleType](/references/pricing/models/RuleType) defines custom conditions. A rule type has a unique `rule_attribute` which indicates the field this rule applies on. For example, `region_id`.
A [RuleType](/references/pricing/models/RuleType) defines custom conditions. A rule type has a unique `rule_attribute` which indicates the property this rule applies on. For example, `region_id`.
This is referenced when setting a rule of a price. For example:
@@ -46,6 +46,6 @@ const priceSet = await pricingModuleService.addPrices({
## Price List
A [PriceList](/references/pricing/models/PriceList) is a group of prices only enabled if their conditions and rules are satisfied. A price list has optional `start_date` and `end_date` fields, which indicate the date range in which a price list can be applied.
A [PriceList](/references/pricing/models/PriceList) is a group of prices only enabled if their conditions and rules are satisfied. A price list has optional `start_date` and `end_date` properties, which indicate the date range in which a price list can be applied.
Its associated prices are represented by the `Price` data model.
@@ -27,7 +27,7 @@ In this document, you’ll find common examples of how you can use the Pricing M
// A rule type with \`rule_field=region_id\` should
// already be present in the database
const priceSet = await pricingModuleService.create([
const priceSet = await pricingModuleService.createPriceSets([
{
rules: [{ rule_field: "region_id" }],
prices: [
@@ -62,7 +62,7 @@ In this document, you’ll find common examples of how you can use the Pricing M
// A rule type with \`rule_field=region_i\` should
// already be present in the database
const priceSet = await pricingModuleService.create([
const priceSet = await pricingModuleService.createPriceSets([
{
rules: [{ rule_field: "region_id" }],
prices: [
@@ -103,7 +103,7 @@ In this document, you’ll find common examples of how you can use the Pricing M
const pricingModuleService: IPricingModuleService =
request.scope.resolve(ModuleRegistrationName.PRICING)
const priceSets = await pricingModuleService.list()
const priceSets = await pricingModuleService.listPriceSets()
res.json({ price_sets: priceSets })
}
@@ -122,7 +122,7 @@ In this document, you’ll find common examples of how you can use the Pricing M
export async function GET(request: Request) {
const pricingModuleService = await initializePricingModule()
const priceSets = await pricingModuleService.list()
const priceSets = await pricingModuleService.listPriceSets()
return NextResponse.json({ price_sets: priceSets })
}
@@ -150,7 +150,7 @@ In this document, you’ll find common examples of how you can use the Pricing M
const pricingModuleService: IPricingModuleService =
request.scope.resolve(ModuleRegistrationName.PRICING)
const priceSet = await pricingModuleService.retrieve(
const priceSet = await pricingModuleService.retrievePriceSet(
request.params.id
)
@@ -180,7 +180,7 @@ In this document, you’ll find common examples of how you can use the Pricing M
) {
const pricingModuleService = await initializePricingModule()
const priceSet = await pricingModuleService.retrieve(
const priceSet = await pricingModuleService.retrievePriceSet(
params.id
)
@@ -17,7 +17,7 @@ With the Pricing Module, store the prices of a resource and manage them through
Prices are grouped in a price set, allowing you to add more than one price for a resource based on different conditions, such as currency code.
```ts
const priceSet = await pricingModuleService.create({
const priceSet = await pricingModuleService.createPriceSets({
rules: [],
prices: [
{
@@ -124,7 +124,7 @@ For example:
request.scope.resolve(ModuleRegistrationName.PRICING)
res.json({
price_sets: await pricingModuleService.list(),
price_sets: await pricingModuleService.listPriceSets(),
})
}
```
@@ -143,7 +143,7 @@ For example:
const pricingModuleService: IPricingModuleService =
container.resolve(ModuleRegistrationName.PRICING)
const priceSets = await pricingModuleService.list()
const priceSets = await pricingModuleService.listPriceSets()
}
```
@@ -161,7 +161,7 @@ For example:
const pricingModuleService: IPricingModuleService =
container.resolve(ModuleRegistrationName.PRICING)
const priceSets = await pricingModuleService.list()
const priceSets = await pricingModuleService.listPriceSets()
})
```
@@ -178,7 +178,7 @@ const ruleTypes = await pricingModuleService.createRuleTypes([
},
])
const priceSet = await pricingModuleService.create({
const priceSet = await pricingModuleService.createPriceSets({
rules: [
{ rule_attribute: "region_id" },
{ rule_attribute: "city" },
@@ -422,7 +422,7 @@ const priceSet = await pricingModuleService.create({
<TabsContent value="code">
```ts
const priceList = pricingModuleService.createPriceList({
const priceList = pricingModuleService.createPriceLists({
name: "Test Price List",
starts_at: Date.parse("01/10/2023"),
ends_at: Date.parse("31/10/2023"),
@@ -8,7 +8,7 @@ In this document, you'll learn about price rules for price sets and price lists.
## Price Rule
Each rule of a price within a price set is represented by the [PriceRule data model](/references/pricing/models/PriceRule), which holds the value of a rule type. The `Price` data model has a `rules_count` field, which indicates how many rules, represented by `PriceRule`, are applied to the price.
Each rule of a price within a price set is represented by the [PriceRule data model](/references/pricing/models/PriceRule), which holds the value of a rule type. The `Price` data model has a `rules_count` property, which indicates how many rules, represented by `PriceRule`, are applied to the price.
![A diagram showcasing the relation between the PriceRule, PriceSet, Price, and RuleType.](https://res.cloudinary.com/dza7lstvk/image/upload/v1709648772/Medusa%20Resources/price-rule-1_vy8bn9.jpg)
@@ -40,7 +40,7 @@ For example, to use the `zip_code` rule type on a price in a price set, the rule
## Price List Rules
Rules that can be applied to a price list are represented by the [PriceListRule data model](/references/pricing/models/PriceListRule). The `rules_count` field of a `PriceList` indicates how many rules are applied to it.
Rules that can be applied to a price list are represented by the [PriceListRule data model](/references/pricing/models/PriceListRule). The `rules_count` property of a `PriceList` indicates how many rules are applied to it.
Each rule of a price list can have more than one value, representing its values by the [PriceListRuleValue data model](/references/pricing/models/PriceListRuleValue).
@@ -25,7 +25,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const productModuleService: IProductModuleService =
request.scope.resolve(ModuleRegistrationName.PRODUCT)
const products = await productModuleService.create([
const products = await productModuleService.createProducts([
{
title: "Medusa Shirt",
options: [
@@ -63,7 +63,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
export async function POST(request: Request) {
const productModuleService = await initializeProductModule()
const products = await productModuleService.create([
const products = await productModuleService.createProducts([
{
title: "Medusa Shirt",
options: [
@@ -110,7 +110,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const productModuleService: IProductModuleService =
request.scope.resolve(ModuleRegistrationName.PRODUCT)
const products = await productModuleService.list()
const products = await productModuleService.listProducts()
res.json({ products })
}
@@ -129,7 +129,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
export async function GET(request: Request) {
const productModuleService = await initializeProductModule()
const products = await productModuleService.list()
const products = await productModuleService.listProducts()
return NextResponse.json({ products })
}
@@ -157,7 +157,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const productModuleService: IProductModuleService =
request.scope.resolve(ModuleRegistrationName.PRODUCT)
const product = await productModuleService.retrieve(
const product = await productModuleService.retrieveProduct(
request.params.id
)
@@ -182,7 +182,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const { id } = params
const productModuleService = await initializeProductModule()
const product = await productModuleService.retrieve(
const product = await productModuleService.retrieveProduct(
id
)
@@ -212,7 +212,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const productModuleService: IProductModuleService =
request.scope.resolve(ModuleRegistrationName.PRODUCT)
const data = await productModuleService.list({
const data = await productModuleService.listProducts({
handle: "shirt",
})
@@ -233,7 +233,7 @@ In this guide, you’ll find common examples of how you can use the Product Modu
export async function GET(request: Request) {
const productModuleService = await initializeProductModule()
const data = await productModuleService.list({
const data = await productModuleService.listProducts({
handle: "shirt",
})
@@ -263,7 +263,8 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const productModuleService: IProductModuleService =
request.scope.resolve(ModuleRegistrationName.PRODUCT)
const categories = await productModuleService.listCategories()
const categories = await productModuleService
.listProductCategories()
res.json({ categories })
}
@@ -282,7 +283,8 @@ In this guide, you’ll find common examples of how you can use the Product Modu
export async function GET(request: Request) {
const productModuleService = await initializeProductModule()
const categories = await productModuleService.listCategories()
const categories = await productModuleService
.listProductCategories()
return NextResponse.json({ categories })
}
@@ -310,9 +312,10 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const productModuleService: IProductModuleService =
request.scope.resolve(ModuleRegistrationName.PRODUCT)
const data = await productModuleService.listCategories({
handle: request.params.handle,
})
const data = await productModuleService
.listProductCategories({
handle: request.params.handle,
})
res.json({ category: data[0] })
}
@@ -335,9 +338,10 @@ In this guide, you’ll find common examples of how you can use the Product Modu
const { handle } = params
const productModuleService = await initializeProductModule()
const data = await productModuleService.listCategories({
handle,
})
const data = await productModuleService
.listProductCategories({
handle,
})
return NextResponse.json({ category: data[0] })
}
@@ -15,7 +15,7 @@ The Product Module is the `@medusajs/product` NPM package that provides product-
Store and manage products. Products have custom options, such as color or size, and each variant in the product sets the value for these options.
```ts
const products = await productService.create([
const products = await productService.createProducts([
{
title: "Medusa Shirt",
options: [
@@ -42,11 +42,11 @@ const products = await productService.create([
The Product Module provides different data models used to organize products, including categories, collections, tags, and more.
```ts
const category = await productService.createCategory({
const category = await productService.createProductCategories({
name: "Shirts",
})
const products = await productService.update([
const products = await productService.updateProducts([
{
id: product.id,
categories: [
@@ -81,7 +81,9 @@ For example:
const productModuleService: IProductModuleService =
request.scope.resolve(ModuleRegistrationName.PRODUCT)
res.json({ products: await productModuleService.list() })
res.json({
products: await productModuleService.listProducts(),
})
}
```
@@ -99,7 +101,7 @@ For example:
const productModuleService: IProductModuleService =
container.resolve(ModuleRegistrationName.PRODUCT)
const products = await productModuleService.list()
const products = await productModuleService.listProducts()
}
```
@@ -117,7 +119,7 @@ For example:
const productModuleService: IProductModuleService =
container.resolve(ModuleRegistrationName.PRODUCT)
const products = await productModuleService.list()
const products = await productModuleService.listProducts()
})
```
@@ -48,6 +48,6 @@ Each product variant has different inventory details. Medusa defines a link modu
![A diagram showcasing an example of how data models from the Product and Inventory modules are linked.](https://res.cloudinary.com/dza7lstvk/image/upload/v1709652779/Medusa%20Resources/product-inventory_kmjnud.jpg)
When the `manage_inventory` field of a product variant is enabled, you can manage the variant's inventory in different locations through this relation.
When the `manage_inventory` property of a product variant is enabled, you can manage the variant's inventory in different locations through this relation.
Learn more about the `InventoryItem` data model in the [Inventory Concepts](../../inventory/concepts/page.mdx#inventoryitem)
@@ -10,7 +10,7 @@ In this document, you’ll learn about promotion actions and how they’re compu
The Promotion Module's main service has a [computeActions method](/references/promotion/computeActions) that returns an array of actions to perform on a cart when one or more promotions are applied.
Actions inform you what adjustment must be made to a cart item or shipping method. Each action is an object having the `action` field indicating the type of action.
Actions inform you what adjustment must be made to a cart item or shipping method. Each action is an object having the `action` property indicating the type of action.
---
@@ -17,7 +17,7 @@ The [ApplicationMethod data model](/references/promotion/models/ApplicationMetho
<Table.Row>
<Table.HeaderCell>
Field
Property
</Table.HeaderCell>
<Table.HeaderCell>
@@ -71,7 +71,7 @@ The [ApplicationMethod data model](/references/promotion/models/ApplicationMetho
When the promotion is applied to a cart item or a shipping method, you can restrict which items/shipping methods the promotion is applied to.
The `ApplicationMethod` data model has a collection of `PromotionRule` records to restrict which items or shipping methods the promotion applies to. The `target_rules` field represents this relation.
The `ApplicationMethod` data model has a collection of `PromotionRule` records to restrict which items or shipping methods the promotion applies to. The `target_rules` property represents this relation.
![A diagram showcasing the target_rules relation between the ApplicationMethod and PromotionRule data models](https://res.cloudinary.com/dza7lstvk/image/upload/v1709898273/Medusa%20Resources/application-method-target-rules_hqaymz.jpg)
@@ -83,7 +83,7 @@ In this example, the promotion is only applied on products in the cart having th
When the promotion’s type is `buyget`, you must specify the “buy X” condition. For example, a cart must have two shirts before the promotion can be applied.
The application method has a collection of `PromotionRule` items to define the “buy X” rule. The `buy_rules` field represents this relation.
The application method has a collection of `PromotionRule` items to define the “buy X” rule. The `buy_rules` property represents this relation.
![A diagram showcasing the buy_rules relation between the ApplicationMethod and PromotionRule data models](https://res.cloudinary.com/dza7lstvk/image/upload/v1709898453/Medusa%20Resources/application-method-buy-rules_djjuhw.jpg)
@@ -78,19 +78,19 @@ A promotion can be restricted by a set of rules, each rule is represented by the
![A diagram showcasing the relation between Promotion and PromotionRule](https://res.cloudinary.com/dza7lstvk/image/upload/v1709833196/Medusa%20Resources/promotion-promotion-rule_msbx0w.jpg)
A `PromotionRule`'s `attribute` field indicates the field's name to which this rule is applied. For example, `customer_group_id`. Its value is stored in the `PromotionRuleValue` data model. So, a rule can have multiple values.
A `PromotionRule`'s `attribute` property indicates the property's name to which this rule is applied. For example, `customer_group_id`. Its value is stored in the `PromotionRuleValue` data model. So, a rule can have multiple values.
When testing whether a promotion can be applied to a cart, the rule's `attribute` field and its values are tested on the cart itself. For example, the cart's customer must be part of the customer group(s) indicated in the promotion rule's value.
When testing whether a promotion can be applied to a cart, the rule's `attribute` property and its values are tested on the cart itself. For example, the cart's customer must be part of the customer group(s) indicated in the promotion rule's value.
---
## Flexible Rules
The `PromotionRule`'s `operator` field adds more flexibility to the rule’s condition rather than simple equality (`eq`).
The `PromotionRule`'s `operator` property adds more flexibility to the rule’s condition rather than simple equality (`eq`).
For example, to restrict the promotion to only `VIP` and `B2B` customer groups:
- Add a `PromotionRule` with its `attribute` field set to `customer_group_id` and `operator` field to `in`.
- Add a `PromotionRule` with its `attribute` property set to `customer_group_id` and `operator` property to `in`.
- Add two `PromotionRuleValue` associated with the rule: one with the value `VIP` and the other `B2B`.
![A diagram showcasing the relation between PromotionRule and PromotionRuleValue when a rule has multiple values](https://res.cloudinary.com/dza7lstvk/image/upload/v1709897383/Medusa%20Resources/promotion-promotion-rule-multiple_hctpmt.jpg)
@@ -25,7 +25,7 @@ In this document, you’ll find common examples of how you can use the Promotion
const promotionModuleService: IPromotionModuleService =
request.scope.resolve(ModuleRegistrationName.PROMOTION)
const promotion = await promotionModuleService.create({
const promotion = await promotionModuleService.createPromotions({
code: "10%OFF",
type: "standard",
application_method: {
@@ -55,7 +55,7 @@ In this document, you’ll find common examples of how you can use the Promotion
await initializePromotionModule()
const body = await request.json()
const promotion = await promotionModuleService.create({
const promotion = await promotionModuleService.createPromotions({
code: "10%OFF",
type: "standard",
application_method: {
@@ -155,7 +155,7 @@ In this document, you’ll find common examples of how you can use the Promotion
const promotionModuleService: IPromotionModuleService =
request.scope.resolve(ModuleRegistrationName.PROMOTION)
const promotion = await promotionModuleService.create({
const promotion = await promotionModuleService.createPromotions({
code: "10%OFF",
type: "standard",
application_method: {
@@ -191,7 +191,7 @@ In this document, you’ll find common examples of how you can use the Promotion
const promotionModuleService =
await initializePromotionModule()
const promotion = await promotionModuleService.create({
const promotion = await promotionModuleService.createPromotions({
code: "10%OFF",
type: "standard",
application_method: {
@@ -236,7 +236,7 @@ In this document, you’ll find common examples of how you can use the Promotion
request.scope.resolve(ModuleRegistrationName.PROMOTION)
res.json({
promotions: await promotionModuleService.list(),
promotions: await promotionModuleService.listPromotions(),
})
}
```
@@ -256,7 +256,7 @@ In this document, you’ll find common examples of how you can use the Promotion
await initializePromotionModule()
return NextResponse.json({
promotions: await promotionModuleService.list(),
promotions: await promotionModuleService.listPromotions(),
})
}
```
@@ -17,7 +17,7 @@ A promotion discounts an amount or percentage of a cart's items, shipping method
The Promotion Module allows you to store and manage promotions.
```ts
const promotion = await promotionModuleService.create({
const promotion = await promotionModuleService.createPromotions({
code: "10%OFF",
type: "standard",
application_method: {
@@ -34,7 +34,7 @@ const promotion = await promotionModuleService.create({
A promotion has rules that restricts when it's applied. For example, you can create a promotion that's only applied to VIP customers.
```ts
const promotion = await promotionModuleService.create({
const promotion = await promotionModuleService.createPromotions({
code: "10%OFF",
type: "standard",
application_method: {
@@ -94,7 +94,7 @@ For example:
request.scope.resolve(ModuleRegistrationName.PROMOTION)
res.json({
promotions: await promotionModuleService.list(),
promotions: await promotionModuleService.listPromotions(),
})
}
```
@@ -113,7 +113,7 @@ For example:
const promotionModuleService: IPromotionModuleService =
container.resolve(ModuleRegistrationName.PROMOTION)
const promotions = await promotionModuleService.list()
const promotions = await promotionModuleService.listPromotions()
}
```
@@ -131,7 +131,7 @@ For example:
const promotionModuleService: IPromotionModuleService =
container.resolve(ModuleRegistrationName.PROMOTION)
const promotions = await promotionModuleService.list()
const promotions = await promotionModuleService.listPromotions()
})
```
@@ -25,7 +25,7 @@ In this guide, you’ll find common examples of how you can use the Region Modul
const regionModuleService: IRegionModuleService =
req.scope.resolve(ModuleRegistrationName.REGION)
const region = await regionModuleService.create({
const region = await regionModuleService.createRegions({
name: "Europe",
currency_code: "eur",
})
@@ -49,7 +49,7 @@ In this guide, you’ll find common examples of how you can use the Region Modul
export async function POST(request: Request) {
const regionModuleService = await initializeRegionModule()
const region = await regionModuleService.create({
const region = await regionModuleService.createRegions({
name: "Europe",
currency_code: "eur",
})
@@ -83,7 +83,7 @@ In this guide, you’ll find common examples of how you can use the Region Modul
req.scope.resolve(ModuleRegistrationName.REGION)
res.json({
regions: await regionModuleService.list(),
regions: await regionModuleService.listRegions(),
})
}
```
@@ -102,7 +102,7 @@ In this guide, you’ll find common examples of how you can use the Region Modul
const regionModuleService = await initializeRegionModule()
return NextResponse.json({
regions: await regionModuleService.list(),
regions: await regionModuleService.listRegions(),
})
}
```
@@ -129,7 +129,8 @@ In this guide, you’ll find common examples of how you can use the Region Modul
const regionModuleService: IRegionModuleService =
req.scope.resolve(ModuleRegistrationName.REGION)
const region = await regionModuleService.retrieve("reg_123")
const region = await regionModuleService
.retrieveRegion("reg_123")
res.json({ region })
}
@@ -150,7 +151,8 @@ In this guide, you’ll find common examples of how you can use the Region Modul
) {
const regionModuleService = await initializeRegionModule()
const region = await regionModuleService.retrieve("reg_123")
const region = await regionModuleService
.retrieveRegion("reg_123")
return NextResponse.json({ region })
}
@@ -178,9 +180,10 @@ In this guide, you’ll find common examples of how you can use the Region Modul
const regionModuleService: IRegionModuleService =
req.scope.resolve(ModuleRegistrationName.REGION)
const region = await regionModuleService.update("reg_123", {
automatic_taxes: false,
})
const region = await regionModuleService
.updateRegions("reg_123", {
automatic_taxes: false,
})
res.json({ region })
}
@@ -201,9 +204,10 @@ In this guide, you’ll find common examples of how you can use the Region Modul
) {
const regionModuleService = await initializeRegionModule()
const region = await regionModuleService.update("reg_123", {
automatic_taxes: false,
})
const region = await regionModuleService
.updateRegions("reg_123", {
automatic_taxes: false,
})
return NextResponse.json({ region })
}
@@ -231,7 +235,7 @@ In this guide, you’ll find common examples of how you can use the Region Modul
const regionModuleService: IRegionModuleService =
req.scope.resolve(ModuleRegistrationName.REGION)
await regionModuleService.delete("reg_123")
await regionModuleService.deleteRegions("reg_123")
res.status(200)
}
@@ -252,7 +256,7 @@ In this guide, you’ll find common examples of how you can use the Region Modul
) {
const regionModuleService = await initializeRegionModule()
await regionModuleService.delete("reg_123")
await regionModuleService.deleteRegions("reg_123")
}
```
@@ -21,7 +21,7 @@ A region represents the area you sell products in. Each region can cover multipl
You can manage your regions to create, update, retrieve, or delete them.
```ts
const region = await regionModuleService.create({
const region = await regionModuleService.createRegions({
name: "Europe",
currency_code: "eur",
})
@@ -32,7 +32,7 @@ const region = await regionModuleService.create({
As each region has a currency, you can support multiple currencies in your store by creating multiple regions.
```ts
const regions = await regionModuleService.create([
const regions = await regionModuleService.createRegions([
{
name: "Europe",
currency_code: "eur",
@@ -49,7 +49,7 @@ const regions = await regionModuleService.create([
Each region has its own settings, such as what countries belong to a region or its tax settings. Each region has different tax rates, payment providers, and more provided by other commerce modules.
```ts
const regions = await regionModuleService.create([
const regions = await regionModuleService.createRegions([
{
name: "Europe",
currency_code: "eur",
@@ -89,7 +89,7 @@ For example:
req.scope.resolve(ModuleRegistrationName.REGION)
res.json({
regions: await regionModuleService.list(),
regions: await regionModuleService.listRegions(),
})
}
```
@@ -108,7 +108,7 @@ For example:
const regionModuleService: IRegionModuleService =
container.resolve(ModuleRegistrationName.REGION)
const regions = await regionModuleService.list()
const regions = await regionModuleService.listRegions()
}
```
@@ -128,7 +128,7 @@ For example:
ModuleRegistrationName.REGION
)
const regions = await regionModuleService.list()
const regions = await regionModuleService.listRegions()
})
```
@@ -25,9 +25,10 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService: ISalesChannelModuleService =
request.scope.resolve(ModuleRegistrationName.SALES_CHANNEL)
const salesChannel = await salesChannelModuleService.create({
name: "B2B",
})
const salesChannel = await salesChannelModuleService
.createSalesChannels({
name: "B2B",
})
res.json({
sales_channel: salesChannel,
@@ -49,9 +50,10 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService =
await initializeSalesChannelModule()
const salesChannel = await salesChannelModuleService.create({
name: "B2B",
})
const salesChannel = await salesChannelModuleService
.createSalesChannels({
name: "B2B",
})
return NextResponse.json({ sales_channel: salesChannel })
}
@@ -80,7 +82,8 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
request.scope.resolve(ModuleRegistrationName.SALES_CHANNEL)
res.json({
sales_channels: salesChannelModuleService.list(),
sales_channels: salesChannelModuleService
.listSalesChannels(),
})
}
```
@@ -99,7 +102,8 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService =
await initializeSalesChannelModule()
const salesChannels = await salesChannelModuleService.list()
const salesChannels = await salesChannelModuleService
.listSalesChannels()
return NextResponse.json({ sales_channels: salesChannels })
}
@@ -127,9 +131,10 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService: ISalesChannelModuleService =
request.scope.resolve(ModuleRegistrationName.SALES_CHANNEL)
const salesChannel = await salesChannelModuleService.retrieve(
"sc_123"
)
const salesChannel = await salesChannelModuleService
.retrieveSalesChannel(
"sc_123"
)
res.json({
sales_channel: salesChannel,
@@ -153,9 +158,10 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService =
await initializeSalesChannelModule()
const salesChannel = await salesChannelModuleService.retrieve(
"sc_123"
)
const salesChannel = await salesChannelModuleService
.retrieveSalesChannel(
"sc_123"
)
return NextResponse.json({ sales_channel: salesChannel })
}
@@ -183,10 +189,11 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService: ISalesChannelModuleService =
request.scope.resolve(ModuleRegistrationName.SALES_CHANNEL)
const salesChannel = await salesChannelModuleService.update({
id: "sc_123",
description: "Sales channel for B2B customers",
})
const salesChannel = await salesChannelModuleService
.updateSalesChannels({
id: "sc_123",
description: "Sales channel for B2B customers",
})
res.json({
sales_channel: salesChannel,
@@ -210,10 +217,11 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService =
await initializeSalesChannelModule()
const salesChannel = await salesChannelModuleService.update({
id: "sc_123",
description: "Sales channel for B2B customers",
})
const salesChannel = await salesChannelModuleService
.updateSalesChannels({
id: "sc_123",
description: "Sales channel for B2B customers",
})
return NextResponse.json({ sales_channel: salesChannel })
}
@@ -241,7 +249,7 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService: ISalesChannelModuleService =
request.scope.resolve(ModuleRegistrationName.SALES_CHANNEL)
await salesChannelModuleService.delete("sc_123")
await salesChannelModuleService.deleteSalesChannels("sc_123")
res.status(200)
}
@@ -263,7 +271,7 @@ In this guide, you’ll find common examples of how you can use the Sales Channe
const salesChannelModuleService =
await initializeSalesChannelModule()
await salesChannelModuleService.delete("sc_123")
await salesChannelModuleService.deleteSalesChannels("sc_123")
}
```
@@ -27,14 +27,15 @@ Some use case examples for using a sales channel:
Manage sales channels in your store. Each sales channel has different meta information such as name or description, allowing you to easily differentiate between sales channels.
```ts
const salesChannels = await salesChannelModuleService.create([
{
name: "B2B",
},
{
name: "Mobile App",
},
])
const salesChannels = await salesChannelModuleService
.createSalesChannels([
{
name: "B2B",
},
{
name: "Mobile App",
},
])
```
### Product Availability
@@ -73,7 +74,8 @@ For example:
request.scope.resolve(ModuleRegistrationName.SALES_CHANNEL)
res.json({
sales_channels: await salesChannelModuleService.list(),
sales_channels: await salesChannelModuleService
.listSalesChannels(),
})
}
```
@@ -92,7 +94,8 @@ For example:
const salesChannelModuleService: ISalesChannelModuleService =
container.resolve(ModuleRegistrationName.SALES_CHANNEL)
const salesChannels = await salesChannelModuleService.list()
const salesChannels = await salesChannelModuleService
.listSalesChannels()
}
```
@@ -112,7 +115,8 @@ For example:
ModuleRegistrationName.SALES_CHANNEL
)
const salesChannels = await salesChannelModuleService.list()
const salesChannels = await salesChannelModuleService
.listSalesChannels()
})
```
@@ -25,11 +25,12 @@ In this document, you’ll find common examples of how you can use the Stock Loc
const stockLocationModuleService: IStockLocationService =
request.scope.resolve(ModuleRegistrationName.STOCK_LOCATION)
const stockLocation = await stockLocationModuleService.create(
{
name: "Warehouse 1",
}
)
const stockLocation = await stockLocationModuleService
.createStockLocations(
{
name: "Warehouse 1",
}
)
res.json({
stock_location: stockLocation,
@@ -51,11 +52,12 @@ In this document, you’ll find common examples of how you can use the Stock Loc
const stockLocationModuleService =
await initializeStockLocationModule({})
const stockLocation = await stockLocationModuleService.create(
{
name: "Warehouse 1",
}
)
const stockLocation = await stockLocationModuleService
.createStockLocations(
{
name: "Warehouse 1",
}
)
return NextResponse.json({ stock_location: stockLocation })
}
@@ -84,7 +86,8 @@ In this document, you’ll find common examples of how you can use the Stock Loc
request.scope.resolve(ModuleRegistrationName.STOCK_LOCATION)
res.json({
stock_locations: await stockLocationModuleService.list({}),
stock_locations: await stockLocationModuleService
.listStockLocations({}),
})
}
```
@@ -104,7 +107,8 @@ In this document, you’ll find common examples of how you can use the Stock Loc
await initializeStockLocationModule({})
return NextResponse.json({
stock_locations: await stockLocationModuleService.list({}),
stock_locations: await stockLocationModuleService
.listStockLocations({}),
})
}
```
@@ -131,15 +135,16 @@ In this document, you’ll find common examples of how you can use the Stock Loc
const stockLocationModuleService: IStockLocationService =
request.scope.resolve(ModuleRegistrationName.STOCK_LOCATION)
const stockLocation = await stockLocationModuleService.update({
id: "sloc_123",
address: {
country_code: "US",
city: "New York City",
address_1: "52 Stone St",
postal_code: "10004",
},
})
const stockLocation = await stockLocationModuleService
.updateStockLocations({
id: "sloc_123",
address: {
country_code: "US",
city: "New York City",
address_1: "52 Stone St",
postal_code: "10004",
},
})
res.json({
stock_location: stockLocation,
@@ -163,15 +168,16 @@ In this document, you’ll find common examples of how you can use the Stock Loc
const stockLocationModuleService =
await initializeStockLocationModule({})
const stockLocation = await stockLocationModuleService.update({
id: "sloc_123",
address: {
country_code: "us",
city: "New York City",
address_1: "52 Stone St",
postal_code: "10004",
},
})
const stockLocation = await stockLocationModuleService
.updateStockLocations({
id: "sloc_123",
address: {
country_code: "us",
city: "New York City",
address_1: "52 Stone St",
postal_code: "10004",
},
})
return NextResponse.json({
stock_location: stockLocation,
@@ -201,7 +207,9 @@ In this document, you’ll find common examples of how you can use the Stock Loc
const stockLocationModuleService: IStockLocationService =
request.scope.resolve(ModuleRegistrationName.STOCK_LOCATION)
await stockLocationModuleService.delete("sloc_123")
await stockLocationModuleService.deleteStockLocations(
"sloc_123"
)
res.status(200)
}
@@ -223,7 +231,9 @@ In this document, you’ll find common examples of how you can use the Stock Loc
const stockLocationModuleService =
await initializeStockLocationModule({})
await stockLocationModuleService.delete("sloc_123")
await stockLocationModuleService.deleteStockLocations(
"sloc_123"
)
}
```
@@ -15,11 +15,12 @@ The Stock Location Module is the `@medusajs/stock-location-next` NPM package tha
Store and manage stock locations. Stock locations are associated with data models of other modules that require a location, such as the [Inventory Module's InventoryLevel](../inventory/concepts/page.mdx#inventory-level).
```ts
const stockLocation = await stockLocationModuleService.create(
{
const stockLocation = await stockLocationModuleService
.createStockLocations(
{
name: "Warehouse 1",
}
)
}
)
```
### Address Management
@@ -27,17 +28,18 @@ const stockLocation = await stockLocationModuleService.create(
Manage the address of each stock location.
```ts
const stockLocation = await stockLocationModuleService.update(
{
id: "sloc_123",
address: {
country_code: "us",
city: "New York City",
address_1: "52 Stone St",
postal_code: "10004",
},
}
)
const stockLocation = await stockLocationModuleService
.updateStockLocations(
{
id: "sloc_123",
address: {
country_code: "us",
city: "New York City",
address_1: "52 Stone St",
postal_code: "10004",
},
}
)
```
---
@@ -64,7 +66,8 @@ For example:
request.scope.resolve(ModuleRegistrationName.STOCK_LOCATION)
res.json({
stock_locations: await stockLocationModuleService.list({}),
stock_locations: await stockLocationModuleService
.listStockLocations({}),
})
}
```
@@ -83,9 +86,8 @@ For example:
const stockLocationModuleService: IStockLocationService =
container.resolve(ModuleRegistrationName.STOCK_LOCATION)
const stockLocations = await stockLocationModuleService.list(
{}
)
const stockLocations = await stockLocationModuleService
.listStockLocations({})
}
```
@@ -105,9 +107,8 @@ For example:
ModuleRegistrationName.STOCK_LOCATION
)
const stockLocations = await stockLocationModuleService.list(
{}
)
const stockLocations = await stockLocationModuleService
.listStockLocations({})
})
```
@@ -25,9 +25,14 @@ In this guide, you’ll find common examples of how you can use the Store Module
const storeModuleService: IStoreModuleService =
request.scope.resolve(ModuleRegistrationName.STORE)
const store = await storeModuleService.create({
const store = await storeModuleService.createStores({
name: "My Store",
supported_currency_codes: ["usd"],
supported_currencies: [
{
currency_code: "usd",
is_default: true,
},
],
})
res.json({
@@ -49,9 +54,14 @@ In this guide, you’ll find common examples of how you can use the Store Module
export async function POST(request: Request) {
const storeModuleService = await initializeStoreModule()
const store = await storeModuleService.create({
const store = await storeModuleService.createStores({
name: "My Store",
supported_currency_codes: ["usd"],
supported_currencies: [
{
currency_code: "usd",
is_default: true,
},
],
})
res.json({
@@ -83,7 +93,7 @@ In this guide, you’ll find common examples of how you can use the Store Module
request.scope.resolve(ModuleRegistrationName.STORE)
res.json({
stores: await storeModuleService.list(),
stores: await storeModuleService.listStores(),
})
}
```
@@ -101,7 +111,7 @@ In this guide, you’ll find common examples of how you can use the Store Module
export async function GET(request: Request) {
const storeModuleService = await initializeStoreModule()
const salesChannels = await storeModuleService.list()
const salesChannels = await storeModuleService.listStores()
return NextResponse.json({
stores: await storeModuleService.list(),
@@ -131,7 +141,7 @@ In this guide, you’ll find common examples of how you can use the Store Module
const storeModuleService: IStoreModuleService =
request.scope.resolve(ModuleRegistrationName.STORE)
const store = await storeModuleService.retrieve(
const store = await storeModuleService.retrieveStore(
"store_123"
)
@@ -157,7 +167,7 @@ In this guide, you’ll find common examples of how you can use the Store Module
) {
const storeModuleService = await initializeStoreModule()
const store = await storeModuleService.retrieve(
const store = await storeModuleService.retrieveStore(
"store_123"
)
@@ -187,9 +197,10 @@ In this guide, you’ll find common examples of how you can use the Store Module
const storeModuleService: IStoreModuleService =
request.scope.resolve(ModuleRegistrationName.STORE)
const store = await storeModuleService.update("store_123", {
name: "Change Store",
})
const store = await storeModuleService
.updateStores("store_123", {
name: "Change Store",
})
res.json({
store,
@@ -213,9 +224,10 @@ In this guide, you’ll find common examples of how you can use the Store Module
) {
const storeModuleService = await initializeStoreModule()
const store = await storeModuleService.update("store_123", {
name: "Change Store",
})
const store = await storeModuleService
.updateStores("store_123", {
name: "Change Store",
})
return NextResponse.json({ store })
}
@@ -243,7 +255,7 @@ In this guide, you’ll find common examples of how you can use the Store Module
const storeModuleService: IStoreModuleService =
request.scope.resolve(ModuleRegistrationName.STORE)
await storeModuleService.delete("store_123")
await storeModuleService.deleteStores("store_123")
res.status(200)
}
@@ -265,7 +277,7 @@ In this guide, you’ll find common examples of how you can use the Store Module
) {
const storeModuleService = await initializeStoreModule()
await storeModuleService.delete("store_123")
await storeModuleService.deleteStores("store_123")
}
```
@@ -15,7 +15,7 @@ The Store Module is the `@medusajs/store` NPM package that provides store-relate
A store holds the main configurations of your commerce store, such as supported currencies, default region and sales channel, and more.
```ts
const store = await storeModuleService.create({
const store = await storeModuleService.createStores({
name: "My Store",
supported_currency_codes: ["usd"],
})
@@ -26,7 +26,7 @@ const store = await storeModuleService.create({
You can create multiple stores, each having its own configurations.
```ts
const stores = await storeModuleService.create([
const stores = await storeModuleService.createStores([
{
name: "USA Store",
supported_currency_codes: ["usd"],
@@ -62,7 +62,7 @@ For example:
request.scope.resolve(ModuleRegistrationName.STORE)
res.json({
stores: await storeModuleService.list(),
stores: await storeModuleService.listStores(),
})
}
```
@@ -81,7 +81,7 @@ For example:
const storeModuleService: IStoreModuleService =
container.resolve(ModuleRegistrationName.STORE)
const stores = await storeModuleService.list()
const stores = await storeModuleService.listStores()
}
```
@@ -101,7 +101,7 @@ For example:
ModuleRegistrationName.STORE
)
const stores = await storeModuleService.list()
const stores = await storeModuleService.listStores()
})
```
@@ -91,7 +91,7 @@ In this guide, you’ll find common examples of how you can use the Tax Module i
)
res.json({
tax_regions: await taxModuleService.list(),
tax_regions: await taxModuleService.listTaxRegions(),
})
}
```
@@ -110,7 +110,7 @@ In this guide, you’ll find common examples of how you can use the Tax Module i
const taxModuleService = await initializeTaxModule()
return NextResponse.json({
tax_regions: await taxModuleService.list(),
tax_regions: await taxModuleService.listTaxRegions(),
})
}
```
@@ -138,7 +138,7 @@ In this guide, you’ll find common examples of how you can use the Tax Module i
ModuleRegistrationName.TAX
)
const taxRate = await taxModuleService.create({
const taxRate = await taxModuleService.createTaxRates({
tax_region_id: "txreg_123",
name: "Custom rate",
rate: 15,
@@ -175,7 +175,7 @@ In this guide, you’ll find common examples of how you can use the Tax Module i
) {
const taxModuleService = await initializeTaxModule()
const taxRate = await taxModuleService.create({
const taxRate = await taxModuleService.createTaxRates({
tax_region_id: "txreg_123",
name: "Custom rate",
rate: 15,
@@ -221,7 +221,7 @@ In this guide, you’ll find common examples of how you can use the Tax Module i
)
res.json({
tax_rates: await taxModuleService.list(),
tax_rates: await taxModuleService.listTaxRates(),
})
}
```
@@ -242,7 +242,7 @@ In this guide, you’ll find common examples of how you can use the Tax Module i
const taxModuleService = await initializeTaxModule()
return NextResponse.json({
tax_rates: await taxModuleService.list(),
tax_rates: await taxModuleService.listTaxRates(),
})
}
```
@@ -25,7 +25,7 @@ const taxRegion = await taxModuleService.createTaxRegions({
Manage each region's default tax rates and override them with conditioned tax rates.
```ts
const taxRates = await taxModuleService.create([
const taxRates = await taxModuleService.createTaxRates([
{
tax_region_id: "txreg_123",
name: "Default tax rate",
@@ -35,7 +35,7 @@ const taxLines = await taxModuleService.getTaxLines(
)
```
The context object is used to determine which tax regions and rates to use in the calculation. It includes fields related to the address and customer.
The context object is used to determine which tax regions and rates to use in the calculation. It includes properties related to the address and customer.
The example above returns the tax lines based on the tax region for the United States.
@@ -28,7 +28,7 @@ A tax region can have multiple tax rates, and each tax rate can have multiple ta
![A diagram showcasing the relation between TaxRegion, TaxRate, and TaxRateRule](https://res.cloudinary.com/dza7lstvk/image/upload/v1711462167/Medusa%20Resources/tax-rate-rule_enzbp2.jpg)
These two fields of the data model identify the rule’s target:
These two properties of the data model identify the rule’s target:
- `reference`: the name of the table in the database that this rule points to. For example, `product_type`.
- `reference_id`: the ID of the data model’s record that this points to. For example, a product type’s ID.
@@ -25,7 +25,7 @@ In this guide, you’ll find common examples of how you can use the User Module
const userModuleService: IUserModuleService =
req.scope.resolve(ModuleRegistrationName.USER)
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: "user@example.com",
first_name: "John",
last_name: "Smith",
@@ -48,7 +48,7 @@ In this guide, you’ll find common examples of how you can use the User Module
export async function POST(request: Request) {
const userModuleService = await initializeUserModule()
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: "user@example.com",
first_name: "John",
last_name: "Smith",
@@ -83,7 +83,7 @@ In this guide, you’ll find common examples of how you can use the User Module
req.scope.resolve(ModuleRegistrationName.USER)
res.json({
users: await userModuleService.list(),
users: await userModuleService.listUsers(),
})
}
```
@@ -102,7 +102,7 @@ In this guide, you’ll find common examples of how you can use the User Module
const userModuleService = await initializeUserModule()
return NextResponse.json({
users: await userModuleService.list(),
users: await userModuleService.listUsers(),
})
}
```
@@ -129,7 +129,7 @@ In this guide, you’ll find common examples of how you can use the User Module
const userModuleService: IUserModuleService =
req.scope.resolve(ModuleRegistrationName.USER)
const user = await userModuleService.update({
const user = await userModuleService.updateUsers({
id: "user_123",
last_name: "Smith",
})
@@ -153,7 +153,7 @@ In this guide, you’ll find common examples of how you can use the User Module
) {
const userModuleService = await initializeUserModule()
const user = await userModuleService.update({
const user = await userModuleService.updateUsers({
id: "user_123",
last_name: "Smith",
})
@@ -186,7 +186,7 @@ In this guide, you’ll find common examples of how you can use the User Module
const userModuleService: IUserModuleService =
req.scope.resolve(ModuleRegistrationName.USER)
await userModuleService.delete(["user_123"])
await userModuleService.deleteUsers(["user_123"])
}
```
@@ -205,7 +205,7 @@ In this guide, you’ll find common examples of how you can use the User Module
) {
const userModuleService = await initializeUserModule()
await userModuleService.delete(["user_123"])
await userModuleService.deleteUsers(["user_123"])
}
```
@@ -292,7 +292,7 @@ In this guide, you’ll find common examples of how you can use the User Module
const invite =
await userModuleService.validateInviteToken("secret_123")
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: invite.email,
metadata: invite.metadata,
})
@@ -327,7 +327,7 @@ In this guide, you’ll find common examples of how you can use the User Module
const invite =
await userModuleService.validateInviteToken("secret_123")
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: invite.email,
metadata: invite.metadata,
})
@@ -15,7 +15,7 @@ The User Module is the `@medusajs/user` NPM package that provides user-related f
Manage and store your users through Create, Read, Update, and Delete (CRUD) operations:
```ts
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: "user@example.com",
first_name: "John",
last_name: "Smith",
@@ -65,7 +65,7 @@ For example:
req.scope.resolve(ModuleRegistrationName.USER)
res.json({
users: await userModuleService.list(),
users: await userModuleService.listUsers(),
})
}
```
@@ -84,7 +84,7 @@ For example:
const userModuleService: IUserModuleService =
container.resolve(ModuleRegistrationName.USER)
const users = await userModuleService.list()
const users = await userModuleService.listUsers()
}
```
@@ -104,7 +104,7 @@ For example:
ModuleRegistrationName.USER
)
const users = await userModuleService.list()
const users = await userModuleService.listUsers()
})
```
@@ -25,7 +25,7 @@ await userModuleService.updateInvites({
accepted: true,
})
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: invite.email,
})
```
@@ -45,7 +45,7 @@ await userModuleService.refreshInviteTokens(["invite_123"])
Finally, you can create a user using the [create method of the User Module’s main service](/references/user/create):
```ts
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: "user@example.com",
})
```
@@ -63,12 +63,12 @@ const { success, authIdentity } =
})
// assuming authIdentity is defined
const [, count] = await userModuleService.listAndCount({
const [, count] = await userModuleService.listAndCountUsers({
email: authIdentity.entity_id,
})
if (!count) {
const user = await userModuleService.create({
const user = await userModuleService.createUsers({
email: authIdentity.entity_id,
})
}