feat(medusa): refactor the way the order edit handle the items (#2255)

* feat(medusa): Reftor the way the order edit works
This commit is contained in:
Adrien de Peretti
2022-09-26 16:01:20 +02:00
committed by GitHub
parent 7e56935e7a
commit d138baf460
25 changed files with 704 additions and 360 deletions
@@ -33,6 +33,7 @@ describe("POST /admin/order-edits", () => {
})
it("calls order edit service create", () => {
expect(orderEditServiceMock.decorateTotals).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.create).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.create).toHaveBeenCalledWith(
{
@@ -33,7 +33,7 @@ describe("GET /admin/order-edits/:id", () => {
select: defaultOrderEditFields,
relations: defaultOrderEditRelations,
})
expect(orderEditServiceMock.decorateLineItemsAndTotals).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.decorateTotals).toHaveBeenCalledTimes(1)
})
it("returns order", () => {
@@ -9,14 +9,18 @@ describe("GET /admin/order-edits/:id", () => {
let subject
beforeAll(async () => {
subject = await request("POST", `/admin/order-edits/${orderEditId}/request`, {
adminSession: {
jwt: {
userId: IdMap.getId("admin_user"),
subject = await request(
"POST",
`/admin/order-edits/${orderEditId}/request`,
{
adminSession: {
jwt: {
userId: IdMap.getId("admin_user"),
},
},
},
flags: [OrderEditingFeatureFlag],
})
flags: [OrderEditingFeatureFlag],
}
)
})
afterAll(() => {
@@ -25,15 +29,20 @@ describe("GET /admin/order-edits/:id", () => {
it("calls orderEditService requestConfirmation", () => {
expect(orderEditServiceMock.requestConfirmation).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.requestConfirmation).toHaveBeenCalledWith(orderEditId, {loggedInUser: IdMap.getId("admin_user")})
expect(orderEditServiceMock.requestConfirmation).toHaveBeenCalledWith(
orderEditId,
{ loggedInUser: IdMap.getId("admin_user") }
)
})
it("returns updated orderEdit", () => {
expect(subject.body.order_edit).toEqual(expect.objectContaining({
id: orderEditId,
requested_at: expect.any(String),
requested_by: IdMap.getId("admin_user")
}))
expect(subject.body.order_edit).toEqual(
expect.objectContaining({
id: orderEditId,
requested_at: expect.any(String),
requested_by: IdMap.getId("admin_user"),
})
)
})
})
})
@@ -2,6 +2,10 @@ import { Request, Response } from "express"
import { OrderEditService } from "../../../../services"
import { IsOptional, IsString } from "class-validator"
import { EntityManager } from "typeorm"
import {
defaultOrderEditFields,
defaultOrderEditRelations,
} from "../../../../types/order-edit"
/**
* @oas [post] /order-edits
@@ -62,13 +66,19 @@ export default async (req: Request, res: Response) => {
const data = req.validatedBody as AdminPostOrderEditsReq
const loggedInUserId = (req.user?.id ?? req.user?.userId) as string
const orderEdit = await manager.transaction(async (transactionManager) => {
const orderEditServiceTx =
orderEditService.withTransaction(transactionManager)
const orderEdit = await orderEditServiceTx.create(data, { loggedInUserId })
const createdOrderEdit = await manager.transaction(
async (transactionManager) => {
return await orderEditService
.withTransaction(transactionManager)
.create(data, { loggedInUserId })
}
)
return await orderEditServiceTx.decorateLineItemsAndTotals(orderEdit)
let orderEdit = await orderEditService.retrieve(createdOrderEdit.id, {
select: defaultOrderEditFields,
relations: defaultOrderEditRelations,
})
orderEdit = await orderEditService.decorateTotals(orderEdit)
return res.json({ order_edit: orderEdit })
}
@@ -60,8 +60,7 @@ export default async (req: Request, res: Response) => {
const retrieveConfig = req.retrieveConfig
let orderEdit = await orderEditService.retrieve(id, retrieveConfig)
orderEdit = await orderEditService.decorateLineItemsAndTotals(orderEdit)
orderEdit = await orderEditService.decorateTotals(orderEdit)
return res.json({ order_edit: orderEdit })
}
@@ -3,6 +3,10 @@ import { Request, Response } from "express"
import { EntityManager } from "typeorm"
import { OrderEditService } from "../../../../services"
import {
defaultOrderEditFields,
defaultOrderEditRelations,
} from "../../../../types/order-edit"
/**
* @oas [post] /order-edits/{id}
@@ -71,26 +75,19 @@ export default async (req: Request, res: Response) => {
const manager: EntityManager = req.scope.resolve("manager")
const orderEdit = await manager.transaction(async (transactionManager) => {
const orderEditServiceTx =
orderEditService.withTransaction(transactionManager)
const updatedOrderEdit = await manager.transaction(
async (transactionManager) => {
return await orderEditService
.withTransaction(transactionManager)
.update(id, validatedBody)
}
)
const _orderEdit = await orderEditServiceTx.update(id, validatedBody)
const { items } = await orderEditServiceTx.computeLineItems(_orderEdit.id)
_orderEdit.items = items
const totals = await orderEditServiceTx.getTotals(_orderEdit.id)
_orderEdit.discount_total = totals.discount_total
_orderEdit.gift_card_total = totals.gift_card_total
_orderEdit.gift_card_tax_total = totals.gift_card_tax_total
_orderEdit.shipping_total = totals.shipping_total
_orderEdit.subtotal = totals.subtotal
_orderEdit.tax_total = totals.tax_total
_orderEdit.total = totals.total
return _orderEdit
let orderEdit = await orderEditService.retrieve(updatedOrderEdit.id, {
select: defaultOrderEditFields,
relations: defaultOrderEditRelations,
})
orderEdit = await orderEditService.decorateTotals(orderEdit)
res.status(200).json({ order_edit: orderEdit })
}
@@ -2,11 +2,6 @@ import { IdMap } from "medusa-test-utils"
import { request } from "../../../../../helpers/test-request"
import { orderEditServiceMock } from "../../../../../services/__mocks__/order-edit"
import OrderEditingFeatureFlag from "../../../../../loaders/feature-flags/order-editing"
import {
defaultOrderEditFields,
defaultOrderEditRelations,
} from "../../../../../types/order-edit"
import { storeOrderEditNotAllowedFields } from "../index"
describe("GET /store/order-edits/:id", () => {
describe("successfully gets an order edit", () => {
@@ -18,10 +13,14 @@ describe("GET /store/order-edits/:id", () => {
}
beforeAll(async () => {
subject = await request("POST", `/store/order-edits/${orderEditId}/decline`, {
payload,
flags: [OrderEditingFeatureFlag],
})
subject = await request(
"POST",
`/store/order-edits/${orderEditId}/decline`,
{
payload,
flags: [OrderEditingFeatureFlag],
}
)
})
afterAll(() => {
@@ -30,8 +29,11 @@ describe("GET /store/order-edits/:id", () => {
it("calls orderService decline", () => {
expect(orderEditServiceMock.decline).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.decline).toHaveBeenCalledWith(orderEditId, { declinedReason: "test", loggedInUser: undefined})
expect(orderEditServiceMock.decorateLineItemsAndTotals).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.decline).toHaveBeenCalledWith(orderEditId, {
declinedReason: "test",
loggedInUser: undefined,
})
expect(orderEditServiceMock.decorateTotals).toHaveBeenCalledTimes(1)
})
it("returns orderEdit", () => {
@@ -3,10 +3,9 @@ import { request } from "../../../../../helpers/test-request"
import { orderEditServiceMock } from "../../../../../services/__mocks__/order-edit"
import OrderEditingFeatureFlag from "../../../../../loaders/feature-flags/order-editing"
import {
defaultOrderEditFields,
defaultOrderEditRelations,
defaultStoreOrderEditFields,
defaultStoreOrderEditRelations,
} from "../../../../../types/order-edit"
import { storeOrderEditNotAllowedFields } from "../index"
describe("GET /store/order-edits/:id", () => {
describe("successfully gets an order edit", () => {
@@ -26,14 +25,10 @@ describe("GET /store/order-edits/:id", () => {
it("calls orderService retrieve", () => {
expect(orderEditServiceMock.retrieve).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.retrieve).toHaveBeenCalledWith(orderEditId, {
select: defaultOrderEditFields.filter(
(field) => !storeOrderEditNotAllowedFields.includes(field)
),
relations: defaultOrderEditRelations.filter(
(field) => !storeOrderEditNotAllowedFields.includes(field)
),
select: defaultStoreOrderEditFields,
relations: defaultStoreOrderEditRelations,
})
expect(orderEditServiceMock.decorateLineItemsAndTotals).toHaveBeenCalledTimes(1)
expect(orderEditServiceMock.decorateTotals).toHaveBeenCalledTimes(1)
})
it("returns order", () => {
@@ -2,6 +2,10 @@ import { IsOptional, IsString } from "class-validator"
import { Request, Response } from "express"
import { EntityManager } from "typeorm"
import { OrderEditService } from "../../../../services"
import {
defaultStoreOrderEditFields,
defaultStoreOrderEditRelations,
} from "../../../../types/order-edit"
/**
* @oas [post] /order-edits/{id}/decline
@@ -71,9 +75,12 @@ export default async (req: Request, res: Response) => {
loggedInUser: userId,
})
})
let orderEdit = await orderEditService.retrieve(id)
orderEdit = await orderEditService.decorateLineItemsAndTotals(orderEdit)
let orderEdit = await orderEditService.retrieve(id, {
select: defaultStoreOrderEditFields,
relations: defaultStoreOrderEditRelations,
})
orderEdit = await orderEditService.decorateTotals(orderEdit)
res.status(200).json({ order_edit: orderEdit })
}
@@ -54,8 +54,7 @@ export default async (req: Request, res: Response) => {
const retrieveConfig = req.retrieveConfig
let orderEdit = await orderEditService.retrieve(id, retrieveConfig)
orderEdit = await orderEditService.decorateLineItemsAndTotals(orderEdit)
orderEdit = await orderEditService.decorateTotals(orderEdit)
return res.json({ order_edit: orderEdit })
}
@@ -7,8 +7,8 @@ import { EmptyQueryParams } from "../../../../types/common"
import { isFeatureFlagEnabled } from "../../../middlewares/feature-flag-enabled"
import OrderEditingFeatureFlag from "../../../../loaders/feature-flags/order-editing"
import {
defaultOrderEditFields,
defaultOrderEditRelations,
defaultStoreOrderEditFields,
defaultStoreOrderEditRelations,
} from "../../../../types/order-edit"
import { OrderEdit } from "../../../../models"
import { StorePostOrderEditsOrderEditDecline } from "./decline-order-edit"
@@ -25,13 +25,9 @@ export default (app) => {
route.get(
"/:id",
transformQuery(EmptyQueryParams, {
defaultRelations: defaultOrderEditRelations.filter(
(field) => !storeOrderEditNotAllowedFields.includes(field)
),
defaultFields: defaultOrderEditFields.filter(
(field) => !storeOrderEditNotAllowedFields.includes(field)
),
allowedFields: defaultOrderEditFields,
defaultRelations: defaultStoreOrderEditRelations,
defaultFields: defaultStoreOrderEditFields,
allowedFields: defaultStoreOrderEditFields,
isList: false,
}),
middlewares.wrap(require("./get-order-edit").default)
@@ -54,10 +50,3 @@ export type StoreOrderEditsRes = {
}
export * from "./decline-order-edit"
export const storeOrderEditNotAllowedFields = [
"internal_note",
"created_by",
"confirmed_by",
"canceled_by",
]