From b7f699654bd8c5b08919667d4e29c835901e1af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frane=20Poli=C4=87?= <16856471+fPolic@users.noreply.github.com> Date: Wed, 23 Mar 2022 20:07:13 +0100 Subject: [PATCH] feat: customer group customers client endpoints (#1221) * feat: add `listCustomers` (by group) to `medusa-js` * feat: add `useAdminCustomerGroupCustomers` hook * fix: remove log * fix: import/export * fix: change query keys * wip: sublist query keys * fix: revert query factory changes * fix: add query as a param when building the "detail" key * fix: revert keys logic, use special case * fix: query path, change batch keys * change admin customer groups cache key generation * spread query params Co-authored-by: fPolic --- .../src/resources/admin/customer-groups.ts | 24 +++++++++++++ packages/medusa-react/mocks/handlers/admin.ts | 9 +++++ .../hooks/admin/customer-groups/mutations.ts | 10 ++++-- .../hooks/admin/customer-groups/queries.ts | 36 +++++++++++++++++-- .../src/hooks/admin/customers/mutations.ts | 8 +++-- .../src/hooks/admin/customers/queries.ts | 2 +- .../admin/customer-groups/queries.test.ts | 23 +++++++++++- 7 files changed, 102 insertions(+), 10 deletions(-) diff --git a/packages/medusa-js/src/resources/admin/customer-groups.ts b/packages/medusa-js/src/resources/admin/customer-groups.ts index 8ff33a6aa4..072dcccd74 100644 --- a/packages/medusa-js/src/resources/admin/customer-groups.ts +++ b/packages/medusa-js/src/resources/admin/customer-groups.ts @@ -8,6 +8,8 @@ import { AdminPostCustomerGroupsGroupCustomersBatchReq, AdminDeleteCustomerGroupsGroupCustomerBatchReq, AdminGetCustomerGroupsGroupParams, + AdminCustomersListRes, + AdminGetCustomersParams, } from "@medusajs/medusa" import qs from "qs" @@ -131,6 +133,28 @@ class AdminCustomerGroupsResource extends BaseResource { const path = `/admin/customer-groups/${id}/customers/batch` return this.client.request("DELETE", path, payload, {}, customHeaders) } + + /** + * List and count customers that belong to provided customer groups. + * + * @param id - customer group id + * @param query - params for filtering customers + * @param customHeaders + */ + listCustomers( + id: string, + query?: AdminGetCustomersParams, + customHeaders: Record = {} + ): ResponsePromise { + let path = `/admin/customer-groups/${id}/customers` + + if (query) { + const queryString = qs.stringify(query) + path += `?${queryString}` + } + + return this.client.request("GET", path, {}, {}, customHeaders) + } } export default AdminCustomerGroupsResource diff --git a/packages/medusa-react/mocks/handlers/admin.ts b/packages/medusa-react/mocks/handlers/admin.ts index c43faf69ac..2848430e4c 100644 --- a/packages/medusa-react/mocks/handlers/admin.ts +++ b/packages/medusa-react/mocks/handlers/admin.ts @@ -551,6 +551,15 @@ export const adminHandlers = [ ) }), + rest.get("/admin/customer-groups/:id/customers", (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + customers: fixtures.list("customer"), + }) + ) + }), + rest.get("/admin/discounts/", (req, res, ctx) => { return res( ctx.status(200), diff --git a/packages/medusa-react/src/hooks/admin/customer-groups/mutations.ts b/packages/medusa-react/src/hooks/admin/customer-groups/mutations.ts index d9584a463d..1f242ce0ac 100644 --- a/packages/medusa-react/src/hooks/admin/customer-groups/mutations.ts +++ b/packages/medusa-react/src/hooks/admin/customer-groups/mutations.ts @@ -112,7 +112,10 @@ export const useAdminAddCustomersToCustomerGroup = ( client.admin.customerGroups.addCustomers(id, payload), buildOptions( queryClient, - [adminCustomerGroupKeys.lists(), adminCustomerGroupKeys.detail(id)], + [ + adminCustomerGroupKeys.lists(), + adminCustomerGroupKeys.detailCustomer(id), + ], options ) ) @@ -140,7 +143,10 @@ export const useAdminRemoveCustomersFromCustomerGroup = ( client.admin.customerGroups.removeCustomers(id, payload), buildOptions( queryClient, - [adminCustomerGroupKeys.lists(), adminCustomerGroupKeys.detail(id)], + [ + adminCustomerGroupKeys.lists(), + adminCustomerGroupKeys.detailCustomer(id), + ], options ) ) diff --git a/packages/medusa-react/src/hooks/admin/customer-groups/queries.ts b/packages/medusa-react/src/hooks/admin/customer-groups/queries.ts index 519820645f..19004d7e1e 100644 --- a/packages/medusa-react/src/hooks/admin/customer-groups/queries.ts +++ b/packages/medusa-react/src/hooks/admin/customer-groups/queries.ts @@ -1,8 +1,10 @@ import { AdminCustomerGroupsListRes, AdminCustomerGroupsRes, + AdminCustomersListRes, AdminGetCustomerGroupsGroupParams, AdminGetCustomerGroupsParams, + AdminGetCustomersParams, } from "@medusajs/medusa" import { Response } from "@medusajs/medusa-js" import { useQuery } from "react-query" @@ -13,9 +15,12 @@ import { queryKeysFactory } from "../../utils" const ADMIN_CUSTOMER_GROUPS_QUERY_KEY = `admin_customer_groups` as const -export const adminCustomerGroupKeys = queryKeysFactory( - ADMIN_CUSTOMER_GROUPS_QUERY_KEY -) +export const adminCustomerGroupKeys = { + ...queryKeysFactory(ADMIN_CUSTOMER_GROUPS_QUERY_KEY), + detailCustomer(id: string, query?: AdminGetCustomersParams) { + return [...this.detail(id), "customers", { ...(query || {}) }] + }, +} type CustomerGroupQueryKeys = typeof adminCustomerGroupKeys @@ -66,3 +71,28 @@ export const useAdminCustomerGroups = ( ) return { ...data, ...rest } as const } + +/** + * Hook retrieves a list of customers that belong to provided groups. + * + * @param id - customer group id + * @param query - pagination/filtering params + * @param options + */ +export const useAdminCustomerGroupCustomers = ( + id: string, + query?: AdminGetCustomersParams, + options?: UseQueryOptionsWrapper< + Response, + Error, + ReturnType + > +) => { + const { client } = useMedusa() + const { data, ...rest } = useQuery( + adminCustomerGroupKeys.detailCustomer(id, query), + () => client.admin.customerGroups.listCustomers(id, query), + options + ) + return { ...data, ...rest } as const +} diff --git a/packages/medusa-react/src/hooks/admin/customers/mutations.ts b/packages/medusa-react/src/hooks/admin/customers/mutations.ts index 8ad082f442..b34aaf829a 100644 --- a/packages/medusa-react/src/hooks/admin/customers/mutations.ts +++ b/packages/medusa-react/src/hooks/admin/customers/mutations.ts @@ -1,9 +1,11 @@ -import { adminCustomerKeys } from "./queries" +import { useMutation, UseMutationOptions, useQueryClient } from "react-query" + import { AdminCustomersRes, AdminPostCustomersReq } from "@medusajs/medusa" import { Response } from "@medusajs/medusa-js" -import { useMutation, UseMutationOptions, useQueryClient } from "react-query" -import { useMedusa } from "../../../contexts/medusa" + +import { useMedusa } from "../../../contexts" import { buildOptions } from "../../utils/buildOptions" +import { adminCustomerKeys } from "./queries" export const useAdminCreateCustomer = ( options?: UseMutationOptions< diff --git a/packages/medusa-react/src/hooks/admin/customers/queries.ts b/packages/medusa-react/src/hooks/admin/customers/queries.ts index 6faf78fbdc..0c6acb9b44 100644 --- a/packages/medusa-react/src/hooks/admin/customers/queries.ts +++ b/packages/medusa-react/src/hooks/admin/customers/queries.ts @@ -7,7 +7,7 @@ import { Response } from "@medusajs/medusa-js" import { useQuery } from "react-query" import { useMedusa } from "../../../contexts" import { UseQueryOptionsWrapper } from "../../../types" -import { queryKeysFactory } from "../../utils/index" +import { queryKeysFactory } from "../../utils" const ADMIN_CUSTOMERS_QUERY_KEY = `admin_customers` as const diff --git a/packages/medusa-react/test/hooks/admin/customer-groups/queries.test.ts b/packages/medusa-react/test/hooks/admin/customer-groups/queries.test.ts index 34bfce4a49..cf800d5f3a 100644 --- a/packages/medusa-react/test/hooks/admin/customer-groups/queries.test.ts +++ b/packages/medusa-react/test/hooks/admin/customer-groups/queries.test.ts @@ -1,6 +1,10 @@ import { renderHook } from "@testing-library/react-hooks" -import { useAdminCustomerGroup, useAdminCustomerGroups } from "../../../../src" +import { + useAdminCustomerGroup, + useAdminCustomerGroupCustomers, + useAdminCustomerGroups, +} from "../../../../src" import { fixtures } from "../../../../mocks/data" import { createWrapper } from "../../../utils" @@ -31,4 +35,21 @@ describe("useAdminCustomerGroup hook", () => { expect(result.current.response.status).toEqual(200) expect(result.current.customer_groups).toEqual(groups) }) + + test("returns a list of customers that belong to a group", async () => { + const groups = fixtures.list("customer_group") + const customers = fixtures.list("customer") + + const { result, waitFor } = renderHook( + () => useAdminCustomerGroupCustomers(groups[0].id), + { + wrapper: createWrapper(), + } + ) + + await waitFor(() => result.current.isSuccess) + + expect(result.current.response.status).toEqual(200) + expect(result.current.customers).toEqual(customers) + }) })