From f8f36bb862eabc74075d299d9958529462b0fe49 Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Fri, 4 Oct 2024 14:15:41 +0300 Subject: [PATCH] docs: update modules chapter in basics (#9452) * docs: update modules chapter in basics * address PR feedback --- www/apps/book/app/basics/data-models/page.mdx | 105 ------- .../app/basics/modules-and-services/page.mdx | 153 ---------- .../modules-directory-structure/page.mdx | 4 +- www/apps/book/app/basics/modules/page.mdx | 274 ++++++++++++++++++ .../basics/project-directories-files/page.mdx | 2 +- .../custom-features/module/page.mdx | 2 +- www/apps/book/generated/edit-dates.mjs | 11 +- www/apps/book/next.config.mjs | 10 + www/apps/book/sidebar.mjs | 15 +- www/apps/resources/app/recipes/b2b/page.mdx | 6 +- .../app/recipes/commerce-automation/page.mdx | 4 +- .../examples/standard/page.mdx | 4 +- .../app/recipes/digital-products/page.mdx | 4 +- .../integrate-ecommerce-stack/page.mdx | 4 +- .../examples/restaurant-delivery/page.mdx | 4 +- .../marketplace/examples/vendors/page.mdx | 4 +- .../app/recipes/marketplace/page.mdx | 4 +- .../app/recipes/multi-region-store/page.mdx | 2 +- .../app/recipes/omnichannel/page.mdx | 4 +- .../recipes/personalized-products/page.mdx | 4 +- www/apps/resources/app/recipes/pos/page.mdx | 2 +- .../subscriptions/examples/standard/page.mdx | 4 +- .../app/recipes/subscriptions/page.mdx | 4 +- www/apps/resources/generated/edit-dates.mjs | 28 +- 24 files changed, 339 insertions(+), 319 deletions(-) delete mode 100644 www/apps/book/app/basics/data-models/page.mdx delete mode 100644 www/apps/book/app/basics/modules-and-services/page.mdx create mode 100644 www/apps/book/app/basics/modules/page.mdx diff --git a/www/apps/book/app/basics/data-models/page.mdx b/www/apps/book/app/basics/data-models/page.mdx deleted file mode 100644 index 17dfe23c27422..0000000000000 --- a/www/apps/book/app/basics/data-models/page.mdx +++ /dev/null @@ -1,105 +0,0 @@ -export const metadata = { - title: `${pageNumber} Data Models`, -} - -# {metadata.title} - -In this chapter, you’ll learn what data models are and how to create a data model. - -## What is a Data Model? - -A data model is a class that represents a table in the database. - -A data model is created in a module, and its record are managed in the database using the module's service. - ---- - -## How to Create a Data Model? - -A data model is created in a TypeScript or JavaScript file under a module's `models` directory. It's defined using the `model` utility imported from `@medusajs/framework/utils`. - -For example, create the file `src/modules/hello/models/my-custom.ts` with the following content: - -```ts title="src/modules/hello/models/my-custom.ts" -import { model } from "@medusajs/framework/utils" - -const MyCustom = model.define("my_custom", { - id: model.id().primaryKey(), - name: model.text(), -}) - -export default MyCustom -``` - -You define a data model using the `model`'s `define` method. It accepts two parameters: - -1. The first one is the name of the data model's table in the database. It should be in snake-case form. -2. The second is an object, which is the data model's schema. The schema's properties are defined using the `model`'s methods. - -The example above defines the data model `MyCustom` with the properties `id` and `name`. - -### Generate a Migration - -A migration is a TypeScript or JavaScript file that defines changes to be made in the database, such as creating a new table or updating it. - -To generate a migration for the data models in your module, run the following command: - -```bash -npx medusa db:generate helloModuleService -``` - -The `db:generate` command of the Medusa CLI accepts one or more module names to generate the migration for. - -The module name (for example, `helloModuleService`) is the key used when registering the module in the `modules` configuration in `medusa-config.js`. - -The above command creates a migration file at the directory `src/modules/hello/migrations` similar to the following: - -```ts -import { Migration } from "@mikro-orm/migrations" - -export class Migration20240702105919 extends Migration { - - async up(): Promise { - this.addSql("create table if not exists \"my_custom\" (\"id\" text not null, \"name\" text not null, \"created_at\" timestamptz not null default now(), \"updated_at\" timestamptz not null default now(), \"deleted_at\" timestamptz null, constraint \"my_custom_pkey\" primary key (\"id\"));") - } - - async down(): Promise { - this.addSql("drop table if exists \"my_custom\" cascade;") - } - -} -``` - -In the migration class, the `up` method creates the table `my_custom` and defines its columns. The `down` method drops the table. - - - -Data models automatically have the date properties `created_at`, `updated_at`, and `deleted_at`. - - - -### Run Migration - -To reflect the changes in the generated migration file, run the `migration` command: - -```bash -npx medusa db:migrate -``` - -If ran successfully, the `my_custom` table will be created in the database. - ---- - -## When to Use Data Models - - - -You want to store data related to your customization in the database. - - - - - -You want to store simple key-value pairs related to an existing data model. Instead, use the `metadata` field that most existing models have, which is an object of custom key-value pairs. - - diff --git a/www/apps/book/app/basics/modules-and-services/page.mdx b/www/apps/book/app/basics/modules-and-services/page.mdx deleted file mode 100644 index 5a4d88bea4410..0000000000000 --- a/www/apps/book/app/basics/modules-and-services/page.mdx +++ /dev/null @@ -1,153 +0,0 @@ -export const metadata = { - title: `${pageNumber} Modules and Services`, -} - -# {metadata.title} - -In this chapter, you’ll learn about modules, their main service, and how to create them. - -## What is a Module? - -A module is a package of reusable commerce or architectural functionalities. It's integrated as a building block in your Medusa application, without implications on the existing setup. - -A module has a service, which is a class that can connect to the database or third-party systems to provide custom features. The service's methods are then used by other resources, such as API routes. - ---- - -## How to Create a Module? - -Modules are created in a sub-directory of `src/modules`. - -For example, create the directory `src/modules/hello`. - -### 1. Create Main Service - -A module must define a service. A service is a TypeScript or JavaScript class used to perform actions on the database or connect to third-party services. - -A service must be defined at the root of your module directory under `service.ts` filename. - -For example, create the file `src/modules/hello/service.ts` with the following content: - -```ts title="src/modules/hello/service.ts" -export default class HelloModuleService { - async getMessage() { - return "Hello, world!" - } -} -``` - -### 2. Export Module Definition - -A module must have an `index.ts` file in its root directory that exports its definition. The definition specifies the main service of the module. - -For example, create the file `src/modules/hello/index.ts` with the following content: - -```ts title="src/modules/hello/index.ts" highlights={[["7", "", "The main service of the module."]]} -import HelloModuleService from "./service" -import { Module } from "@medusajs/framework/utils" - -export const HELLO_MODULE = "helloModuleService" - -export default Module(HELLO_MODULE, { - service: HelloModuleService, -}) -``` - -You use the `Module` function imported from `@medusajs/framework/utils` to create the module definition. It requires two parameters: - -1. The module's name. -2. An object with a required property `service` indicating the module's main service. - -### 3. Add Module to Configurations - -The last step is to add the module in Medusa’s configurations. - -In `medusa-config.js`, add a `modules` property and pass to it your custom module: - -```js title="medusa-config.js" highlights={[["7", "helloModuleService", "The key of the main service to be registered in the Medusa container."]]} -module.exports = defineConfig({ - projectConfig: { - // ... - }, - modules: { - helloModuleService: { - resolve: "./modules/hello", - }, - }, -}) -``` - -Its key (`helloModuleService`) is the name of the module’s main service. It will be registered in the Medusa container with that name. - - - -It should also be the same name passed as the first parameter to the `Module` function in the module's definition. - - - -Its value is an object having the `resolve` property, whose value is either a path to module's directory relative to `src`(it shouldn't include `src` in the path), or an `npm` package’s name. - ---- - -## Test the Module - -Since the module's main service is registered in the Medusa container, you can resolve it in other resources to use its methods. - - - -Resolving a module's service is essential to use its methods that perform actions on the database or connect to a third-party service. - - - -For example, create the API route `src/api/custom/route.ts` with the following content: - -```ts title="src/api/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import HelloModuleService from "../../modules/hello/service" -import { HELLO_MODULE } from "../../modules/hello" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const helloModuleService: HelloModuleService = req.scope.resolve( - HELLO_MODULE - ) - - res.json({ - message: await helloModuleService.getMessage(), - }) -} -``` - -Then, start the Medusa application: - -```bash npm2yarn -npm run dev -``` - -Finally, send a `GET` request to `/custom`: - -```bash -curl http://localhost:9000/custom -``` - -You’ll receive the following response: - -```json -{ - "message": "Hello, world!" -} -``` - ---- - -## When to Use Modules - - - -- You're adding new tables to the database, as explained in later chapters. -- You're integrating a third-party system for commerce or architectural features. -- You want to re-use your custom commerce functionalities across Medusa applications or use them in other environments, such as Edge functions and Next.js apps. - - diff --git a/www/apps/book/app/basics/modules-directory-structure/page.mdx b/www/apps/book/app/basics/modules-directory-structure/page.mdx index 8dfe5b9ec4486..4f89f30a80251 100644 --- a/www/apps/book/app/basics/modules-directory-structure/page.mdx +++ b/www/apps/book/app/basics/modules-directory-structure/page.mdx @@ -10,13 +10,13 @@ In this document, you'll learn about the expected files and directories in your ## index.ts -The `index.ts` file in the root of your module's directory is the only required file. It must export the module's definition as explained in a [previous chapter](../modules-and-services/page.mdx). +The `index.ts` file in the root of your module's directory is the only required file. It must export the module's definition as explained in a [previous chapter](../modules/page.mdx). --- ## service.ts -A module must have a main service. It's created in the `service.ts` file at the root of your module directory as explained in a [previous chapter](../modules-and-services/page.mdx). +A module must have a main service. It's created in the `service.ts` file at the root of your module directory as explained in a [previous chapter](../modules/page.mdx). --- diff --git a/www/apps/book/app/basics/modules/page.mdx b/www/apps/book/app/basics/modules/page.mdx new file mode 100644 index 0000000000000..6cfaafe458283 --- /dev/null +++ b/www/apps/book/app/basics/modules/page.mdx @@ -0,0 +1,274 @@ +export const metadata = { + title: `${pageNumber} Modules`, +} + +# {metadata.title} + +In this chapter, you’ll learn about modules and how to create them. + +## What is a Module? + +A module is a package of reusable commerce or architectural functionalities. + +In Medusa, modules handle business logic in a class called a service, and define and manage data models that represent tables in the database. + +Out of the box, Medusa comes with multiple pre-built modules for core commerce needs. For example, the Cart Module holds the data models and business logic for cart operations. + +As you learn more about Medusa, you will see that Modules are central to customizations and integrations. + +--- + +## How to Create a Module? + +In this section, you'll build a module that has a `MyCustom` data model and a service to manage that data model. You'll then use the module's service in an API route to create a record of `MyCustom`. + +Modules are created in a sub-directory of `src/modules`. + +For example, create the directory `src/modules/hello`. + +### 1. Create Data Model + +A data model represents a table in the database. It's created in a TypeScript or JavaScript file under the module's `models` directory. + +For example, create the file `src/modules/hello/models/my-custom.ts` with the following content: + +```ts title="src/modules/hello/models/my-custom.ts" +import { model } from "@medusajs/framework/utils" + +const MyCustom = model.define("my_custom", { + id: model.id().primaryKey(), + name: model.text(), +}) + +export default MyCustom +``` + +You define the data model using the `define` method of the `model` utility imported from `@medusajs/framework/utils`. It accepts two parameters: + +1. The first one is the name of the data model's table in the database. It should be snake-case. +2. The second is an object, which is the data model's schema. The schema's properties are defined using the `model`'s methods. + +The example above defines the data model `MyCustom` with the properties `id` and `name`. + + + +Data models automatically have the date properties `created_at`, `updated_at`, and `deleted_at`. + + + +### 2. Create Service + +A module must define a service that implements its functionalities, such as manage the records of your custom data models in the database. + +A service is a TypeScript or JavaScript class defined in the `service.ts` file at the root of your module's directory. + +For example, create the file `src/modules/hello/service.ts` with the following content: + +export const highlights = [ + ["4", "MedusaService", "The service factory function."], + ["5", "MyCustom", "The data models to generate data-management methods for."] +] + +```ts title="src/modules/hello/service.ts" highlights={highlights} +import { MedusaService } from "@medusajs/framework/utils" +import MyCustom from "./models/my-custom" + +class HelloModuleService extends MedusaService({ + MyCustom, +}){ +} + +export default HelloModuleService +``` + +In the snippet above, your module's service extends a class generated by the `MedusaService` utility function, which is the service factory. + +The `MedusaService` function accepts as a parameter an object of data models, and returns a class with generated methods for data-management Create, Read, Update, and Delete (CRUD) operations on those data models. + +For example, `HelloModuleService` now has a `createMyCustoms` method to create `MyCustom` records, and `retrieveMyCustom` to retrive a `MyCustom` record. + + + +If a module doesn't have data models, it doesn't need to extend `MedusaService`. + + + + + +You'll learn more about the methods generated by the service factory in later chapters. + + + +### 3. Export Module Definition + +A module must have an `index.ts` file in its root directory. The file exports the module's definition. + +For example, create the file `src/modules/hello/index.ts` with the following content: + +```ts title="src/modules/hello/index.ts" highlights={[["7", "", "The main service of the module."]]} +import HelloModuleService from "./service" +import { Module } from "@medusajs/framework/utils" + +export const HELLO_MODULE = "helloModuleService" + +export default Module(HELLO_MODULE, { + service: HelloModuleService, +}) +``` + +You use the `Module` function imported from `@medusajs/framework/utils` to create the module's definition. It accepts two parameters: + +1. The module's name. +2. An object with a required property `service` indicating the module's main service. + +### 4. Add Module to Configurations + +The last step is to add the module in Medusa’s configurations. + +In `medusa-config.js`, add a `modules` property and pass to it your custom module: + +```js title="medusa-config.js" highlights={[["6", "helloModuleService", "The key of the main service to be registered in the Medusa container."]]} +module.exports = defineConfig({ + projectConfig: { + // ... + }, + modules: { + helloModuleService: { + resolve: "./modules/hello", + }, + }, +}) +``` + +The key `helloModuleService` is the name of the module’s main service. It will be registered in the Medusa container with that name. + + + +The key must be the same value passed as the first parameter to the `Module` function in the module's definition. + + + +Its value is an object having the `resolve` property, whose value is either a path to module's directory relative to `src` (it shouldn't include `src` in the path), or an `npm` package’s name. + +### 5. Generate Migrations + +A migration is a TypeScript or JavaScript file that defines database changes made by your module, such as create the `my_custom` table for the `MyCustom` data model. + +To generate a migration for the data models in your module, run the following command: + +```bash +npx medusa db:generate helloModuleService +``` + +The `db:generate` command of the Medusa CLI accepts one or more module names to generate the migration for. + + + +The module name `helloModuleService` is the key used when registering the module in Medusa's `modules` configuration. + + + +The above command creates a migration file at the directory `src/modules/hello/migrations` similar to the following: + +```ts +import { Migration } from "@mikro-orm/migrations" + +export class Migration20240702105919 extends Migration { + + async up(): Promise { + this.addSql("create table if not exists \"my_custom\" (\"id\" text not null, \"name\" text not null, \"created_at\" timestamptz not null default now(), \"updated_at\" timestamptz not null default now(), \"deleted_at\" timestamptz null, constraint \"my_custom_pkey\" primary key (\"id\"));") + } + + async down(): Promise { + this.addSql("drop table if exists \"my_custom\" cascade;") + } + +} +``` + +In the migration class, the `up` method creates the table `my_custom` and defines its columns using PostgreSQL syntax. The `down` method drops the table. + +### 6. Run Migrations + +To reflect the changes in the generated migration file, run the `db:migrate` command: + +```bash +npx medusa db:migrate +``` + +This creates the `my_custom` table in the database. + +--- + +## Test the Module + +Since the module's main service is registered in the Medusa container, you can resolve it in other resources to use its methods. + +For example, create the API route `src/api/custom/route.ts` with the following content: + +```ts title="src/api/custom/route.ts" +import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" +import HelloModuleService from "../../modules/hello/service" +import { HELLO_MODULE } from "../../modules/hello" + +export async function GET( + req: MedusaRequest, + res: MedusaResponse +): Promise { + const helloModuleService: HelloModuleService = req.scope.resolve( + HELLO_MODULE + ) + + const my_custom = await helloModuleService.createMyCustoms({ + name: "test" + }) + + res.json({ + my_custom + }) +} +``` + +You resolve the Hello Module's main service and use its generated method `createMyCustoms` to create a new record in the database, then return that record. + +Then, start the Medusa application: + +```bash npm2yarn +npm run dev +``` + +Finally, send a `GET` request to `/custom`: + +```bash +curl http://localhost:9000/custom +``` + +You’ll receive the following response: + +```json +{ + "my_custom": { + "id": "123...", + "name": "test", + "created_at": "...", + "updated_at": "..." + } +} +``` + +--- + +## Why Use Modules + +In digital commerce, you often need to introduce custom behavior specific to your products, industry, tech stack, or your general ways of working. In other commerce platforms, introducing custom business logic and data models requires setting up separate applications to manage these customizations. + +Medusa removes this overhead by allowing you to easily write custom Modules that integrate into the Medusa application without implications on the existing setup. + + + +- You're adding a new table to the database. +- You're extending an existing table in the database to add custom fields, which is explained in later chapters. +- You're integrating a third-party system for commerce or architectural features, as explained in later chapters. +- You want to re-use your custom commerce functionalities across Medusa applications or use them in other environments, such as Edge functions and Next.js apps. + + diff --git a/www/apps/book/app/basics/project-directories-files/page.mdx b/www/apps/book/app/basics/project-directories-files/page.mdx index 3bde89da89996..d5d930c4c90de 100644 --- a/www/apps/book/app/basics/project-directories-files/page.mdx +++ b/www/apps/book/app/basics/project-directories-files/page.mdx @@ -1,5 +1,5 @@ export const metadata = { - title: `${pageNumber} Project Directories and Files`, + title: `${pageNumber} Project File Conventions`, } # {metadata.title} diff --git a/www/apps/book/app/customization/custom-features/module/page.mdx b/www/apps/book/app/customization/custom-features/module/page.mdx index 53ce9e786e4d9..2b22ef4e55d72 100644 --- a/www/apps/book/app/customization/custom-features/module/page.mdx +++ b/www/apps/book/app/customization/custom-features/module/page.mdx @@ -89,7 +89,7 @@ This exposes the module to your application and allows you to resolve the `Brand -Learn more about modules and services [in this guide](../../../basics/modules-and-services/page.mdx). +Learn more about modules and services [in this guide](../../../basics/modules/page.mdx). diff --git a/www/apps/book/generated/edit-dates.mjs b/www/apps/book/generated/edit-dates.mjs index 589b0bb79a71e..7893f508dec98 100644 --- a/www/apps/book/generated/edit-dates.mjs +++ b/www/apps/book/generated/edit-dates.mjs @@ -3,7 +3,6 @@ export const generatedEditDates = { "app/basics/workflows/page.mdx": "2024-09-30T08:43:53.132Z", "app/deployment/page.mdx": "2024-08-05T07:24:05+00:00", "app/page.mdx": "2024-09-03T07:09:09.034Z", - "app/basics/modules-and-services/page.mdx": "2024-09-30T08:43:53.132Z", "app/basics/commerce-modules/page.mdx": "2024-09-30T08:43:53.131Z", "app/advanced-development/workflows/retry-failed-steps/page.mdx": "2024-09-30T08:43:53.130Z", "app/advanced-development/workflows/workflow-hooks/page.mdx": "2024-09-30T08:43:53.131Z", @@ -20,13 +19,12 @@ export const generatedEditDates = { "app/first-customizations/page.mdx": "2024-09-11T10:48:42.374Z", "app/debugging-and-testing/page.mdx": "2024-05-03T17:36:38+03:00", "app/basics/medusa-container/page.mdx": "2024-09-30T08:43:53.132Z", - "app/basics/project-directories-files/page.mdx": "2024-07-04T17:26:03+03:00", + "app/basics/project-directories-files/page.mdx": "2024-10-03T12:46:52.762Z", "app/basics/api-routes/page.mdx": "2024-09-11T10:48:31.777Z", - "app/basics/modules-directory-structure/page.mdx": "2024-05-07T18:00:28+02:00", + "app/basics/modules-directory-structure/page.mdx": "2024-10-03T13:03:35.957Z", "app/advanced-development/workflows/access-workflow-errors/page.mdx": "2024-09-18T12:54:04.695Z", "app/basics/events-and-subscribers/page.mdx": "2024-09-30T08:43:53.131Z", "app/advanced-development/modules/container/page.mdx": "2024-09-30T08:43:53.125Z", - "app/basics/data-models/page.mdx": "2024-09-30T08:43:53.131Z", "app/advanced-development/workflows/execute-another-workflow/page.mdx": "2024-09-30T08:43:53.129Z", "app/basics/loaders/page.mdx": "2024-09-03T08:00:45.993Z", "app/advanced-development/admin/widgets/page.mdx": "2024-09-30T08:43:53.120Z", @@ -92,7 +90,7 @@ export const generatedEditDates = { "app/advanced-development/workflows/page.mdx": "2024-09-18T08:00:57.364Z", "app/advanced-development/workflows/variable-manipulation/page.mdx": "2024-09-30T08:43:53.130Z", "app/customization/custom-features/api-route/page.mdx": "2024-09-12T12:42:34.201Z", - "app/customization/custom-features/module/page.mdx": "2024-09-30T08:43:53.133Z", + "app/customization/custom-features/module/page.mdx": "2024-10-03T13:03:41.359Z", "app/customization/custom-features/workflow/page.mdx": "2024-09-30T08:43:53.133Z", "app/customization/extend-models/create-links/page.mdx": "2024-09-30T08:43:53.133Z", "app/customization/extend-models/extend-create-product/page.mdx": "2024-09-30T08:43:53.134Z", @@ -113,5 +111,6 @@ export const generatedEditDates = { "app/more-resources/examples/page.mdx": "2024-09-27T07:17:16.892Z", "app/architecture/architectural-modules/page.mdx": "2024-09-23T12:51:04.520Z", "app/architecture/overview/page.mdx": "2024-09-23T12:55:01.339Z", - "app/advanced-development/data-models/infer-type/page.mdx": "2024-09-30T08:43:53.123Z" + "app/advanced-development/data-models/infer-type/page.mdx": "2024-09-30T08:43:53.123Z", + "app/basics/modules/page.mdx": "2024-10-03T13:05:49.551Z" } \ No newline at end of file diff --git a/www/apps/book/next.config.mjs b/www/apps/book/next.config.mjs index 4ecc7d776a983..e7eb9f2281769 100644 --- a/www/apps/book/next.config.mjs +++ b/www/apps/book/next.config.mjs @@ -164,6 +164,16 @@ const nextConfig = { destination: "/advanced-development/architecture/architectural-modules", permanent: true, }, + { + source: "/basics/modules-and-services", + destination: "/basics/modules", + permanent: true + }, + { + source: "/basics/data-models", + destination: "/basics/modules", + permanent: true + } ] }, } diff --git a/www/apps/book/sidebar.mjs b/www/apps/book/sidebar.mjs index ba11e80aca245..be38646972dd8 100644 --- a/www/apps/book/sidebar.mjs +++ b/www/apps/book/sidebar.mjs @@ -24,7 +24,7 @@ export const sidebar = numberSidebarItems( { type: "link", path: "/basics/project-directories-files", - title: "Project Directories and Files", + title: "Project Conventions", }, { type: "link", @@ -33,13 +33,13 @@ export const sidebar = numberSidebarItems( }, { type: "link", - path: "/basics/api-routes", - title: "API Routes", + path: "/basics/modules", + title: "Modules", }, { type: "link", - path: "/basics/modules-and-services", - title: "Modules and Services", + path: "/basics/api-routes", + title: "API Routes", }, { type: "link", @@ -51,11 +51,6 @@ export const sidebar = numberSidebarItems( path: "/basics/modules-directory-structure", title: "Modules Directory Structure", }, - { - type: "link", - path: "/basics/data-models", - title: "Data Models", - }, { type: "link", path: "/basics/loaders", diff --git a/www/apps/resources/app/recipes/b2b/page.mdx b/www/apps/resources/app/recipes/b2b/page.mdx index 42b8f49d27ef9..43bc70cde5121 100644 --- a/www/apps/resources/app/recipes/b2b/page.mdx +++ b/www/apps/resources/app/recipes/b2b/page.mdx @@ -173,13 +173,13 @@ You can create a B2B module that adds necessary data models to represent a B2B c - You can store the product's ID in the external system using the `metadata` property of the `Product` data model in the Product Module. Alternatively, you can create a [data model](!docs!/basics/data-models) in your module to store data related to the external system. + You can store the product's ID in the external system using the `metadata` property of the `Product` data model in the Product Module. Alternatively, you can create a [data model](!docs!/basics/modules#1-create-data-model) in your module to store data related to the external system. diff --git a/www/apps/resources/app/recipes/marketplace/examples/restaurant-delivery/page.mdx b/www/apps/resources/app/recipes/marketplace/examples/restaurant-delivery/page.mdx index 52f66df2ea797..d96af0b90ae10 100644 --- a/www/apps/resources/app/recipes/marketplace/examples/restaurant-delivery/page.mdx +++ b/www/apps/resources/app/recipes/marketplace/examples/restaurant-delivery/page.mdx @@ -170,8 +170,8 @@ module.exports = defineConfig({ ### Further Reads -- [How to Create a Module](!docs!/basics/modules-and-services) -- [How to Create a Data Model](!docs!/basics/data-models) +- [How to Create a Module](!docs!/basics/modules) +- [How to Create a Data Model](!docs!/basics/modules#1-create-data-model) --- diff --git a/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx b/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx index 49d64f76e2c0d..4a63fca79bed4 100644 --- a/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx +++ b/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx @@ -150,8 +150,8 @@ module.exports = defineConfig({ ### Further Reads -- [How to Create a Module](!docs!/basics/modules-and-services) -- [How to Create Data Models](!docs!/basics/data-models) +- [How to Create a Module](!docs!/basics/modules) +- [How to Create Data Models](!docs!/basics/modules#1-create-data-model) --- diff --git a/www/apps/resources/app/recipes/marketplace/page.mdx b/www/apps/resources/app/recipes/marketplace/page.mdx index 1378bf16ce55c..dc5ab1665bd4b 100644 --- a/www/apps/resources/app/recipes/marketplace/page.mdx +++ b/www/apps/resources/app/recipes/marketplace/page.mdx @@ -35,13 +35,13 @@ You can create a marketplace module that implements data models for vendors, the