feat(medusa-js,medusa-react,medusa): Add missing Currency endpoints (#2185)

This commit is contained in:
Kasper Fabricius Kristensen
2022-09-12 19:28:43 +02:00
committed by GitHub
parent b6161d2404
commit 64949dc721
13 changed files with 233 additions and 17 deletions

View File

@@ -0,0 +1,7 @@
---
"@medusajs/medusa": patch
"@medusajs/medusa-js": patch
"medusa-react": patch
---
Adds missing response types for currency endpoints and exports route. Adds currency endpoints to medusa-js and medusa-react.

View File

@@ -0,0 +1,53 @@
import {
AdminCurrenciesListRes,
AdminCurrenciesRes,
AdminGetCurrenciesParams,
AdminPostCurrenciesCurrencyReq,
} from "@medusajs/medusa"
import qs from "qs"
import { ResponsePromise } from "../../typings"
import BaseResource from "../base"
class AdminCurrenciesResource extends BaseResource {
/**
* @description Lists currencies.
* @experimental This feature is under development and may change in the future.
* To use this feature please enable featureflag `tax_inclusive_pricing` in your medusa backend project.
* @param payload optional
* @param customHeaders
* @returns the list of currencies as well as the pagination properties.
*/
list(
query?: AdminGetCurrenciesParams,
customHeaders: Record<string, any> = {}
): ResponsePromise<AdminCurrenciesListRes> {
let path = `/admin/currencies`
if (query) {
const queryString = qs.stringify(query)
path += `?${queryString}`
}
return this.client.request("GET", path, undefined, {}, customHeaders)
}
/**
* @description Updates a currency
* @experimental This feature is under development and may change in the future.
* To use this feature please enable featureflag `tax_inclusive_pricing` in your medusa backend project.
* @param code code of the currency to update.
* @param payload update to apply to currency.
* @param customHeaders
* @returns the updated currency.
*/
update(
code: string,
payload: AdminPostCurrenciesCurrencyReq,
customHeaders: Record<string, any> = {}
): ResponsePromise<AdminCurrenciesRes> {
const path = `/admin/currencies/${code}`
return this.client.request("POST", path, payload, {}, customHeaders)
}
}
export default AdminCurrenciesResource

View File

@@ -2,6 +2,7 @@ import BaseResource from "../base"
import AdminAuthResource from "./auth"
import AdminBatchJobsResource from "./batch-jobs"
import CollectionsResource from "./collections"
import AdminCurrenciesResource from "./currencies"
import AdminCustomerGroupsResource from "./customer-groups"
import AdminCustomersResource from "./customers"
import AdminDiscountsResource from "./discounts"
@@ -34,6 +35,7 @@ class Admin extends BaseResource {
public customers = new AdminCustomersResource(this.client)
public customerGroups = new AdminCustomerGroupsResource(this.client)
public discounts = new AdminDiscountsResource(this.client)
public currencies = new AdminCurrenciesResource(this.client)
public collections = new CollectionsResource(this.client)
public draftOrders = new AdminDraftOrdersResource(this.client)
public giftCards = new AdminGiftCardsResource(this.client)

View File

@@ -1,5 +1,12 @@
{
"resources": {
"currency": {
"symbol": "$",
"name": "US Dollar",
"symbol_native": "$",
"code": "USD",
"includes_tax": false
},
"region": {
"id": "reg_01F0YES4R67TXXC1QBQ8P54A8Y",
"name": "Test Region",
@@ -1271,14 +1278,16 @@
"created_at": "2022-07-05T15:16:01.959Z",
"deleted_at": null
},
"sales_channels": [{
"id": "sc_01F0YES4R67TXXC1QBQ8P54A8Y",
"name": "sales channel 1 name",
"description": "sales channel 1 description",
"is_disabled": false,
"updated_at": "2022-07-05T15:16:01.959Z",
"created_at": "2022-07-05T15:16:01.959Z",
"deleted_at": null
}]
"sales_channels": [
{
"id": "sc_01F0YES4R67TXXC1QBQ8P54A8Y",
"name": "sales channel 1 name",
"description": "sales channel 1 description",
"is_disabled": false,
"updated_at": "2022-07-05T15:16:01.959Z",
"created_at": "2022-07-05T15:16:01.959Z",
"deleted_at": null
}
]
}
}

View File

@@ -1,5 +1,4 @@
import { rest } from "msw"
import { body } from "msw/lib/types/context"
import { fixtures } from "../data"
export const adminHandlers = [
@@ -114,8 +113,8 @@ export const adminHandlers = [
ctx.json({
collection: {
...fixtures.get("product_collection"),
products: [fixtures.get("product")]
}
products: [fixtures.get("product")],
},
})
)
}),
@@ -126,7 +125,7 @@ export const adminHandlers = [
ctx.json({
id: req.params.id,
object: "product-collection",
removed_products: [fixtures.get("product").id]
removed_products: [fixtures.get("product").id],
})
)
}),
@@ -892,7 +891,7 @@ export const adminHandlers = [
discount_condition: {
...fixtures
.get("discount")
.rule.conditions.find(c => c.id === req.params.conditionId),
.rule.conditions.find((c) => c.id === req.params.conditionId),
},
})
)
@@ -1767,4 +1766,25 @@ export const adminHandlers = [
})
)
}),
rest.get("/admin/currencies", (req, res, ctx) => {
return res(
ctx.status(200),
ctx.json({
count: 1,
limit: 20,
offset: 20,
currencies: fixtures.list("currency", 1),
})
)
}),
rest.post("/admin/currencies/:code", (req, res, ctx) => {
return res(
ctx.status(200),
ctx.json({
currency: { ...fixtures.get("currency"), ...(req.body as any) },
})
)
}),
]

