feat: update return request (#8302)

This commit is contained in:
Oli Juhl
2024-07-26 19:41:21 +02:00
committed by GitHub
parent a4eab3f37a
commit feabe0e6c0
13 changed files with 216 additions and 3 deletions
@@ -420,6 +420,25 @@ medusaIntegrationTestRunner({
}) })
) )
result = await api.post(
`/admin/returns/${returnId}`,
{
location_id: location.id,
metadata: { hello: "world" },
no_notification: true,
},
adminHeaders
)
expect(result.data.return).toEqual(
expect.objectContaining({
id: returnId,
location_id: location.id,
metadata: { hello: "world" },
no_notification: true,
})
)
const item = order.items[0] const item = order.items[0]
result = await api.post( result = await api.post(
@@ -151,6 +151,29 @@ export const useRemoveReturnItem = (
}) })
} }
export const useUpdateReturn = (
id: string,
orderId: string,
options?: UseMutationOptions<
HttpTypes.AdminReturnResponse,
Error,
HttpTypes.AdminUpdateReturnRequest
>
) => {
return useMutation({
mutationFn: (payload: HttpTypes.AdminUpdateReturnRequest) => {
return sdk.admin.return.updateRequest(id, payload)
},
onSuccess: (data: any, variables: any, context: any) => {
queryClient.invalidateQueries({
queryKey: ordersQueryKeys.preview(orderId),
})
options?.onSuccess?.(data, variables, context)
},
...options,
})
}
export const useAddReturnShipping = ( export const useAddReturnShipping = (
id: string, id: string,
orderId: string, orderId: string,
@@ -37,6 +37,7 @@ import {
useConfirmReturnRequest, useConfirmReturnRequest,
useDeleteReturnShipping, useDeleteReturnShipping,
useRemoveReturnItem, useRemoveReturnItem,
useUpdateReturn,
useUpdateReturnItem, useUpdateReturnItem,
useUpdateReturnShipping, useUpdateReturnShipping,
} from "../../../../../hooks/api/returns" } from "../../../../../hooks/api/returns"
@@ -91,6 +92,8 @@ export const ReturnCreateForm = ({
const { mutateAsync: cancelReturnRequest, isPending: isCanceling } = const { mutateAsync: cancelReturnRequest, isPending: isCanceling } =
useCancelReturnRequest(activeReturn.id, order.id) useCancelReturnRequest(activeReturn.id, order.id)
const { mutateAsync: updateReturnRequest, isPending: isUpdating } =
useUpdateReturn(activeReturn.id, order.id)
const { mutateAsync: addReturnShipping, isPending: isAddingReturnShipping } = const { mutateAsync: addReturnShipping, isPending: isAddingReturnShipping } =
useAddReturnShipping(activeReturn.id, order.id) useAddReturnShipping(activeReturn.id, order.id)
@@ -122,7 +125,8 @@ export const ReturnCreateForm = ({
isDeletingReturnShipping || isDeletingReturnShipping ||
isAddingReturnItem || isAddingReturnItem ||
isRemovingReturnItem || isRemovingReturnItem ||
isUpdatingReturnItem isUpdatingReturnItem ||
isUpdating
/** /**
* FORM * FORM
@@ -254,6 +258,10 @@ export const ReturnCreateForm = ({
setIsOpen("items", false) setIsOpen("items", false)
} }
const onLocationChange = async (selectedLocationId: string) => {
await updateReturnRequest({ location_id: selectedLocationId })
}
const onShippingOptionChange = async (selectedOptionId: string) => { const onShippingOptionChange = async (selectedOptionId: string) => {
const promises = preview.shipping_methods const promises = preview.shipping_methods
.map((s) => s.actions?.find((a) => a.action === "SHIPPING_ADD")?.id) .map((s) => s.actions?.find((a) => a.action === "SHIPPING_ADD")?.id)
@@ -477,6 +485,7 @@ export const ReturnCreateForm = ({
value={value} value={value}
onChange={(v) => { onChange={(v) => {
onChange(v) onChange(v)
onLocationChange(v)
}} }}
{...field} {...field}
options={(stock_locations ?? []).map( options={(stock_locations ?? []).map(
@@ -46,6 +46,8 @@ export * from "./return/remove-return-shipping-method"
export * from "./return/request-item-return" export * from "./return/request-item-return"
export * from "./return/update-receive-item-return-request" export * from "./return/update-receive-item-return-request"
export * from "./return/update-request-item-return" export * from "./return/update-request-item-return"
export * from "./return/update-return"
export * from "./return/update-return-shipping-method" export * from "./return/update-return-shipping-method"
export * from "./update-order-change-actions" export * from "./update-order-change-actions"
export * from "./update-tax-lines" export * from "./update-tax-lines"
@@ -0,0 +1,73 @@
import { OrderChangeDTO, OrderWorkflow, ReturnDTO } from "@medusajs/types"
import { OrderChangeStatus } from "@medusajs/utils"
import {
WorkflowData,
createStep,
createWorkflow,
transform,
} from "@medusajs/workflows-sdk"
import { useRemoteQueryStep } from "../../../common"
import { updateReturnsStep } from "../../steps"
import { previewOrderChangeStep } from "../../steps/preview-order-change"
import {
throwIfIsCancelled,
throwIfOrderChangeIsNotActive,
} from "../../utils/order-validation"
const validationStep = createStep(
"validate-update-return",
async function ({
orderChange,
orderReturn,
}: {
orderReturn: ReturnDTO
orderChange: OrderChangeDTO
}) {
throwIfIsCancelled(orderReturn, "Return")
throwIfOrderChangeIsNotActive({ orderChange })
}
)
export const updateReturnWorkflowId = "update-return"
export const updateReturnWorkflow = createWorkflow(
updateReturnWorkflowId,
function (
input: WorkflowData<OrderWorkflow.UpdateReturnWorkflowInput>
): WorkflowData {
const orderReturn: ReturnDTO = useRemoteQueryStep({
entry_point: "return",
fields: ["id", "status", "order_id", "canceled_at"],
variables: { id: input.return_id },
list: false,
throw_if_key_not_found: true,
})
const orderChange: OrderChangeDTO = useRemoteQueryStep({
entry_point: "order_change",
fields: ["id", "status", "version", "actions.*"],
variables: {
filters: {
order_id: orderReturn.order_id,
return_id: orderReturn.id,
status: [OrderChangeStatus.PENDING, OrderChangeStatus.REQUESTED],
},
},
list: false,
}).config({ name: "order-change-query" })
validationStep({ orderReturn, orderChange })
const updateData = transform({ input }, ({ input }) => {
return {
id: input.return_id,
location_id: input.location_id,
no_notification: input.no_notification,
metadata: input.metadata,
}
})
updateReturnsStep([updateData])
return previewOrderChangeStep(orderReturn.order_id)
}
)
+18 -1
View File
@@ -1,4 +1,4 @@
import { FindParams, HttpTypes, SelectParams } from "@medusajs/types" import { HttpTypes, SelectParams } from "@medusajs/types"
import { Client } from "../client" import { Client } from "../client"
import { ClientHeaders } from "../types" import { ClientHeaders } from "../types"
@@ -178,4 +178,21 @@ export class Return {
} }
) )
} }
async updateRequest(
id: string,
body: HttpTypes.AdminUpdateReturnRequest,
query?: HttpTypes.SelectParams,
headers?: ClientHeaders
) {
return await this.client.fetch<HttpTypes.AdminReturnResponse>(
`/admin/returns/${id}`,
{
method: "POST",
headers,
body,
query,
}
)
}
} }
@@ -78,6 +78,12 @@ export interface AdminConfirmReturnRequest {
no_notification?: boolean no_notification?: boolean
} }
export interface AdminUpdateReturnRequest {
location_id?: string
no_notification?: boolean
metadata?: Record<string, unknown> | null
}
export interface AdminReturnFilters extends FindParams { export interface AdminReturnFilters extends FindParams {
id?: string[] | string | OperatorMap<string | string[]> id?: string[] | string | OperatorMap<string | string[]>
order_id?: string[] | string | OperatorMap<string | string[]> order_id?: string[] | string | OperatorMap<string | string[]>
@@ -13,3 +13,5 @@ export * from "./items"
export * from "./receive-return" export * from "./receive-return"
export * from "./request-item-return" export * from "./request-item-return"
export * from "./shipping-method" export * from "./shipping-method"
export * from "./update-return"
@@ -0,0 +1,6 @@
export interface UpdateReturnWorkflowInput {
return_id: string
location_id?: string
no_notification?: boolean
metadata?: Record<string, any> | null
}
@@ -1,3 +1,4 @@
import { updateReturnWorkflow } from "@medusajs/core-flows"
import { import {
ContainerRegistrationKeys, ContainerRegistrationKeys,
remoteQueryObjectFromString, remoteQueryObjectFromString,
@@ -6,6 +7,7 @@ import {
AuthenticatedMedusaRequest, AuthenticatedMedusaRequest,
MedusaResponse, MedusaResponse,
} from "../../../../types/routing" } from "../../../../types/routing"
import { AdminPostReturnsReturnReqSchemaType } from "../validators"
export const GET = async ( export const GET = async (
req: AuthenticatedMedusaRequest, req: AuthenticatedMedusaRequest,
@@ -32,3 +34,34 @@ export const GET = async (
return: orderReturn, return: orderReturn,
}) })
} }
export const POST = async (
req: AuthenticatedMedusaRequest<AdminPostReturnsReturnReqSchemaType>,
res: MedusaResponse
) => {
const { id } = req.params
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const { result } = await updateReturnWorkflow(req.scope).run({
input: { return_id: id, ...req.validatedBody },
})
const queryObject = remoteQueryObjectFromString({
entryPoint: "return",
variables: {
id,
filters: {
...req.filterableFields,
},
},
fields: req.remoteQueryConfig.fields,
})
const [orderReturn] = await remoteQuery(queryObject)
res.json({
order_preview: result,
return: orderReturn,
})
}
@@ -5,13 +5,14 @@ import * as QueryConfig from "./query-config"
import { import {
AdminGetOrdersOrderParams, AdminGetOrdersOrderParams,
AdminGetOrdersParams, AdminGetOrdersParams,
AdminPostCancelReturnReqSchema,
AdminPostReceiveReturnItemsReqSchema, AdminPostReceiveReturnItemsReqSchema,
AdminPostReceiveReturnsReqSchema, AdminPostReceiveReturnsReqSchema,
AdminPostCancelReturnReqSchema,
AdminPostReturnsConfirmRequestReqSchema, AdminPostReturnsConfirmRequestReqSchema,
AdminPostReturnsReqSchema, AdminPostReturnsReqSchema,
AdminPostReturnsRequestItemsActionReqSchema, AdminPostReturnsRequestItemsActionReqSchema,
AdminPostReturnsRequestItemsReqSchema, AdminPostReturnsRequestItemsReqSchema,
AdminPostReturnsReturnReqSchema,
AdminPostReturnsShippingActionReqSchema, AdminPostReturnsShippingActionReqSchema,
AdminPostReturnsShippingReqSchema, AdminPostReturnsShippingReqSchema,
} from "./validators" } from "./validators"
@@ -37,6 +38,17 @@ export const adminReturnRoutesMiddlewares: MiddlewareRoute[] = [
), ),
], ],
}, },
{
method: ["POST"],
matcher: "/admin/returns/:id",
middlewares: [
validateAndTransformBody(AdminPostReturnsReturnReqSchema),
validateAndTransformQuery(
AdminGetOrdersOrderParams,
QueryConfig.retrieveTransformQueryConfig
),
],
},
{ {
method: ["POST"], method: ["POST"],
matcher: "/admin/returns", matcher: "/admin/returns",
@@ -7,6 +7,8 @@ export const defaultAdminReturnFields = [
"location_id", "location_id",
"order_version", "order_version",
"status", "status",
"metadata",
"no_notification",
"refund_amount", "refund_amount",
"created_at", "created_at",
"updated_at", "updated_at",
@@ -50,6 +50,15 @@ export type AdminPostReturnsReqSchemaType = z.infer<
typeof AdminPostReturnsReqSchema typeof AdminPostReturnsReqSchema
> >
export const AdminPostReturnsReturnReqSchema = z.object({
location_id: z.string().optional(),
no_notification: z.boolean().optional(),
metadata: z.record(z.unknown()).nullish(),
})
export type AdminPostReturnsReturnReqSchemaType = z.infer<
typeof AdminPostReturnsReturnReqSchema
>
export const AdminPostOrderExchangesReqSchema = z.object({ export const AdminPostOrderExchangesReqSchema = z.object({
order_id: z.string(), order_id: z.string(),
description: z.string().optional(), description: z.string().optional(),