-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
/
inventory.js
86 lines (73 loc) · 2.82 KB
/
inventory.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { BaseService } from "medusa-interfaces"
import { MedusaError } from "medusa-core-utils"
class InventoryService extends BaseService {
constructor({ manager, productVariantService }) {
super()
/** @private @const {EntityManager} */
this.manager_ = manager
/** @private @const {ProductVariantRepository_} */
this.productVariantService_ = productVariantService
}
withTransaction(transactionManager) {
if (!transactionManager) {
return this
}
const cloned = new InventoryService({
manager: transactionManager,
productVariantService: this.productVariantService_,
})
cloned.transactionManager_ = transactionManager
return cloned
}
/**
* Updates the inventory of a variant based on a given adjustment.
* @param {string} variantId - the id of the variant to update
* @param {number} adjustment - the number to adjust the inventory quantity by
* @return {Promise} resolves to the update result.
*/
async adjustInventory(variantId, adjustment) {
// if variantId is undefined – ergo. a custom item – then do nothing
if (typeof variantId === "undefined" || variantId === null) {
return
}
return this.atomicPhase_(async (manager) => {
const variant = await this.productVariantService_.retrieve(variantId)
// if inventory is managed then update
if (variant.manage_inventory) {
return await this.productVariantService_
.withTransaction(manager)
.update(variant, {
inventory_quantity: variant.inventory_quantity + adjustment,
})
}
})
}
/**
* Checks if the inventory of a variant can cover a given quantity. Will
* return true if the variant doesn't have managed inventory or if the variant
* allows backorders or if the inventory quantity is greater than `quantity`.
* @param {string} variantId - the id of the variant to check
* @param {number} quantity - the number of units to check availability for
* @return {Promise<boolean>} true if the inventory covers the quantity
*/
async confirmInventory(variantId, quantity) {
// if variantId is undefined then confirm inventory as it
// is a custom item that is not managed
if (typeof variantId === "undefined" || variantId === null) {
return true
}
const variant = await this.productVariantService_.retrieve(variantId)
const { inventory_quantity, allow_backorder, manage_inventory } = variant
const isCovered =
!manage_inventory || allow_backorder || inventory_quantity >= quantity
if (!isCovered) {
throw new MedusaError(
MedusaError.Types.NOT_ALLOWED,
`Variant with id: ${variant.id} does not have the required inventory`,
MedusaError.Codes.INSUFFICIENT_INVENTORY
)
}
return isCovered
}
}
export default InventoryService