View File

@@ -0,0 +1,2 @@
export * from "./mutations"
export * from "./queries"

View File

@@ -0,0 +1,30 @@
import {
AdminCurrenciesRes,
AdminPostCurrenciesCurrencyReq,
} from "@medusajs/medusa"
import { Response } from "@medusajs/medusa-js"
import { useMutation, UseMutationOptions, useQueryClient } from "react-query"
import { adminCurrenciesKeys } from "."
import { useMedusa } from "../../../contexts/medusa"
import { buildOptions } from "../../utils/buildOptions"
export const useAdminUpdateCurrency = (
code: string,
options?: UseMutationOptions<
Response<AdminCurrenciesRes>,
Error,
AdminPostCurrenciesCurrencyReq
>
) => {
const { client } = useMedusa()
const queryClient = useQueryClient()
return useMutation(
(payload: AdminPostCurrenciesCurrencyReq) =>
client.admin.currencies.update(code, payload),
buildOptions(
queryClient,
[adminCurrenciesKeys.lists(), adminCurrenciesKeys.detail(code)],
options
)
)
}

View File

@@ -0,0 +1,32 @@
import {
AdminCurrenciesListRes,
AdminGetCurrenciesParams,
} from "@medusajs/medusa"
import { Response } from "@medusajs/medusa-js"
import { useQuery } from "react-query"
import { useMedusa } from "../../../contexts"
import { UseQueryOptionsWrapper } from "../../../types"
import { queryKeysFactory } from "../../utils/index"
const ADMIN_CURRENCIES_QUERY_KEY = `admin_currencies` as const
export const adminCurrenciesKeys = queryKeysFactory(ADMIN_CURRENCIES_QUERY_KEY)
type CurrenciesQueryKey = typeof adminCurrenciesKeys
export const useAdminCurrencies = (
query?: AdminGetCurrenciesParams,
options?: UseQueryOptionsWrapper<
Response<AdminCurrenciesListRes>,
Error,
ReturnType<CurrenciesQueryKey["list"]>
>
) => {
const { client } = useMedusa()
const { data, ...rest } = useQuery(
adminCurrenciesKeys.list(query),
() => client.admin.currencies.list(query),
options
)
return { ...data, ...rest } as const
}

View File

@@ -2,6 +2,7 @@ export * from "./auth"
export * from "./batch-jobs"
export * from "./claims"
export * from "./collections"
export * from "./currencies"
export * from "./customer-groups"
export * from "./customers"
export * from "./discounts"
@@ -24,6 +25,6 @@ export * from "./shipping-profiles"
export * from "./store"
export * from "./swaps"
export * from "./tax-rates"
export * from "./uploads"
export * from "./users"
export * from "./variants"
export * from "./uploads"

View File

@@ -0,0 +1,31 @@
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import { useAdminUpdateCurrency } from "../../../../src/"
import { createWrapper } from "../../../utils"
describe("useAdminUpdateCurrency hook", () => {
test("updates a currency and returns it", async () => {
const update = {
includes_tax: true,
}
const { result, waitFor } = renderHook(
() => useAdminUpdateCurrency(fixtures.get("currency").code),
{
wrapper: createWrapper(),
}
)
result.current.mutate(update)
await waitFor(() => result.current.isSuccess)
expect(result.current.data?.response.status).toEqual(200)
expect(result.current.data?.currency).toEqual(
expect.objectContaining({
...fixtures.get("currency"),
...update,
})
)
})
})

View File

@@ -0,0 +1,18 @@
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import { useAdminCurrencies } from "../../../../src"
import { createWrapper } from "../../../utils"
describe("useAdminCurrencies hook", () => {
test("returns a list of currencies", async () => {
const currencies = fixtures.list("currency", 1)
const { result, waitFor } = renderHook(() => useAdminCurrencies(), {
wrapper: createWrapper(),
})
await waitFor(() => result.current.isSuccess)
expect(result.current.response?.status).toEqual(200)
expect(result.current.currencies).toEqual(currencies)
})
})

View File

@@ -19,6 +19,7 @@ export default (container, config) => {
export * from "./routes/admin/auth"
export * from "./routes/admin/batch"
export * from "./routes/admin/collections"
export * from "./routes/admin/currencies"
export * from "./routes/admin/customer-groups"
export * from "./routes/admin/customers"
export * from "./routes/admin/discounts"

View File

@@ -1,12 +1,14 @@
import { Router } from "express"
import { Currency } from "../../../.."
import TaxInclusivePricingFeatureFlag from "../../../../loaders/feature-flags/tax-inclusive-pricing"
import { PaginatedResponse } from "../../../../types/common"
import middlewares, {
transformBody,
transformQuery,
} from "../../../middlewares"
import { isFeatureFlagEnabled } from "../../../middlewares/feature-flag-enabled"
import { AdminGetCurrenciesParams } from "./list-currencies"
import { AdminPostCurrenciesCurrencyReq } from "./update-currency"
import { isFeatureFlagEnabled } from "../../../middlewares/feature-flag-enabled"
import TaxInclusivePricingFeatureFlag from "../../../../loaders/feature-flags/tax-inclusive-pricing"
export default (app) => {
const route = Router()
@@ -33,5 +35,13 @@ export default (app) => {
return app
}
export type AdminCurrenciesListRes = PaginatedResponse & {
currencies: Currency[]
}
export type AdminCurrenciesRes = {
currency: Currency
}
export * from "./list-currencies"
export * from "./update-currency"