diff --git a/integration-tests/http/__tests__/order/admin/order.spec.ts b/integration-tests/http/__tests__/order/admin/order.spec.ts index 70c01fc0e0..03b24a8448 100644 --- a/integration-tests/http/__tests__/order/admin/order.spec.ts +++ b/integration-tests/http/__tests__/order/admin/order.spec.ts @@ -30,6 +30,44 @@ medusaIntegrationTestRunner({ ).data.shipping_profile }) + describe("GET /admin/orders", () => { + beforeEach(async () => { + seeder = await createOrderSeeder({ + api, + container: getContainer(), + }) + order = seeder.order + }) + + it("should search orders by display_id", async () => { + let response = await api.get(`/admin/orders`, adminHeaders) + + expect(response.data.orders).toHaveLength(1) + expect(response.data.orders).toEqual([ + expect.objectContaining({ + id: order.id, + }), + ]) + + response = await api.get( + `/admin/orders?q=${order.display_id}`, + adminHeaders + ) + + expect(response.data.orders).toHaveLength(1) + expect(response.data.orders).toEqual([ + expect.objectContaining({ + id: order.id, + }), + ]) + + response = await api.get(`/admin/orders?q=2345`, adminHeaders) + + expect(response.data.orders).toHaveLength(0) + expect(response.data.orders).toEqual([]) + }) + }) + describe("POST /orders/:id", () => { beforeEach(async () => { seeder = await createOrderSeeder({ diff --git a/packages/core/utils/src/dal/mikro-orm/mikro-orm-free-text-search-filter.ts b/packages/core/utils/src/dal/mikro-orm/mikro-orm-free-text-search-filter.ts index 1b515069ca..0397a0d8f3 100644 --- a/packages/core/utils/src/dal/mikro-orm/mikro-orm-free-text-search-filter.ts +++ b/packages/core/utils/src/dal/mikro-orm/mikro-orm-free-text-search-filter.ts @@ -4,7 +4,7 @@ import type { FindOneOptions, FindOptions, } from "@mikro-orm/core" -import { EntityMetadata, ReferenceKind } from "@mikro-orm/core" +import { EntityMetadata, raw, ReferenceKind } from "@mikro-orm/core" import { SqlEntityManager } from "@mikro-orm/postgresql" export const FreeTextSearchFilterKeyPrefix = "freeTextSearch_" @@ -54,9 +54,10 @@ function retrieveRelationsConstraints( } const isText = propertyConfiguration?.columnTypes?.includes("text") + const columnName = isText ? propertyConfiguration.name - : `${propertyConfiguration.name}::text` + : raw((alias) => `cast(${alias}.${propertyConfiguration.name} as text)`) relationFreeTextSearchWhere.push({ [columnName]: { diff --git a/packages/core/utils/src/dml/properties/autoincrement.ts b/packages/core/utils/src/dml/properties/autoincrement.ts index e78279db62..348b033ad9 100644 --- a/packages/core/utils/src/dml/properties/autoincrement.ts +++ b/packages/core/utils/src/dml/properties/autoincrement.ts @@ -8,7 +8,10 @@ import { PrimaryKeyModifier } from "./primary-key" export class AutoIncrementProperty extends BaseProperty { protected dataType: { name: "serial" - options: {} + options: { + searchable?: boolean + primaryKey?: boolean + } } /** @@ -30,6 +33,27 @@ export class AutoIncrementProperty extends BaseProperty { return new PrimaryKeyModifier(this) } + /** + * This method indicates that a serial property is searchable. + * + * @example + * import { model } from "@medusajs/framework/utils" + * + * const MyCustom = model.define("my_custom", { + * name: model.autoincrement().searchable(), + * // ... + * }) + * + * export default MyCustom + * + * @customNamespace Property Configuration Methods + */ + searchable() { + this.dataType.options.searchable = true + + return this + } + constructor(options?: { primaryKey?: boolean }) { super() diff --git a/packages/modules/order/src/models/order.ts b/packages/modules/order/src/models/order.ts index 584c01762b..455d52c44e 100644 --- a/packages/modules/order/src/models/order.ts +++ b/packages/modules/order/src/models/order.ts @@ -1,16 +1,16 @@ import { model, OrderStatus } from "@medusajs/framework/utils" +import { Return } from "@models" import { OrderAddress } from "./address" import { OrderCreditLine } from "./credit-line" import { OrderItem } from "./order-item" import { OrderShipping } from "./order-shipping-method" import { OrderSummary } from "./order-summary" import { OrderTransaction } from "./transaction" -import { Return } from "@models" const _Order = model .define("Order", { id: model.id({ prefix: "order" }).primaryKey(), - display_id: model.autoincrement(), + display_id: model.autoincrement().searchable(), region_id: model.text().nullable(), customer_id: model.text().nullable(), version: model.number().default(1),