From fbf33885f5050785c782755967922131dd0314b8 Mon Sep 17 00:00:00 2001 From: juanzgc Date: Wed, 25 Jun 2025 02:16:40 -0500 Subject: [PATCH] feat: Search by billing_address and shipping_address on Order model (#12814) * feat: Search by billing_address and shipping_address on Order model **What** Added `.searchable()` method to the `shipping_address` and `billing_address` relationships in the `Order` model, enabling search functionality. **Why** Previously searching via `shipping_address` and `billing_address` was not supported, limiting the ability to find orders based on shipping or billing address information. Resolves SUP-1838 * Update integration tests to include billing_address and non-existing addresses. --- .../http/__tests__/order/admin/order.spec.ts | 63 +++++++++++++++++++ packages/modules/order/src/models/order.ts | 2 + 2 files changed, 65 insertions(+) diff --git a/integration-tests/http/__tests__/order/admin/order.spec.ts b/integration-tests/http/__tests__/order/admin/order.spec.ts index 03b24a8448..62bca9e6a2 100644 --- a/integration-tests/http/__tests__/order/admin/order.spec.ts +++ b/integration-tests/http/__tests__/order/admin/order.spec.ts @@ -66,6 +66,69 @@ medusaIntegrationTestRunner({ expect(response.data.orders).toHaveLength(0) expect(response.data.orders).toEqual([]) }) + + it("should search orders by shipping address", async () => { + let response = await api.get(`/admin/orders?fields=+shipping_address.address_1,+shipping_address.address_2`, adminHeaders) + + expect(response.data.orders).toHaveLength(1) + expect(response.data.orders).toEqual([ + expect.objectContaining({ + id: order.id, + }), + ]) + + response = await api.get(`/admin/orders?fields=+shipping_address.address_1,+shipping_address.address_2&q=${order.shipping_address.address_1}`, 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.shipping_address.address_2}`, adminHeaders) + + expect(response.data.orders).toHaveLength(1) + expect(response.data.orders).toEqual([ + expect.objectContaining({ + id: order.id, + }), + ]) + + response = await api.get(`/admin/orders?q=does-not-exist`, adminHeaders) + + expect(response.data.orders).toHaveLength(0) + expect(response.data.orders).toEqual([]) + }) + + it("should search orders by billing address", async () => { + let response = await api.get(`/admin/orders?fields=+billing_address.address_1,+billing_address.address_2`, adminHeaders) + + expect(response.data.orders).toHaveLength(1) + expect(response.data.orders).toEqual([ + expect.objectContaining({ + id: order.id, + }), + ]) + + response = await api.get(`/admin/orders?fields=+billing_address.address_1,+billing_address.address_2&q=${order.billing_address.address_1}`, 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.billing_address.address_2}`, adminHeaders) + + expect(response.data.orders).toHaveLength(1) + expect(response.data.orders).toEqual([ + expect.objectContaining({ + id: order.id, + }), + ]) + }) }) describe("POST /orders/:id", () => { diff --git a/packages/modules/order/src/models/order.ts b/packages/modules/order/src/models/order.ts index 455d52c44e..9843ae9cd3 100644 --- a/packages/modules/order/src/models/order.ts +++ b/packages/modules/order/src/models/order.ts @@ -27,12 +27,14 @@ const _Order = model mappedBy: undefined, foreignKey: true, }) + .searchable() .nullable(), billing_address: model .hasOne(() => OrderAddress, { mappedBy: undefined, foreignKey: true, }) + .searchable() .nullable(), summary: model.hasMany(() => OrderSummary, { mappedBy: "order",