diff --git a/www/apps/book/app/advanced-development/data-models/default-properties/page.mdx b/www/apps/book/app/advanced-development/data-models/default-properties/page.mdx new file mode 100644 index 0000000000..7d4984153a --- /dev/null +++ b/www/apps/book/app/advanced-development/data-models/default-properties/page.mdx @@ -0,0 +1,13 @@ +export const metadata = { + title: `${pageNumber} Data Model Default Properties`, +} + +# {metadata.title} + +In this chapter, you'll learn about the properties available by default in your data model. + +When you create a data model, the following properties are created for you by Medusa: + +- `created_at`: A `dateTime` property that stores when a record of the data model was created. +- `updated_at`: A `dateTime` property that stores when a record of the data model was updated. +- `deleted_at`: A `dateTime` property that stores when a record of the data model was deleted. When you delete a record, Medusa soft-deletes it by setting the `deleted_at` property to the current date. diff --git a/www/apps/book/app/advanced-development/data-models/index/page.mdx b/www/apps/book/app/advanced-development/data-models/index/page.mdx new file mode 100644 index 0000000000..2f392f78a4 --- /dev/null +++ b/www/apps/book/app/advanced-development/data-models/index/page.mdx @@ -0,0 +1,160 @@ +export const metadata = { + title: `${pageNumber} Data Model Index`, +} + +# {metadata.title} + +In this chapter, you’ll learn how to define indices on a data model. + +## Define Index on Property + +Define an index on a property using the `model` utility's `index` method. + +For example: + +export const highlights = [ + ["5", "index", "Define an index on the `name` property."], + ["6", '"IDX_MY_CUSTOM_NAME"', "Index name is optional."] +] + +```ts highlights={highlights} +import { model } from "@medusajs/utils" + +const MyCustom = model.define("my_custom", { + id: model.id().primaryKey(), + name: model.text().index( + "IDX_MY_CUSTOM_NAME" + ), +}) + +export default MyCustom +``` + +The `index` method optionally accepts the name of the index as a parameter. + +In this example, you define an index on the `name` property. + +--- + +## Define Index on Data Model + +A data model has an `indexes` method that defines indices on the data model. + +The index can be on multiple columns (composite index). For example: + +export const dataModelIndexHighlights = [ + ["7", "indexes", "Define indices on the data model."], + ["9", "on", "Specify the properties to define the index on."] +] + +```ts highlights={dataModelIndexHighlights} +import { model } from "@medusajs/utils" + +const MyCustom = model.define("my_custom", { + id: model.id().primaryKey(), + name: model.text(), + age: model.number() +}).indexes([ + { + on: ["name", "age"], + }, +]) + +export default MyCustom +``` + +The `indexes` method receives an array of indices as a parameter. Each index is an object with a required `on` property indicating the properties to apply the index on. + +In the above example, you define a composite index on the `name` and `age` properties. + +### Index Conditions + +An index can have conditions. For example: + +export const conditionHighlights = [ + ["10", "where", "Specify conditions on properties."], + ["11", "", "Create the index when `age` is `30`."] +] + +```ts highlights={conditionHighlights} +import { model } from "@medusajs/utils" + +const MyCustom = model.define("my_custom", { + id: model.id().primaryKey(), + name: model.text(), + age: model.number() +}).indexes([ + { + on: ["name", "age"], + where: { + age: 30 + } + }, +]) + +export default MyCustom +``` + +The index object passed to `indexes` accepts a `where` property that is an object of conditions. The object's key is a property's name, and its value is the condition on that property. + +In the example above, the composite index is created on the `name` and `age` properties when the `age`'s value is `30`. + +A property's condition can be a negation. For example: + +export const negationHighlights = [ + ["12", "", "Create the index when `age` is not `null`."] +] + +```ts highlights={negationHighlights} +import { model } from "@medusajs/utils" + +const MyCustom = model.define("my_custom", { + id: model.id().primaryKey(), + name: model.text(), + age: model.number().nullable() +}).indexes([ + { + on: ["name", "age"], + where: { + age: { + $ne: null + } + } + }, +]) + +export default MyCustom +``` + +A property's value in `where` can be an object having a `$ne` property. `$ne`'s value indicates what the specified property's value shouldn't be. + +In the example above, the composite index is created on the `name` and `age` properties when `age`'s value is not `null`. + +### Unique Data Model Index + +The object passed to `indexes` accepts a `unique` property indicating that the created index must be a unique index. + +For example: + +export const uniqueHighlights = [ + ["10", "unique", "Specify if the index is a unique index."] +] + +```ts highlights={uniqueHighlights} +import { model } from "@medusajs/utils" + +const MyCustom = model.define("my_custom", { + id: model.id().primaryKey(), + name: model.text(), + age: model.number() +}).indexes([ + { + on: ["name", "age"], + unique: true + }, +]) + +export default MyCustom +``` + +This creates a unique composite index on the `name` and `age` properties. \ No newline at end of file diff --git a/www/apps/book/app/advanced-development/data-models/indexes/page.mdx b/www/apps/book/app/advanced-development/data-models/indexes/page.mdx deleted file mode 100644 index f4b6b3e2b5..0000000000 --- a/www/apps/book/app/advanced-development/data-models/indexes/page.mdx +++ /dev/null @@ -1,32 +0,0 @@ -export const metadata = { - title: `${pageNumber} Data Model Indexes`, -} - -# {metadata.title} - -In this chapter, you’ll learn how to define indexes on a data model. - -## Define Index - -The `index` method defines a custom index on a property. - -For example: - -export const highlights = [ - ["5", "index", "Define an index on the `name` property."] -] - -```ts highlights={highlights} -import { model } from "@medusajs/utils" - -const MyCustom = model.define("my_custom", { - id: model.id(), - name: model.text().index( - "IDX_MY_CUSTOM_NAME" - ), -}) - -export default MyCustom -``` - -In this example, you define an index on the `name` property. The `index` method optionally accepts the name of the index as a parameter. diff --git a/www/apps/book/app/advanced-development/data-models/primary-key/page.mdx b/www/apps/book/app/advanced-development/data-models/primary-key/page.mdx index 0803069dc3..d88c910670 100644 --- a/www/apps/book/app/advanced-development/data-models/primary-key/page.mdx +++ b/www/apps/book/app/advanced-development/data-models/primary-key/page.mdx @@ -6,35 +6,25 @@ export const metadata = { In this chapter, you’ll learn how to configure the primary key of a data model. -## id Property - -A property defined with the `id` method is, by default, considered the data model’s primary key. - ---- - ## primaryKey Method -To set any `text` or `number` property as a primary key, use the `primaryKey` method. +To set any `id`, `text`, or `number` property as a primary key, use the `primaryKey` method. For example: export const highlights = [ - ["4", "primaryKey", "Define the `code` property to be the data model's primary key."] + ["4", "primaryKey", "Define the `id` property to be the data model's primary key."] ] ```ts highlights={highlights} import { model } from "@medusajs/utils" const MyCustom = model.define("my_custom", { - code: model.text().primaryKey(), + id: model.id().primaryKey(), // ... }) export default MyCustom ``` - - -A property that’s defined with the `primaryKey` method takes precedence over an `id` property. - - \ No newline at end of file +In the example above, the `id` property is defined as the data model's primary key. diff --git a/www/apps/book/app/advanced-development/data-models/relationships/page.mdx b/www/apps/book/app/advanced-development/data-models/relationships/page.mdx index bb847fc982..88277dab86 100644 --- a/www/apps/book/app/advanced-development/data-models/relationships/page.mdx +++ b/www/apps/book/app/advanced-development/data-models/relationships/page.mdx @@ -31,12 +31,12 @@ export const oneToOneHighlights = [ import { model } from "@medusajs/utils" const User = model.define("user", { - id: model.id(), + id: model.id().primaryKey(), email: model.hasOne(() => Email), }) const Email = model.define("email", { - id: model.id(), + id: model.id().primaryKey(), user: model.belongsTo(() => User, { mappedBy: "email", }), @@ -70,12 +70,12 @@ export const oneToManyHighlights = [ import { model } from "@medusajs/utils" const Store = model.define("store", { - id: model.id(), + id: model.id().primaryKey(), products: model.hasMany(() => Product), }) const Product = model.define("product", { - id: model.id(), + id: model.id().primaryKey(), store: model.belongsTo(() => Store, { mappedBy: "products", }), @@ -101,12 +101,12 @@ export const manyToManyHighlights = [ import { model } from "@medusajs/utils" const Order = model.define("order", { - id: model.id(), + id: model.id().primaryKey(), products: model.manyToMany(() => Product), }) const Product = model.define("product", { - id: model.id(), + id: model.id().primaryKey(), order: model.manyToMany(() => Order), }) ``` @@ -132,14 +132,14 @@ export const relationNameHighlights = [ import { model } from "@medusajs/utils" const User = model.define("user", { - id: model.id(), + id: model.id().primaryKey(), email: model.hasOne(() => Email, { mappedBy: "owner", }), }) const Email = model.define("email", { - id: model.id(), + id: model.id().primaryKey(), owner: model.belongsTo(() => User, { mappedBy: "email", }), @@ -170,7 +170,7 @@ export const highlights = [ import { model } from "@medusajs/utils" const Store = model.define("store", { - id: model.id(), + id: model.id().primaryKey(), products: model.hasMany(() => Product), }) .cascades({ @@ -178,7 +178,7 @@ const Store = model.define("store", { }) const Product = model.define("product", { - id: model.id(), + id: model.id().primaryKey(), store: model.belongsTo(() => Store, { mappedBy: "products", }), diff --git a/www/apps/book/app/advanced-development/data-models/soft-deletable/page.mdx b/www/apps/book/app/advanced-development/data-models/soft-deletable/page.mdx deleted file mode 100644 index 0b1eb3f957..0000000000 --- a/www/apps/book/app/advanced-development/data-models/soft-deletable/page.mdx +++ /dev/null @@ -1,19 +0,0 @@ -export const metadata = { - title: `${pageNumber} Soft-Deletable Data Models`, -} - -# {metadata.title} - -In this chapter, you’ll learn about soft-deletable data models. - -## What is a Soft-Deletable Data Model? - -A soft-deletable data model is a model that has a `deleted_at` `dateTime` property. - -When a record of the data model is deleted, this field is set to the current date, marking it as deleted. - ---- - -## Configure Data Model Soft-Deletion - -By default, all data models have a `deleted_at` property and are considered soft-deletable. diff --git a/www/apps/book/app/basics/data-models/page.mdx b/www/apps/book/app/basics/data-models/page.mdx index aca44de7cf..9c4ece4339 100644 --- a/www/apps/book/app/basics/data-models/page.mdx +++ b/www/apps/book/app/basics/data-models/page.mdx @@ -30,7 +30,7 @@ For example, create the file `src/modules/hello/models/my-custom.ts` with the fo import { model } from "@medusajs/utils" const MyCustom = model.define("my_custom", { - id: model.id(), + id: model.id().primaryKey(), name: model.text(), }) diff --git a/www/apps/book/sidebar.mjs b/www/apps/book/sidebar.mjs index 5b4068de6c..947f758e18 100644 --- a/www/apps/book/sidebar.mjs +++ b/www/apps/book/sidebar.mjs @@ -135,25 +135,25 @@ export const sidebar = sidebarAttachHrefCommonOptions( path: "/advanced-development/data-models/property-types", title: "Property Types", }, - { - path: "/advanced-development/data-models/configure-properties", - title: "Configure Properties", - }, { path: "/advanced-development/data-models/primary-key", title: "Primary Key", }, + { + path: "/advanced-development/data-models/default-properties", + title: "Default Properties", + }, + { + path: "/advanced-development/data-models/configure-properties", + title: "Configure Properties", + }, { path: "/advanced-development/data-models/relationships", title: "Relationships", }, { - path: "/advanced-development/data-models/indexes", - title: "Data Model Index", - }, - { - path: "/advanced-development/data-models/soft-deletable", - title: "Soft-Deletable Models", + path: "/advanced-development/data-models/index", + title: "Index", }, { path: "/advanced-development/data-models/searchable-property", diff --git a/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx b/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx index c71e393d9d..a2499993fc 100644 --- a/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx +++ b/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx @@ -16,7 +16,7 @@ The rest of this guide uses this `Manager` data model as an example: import { model } from "@medusajs/utils" const Manager = model.define("manager", { - id: model.id(), + id: model.id().primaryKey(), firstName: model.text(), lastName: model.text(), email: model.text(), diff --git a/www/apps/resources/app/recipes/b2b/page.mdx b/www/apps/resources/app/recipes/b2b/page.mdx index 13fd21720a..d479b2d4e9 100644 --- a/www/apps/resources/app/recipes/b2b/page.mdx +++ b/www/apps/resources/app/recipes/b2b/page.mdx @@ -229,7 +229,7 @@ Module Relationships is coming soon. import { model } from "@medusajs/utils" const Company = model.define("company", { - id: model.id(), + id: model.id().primaryKey(), name: model.text(), city: model.text(), country_code: model.text(), diff --git a/www/apps/resources/app/recipes/commerce-automation/page.mdx b/www/apps/resources/app/recipes/commerce-automation/page.mdx index a6aa608f1e..219fec1b14 100644 --- a/www/apps/resources/app/recipes/commerce-automation/page.mdx +++ b/www/apps/resources/app/recipes/commerce-automation/page.mdx @@ -94,7 +94,7 @@ export const restockModelHighlights = [ import { model } from "@medusajs/utils" const RestockNotification = model.define("restock_notification", { - id: model.id(), + id: model.id().primaryKey(), email: model.text(), variant_id: model.text(), sales_channel_id: model.text(), diff --git a/www/apps/resources/app/recipes/digital-products/page.mdx b/www/apps/resources/app/recipes/digital-products/page.mdx index 9b9061b8bd..a0fe152ed2 100644 --- a/www/apps/resources/app/recipes/digital-products/page.mdx +++ b/www/apps/resources/app/recipes/digital-products/page.mdx @@ -182,7 +182,7 @@ Module Relationships is coming soon. import { MediaType } from "../../../types/digital-product/product-media" const ProductMedia = model.define("product_media", { - id: model.id(), + id: model.id().primaryKey(), name: model.text(), type: model.enum(Object.values(MediaType)), fileKey: model.text(), diff --git a/www/apps/resources/app/recipes/marketplace/page.mdx b/www/apps/resources/app/recipes/marketplace/page.mdx index 4d83b02b3a..5bb178a99f 100644 --- a/www/apps/resources/app/recipes/marketplace/page.mdx +++ b/www/apps/resources/app/recipes/marketplace/page.mdx @@ -69,7 +69,7 @@ Module Relationships is coming soon. import { model } from "@medusajs/utils" const StoreUser = model.define("store_user", { - id: model.id(), + id: model.id().primaryKey(), store_id: model.text(), user_id: model.text(), }) @@ -87,7 +87,7 @@ Module Relationships is coming soon. import { model } from "@medusajs/utils" const StoreProduct = model.define("store_user", { - id: model.id(), + id: model.id().primaryKey(), store_id: model.text(), product_id: model.text(), }) @@ -105,7 +105,7 @@ Module Relationships is coming soon. import { model } from "@medusajs/utils" const StoreOrder = model.define("store_user", { - id: model.id(), + id: model.id().primaryKey(), store_id: model.text(), order_id: model.text(), parent_order_id: model.text(),