diff --git a/www/apps/book/app/learn/fundamentals/api-routes/parameters/page.mdx b/www/apps/book/app/learn/fundamentals/api-routes/parameters/page.mdx index 125cf21658..d598cf206b 100644 --- a/www/apps/book/app/learn/fundamentals/api-routes/parameters/page.mdx +++ b/www/apps/book/app/learn/fundamentals/api-routes/parameters/page.mdx @@ -13,7 +13,7 @@ To create an API route that accepts a path parameter, create a directory within For example, to create an API Route at the path `/hello-world/:id`, where `:id` is a path parameter, create the file `src/api/hello-world/[id]/route.ts` with the following content: export const singlePathHighlights = [ - ["11", "req.params.id", "Access the path parameter `id`"] + ["11", "req.params.id", "Access the path parameter `id`."] ] ```ts title="src/api/hello-world/[id]/route.ts" highlights={singlePathHighlights} @@ -41,8 +41,8 @@ To create an API route that accepts multiple path parameters, create within the For example, to create an API route at `/hello-world/:id/name/:name`, create the file `src/api/hello-world/[id]/name/[name]/route.ts` with the following content: export const multiplePathHighlights = [ - ["12", "req.params.id", "Access the path parameter `id`"], - ["13", "req.params.name", "Access the path parameter `name`"] + ["12", "req.params.id", "Access the path parameter `id`."], + ["13", "req.params.name", "Access the path parameter `name`."] ] ```ts title="src/api/hello-world/[id]/name/[name]/route.ts" highlights={multiplePathHighlights} @@ -74,7 +74,7 @@ You can access all query parameters in the `query` property of the `MedusaReques For example: export const queryHighlights = [ - ["11", "req.query.name", "Access the query parameter `name`"], + ["11", "req.query.name", "Access the query parameter `name`."], ] ```ts title="src/api/hello-world/route.ts" highlights={queryHighlights} @@ -99,17 +99,17 @@ The value of `req.query.name` is the value passed in `?name=John`, for example. You can apply validation rules on received query parameters to ensure they match specified rules and types. -Learn more in [this documentation](../validation/page.mdx#how-to-validate-request-query-paramters). +Learn more in the [API Route Validation](../validation/page.mdx#how-to-validate-request-query-parameters) chapter. --- ## Request Body Parameters -The Medusa application parses the body of any request having a JSON, URL-encoded, or text request content types. The request body parameters are set in the `MedusaRequest`'s `body` property. +The Medusa application parses the body of any request with JSON, URL-encoded, or text content types. The request body parameters are set in the `MedusaRequest`'s `body` property. -Learn more about configuring body parsing in [this guide](../parse-body/page.mdx). +Learn more about configuring body parsing in the [Body Parsing](../parse-body/page.mdx) chapter. @@ -117,7 +117,7 @@ For example: export const bodyHighlights = [ ["11", "HelloWorldReq", "Specify the type of the request body parameters."], - ["15", "req.body.name", "Access the request body parameter `name`"], + ["15", "req.body.name", "Access the request body parameter `name`."], ] ```ts title="src/api/hello-world/route.ts" highlights={bodyHighlights} @@ -170,4 +170,4 @@ This returns the following JSON object: You can apply validation rules on received body parameters to ensure they match specified rules and types. -Learn more in [this documentation](../validation/page.mdx#how-to-validate-request-body). +Learn more in the [Body Validation](../validation/page.mdx#how-to-validate-request-body) chapter. diff --git a/www/apps/book/app/learn/fundamentals/custom-cli-scripts/seed-data/page.mdx b/www/apps/book/app/learn/fundamentals/custom-cli-scripts/seed-data/page.mdx index a24559d8d1..2aa553287a 100644 --- a/www/apps/book/app/learn/fundamentals/custom-cli-scripts/seed-data/page.mdx +++ b/www/apps/book/app/learn/fundamentals/custom-cli-scripts/seed-data/page.mdx @@ -4,7 +4,7 @@ export const metadata = { # {metadata.title} -In this chapter, you'll learn how to seed data using a custom CLI script. +In this chapter, you'll learn how to seed data using a [custom CLI script](../page.mdx). ## How to Seed Data @@ -12,7 +12,9 @@ To seed dummy data for development or demo purposes, use a custom CLI script. In the CLI script, use your custom workflows or Medusa's existing workflows, which you can browse in [this reference](!resources!/medusa-workflows-reference), to seed data. -### Example: Seed Dummy Products +--- + +## Example: Seed Dummy Products In this section, you'll follow an example of creating a custom CLI script that seeds fifty dummy products. @@ -25,7 +27,7 @@ npm install --save-dev @faker-js/faker Then, create the file `src/scripts/demo-products.ts` with the following content: export const highlights = [ - ["16", "salesChannelModuleService", "Resolve the Sales Chanel Module's main service"], + ["16", "salesChannelModuleService", "Resolve the Sales Channel Module's service."], ["19", "logger", "Resolve the logger to log messages in the terminal."], ["22", "query", "Resolve Query to retrieve data later."], ["26", "defaultSalesChannel", "Retrieve the default sales channel to associate products with."], @@ -77,8 +79,8 @@ export default async function seedDummyProducts({ So far, in the script, you: -- Resolve the Sales Channel Module's main service to retrieve the application's default sales channel. This is the sales channel the dummy products will be available in. -- Resolve the Logger to log messages in the terminal, and Query to later retrieve data useful for the seeded products. +- Resolve the [Sales Channel Module](!resources!/commerce-modules/sales-channel)'s service to retrieve the application's default sales channel. This is the sales channel the dummy products will be available in. +- Resolve the [Logger](../../../debugging-and-testing/logging/page.mdx) to log messages in the terminal, and Query to later retrieve data useful for the seeded products. - Initialize some default data to use when seeding the products next. Next, replace the `TODO` with the following: @@ -88,7 +90,7 @@ const productsData = new Array(productsNum).fill(0).map((_, index) => { const title = faker.commerce.product() + "_" + index return { title, - is_giftcard: true, + is_giftcard: false, description: faker.commerce.productDescription(), status: ProductStatus.PUBLISHED, options: [ @@ -154,7 +156,7 @@ logger.info(`Seeded ${products.length} products.`) You create the generated products using the `createProductsWorkflow` imported previously from `@medusajs/medusa/core-flows`. It accepts the product data as input, and returns the created products. -Only thing left is to create inventory levels for the products. So, replace the last `TODO` with the following: +The only thing left is to create [inventory levels](!resources!/commerce-modules/inventory/concepts#inventorylevel) for the product variants. So, replace the last `TODO` with the following: ```ts title="src/scripts/demo-products.ts" logger.info("Seeding inventory levels.") @@ -184,7 +186,7 @@ await createInventoryLevelsWorkflow(container).run({ logger.info("Finished seeding inventory levels data.") ``` -You use Query to retrieve the stock location, to use the first location in the application, and the inventory items. +You use [Query](../../module-links/query/page.mdx) to retrieve the first stock location in the application and the inventory items. Then, you generate inventory levels for each inventory item, associating it with the first stock location. diff --git a/www/apps/book/app/learn/fundamentals/module-links/query-context/page.mdx b/www/apps/book/app/learn/fundamentals/module-links/query-context/page.mdx index 6e804eb4ca..83856f3231 100644 --- a/www/apps/book/app/learn/fundamentals/module-links/query-context/page.mdx +++ b/www/apps/book/app/learn/fundamentals/module-links/query-context/page.mdx @@ -4,30 +4,36 @@ export const metadata = { # {metadata.title} -In this chapter, you'll learn how to pass contexts when retrieving data with [Query](../query/page.mdx). +In this chapter, you'll learn how to pass context when retrieving data with [Query](../query/page.mdx). ## What is Query Context? -Query context is a way to pass additional information when retrieving data with Query. This data can be useful when applying custom transformations to the retrieved data based on the current context. +Query context is additional information you pass to Query when retrieving data. You can use it to apply custom transformations to the returned data based on the current context. -For example, consider you have a Blog Module with posts and authors. You can accept the user's language as a context and return the posts in the user's language. Another example is how Medusa uses Query Context to [retrieve product variants' prices based on the customer's currency](!resources!/commerce-modules/product/guides/price). +For example, consider a Blog Module with posts and authors. You can send the user's language as context to Query to retrieve posts in the user's language. + +Medusa also uses Query Context to [retrieve product variants' prices based on the customer's currency](!resources!/commerce-modules/product/guides/price). --- -## How to Use Query Context +## How to Pass Query Context -The `query.graph` method accepts an optional `context` parameter that can be used to pass additional context either to the data model you're retrieving (for example, `post`), or its related and linked models (for example, `author`). +The `query.graph` method accepts an optional `context` parameter. You can use this to pass additional context to the data model you're retrieving (for example, `post`) or its related and linked models (for example, `author`). -You initialize a context using `QueryContext` from the Modules SDK. It accepts an object of contexts as an argument. +You can initialize a context using `QueryContext` from the Modules SDK. It accepts an object of contexts as an argument. -For example, to retrieve posts using Query while passing the user's language as a context: +For example, to retrieve posts using Query while passing the user's language as context: export const highlights1 = [ - ["4", "context", "Pass additional context to the query."], - ["4", "QueryContext", "Create a query context."] + ["8", "context", "Pass additional context to the query."], + ["8", "QueryContext", "Create a query context."] ] -```ts +```ts highlights={highlights1} +import { QueryContext } from "@medusajs/framework/utils" + +// ... + const { data } = await query.graph({ entity: "post", fields: ["*"], @@ -37,11 +43,13 @@ const { data } = await query.graph({ }) ``` -In this example, you pass in the context a `lang` property whose value is `es`. +In this example, you pass a `lang` property with the value `es` in the context. You create the context using `QueryContext`. -Then, to handle the context while retrieving records of the data model, in the associated module's service you override the generated `list` method of the data model. +### How to Handle Query Context -For example, continuing the example above, you can override the `listPosts` method of the Blog Module's service to handle the context: +To handle the Query context passed while retrieving records of your data models, override the [generated list method](!resources!/service-factory-reference/methods/list) of the associated module's service. + +For example, continuing the example above, you can override the `listPosts` method of the Blog Module's service to handle the Query context: export const highlights2 = [ ["11", "listPosts", "Override the generated listPosts method."], @@ -87,23 +95,17 @@ class BlogModuleService extends MedusaService({ export default BlogModuleService ``` -In the above example, you override the generated `listPosts` method. This method receives as a first parameter the filters passed to the query, but it also includes a `context` property that holds the context passed to the query. +In the above example, you override the generated `listPosts` method. This method receives the filters passed to `query.graph` as its first parameter. The first parameter includes a `context` property that holds the Query context alsopassed to `query.graph`. -You extract the context from `filters`, then retrieve the posts using the parent's `listPosts` method. After that, if the language is set in the context, you transform the titles of the posts. +You extract the context from `filters`, then retrieve the posts using the parent's `listPosts` method. If the language is set in the context, you transform the post titles. All posts returned will now have their titles appended with "en español". - - -Learn more about the generated `list` method in [this reference](!resources!/service-factory-reference/methods/list). - - - ### Using Pagination with Query -If you pass pagination fields to `query.graph`, you must also override the `listAndCount` method in the service. +If you pass pagination fields to `query.graph`, you must also override the [generated listAndCount method](!resources!/service-factory-reference/methods/listAndCount) in the service. -For example, following along with the previous example, you must override the `listAndCountPosts` method of the Blog Module's service: +For example, following the previous example, you must override the `listAndCountPosts` method of the Blog Module's service: ```ts import { MedusaContext, MedusaService } from "@medusajs/framework/utils" @@ -131,7 +133,7 @@ class BlogModuleService extends MedusaService({ ) if (context.lang === "es") { - result.posts = posts.map((post) => { + result[0] = result[0].map((post) => { return { ...post, title: post.title + " en español", @@ -146,17 +148,17 @@ class BlogModuleService extends MedusaService({ export default BlogModuleService ``` -Now, the `listAndCountPosts` method will handle the context passed to `query.graph` when you pass pagination fields. You can also move the logic to transform the posts' titles to a separate method and call it from both `listPosts` and `listAndCountPosts`. +Now, the `listAndCountPosts` method will handle the context passed to `query.graph` when you pass pagination fields. You can also move the logic to transform the post titles to a separate method and call it from both `listPosts` and `listAndCountPosts`. --- ## Passing Query Context to Related Data Models -If you're retrieving a data model and you want to pass context to its associated model in the same module, you can pass them as part of `QueryContext`'s parameter, then handle them in the same `list` method. +If you're retrieving a data model and want to pass Query context to its associated model in the same module, pass them as part of `QueryContext`'s parameter. Then, you can handle them in the same `list` method. -For linked data models, check out the [next section](#passing-query-context-to-linked-data-models). +To pass Query context to linked data models, check out the [next section](#passing-query-context-to-linked-data-models). @@ -229,15 +231,15 @@ class BlogModuleService extends MedusaService({ export default BlogModuleService ``` -The context in `filters` will also have the context for `author`, which you can use to make transformations to the post's authors. +The context in `filters` will also include the context for `author`, which you can use to transform the post's authors. --- ## Passing Query Context to Linked Data Models -If you're retrieving a data model and you want to pass context to a linked model in a different module, pass to the `context` property an object instead, where its keys are the linked model's name and the values are the context for that linked model. +If you're retrieving a data model and want to pass Query context to a linked model in a different module, pass an object to the `context` property instead. The object's keys should be the linked model's name, and the values should be the Query context for that linked model. -For example, consider the Product Module's `Product` data model is linked to the Blog Module's `Post` data model. You can pass context to the `Post` data model while retrieving products like so: +For example, consider the Product Module's `Product` data model is linked to the Blog Module's `Post` data model. You can pass context to the `Post` data model while retrieving products: export const highlights5 = [ ["5", "post", "Pass a context for posts."] @@ -255,6 +257,6 @@ const { data } = await query.graph({ }) ``` -In this example, you retrieve products and their associated posts. You also pass a context for `post`, indicating the customer's language. +In this example, you retrieve products and their associated posts. You also pass Query context for `post`, indicating the customer's language. -To handle the context, you override the generated `listPosts` method of the Blog Module as explained [previously](#how-to-use-query-context). +To handle the context, override the generated `listPosts` method of the Blog Module as explained [previously](#how-to-handle-query-context). diff --git a/www/apps/book/generated/edit-dates.mjs b/www/apps/book/generated/edit-dates.mjs index cf85e680b7..6619ce793e 100644 --- a/www/apps/book/generated/edit-dates.mjs +++ b/www/apps/book/generated/edit-dates.mjs @@ -41,7 +41,7 @@ export const generatedEditDates = { "app/learn/fundamentals/modules/service-factory/page.mdx": "2025-07-31T13:27:53.791Z", "app/learn/fundamentals/modules/module-links/page.mdx": "2024-09-30T08:43:53.126Z", "app/learn/fundamentals/scheduled-jobs/execution-number/page.mdx": "2025-07-25T15:54:56.135Z", - "app/learn/fundamentals/api-routes/parameters/page.mdx": "2025-02-14T08:34:03.184Z", + "app/learn/fundamentals/api-routes/parameters/page.mdx": "2025-09-15T15:47:08.409Z", "app/learn/fundamentals/api-routes/http-methods/page.mdx": "2025-07-25T15:12:29.347Z", "app/learn/fundamentals/admin/tips/page.mdx": "2025-08-20T11:37:12.855Z", "app/learn/fundamentals/api-routes/cors/page.mdx": "2025-03-11T08:54:26.281Z", @@ -91,7 +91,7 @@ export const generatedEditDates = { "app/learn/fundamentals/modules/infrastructure-modules/page.mdx": "2025-05-21T14:31:51.644Z", "app/learn/introduction/architecture/page.mdx": "2025-07-18T15:52:35.513Z", "app/learn/fundamentals/data-models/infer-type/page.mdx": "2025-03-18T07:41:01.936Z", - "app/learn/fundamentals/custom-cli-scripts/seed-data/page.mdx": "2024-12-09T14:38:06.385Z", + "app/learn/fundamentals/custom-cli-scripts/seed-data/page.mdx": "2025-09-15T16:02:51.362Z", "app/learn/fundamentals/environment-variables/page.mdx": "2025-05-26T15:06:07.800Z", "app/learn/build/page.mdx": "2025-04-25T12:34:33.914Z", "app/learn/deployment/general/page.mdx": "2025-09-01T06:21:43.760Z", @@ -104,7 +104,7 @@ export const generatedEditDates = { "app/learn/fundamentals/plugins/page.mdx": "2025-01-22T10:14:10.433Z", "app/learn/customization/reuse-customizations/page.mdx": "2025-09-04T15:45:52.047Z", "app/learn/update/page.mdx": "2025-01-27T08:45:19.030Z", - "app/learn/fundamentals/module-links/query-context/page.mdx": "2025-02-12T16:59:20.963Z", + "app/learn/fundamentals/module-links/query-context/page.mdx": "2025-09-15T16:09:58.104Z", "app/learn/fundamentals/admin/environment-variables/page.mdx": "2025-08-01T13:16:25.172Z", "app/learn/fundamentals/api-routes/parse-body/page.mdx": "2025-08-20T09:58:37.704Z", "app/learn/fundamentals/admin/routing/page.mdx": "2025-07-25T07:35:18.038Z", diff --git a/www/apps/book/public/llms-full.txt b/www/apps/book/public/llms-full.txt index 5879ccbf97..b18a89996b 100644 --- a/www/apps/book/public/llms-full.txt +++ b/www/apps/book/public/llms-full.txt @@ -8591,15 +8591,15 @@ The value of `req.query.name` is the value passed in `?name=John`, for example. You can apply validation rules on received query parameters to ensure they match specified rules and types. -Learn more in [this documentation](https://docs.medusajs.com/learn/fundamentals/api-routes/validation#how-to-validate-request-query-paramters/index.html.md). +Learn more in the [API Route Validation](https://docs.medusajs.com/learn/fundamentals/api-routes/validation#how-to-validate-request-query-parameters/index.html.md) chapter. *** ## Request Body Parameters -The Medusa application parses the body of any request having a JSON, URL-encoded, or text request content types. The request body parameters are set in the `MedusaRequest`'s `body` property. +The Medusa application parses the body of any request with JSON, URL-encoded, or text content types. The request body parameters are set in the `MedusaRequest`'s `body` property. -Learn more about configuring body parsing in [this guide](https://docs.medusajs.com/learn/fundamentals/api-routes/parse-body/index.html.md). +Learn more about configuring body parsing in the [Body Parsing](https://docs.medusajs.com/learn/fundamentals/api-routes/parse-body/index.html.md) chapter. For example: @@ -8649,7 +8649,7 @@ This returns the following JSON object: You can apply validation rules on received body parameters to ensure they match specified rules and types. -Learn more in [this documentation](https://docs.medusajs.com/learn/fundamentals/api-routes/validation#how-to-validate-request-body/index.html.md). +Learn more in the [Body Validation](https://docs.medusajs.com/learn/fundamentals/api-routes/validation#how-to-validate-request-body/index.html.md) chapter. # Configure Request Body Parser @@ -9695,7 +9695,7 @@ The `startup` script will run every time you run the Medusa application. # Seed Data with Custom CLI Script -In this chapter, you'll learn how to seed data using a custom CLI script. +In this chapter, you'll learn how to seed data using a [custom CLI script](https://docs.medusajs.com/learn/fundamentals/custom-cli-scripts/index.html.md). ## How to Seed Data @@ -9703,7 +9703,9 @@ To seed dummy data for development or demo purposes, use a custom CLI script. In the CLI script, use your custom workflows or Medusa's existing workflows, which you can browse in [this reference](https://docs.medusajs.com/resources/medusa-workflows-reference/index.html.md), to seed data. -### Example: Seed Dummy Products +*** + +## Example: Seed Dummy Products In this section, you'll follow an example of creating a custom CLI script that seeds fifty dummy products. @@ -9757,8 +9759,8 @@ export default async function seedDummyProducts({ So far, in the script, you: -- Resolve the Sales Channel Module's main service to retrieve the application's default sales channel. This is the sales channel the dummy products will be available in. -- Resolve the Logger to log messages in the terminal, and Query to later retrieve data useful for the seeded products. +- Resolve the [Sales Channel Module](https://docs.medusajs.com/resources/commerce-modules/sales-channel/index.html.md)'s service to retrieve the application's default sales channel. This is the sales channel the dummy products will be available in. +- Resolve the [Logger](https://docs.medusajs.com/learn/debugging-and-testing/logging/index.html.md) to log messages in the terminal, and Query to later retrieve data useful for the seeded products. - Initialize some default data to use when seeding the products next. Next, replace the `TODO` with the following: @@ -9768,7 +9770,7 @@ const productsData = new Array(productsNum).fill(0).map((_, index) => { const title = faker.commerce.product() + "_" + index return { title, - is_giftcard: true, + is_giftcard: false, description: faker.commerce.productDescription(), status: ProductStatus.PUBLISHED, options: [ @@ -9834,7 +9836,7 @@ logger.info(`Seeded ${products.length} products.`) You create the generated products using the `createProductsWorkflow` imported previously from `@medusajs/medusa/core-flows`. It accepts the product data as input, and returns the created products. -Only thing left is to create inventory levels for the products. So, replace the last `TODO` with the following: +The only thing left is to create [inventory levels](https://docs.medusajs.com/resources/commerce-modules/inventory/concepts#inventorylevel/index.html.md) for the product variants. So, replace the last `TODO` with the following: ```ts title="src/scripts/demo-products.ts" logger.info("Seeding inventory levels.") @@ -9864,7 +9866,7 @@ await createInventoryLevelsWorkflow(container).run({ logger.info("Finished seeding inventory levels data.") ``` -You use Query to retrieve the stock location, to use the first location in the application, and the inventory items. +You use [Query](https://docs.medusajs.com/learn/fundamentals/module-links/query/index.html.md) to retrieve the first stock location in the application and the inventory items. Then, you generate inventory levels for each inventory item, associating it with the first stock location. @@ -14095,25 +14097,31 @@ npx medusa db:migrate # Query Context -In this chapter, you'll learn how to pass contexts when retrieving data with [Query](https://docs.medusajs.com/learn/fundamentals/module-links/query/index.html.md). +In this chapter, you'll learn how to pass context when retrieving data with [Query](https://docs.medusajs.com/learn/fundamentals/module-links/query/index.html.md). ## What is Query Context? -Query context is a way to pass additional information when retrieving data with Query. This data can be useful when applying custom transformations to the retrieved data based on the current context. +Query context is additional information you pass to Query when retrieving data. You can use it to apply custom transformations to the returned data based on the current context. -For example, consider you have a Blog Module with posts and authors. You can accept the user's language as a context and return the posts in the user's language. Another example is how Medusa uses Query Context to [retrieve product variants' prices based on the customer's currency](https://docs.medusajs.com/resources/commerce-modules/product/guides/price/index.html.md). +For example, consider a Blog Module with posts and authors. You can send the user's language as context to Query to retrieve posts in the user's language. + +Medusa also uses Query Context to [retrieve product variants' prices based on the customer's currency](https://docs.medusajs.com/resources/commerce-modules/product/guides/price/index.html.md). *** -## How to Use Query Context +## How to Pass Query Context -The `query.graph` method accepts an optional `context` parameter that can be used to pass additional context either to the data model you're retrieving (for example, `post`), or its related and linked models (for example, `author`). +The `query.graph` method accepts an optional `context` parameter. You can use this to pass additional context to the data model you're retrieving (for example, `post`) or its related and linked models (for example, `author`). -You initialize a context using `QueryContext` from the Modules SDK. It accepts an object of contexts as an argument. +You can initialize a context using `QueryContext` from the Modules SDK. It accepts an object of contexts as an argument. -For example, to retrieve posts using Query while passing the user's language as a context: +For example, to retrieve posts using Query while passing the user's language as context: + +```ts highlights={highlights1} +import { QueryContext } from "@medusajs/framework/utils" + +// ... -```ts const { data } = await query.graph({ entity: "post", fields: ["*"], @@ -14123,11 +14131,13 @@ const { data } = await query.graph({ }) ``` -In this example, you pass in the context a `lang` property whose value is `es`. +In this example, you pass a `lang` property with the value `es` in the context. You create the context using `QueryContext`. -Then, to handle the context while retrieving records of the data model, in the associated module's service you override the generated `list` method of the data model. +### How to Handle Query Context -For example, continuing the example above, you can override the `listPosts` method of the Blog Module's service to handle the context: +To handle the Query context passed while retrieving records of your data models, override the [generated list method](https://docs.medusajs.com/resources/service-factory-reference/methods/list/index.html.md) of the associated module's service. + +For example, continuing the example above, you can override the `listPosts` method of the Blog Module's service to handle the Query context: ```ts highlights={highlights2} import { MedusaContext, MedusaService } from "@medusajs/framework/utils" @@ -14166,19 +14176,17 @@ class BlogModuleService extends MedusaService({ export default BlogModuleService ``` -In the above example, you override the generated `listPosts` method. This method receives as a first parameter the filters passed to the query, but it also includes a `context` property that holds the context passed to the query. +In the above example, you override the generated `listPosts` method. This method receives the filters passed to `query.graph` as its first parameter. The first parameter includes a `context` property that holds the Query context alsopassed to `query.graph`. -You extract the context from `filters`, then retrieve the posts using the parent's `listPosts` method. After that, if the language is set in the context, you transform the titles of the posts. +You extract the context from `filters`, then retrieve the posts using the parent's `listPosts` method. If the language is set in the context, you transform the post titles. All posts returned will now have their titles appended with "en español". -Learn more about the generated `list` method in [this reference](https://docs.medusajs.com/resources/service-factory-reference/methods/list/index.html.md). - ### Using Pagination with Query -If you pass pagination fields to `query.graph`, you must also override the `listAndCount` method in the service. +If you pass pagination fields to `query.graph`, you must also override the [generated listAndCount method](https://docs.medusajs.com/resources/service-factory-reference/methods/listAndCount/index.html.md) in the service. -For example, following along with the previous example, you must override the `listAndCountPosts` method of the Blog Module's service: +For example, following the previous example, you must override the `listAndCountPosts` method of the Blog Module's service: ```ts import { MedusaContext, MedusaService } from "@medusajs/framework/utils" @@ -14206,7 +14214,7 @@ class BlogModuleService extends MedusaService({ ) if (context.lang === "es") { - result.posts = posts.map((post) => { + result[0] = result[0].map((post) => { return { ...post, title: post.title + " en español", @@ -14221,15 +14229,15 @@ class BlogModuleService extends MedusaService({ export default BlogModuleService ``` -Now, the `listAndCountPosts` method will handle the context passed to `query.graph` when you pass pagination fields. You can also move the logic to transform the posts' titles to a separate method and call it from both `listPosts` and `listAndCountPosts`. +Now, the `listAndCountPosts` method will handle the context passed to `query.graph` when you pass pagination fields. You can also move the logic to transform the post titles to a separate method and call it from both `listPosts` and `listAndCountPosts`. *** ## Passing Query Context to Related Data Models -If you're retrieving a data model and you want to pass context to its associated model in the same module, you can pass them as part of `QueryContext`'s parameter, then handle them in the same `list` method. +If you're retrieving a data model and want to pass Query context to its associated model in the same module, pass them as part of `QueryContext`'s parameter. Then, you can handle them in the same `list` method. -For linked data models, check out the [next section](#passing-query-context-to-linked-data-models). +To pass Query context to linked data models, check out the [next section](#passing-query-context-to-linked-data-models). For example, to pass a context for the post's authors: @@ -14292,15 +14300,15 @@ class BlogModuleService extends MedusaService({ export default BlogModuleService ``` -The context in `filters` will also have the context for `author`, which you can use to make transformations to the post's authors. +The context in `filters` will also include the context for `author`, which you can use to transform the post's authors. *** ## Passing Query Context to Linked Data Models -If you're retrieving a data model and you want to pass context to a linked model in a different module, pass to the `context` property an object instead, where its keys are the linked model's name and the values are the context for that linked model. +If you're retrieving a data model and want to pass Query context to a linked model in a different module, pass an object to the `context` property instead. The object's keys should be the linked model's name, and the values should be the Query context for that linked model. -For example, consider the Product Module's `Product` data model is linked to the Blog Module's `Post` data model. You can pass context to the `Post` data model while retrieving products like so: +For example, consider the Product Module's `Product` data model is linked to the Blog Module's `Post` data model. You can pass context to the `Post` data model while retrieving products: ```ts highlights={highlights5} const { data } = await query.graph({ @@ -14314,9 +14322,9 @@ const { data } = await query.graph({ }) ``` -In this example, you retrieve products and their associated posts. You also pass a context for `post`, indicating the customer's language. +In this example, you retrieve products and their associated posts. You also pass Query context for `post`, indicating the customer's language. -To handle the context, you override the generated `listPosts` method of the Blog Module as explained [previously](#how-to-use-query-context). +To handle the context, override the generated `listPosts` method of the Blog Module as explained [previously](#how-to-handle-query-context). # Query