feat(medusa): Add get inventory item endpoint (#6704)
* initial get-inventory-item * add exception throw test * remove console log * add changeset * remove unused import
This commit is contained in:
5
.changeset/spicy-bats-knock.md
Normal file
5
.changeset/spicy-bats-knock.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/medusa": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
feat(medusa): add get-inventory-item endpoint to api v2
|
||||||
@@ -146,76 +146,6 @@ medusaIntegrationTestRunner({
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip("should retrieve the inventory item", async () => {
|
|
||||||
const inventoryItemId = inventoryItems[0].id
|
|
||||||
|
|
||||||
await api.post(
|
|
||||||
`/admin/inventory-items/${inventoryItemId}/location-levels`,
|
|
||||||
{
|
|
||||||
location_id: locationId,
|
|
||||||
stocked_quantity: 15,
|
|
||||||
incoming_quantity: 5,
|
|
||||||
},
|
|
||||||
adminHeaders
|
|
||||||
)
|
|
||||||
|
|
||||||
await api.post(
|
|
||||||
`/admin/inventory-items/${inventoryItemId}/location-levels`,
|
|
||||||
{
|
|
||||||
location_id: location2Id,
|
|
||||||
stocked_quantity: 7,
|
|
||||||
incoming_quantity: 0,
|
|
||||||
},
|
|
||||||
adminHeaders
|
|
||||||
)
|
|
||||||
|
|
||||||
const response = await api.get(
|
|
||||||
`/admin/inventory-items/${inventoryItemId}`,
|
|
||||||
adminHeaders
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(response.data).toEqual({
|
|
||||||
inventory_item: expect.objectContaining({
|
|
||||||
height: 200,
|
|
||||||
hs_code: "hs001",
|
|
||||||
id: inventoryItemId,
|
|
||||||
length: 100,
|
|
||||||
location_levels: [
|
|
||||||
expect.objectContaining({
|
|
||||||
available_quantity: 15,
|
|
||||||
deleted_at: null,
|
|
||||||
id: expect.any(String),
|
|
||||||
incoming_quantity: 5,
|
|
||||||
inventory_item_id: inventoryItemId,
|
|
||||||
location_id: locationId,
|
|
||||||
metadata: null,
|
|
||||||
reserved_quantity: 0,
|
|
||||||
stocked_quantity: 15,
|
|
||||||
}),
|
|
||||||
expect.objectContaining({
|
|
||||||
available_quantity: 7,
|
|
||||||
deleted_at: null,
|
|
||||||
id: expect.any(String),
|
|
||||||
incoming_quantity: 0,
|
|
||||||
inventory_item_id: inventoryItemId,
|
|
||||||
location_id: location2Id,
|
|
||||||
metadata: null,
|
|
||||||
reserved_quantity: 0,
|
|
||||||
stocked_quantity: 7,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
material: "material",
|
|
||||||
metadata: null,
|
|
||||||
mid_code: "mids",
|
|
||||||
origin_country: "UK",
|
|
||||||
requires_shipping: true,
|
|
||||||
sku: "MY_SKU",
|
|
||||||
weight: 300,
|
|
||||||
width: 150,
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it.skip("should create the inventory item using the api", async () => {
|
it.skip("should create the inventory item using the api", async () => {
|
||||||
const product = await simpleProductFactory(dbConnection, {})
|
const product = await simpleProductFactory(dbConnection, {})
|
||||||
|
|
||||||
@@ -299,6 +229,103 @@ medusaIntegrationTestRunner({
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("Retrieve inventory item", () => {
|
||||||
|
let location1 = "loc_1"
|
||||||
|
let location2 = "loc_2"
|
||||||
|
beforeEach(async () => {
|
||||||
|
await service.create([
|
||||||
|
{
|
||||||
|
sku: "MY_SKU",
|
||||||
|
origin_country: "UK",
|
||||||
|
hs_code: "hs001",
|
||||||
|
mid_code: "mids",
|
||||||
|
material: "material",
|
||||||
|
weight: 300,
|
||||||
|
length: 100,
|
||||||
|
height: 200,
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should retrieve the inventory item", async () => {
|
||||||
|
const [{ id: inventoryItemId }] = await service.list({})
|
||||||
|
|
||||||
|
await service.createInventoryLevels([
|
||||||
|
{
|
||||||
|
inventory_item_id: inventoryItemId,
|
||||||
|
location_id: location1,
|
||||||
|
stocked_quantity: 15,
|
||||||
|
incoming_quantity: 5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
inventory_item_id: inventoryItemId,
|
||||||
|
location_id: location2,
|
||||||
|
stocked_quantity: 7,
|
||||||
|
incoming_quantity: 0,
|
||||||
|
reserved_quantity: 1,
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const response = await api.get(
|
||||||
|
`/admin/inventory-items/${inventoryItemId}`,
|
||||||
|
adminHeaders
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(response.data.inventory_item).toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
id: inventoryItemId,
|
||||||
|
sku: "MY_SKU",
|
||||||
|
origin_country: "UK",
|
||||||
|
hs_code: "hs001",
|
||||||
|
material: "material",
|
||||||
|
mid_code: "mids",
|
||||||
|
requires_shipping: true,
|
||||||
|
weight: 300,
|
||||||
|
length: 100,
|
||||||
|
height: 200,
|
||||||
|
width: 150,
|
||||||
|
stocked_quantity: 22,
|
||||||
|
reserved_quantity: 1,
|
||||||
|
location_levels: [
|
||||||
|
expect.objectContaining({
|
||||||
|
id: expect.any(String),
|
||||||
|
inventory_item_id: inventoryItemId,
|
||||||
|
location_id: location1,
|
||||||
|
stocked_quantity: 15,
|
||||||
|
reserved_quantity: 0,
|
||||||
|
incoming_quantity: 5,
|
||||||
|
available_quantity: 15,
|
||||||
|
metadata: null,
|
||||||
|
}),
|
||||||
|
expect.objectContaining({
|
||||||
|
id: expect.any(String),
|
||||||
|
inventory_item_id: inventoryItemId,
|
||||||
|
location_id: location2,
|
||||||
|
stocked_quantity: 7,
|
||||||
|
reserved_quantity: 1,
|
||||||
|
incoming_quantity: 0,
|
||||||
|
available_quantity: 6,
|
||||||
|
metadata: null,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should throw if inventory item doesn't exist", async () => {
|
||||||
|
const error = await api
|
||||||
|
.get(`/admin/inventory-items/does-not-exist`, adminHeaders)
|
||||||
|
.catch((e) => e)
|
||||||
|
|
||||||
|
expect(error.response.status).toEqual(404)
|
||||||
|
expect(error.response.data).toEqual({
|
||||||
|
type: "not_found",
|
||||||
|
message: "Inventory item with id: does-not-exist was not found",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe.skip("Create inventory item level", () => {
|
describe.skip("Create inventory item level", () => {
|
||||||
let location1
|
let location1
|
||||||
let location2
|
let location2
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import {
|
||||||
|
ContainerRegistrationKeys,
|
||||||
|
MedusaError,
|
||||||
|
remoteQueryObjectFromString,
|
||||||
|
} from "@medusajs/utils"
|
||||||
|
import { MedusaRequest, MedusaResponse } from "../../../../types/routing"
|
||||||
|
|
||||||
|
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
|
||||||
|
const { id } = req.params
|
||||||
|
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
|
||||||
|
|
||||||
|
const query = remoteQueryObjectFromString({
|
||||||
|
entryPoint: "inventory",
|
||||||
|
variables: {
|
||||||
|
filters: { id },
|
||||||
|
skip: 0,
|
||||||
|
take: 1,
|
||||||
|
},
|
||||||
|
|
||||||
|
fields: req.retrieveConfig.select as string[],
|
||||||
|
})
|
||||||
|
|
||||||
|
const { rows } = await remoteQuery(query)
|
||||||
|
|
||||||
|
const [inventory_item] = rows
|
||||||
|
|
||||||
|
if (!inventory_item) {
|
||||||
|
throw new MedusaError(
|
||||||
|
MedusaError.Types.NOT_FOUND,
|
||||||
|
`Inventory item with id: ${id} was not found`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status(200).json({
|
||||||
|
inventory_item,
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -27,6 +27,16 @@ export const adminInventoryRoutesMiddlewares: MiddlewareRoute[] = [
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
method: ["GET"],
|
||||||
|
matcher: "/admin/inventory-items/:id",
|
||||||
|
middlewares: [
|
||||||
|
transformQuery(
|
||||||
|
AdminGetInventoryItemsItemParams,
|
||||||
|
QueryConfig.retrieveTransformQueryConfig
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
method: ["POST"],
|
method: ["POST"],
|
||||||
matcher: "/admin/inventory-items/:id/location-levels",
|
matcher: "/admin/inventory-items/:id/location-levels",
|
||||||
|
|||||||
Reference in New Issue
Block a user