Feat(medusa): search orders by customer phone and name (#2913)
* add support for customer first- and last names and phone * test for querying customer first_name, last_name and phone * add customer as prop for querying orders * polishing before pr * changeset
This commit is contained in:
5
.changeset/light-cars-smile.md
Normal file
5
.changeset/light-cars-smile.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@medusajs/medusa": patch
|
||||
---
|
||||
|
||||
Make orders queryable by customer fields
|
||||
@@ -1369,6 +1369,84 @@ describe("/admin/orders", () => {
|
||||
)
|
||||
})
|
||||
|
||||
it("list all orders with matching customer phone", async () => {
|
||||
const order = await simpleOrderFactory(dbConnection, {
|
||||
customer: {
|
||||
phone: "1234567890",
|
||||
},
|
||||
})
|
||||
|
||||
const api = useApi()
|
||||
|
||||
const response = await api.get("/admin/orders?q=123456", adminReqConfig)
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
expect(response.data.count).toEqual(1)
|
||||
expect(response.data.orders).toHaveLength(1)
|
||||
expect(response.data.orders).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
id: order.id,
|
||||
customer: expect.objectContaining({
|
||||
phone: "1234567890",
|
||||
}),
|
||||
}),
|
||||
])
|
||||
)
|
||||
})
|
||||
|
||||
it("list all orders with matching customer first_name", async () => {
|
||||
const order = await simpleOrderFactory(dbConnection, {
|
||||
customer: {
|
||||
first_name: "john",
|
||||
},
|
||||
})
|
||||
|
||||
const api = useApi()
|
||||
|
||||
const response = await api.get("/admin/orders?q=john", adminReqConfig)
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
expect(response.data.count).toEqual(1)
|
||||
expect(response.data.orders).toHaveLength(1)
|
||||
expect(response.data.orders).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
id: order.id,
|
||||
customer: expect.objectContaining({
|
||||
first_name: "john",
|
||||
}),
|
||||
}),
|
||||
])
|
||||
)
|
||||
})
|
||||
|
||||
it("list all orders with matching customer last_name", async () => {
|
||||
const order = await simpleOrderFactory(dbConnection, {
|
||||
customer: {
|
||||
last_name: "Doe",
|
||||
},
|
||||
})
|
||||
|
||||
const api = useApi()
|
||||
|
||||
const response = await api.get("/admin/orders?q=Doe", adminReqConfig)
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
expect(response.data.count).toEqual(1)
|
||||
expect(response.data.orders).toHaveLength(1)
|
||||
expect(response.data.orders).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
id: order.id,
|
||||
customer: expect.objectContaining({
|
||||
last_name: "Doe",
|
||||
}),
|
||||
}),
|
||||
])
|
||||
)
|
||||
})
|
||||
|
||||
it("list all orders with matching shipping_address first name", async () => {
|
||||
const api = useApi()
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ import {
|
||||
export type CustomerFactoryData = {
|
||||
id?: string
|
||||
email?: string
|
||||
phone?: string
|
||||
first_name?: string
|
||||
last_name?: string
|
||||
groups?: CustomerGroupFactoryData[]
|
||||
password_hash?: string
|
||||
has_account?: boolean
|
||||
@@ -29,6 +32,9 @@ export const simpleCustomerFactory = async (
|
||||
const c = manager.create(Customer, {
|
||||
id: customerId,
|
||||
email: data.email ?? faker.internet.email(),
|
||||
phone: data.phone ?? faker.phone.phoneNumber(),
|
||||
first_name: data.first_name ?? faker.name.firstName(),
|
||||
last_name: data.last_name ?? faker.name.lastName(),
|
||||
password_hash:
|
||||
data.password_hash ??
|
||||
"c2NyeXB0AAEAAAABAAAAAVMdaddoGjwU1TafDLLlBKnOTQga7P2dbrfgf3fB+rCD/cJOMuGzAvRdKutbYkVpuJWTU39P7OpuWNkUVoEETOVLMJafbI8qs8Qx/7jMQXkN", // password matching "test"
|
||||
|
||||
@@ -220,6 +220,7 @@ class OrderService extends TransactionBaseService {
|
||||
alias: "order",
|
||||
innerJoin: {
|
||||
shipping_address: "order.shipping_address",
|
||||
customer: "order.customer",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -233,6 +234,9 @@ class OrderService extends TransactionBaseService {
|
||||
})
|
||||
.orWhere(`order.email ILIKE :q`, { q: `%${q}%` })
|
||||
.orWhere(`display_id::varchar(255) ILIKE :dId`, { dId: `${q}` })
|
||||
.orWhere(`customer.first_name ILIKE :q`, { q: `%${q}%` })
|
||||
.orWhere(`customer.last_name ILIKE :q`, { q: `%${q}%` })
|
||||
.orWhere(`customer.phone ILIKE :q`, { q: `%${q}%` })
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user