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:
@@ -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 () => {
|
it("list all orders with matching shipping_address first name", async () => {
|
||||||
const api = useApi()
|
const api = useApi()
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ import {
|
|||||||
export type CustomerFactoryData = {
|
export type CustomerFactoryData = {
|
||||||
id?: string
|
id?: string
|
||||||
email?: string
|
email?: string
|
||||||
|
phone?: string
|
||||||
|
first_name?: string
|
||||||
|
last_name?: string
|
||||||
groups?: CustomerGroupFactoryData[]
|
groups?: CustomerGroupFactoryData[]
|
||||||
password_hash?: string
|
password_hash?: string
|
||||||
has_account?: boolean
|
has_account?: boolean
|
||||||
@@ -29,6 +32,9 @@ export const simpleCustomerFactory = async (
|
|||||||
const c = manager.create(Customer, {
|
const c = manager.create(Customer, {
|
||||||
id: customerId,
|
id: customerId,
|
||||||
email: data.email ?? faker.internet.email(),
|
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:
|
password_hash:
|
||||||
data.password_hash ??
|
data.password_hash ??
|
||||||
"c2NyeXB0AAEAAAABAAAAAVMdaddoGjwU1TafDLLlBKnOTQga7P2dbrfgf3fB+rCD/cJOMuGzAvRdKutbYkVpuJWTU39P7OpuWNkUVoEETOVLMJafbI8qs8Qx/7jMQXkN", // password matching "test"
|
"c2NyeXB0AAEAAAABAAAAAVMdaddoGjwU1TafDLLlBKnOTQga7P2dbrfgf3fB+rCD/cJOMuGzAvRdKutbYkVpuJWTU39P7OpuWNkUVoEETOVLMJafbI8qs8Qx/7jMQXkN", // password matching "test"
|
||||||
|
|||||||
@@ -220,6 +220,7 @@ class OrderService extends TransactionBaseService {
|
|||||||
alias: "order",
|
alias: "order",
|
||||||
innerJoin: {
|
innerJoin: {
|
||||||
shipping_address: "order.shipping_address",
|
shipping_address: "order.shipping_address",
|
||||||
|
customer: "order.customer",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,6 +234,9 @@ class OrderService extends TransactionBaseService {
|
|||||||
})
|
})
|
||||||
.orWhere(`order.email ILIKE :q`, { q: `%${q}%` })
|
.orWhere(`order.email ILIKE :q`, { q: `%${q}%` })
|
||||||
.orWhere(`display_id::varchar(255) ILIKE :dId`, { dId: `${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