@labdigital/commercetools-mock 2.65.1 → 3.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/README.md +31 -8
  2. package/dist/abstract-BKFcva6S.mjs +1044 -0
  3. package/dist/abstract-BKFcva6S.mjs.map +1 -0
  4. package/dist/config-BcNSzPZz.d.mts +1718 -0
  5. package/dist/index.d.mts +50 -1633
  6. package/dist/index.mjs +3771 -2654
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/storage/sqlite.d.mts +59 -0
  9. package/dist/storage/sqlite.mjs +234 -0
  10. package/dist/storage/sqlite.mjs.map +1 -0
  11. package/package.json +26 -29
  12. package/src/ctMock.ts +125 -136
  13. package/src/helpers.ts +14 -6
  14. package/src/index.ts +5 -0
  15. package/src/lib/masking.ts +4 -5
  16. package/src/lib/product-review-statistics.test.ts +257 -294
  17. package/src/lib/review-statistics.ts +17 -4
  18. package/src/oauth/helpers.ts +7 -4
  19. package/src/oauth/server.test.ts +102 -62
  20. package/src/oauth/server.ts +215 -213
  21. package/src/oauth/store.ts +20 -6
  22. package/src/orderSearch.ts +3 -3
  23. package/src/product-projection-search.ts +38 -20
  24. package/src/product-search-availability.test.ts +31 -52
  25. package/src/product-search.ts +19 -10
  26. package/src/projectAPI.ts +6 -22
  27. package/src/repositories/abstract.ts +182 -48
  28. package/src/repositories/as-associate.test.ts +19 -19
  29. package/src/repositories/associate-role.ts +12 -23
  30. package/src/repositories/attribute-group.test.ts +23 -23
  31. package/src/repositories/attribute-group.ts +6 -4
  32. package/src/repositories/business-unit.test.ts +63 -57
  33. package/src/repositories/business-unit.ts +107 -55
  34. package/src/repositories/cart/actions.ts +96 -65
  35. package/src/repositories/cart/helpers.ts +15 -11
  36. package/src/repositories/cart/index.test.ts +136 -30
  37. package/src/repositories/cart/index.ts +76 -59
  38. package/src/repositories/cart-discount/actions.ts +12 -44
  39. package/src/repositories/cart-discount/index.ts +20 -8
  40. package/src/repositories/category/actions.ts +27 -27
  41. package/src/repositories/category/index.test.ts +13 -9
  42. package/src/repositories/category/index.ts +40 -23
  43. package/src/repositories/channel.test.ts +53 -51
  44. package/src/repositories/channel.ts +12 -22
  45. package/src/repositories/custom-object.ts +34 -25
  46. package/src/repositories/customer/actions.ts +47 -25
  47. package/src/repositories/customer/index.test.ts +11 -11
  48. package/src/repositories/customer/index.ts +65 -35
  49. package/src/repositories/customer-group.test.ts +44 -42
  50. package/src/repositories/customer-group.ts +12 -22
  51. package/src/repositories/discount-code/actions.ts +3 -19
  52. package/src/repositories/discount-code/index.ts +9 -4
  53. package/src/repositories/discount-group/index.ts +8 -3
  54. package/src/repositories/extension.test.ts +27 -27
  55. package/src/repositories/extension.ts +10 -5
  56. package/src/repositories/helpers.ts +126 -47
  57. package/src/repositories/inventory-entry/actions.ts +3 -24
  58. package/src/repositories/inventory-entry/index.ts +19 -11
  59. package/src/repositories/my-customer.ts +13 -12
  60. package/src/repositories/my-order.ts +5 -2
  61. package/src/repositories/order/actions.ts +89 -56
  62. package/src/repositories/order/index.test.ts +36 -31
  63. package/src/repositories/order/index.ts +83 -49
  64. package/src/repositories/order-edit.ts +8 -3
  65. package/src/repositories/payment/actions.ts +64 -44
  66. package/src/repositories/payment/helpers.ts +3 -3
  67. package/src/repositories/payment/index.ts +28 -12
  68. package/src/repositories/product/actions.ts +133 -98
  69. package/src/repositories/product/helpers.ts +29 -16
  70. package/src/repositories/product/index.ts +42 -25
  71. package/src/repositories/product-discount.ts +6 -4
  72. package/src/repositories/product-projection.ts +41 -21
  73. package/src/repositories/product-selection.ts +8 -15
  74. package/src/repositories/product-tailoring.ts +22 -3
  75. package/src/repositories/product-type.ts +45 -4
  76. package/src/repositories/project.ts +57 -13
  77. package/src/repositories/quote/actions.ts +5 -28
  78. package/src/repositories/quote/index.ts +29 -6
  79. package/src/repositories/quote-request/actions.ts +5 -28
  80. package/src/repositories/quote-request/index.test.ts +3 -3
  81. package/src/repositories/quote-request/index.ts +31 -11
  82. package/src/repositories/quote-staged/actions.ts +5 -28
  83. package/src/repositories/quote-staged/index.ts +22 -8
  84. package/src/repositories/recurrence-policy/index.ts +6 -4
  85. package/src/repositories/recurring-order/actions.ts +7 -32
  86. package/src/repositories/recurring-order/index.ts +8 -6
  87. package/src/repositories/review.test.ts +147 -142
  88. package/src/repositories/review.ts +31 -37
  89. package/src/repositories/shipping-method/actions.ts +11 -28
  90. package/src/repositories/shipping-method/index.ts +26 -15
  91. package/src/repositories/shopping-list/actions.ts +21 -31
  92. package/src/repositories/shopping-list/index.ts +44 -22
  93. package/src/repositories/standalone-price.ts +6 -4
  94. package/src/repositories/state.ts +15 -9
  95. package/src/repositories/store.ts +21 -32
  96. package/src/repositories/subscription.test.ts +22 -22
  97. package/src/repositories/subscription.ts +8 -3
  98. package/src/repositories/tax-category/index.ts +8 -3
  99. package/src/repositories/type/actions.ts +21 -3
  100. package/src/repositories/type/index.ts +5 -3
  101. package/src/repositories/zone.test.ts +112 -77
  102. package/src/repositories/zone.ts +5 -3
  103. package/src/schemas/generated/associate-role.ts +13 -0
  104. package/src/schemas/generated/attribute-group.ts +12 -0
  105. package/src/schemas/generated/business-unit.ts +38 -0
  106. package/src/schemas/generated/cart-discount.ts +33 -0
  107. package/src/schemas/generated/cart.ts +61 -0
  108. package/src/schemas/generated/category.ts +25 -0
  109. package/src/schemas/generated/channel.ts +21 -0
  110. package/src/schemas/generated/common.ts +1372 -0
  111. package/src/schemas/generated/custom-object.ts +11 -0
  112. package/src/schemas/generated/customer-group.ts +11 -0
  113. package/src/schemas/generated/customer.ts +47 -0
  114. package/src/schemas/generated/discount-code.ts +25 -0
  115. package/src/schemas/generated/discount-group.ts +13 -0
  116. package/src/schemas/generated/extension.ts +15 -0
  117. package/src/schemas/generated/index.ts +42 -0
  118. package/src/schemas/generated/inventory-entry.ts +20 -0
  119. package/src/schemas/generated/my-quote-request.ts +10 -0
  120. package/src/schemas/generated/order-edit.ts +18 -0
  121. package/src/schemas/generated/order-from-cart.ts +25 -0
  122. package/src/schemas/generated/payment.ts +30 -0
  123. package/src/schemas/generated/product-discount.ts +20 -0
  124. package/src/schemas/generated/product-selection.ts +18 -0
  125. package/src/schemas/generated/product-tailoring.ts +26 -0
  126. package/src/schemas/generated/product-type.ts +12 -0
  127. package/src/schemas/generated/product.ts +37 -0
  128. package/src/schemas/generated/quote-request.ts +19 -0
  129. package/src/schemas/generated/quote.ts +18 -0
  130. package/src/schemas/generated/recurrence-policy.ts +15 -0
  131. package/src/schemas/generated/recurring-order.ts +19 -0
  132. package/src/schemas/generated/review.ts +24 -0
  133. package/src/schemas/generated/shipping-method.ts +24 -0
  134. package/src/schemas/generated/shopping-list.ts +28 -0
  135. package/src/schemas/generated/staged-quote.ts +18 -0
  136. package/src/schemas/generated/standalone-price.ts +32 -0
  137. package/src/schemas/generated/state.ts +20 -0
  138. package/src/schemas/generated/store.ts +23 -0
  139. package/src/schemas/generated/subscription.ts +20 -0
  140. package/src/schemas/generated/tax-category.ts +12 -0
  141. package/src/schemas/generated/type.ts +17 -0
  142. package/src/schemas/generated/zone.ts +12 -0
  143. package/src/schemas/update-request.ts +3 -5
  144. package/src/server.ts +32 -4
  145. package/src/services/abstract.ts +207 -101
  146. package/src/services/as-associate-cart.test.ts +28 -36
  147. package/src/services/as-associate-cart.ts +15 -12
  148. package/src/services/as-associate-order.test.ts +33 -40
  149. package/src/services/as-associate-order.ts +15 -12
  150. package/src/services/as-associate-quote-request.ts +15 -12
  151. package/src/services/as-associate-shopping-list.test.ts +25 -35
  152. package/src/services/as-associate-shopping-list.ts +15 -12
  153. package/src/services/as-associate.test.ts +21 -15
  154. package/src/services/as-associate.ts +23 -22
  155. package/src/services/associate-roles.test.ts +16 -22
  156. package/src/services/associate-roles.ts +2 -2
  157. package/src/services/attribute-group.test.ts +40 -44
  158. package/src/services/attribute-group.ts +2 -2
  159. package/src/services/business-units.test.ts +227 -163
  160. package/src/services/business-units.ts +2 -2
  161. package/src/services/cart-discount.test.ts +253 -187
  162. package/src/services/cart-discount.ts +2 -2
  163. package/src/services/cart.test.ts +833 -832
  164. package/src/services/cart.ts +31 -12
  165. package/src/services/category.test.ts +208 -130
  166. package/src/services/category.ts +2 -2
  167. package/src/services/channel.test.ts +39 -44
  168. package/src/services/channel.ts +2 -2
  169. package/src/services/custom-object.test.ts +103 -79
  170. package/src/services/custom-object.ts +106 -38
  171. package/src/services/customer-group.test.ts +39 -44
  172. package/src/services/customer-group.ts +2 -2
  173. package/src/services/customer.test.ts +357 -292
  174. package/src/services/customer.ts +70 -23
  175. package/src/services/discount-code.test.ts +57 -68
  176. package/src/services/discount-code.ts +2 -2
  177. package/src/services/discount-group.test.ts +111 -134
  178. package/src/services/discount-group.ts +2 -2
  179. package/src/services/draft-validation.test.ts +255 -0
  180. package/src/services/extension.test.ts +39 -44
  181. package/src/services/extension.ts +2 -2
  182. package/src/services/inventory-entry.test.ts +106 -87
  183. package/src/services/inventory-entry.ts +2 -2
  184. package/src/services/my-business-unit.test.ts +82 -112
  185. package/src/services/my-business-unit.ts +25 -19
  186. package/src/services/my-cart.test.ts +46 -41
  187. package/src/services/my-cart.ts +32 -28
  188. package/src/services/my-customer.test.ts +153 -88
  189. package/src/services/my-customer.ts +130 -61
  190. package/src/services/my-order.ts +15 -12
  191. package/src/services/my-payment.test.ts +30 -24
  192. package/src/services/my-payment.ts +2 -2
  193. package/src/services/my-shopping-list.ts +2 -2
  194. package/src/services/order.test.ts +332 -276
  195. package/src/services/order.ts +45 -27
  196. package/src/services/payment.test.ts +31 -29
  197. package/src/services/payment.ts +2 -2
  198. package/src/services/product-discount.test.ts +39 -46
  199. package/src/services/product-discount.ts +2 -2
  200. package/src/services/product-projection.test.ts +176 -166
  201. package/src/services/product-projection.ts +31 -15
  202. package/src/services/product-selection.test.ts +17 -9
  203. package/src/services/product-selection.ts +2 -2
  204. package/src/services/product-type.test.ts +80 -21
  205. package/src/services/product-type.ts +2 -2
  206. package/src/services/product.test.ts +569 -534
  207. package/src/services/product.ts +14 -7
  208. package/src/services/project.test.ts +22 -12
  209. package/src/services/project.ts +28 -13
  210. package/src/services/quote-request.test.ts +36 -39
  211. package/src/services/quote-request.ts +2 -2
  212. package/src/services/quote-staged.ts +2 -2
  213. package/src/services/quote.ts +2 -2
  214. package/src/services/recurrence-policy.test.ts +114 -139
  215. package/src/services/recurrence-policy.ts +2 -2
  216. package/src/services/recurring-order.test.ts +149 -194
  217. package/src/services/recurring-order.ts +2 -2
  218. package/src/services/reviews.test.ts +127 -106
  219. package/src/services/reviews.ts +2 -2
  220. package/src/services/shipping-method.test.ts +96 -125
  221. package/src/services/shipping-method.ts +24 -12
  222. package/src/services/shopping-list.test.ts +183 -141
  223. package/src/services/shopping-list.ts +2 -2
  224. package/src/services/standalone-price.test.ts +60 -46
  225. package/src/services/standalone-price.ts +2 -2
  226. package/src/services/state.test.ts +20 -25
  227. package/src/services/state.ts +2 -2
  228. package/src/services/store.test.ts +26 -45
  229. package/src/services/store.ts +2 -2
  230. package/src/services/subscription.test.ts +39 -44
  231. package/src/services/subscription.ts +2 -2
  232. package/src/services/tax-category.test.ts +33 -36
  233. package/src/services/tax-category.ts +2 -2
  234. package/src/services/type.test.ts +45 -44
  235. package/src/services/type.ts +2 -2
  236. package/src/services/zone.test.ts +40 -44
  237. package/src/services/zone.ts +2 -2
  238. package/src/shipping.ts +41 -11
  239. package/src/storage/abstract.ts +248 -17
  240. package/src/storage/in-memory.ts +147 -290
  241. package/src/storage/sqlite.ts +429 -0
  242. package/src/storage/storage-map.ts +75 -0
  243. package/src/storage/storage.test-helpers.ts +97 -0
  244. package/src/storage/storage.test.ts +802 -0
  245. package/src/testing/associate-role.ts +28 -0
  246. package/src/testing/attribute-group.ts +27 -0
  247. package/src/testing/business-unit.ts +9 -8
  248. package/src/testing/cart-discount.ts +34 -0
  249. package/src/testing/cart.ts +20 -0
  250. package/src/testing/category.ts +25 -0
  251. package/src/testing/channel.ts +23 -0
  252. package/src/testing/custom-object.ts +27 -0
  253. package/src/testing/customer-group.ts +26 -0
  254. package/src/testing/customer.ts +36 -33
  255. package/src/testing/discount-code.ts +29 -0
  256. package/src/testing/discount-group.ts +27 -0
  257. package/src/testing/extension.ts +32 -0
  258. package/src/testing/index.ts +33 -0
  259. package/src/testing/inventory-entry.ts +26 -0
  260. package/src/testing/order.ts +27 -0
  261. package/src/testing/payment.ts +23 -0
  262. package/src/testing/product-discount.ts +33 -0
  263. package/src/testing/product-selection.ts +28 -0
  264. package/src/testing/product-type.ts +27 -0
  265. package/src/testing/product.ts +38 -0
  266. package/src/testing/quote-request.ts +29 -0
  267. package/src/testing/recurrence-policy.ts +33 -0
  268. package/src/testing/recurring-order.ts +32 -0
  269. package/src/testing/review.ts +24 -0
  270. package/src/testing/shipping-method.ts +31 -0
  271. package/src/testing/shopping-list.ts +25 -0
  272. package/src/testing/standalone-price.ts +31 -0
  273. package/src/testing/state.ts +21 -0
  274. package/src/testing/store.ts +26 -0
  275. package/src/testing/subscription.ts +38 -0
  276. package/src/testing/tax-category.ts +27 -0
  277. package/src/testing/type.ts +9 -6
  278. package/src/testing/zone.ts +22 -0
  279. package/src/validate.test.ts +122 -0
  280. package/src/validate.ts +78 -7
  281. package/src/.env +0 -0
@@ -1,44 +1,52 @@
1
1
  import type {
2
+ ChannelReference,
2
3
  InventoryEntry,
3
4
  InventoryEntryDraft,
4
5
  } from "@commercetools/platform-sdk";
5
6
  import type { Config } from "#src/config.ts";
6
7
  import { getBaseResourceProperties } from "#src/helpers.ts";
8
+ import { InventoryEntryDraftSchema } from "#src/schemas/generated/inventory-entry.ts";
7
9
  import {
8
10
  AbstractResourceRepository,
9
11
  type RepositoryContext,
10
12
  } from "../abstract.ts";
11
- import { createCustomFields } from "../helpers.ts";
13
+ import {
14
+ createCustomFields,
15
+ getReferenceFromResourceIdentifier,
16
+ } from "../helpers.ts";
12
17
  import { InventoryEntryUpdateHandler } from "./actions.ts";
13
18
 
14
19
  export class InventoryEntryRepository extends AbstractResourceRepository<"inventory-entry"> {
15
20
  constructor(config: Config) {
16
21
  super("inventory-entry", config);
17
22
  this.actions = new InventoryEntryUpdateHandler(config.storage);
23
+ this.draftSchema = InventoryEntryDraftSchema;
18
24
  }
19
25
 
20
- create(
26
+ async create(
21
27
  context: RepositoryContext,
22
28
  draft: InventoryEntryDraft,
23
- ): InventoryEntry {
29
+ ): Promise<InventoryEntry> {
24
30
  const resource: InventoryEntry = {
25
- ...getBaseResourceProperties(),
31
+ ...getBaseResourceProperties(context.clientId),
26
32
  sku: draft.sku,
27
33
  quantityOnStock: draft.quantityOnStock,
28
34
  availableQuantity: draft.quantityOnStock,
29
35
  expectedDelivery: draft.expectedDelivery,
30
36
  restockableInDays: draft.restockableInDays,
31
- supplyChannel: {
32
- ...draft.supplyChannel,
33
- typeId: "channel",
34
- id: draft.supplyChannel?.id ?? "",
35
- },
36
- custom: createCustomFields(
37
+ supplyChannel: draft.supplyChannel
38
+ ? await getReferenceFromResourceIdentifier<ChannelReference>(
39
+ draft.supplyChannel,
40
+ context.projectKey,
41
+ this._storage,
42
+ )
43
+ : undefined,
44
+ custom: await createCustomFields(
37
45
  draft.custom,
38
46
  context.projectKey,
39
47
  this._storage,
40
48
  ),
41
49
  };
42
- return this.saveNew(context, resource);
50
+ return await this.saveNew(context, resource);
43
51
  }
44
52
  }
@@ -12,14 +12,14 @@ import type { RepositoryContext } from "./abstract.ts";
12
12
  import { CustomerRepository } from "./customer/index.ts";
13
13
 
14
14
  export class MyCustomerRepository extends CustomerRepository {
15
- changePassword(
15
+ async changePassword(
16
16
  context: RepositoryContext,
17
17
  changePassword: MyCustomerChangePassword,
18
18
  ) {
19
19
  const { currentPassword, newPassword } = changePassword;
20
20
  const encodedPassword = hashPassword(currentPassword);
21
21
 
22
- const result = this._storage.query(context.projectKey, "customer", {
22
+ const result = await this._storage.query(context.projectKey, "customer", {
23
23
  where: [`password = "${encodedPassword}"`],
24
24
  });
25
25
  if (result.count === 0) {
@@ -41,11 +41,11 @@ export class MyCustomerRepository extends CustomerRepository {
41
41
  customer.version += 1;
42
42
 
43
43
  // Update storage
44
- this._storage.add(context.projectKey, "customer", customer);
44
+ await this._storage.add(context.projectKey, "customer", customer);
45
45
  return customer;
46
46
  }
47
47
 
48
- confirmEmail(
48
+ async confirmEmail(
49
49
  context: RepositoryContext,
50
50
  resetPassword: MyCustomerEmailVerify,
51
51
  ) {
@@ -59,11 +59,11 @@ export class MyCustomerRepository extends CustomerRepository {
59
59
  });
60
60
  }
61
61
 
62
- const customer = this._storage.get(
62
+ const customer = (await this._storage.get(
63
63
  context.projectKey,
64
64
  "customer",
65
65
  customerId,
66
- ) as Writable<Customer> | undefined;
66
+ )) as Writable<Customer> | undefined;
67
67
 
68
68
  if (!customer) {
69
69
  throw new CommercetoolsError<ResourceNotFoundError>({
@@ -76,30 +76,31 @@ export class MyCustomerRepository extends CustomerRepository {
76
76
  customer.version += 1;
77
77
 
78
78
  // Update storage
79
- this._storage.add(context.projectKey, "customer", customer);
79
+ await this._storage.add(context.projectKey, "customer", customer);
80
80
  return customer;
81
81
  }
82
82
 
83
- deleteMe(context: RepositoryContext): Customer | undefined {
83
+ async deleteMe(context: RepositoryContext): Promise<Customer | undefined> {
84
84
  // grab the first customer you can find for now. In the future we should
85
85
  // use the customer id from the scope of the token
86
- const results = this._storage.query(
86
+ const results = await this._storage.query(
87
87
  context.projectKey,
88
88
  this.getTypeId(),
89
89
  {},
90
90
  );
91
91
 
92
92
  if (results.count > 0) {
93
- return this.delete(context, results.results[0].id) as Customer;
93
+ const deleted = await this.delete(context, results.results[0].id);
94
+ return deleted as Customer;
94
95
  }
95
96
 
96
97
  return;
97
98
  }
98
99
 
99
- getMe(context: RepositoryContext): Customer | undefined {
100
+ async getMe(context: RepositoryContext): Promise<Customer | undefined> {
100
101
  // grab the first customer you can find for now. In the future we should
101
102
  // use the customer id from the scope of the token
102
- const results = this._storage.query(
103
+ const results = await this._storage.query(
103
104
  context.projectKey,
104
105
  this.getTypeId(),
105
106
  {},
@@ -8,12 +8,15 @@ import type { RepositoryContext } from "./abstract.ts";
8
8
  import { OrderRepository } from "./order/index.ts";
9
9
 
10
10
  export class MyOrderRepository extends OrderRepository {
11
- create(context: RepositoryContext, draft: MyOrderFromCartDraft): Order {
11
+ async create(
12
+ context: RepositoryContext,
13
+ draft: MyOrderFromCartDraft,
14
+ ): Promise<Order> {
12
15
  assert(draft.id, "draft.id is missing");
13
16
  const cartIdentifier = {
14
17
  id: draft.id,
15
18
  typeId: "cart",
16
19
  } as CartReference;
17
- return this.createFromCart(context, cartIdentifier);
20
+ return await this.createFromCart(context, cartIdentifier);
18
21
  }
19
22
  }
@@ -2,6 +2,7 @@ import type {
2
2
  CustomLineItemReturnItem,
3
3
  Delivery,
4
4
  GeneralError,
5
+ InvalidOperationError,
5
6
  LineItemReturnItem,
6
7
  Order,
7
8
  OrderAddDeliveryAction,
@@ -28,6 +29,9 @@ import type {
28
29
  OrderUpdateAction,
29
30
  OrderUpdateSyncInfoAction,
30
31
  Parcel,
32
+ ReferencedResourceNotFoundError,
33
+ RequiredFieldError,
34
+ ResourceNotFoundError,
31
35
  ReturnInfo,
32
36
  State,
33
37
  Store,
@@ -44,17 +48,21 @@ export class OrderUpdateHandler
44
48
  extends AbstractUpdateHandler
45
49
  implements Partial<UpdateHandlerInterface<Order, OrderUpdateAction>>
46
50
  {
47
- addPayment(
51
+ async addPayment(
48
52
  context: RepositoryContext,
49
53
  resource: Writable<Order>,
50
54
  { payment }: OrderAddPaymentAction,
51
55
  ) {
52
- const resolvedPayment = this._storage.getByResourceIdentifier(
56
+ const resolvedPayment = await this._storage.getByResourceIdentifier(
53
57
  context.projectKey,
54
58
  payment,
55
59
  );
56
60
  if (!resolvedPayment) {
57
- throw new Error(`Payment ${payment.id} not found`);
61
+ throw new CommercetoolsError<ReferencedResourceNotFoundError>({
62
+ code: "ReferencedResourceNotFound",
63
+ message: `Payment ${payment.id} not found`,
64
+ typeId: "payment",
65
+ });
58
66
  }
59
67
 
60
68
  if (!resource.paymentInfo) {
@@ -69,7 +77,7 @@ export class OrderUpdateHandler
69
77
  });
70
78
  }
71
79
 
72
- addReturnInfo(
80
+ async addReturnInfo(
73
81
  context: RepositoryContext,
74
82
  resource: Writable<Order>,
75
83
  info: OrderAddReturnInfoAction,
@@ -78,14 +86,19 @@ export class OrderUpdateHandler
78
86
  resource.returnInfo = [];
79
87
  }
80
88
 
81
- const resolved: ReturnInfo = {
82
- items: info.items.map((item) => {
89
+ const items = await Promise.all(
90
+ info.items.map(async (item) => {
83
91
  const common = {
84
92
  ...getBaseResourceProperties(),
85
93
  quantity: item.quantity,
86
94
  paymentState: "Initial",
87
- shipmentState: "Initial",
95
+ shipmentState: item.shipmentState ?? "Advised",
88
96
  comment: item.comment,
97
+ custom: await createCustomFields(
98
+ item.custom,
99
+ context.projectKey,
100
+ this._storage,
101
+ ),
89
102
  };
90
103
  if (item.customLineItemId) {
91
104
  return {
@@ -100,6 +113,10 @@ export class OrderUpdateHandler
100
113
  lineItemId: item.customLineItemId || item.lineItemId,
101
114
  } as LineItemReturnItem;
102
115
  }),
116
+ );
117
+
118
+ const resolved: ReturnInfo = {
119
+ items,
103
120
  returnTrackingId: info.returnTrackingId,
104
121
  returnDate: info.returnDate,
105
122
  };
@@ -164,61 +181,52 @@ export class OrderUpdateHandler
164
181
  resource: Order,
165
182
  { name, value }: OrderSetCustomFieldAction,
166
183
  ) {
167
- if (!resource.custom) {
168
- throw new Error("Resource has no custom field");
169
- }
170
- resource.custom.fields[name] = value;
184
+ this._setCustomFieldValues(resource, { name, value });
171
185
  }
172
186
 
173
- setCustomType(
187
+ async setCustomType(
174
188
  context: RepositoryContext,
175
189
  resource: Writable<Order>,
176
190
  { type, fields }: OrderSetCustomTypeAction,
177
191
  ) {
178
- if (!type) {
179
- resource.custom = undefined;
180
- } else {
181
- const resolvedType = this._storage.getByResourceIdentifier(
182
- context.projectKey,
183
- type,
184
- );
185
- if (!resolvedType) {
186
- throw new Error(`Type ${type} not found`);
187
- }
188
-
189
- resource.custom = {
190
- type: {
191
- typeId: "type",
192
- id: resolvedType.id,
193
- },
194
- fields: fields || {},
195
- };
196
- }
192
+ await this._setCustomType(context, resource, { type, fields });
197
193
  }
198
194
 
199
- addDelivery(
195
+ async addDelivery(
200
196
  context: RepositoryContext,
201
197
  resource: Writable<Order>,
202
198
  { action, items, ...deliveryDraft }: OrderAddDeliveryAction,
203
199
  ) {
204
200
  if (!resource.shippingInfo) {
205
- throw new Error("Resource has no shipping info");
201
+ throw new CommercetoolsError<InvalidOperationError>({
202
+ code: "InvalidOperation",
203
+ message: "Resource has no shipping info",
204
+ });
206
205
  }
207
206
 
208
207
  if (!items) {
209
- throw new Error("Delivery items are required");
208
+ throw new CommercetoolsError<RequiredFieldError>({
209
+ code: "RequiredField",
210
+ message: "Delivery items are required",
211
+ field: "items",
212
+ });
210
213
  }
211
214
 
212
215
  if (!resource.shippingInfo.deliveries) {
213
216
  resource.shippingInfo.deliveries = [];
214
217
  }
215
218
 
216
- const parcels: Parcel[] =
217
- deliveryDraft.parcels?.map((p) => ({
219
+ const parcels: Parcel[] = await Promise.all(
220
+ deliveryDraft.parcels?.map(async (p) => ({
218
221
  ...getBaseResourceProperties(),
219
222
  ...p,
220
- custom: createCustomFields(p.custom, context.projectKey, this._storage),
221
- })) ?? [];
223
+ custom: await createCustomFields(
224
+ p.custom,
225
+ context.projectKey,
226
+ this._storage,
227
+ ),
228
+ })) ?? [],
229
+ );
222
230
 
223
231
  const delivery: Delivery = {
224
232
  ...getBaseResourceProperties(),
@@ -230,7 +238,7 @@ export class OrderUpdateHandler
230
238
  context.projectKey,
231
239
  this._storage,
232
240
  ),
233
- custom: createCustomFields(
241
+ custom: await createCustomFields(
234
242
  deliveryDraft.custom,
235
243
  context.projectKey,
236
244
  this._storage,
@@ -246,7 +254,10 @@ export class OrderUpdateHandler
246
254
  { deliveryId, name, value }: OrderSetDeliveryCustomFieldAction,
247
255
  ) {
248
256
  if (!resource.shippingInfo) {
249
- throw new Error("Resource has no shipping info");
257
+ throw new CommercetoolsError<InvalidOperationError>({
258
+ code: "InvalidOperation",
259
+ message: "Resource has no shipping info",
260
+ });
250
261
  }
251
262
 
252
263
  for (const delivery of resource.shippingInfo.deliveries || []) {
@@ -278,13 +289,16 @@ export class OrderUpdateHandler
278
289
  }
279
290
 
280
291
  if (!lineItem.custom) {
281
- throw new Error("Resource has no custom field");
292
+ throw new CommercetoolsError<InvalidOperationError>({
293
+ code: "InvalidOperation",
294
+ message: "Resource has no custom field",
295
+ });
282
296
  }
283
297
 
284
298
  lineItem.custom.fields[name] = value;
285
299
  }
286
300
 
287
- setLineItemCustomType(
301
+ async setLineItemCustomType(
288
302
  context: RepositoryContext,
289
303
  resource: Writable<Order>,
290
304
  { lineItemId, lineItemKey, type, fields }: OrderSetLineItemCustomTypeAction,
@@ -308,12 +322,16 @@ export class OrderUpdateHandler
308
322
  if (!type) {
309
323
  lineItem.custom = undefined;
310
324
  } else {
311
- const resolvedType = this._storage.getByResourceIdentifier(
325
+ const resolvedType = await this._storage.getByResourceIdentifier(
312
326
  context.projectKey,
313
327
  type,
314
328
  );
315
329
  if (!resolvedType) {
316
- throw new Error(`Type ${type} not found`);
330
+ throw new CommercetoolsError<ReferencedResourceNotFoundError>({
331
+ code: "ReferencedResourceNotFound",
332
+ message: `Type ${type} not found`,
333
+ typeId: "type",
334
+ });
317
335
  }
318
336
 
319
337
  lineItem.custom = {
@@ -348,7 +366,10 @@ export class OrderUpdateHandler
348
366
  { parcelId, name, value }: OrderSetParcelCustomFieldAction,
349
367
  ) {
350
368
  if (!resource.shippingInfo) {
351
- throw new Error("Resource has no shipping info");
369
+ throw new CommercetoolsError<InvalidOperationError>({
370
+ code: "InvalidOperation",
371
+ message: "Resource has no shipping info",
372
+ });
352
373
  }
353
374
 
354
375
  for (const delivery of resource.shippingInfo.deliveries || []) {
@@ -380,18 +401,22 @@ export class OrderUpdateHandler
380
401
  );
381
402
  }
382
403
 
383
- setStore(
404
+ async setStore(
384
405
  context: RepositoryContext,
385
406
  resource: Writable<Order>,
386
407
  { store }: OrderSetStoreAction,
387
408
  ) {
388
409
  if (!store) return;
389
- const resolvedType = this._storage.getByResourceIdentifier(
410
+ const resolvedType = await this._storage.getByResourceIdentifier(
390
411
  context.projectKey,
391
412
  store,
392
413
  );
393
414
  if (!resolvedType) {
394
- throw new Error(`No store found with key=${store.key}`);
415
+ throw new CommercetoolsError<ReferencedResourceNotFoundError>({
416
+ code: "ReferencedResourceNotFound",
417
+ message: `No store found with key=${store.key}`,
418
+ typeId: "store",
419
+ });
395
420
  }
396
421
 
397
422
  const storeReference = resolvedType as Store;
@@ -401,19 +426,23 @@ export class OrderUpdateHandler
401
426
  };
402
427
  }
403
428
 
404
- transitionState(
429
+ async transitionState(
405
430
  context: RepositoryContext,
406
431
  resource: Writable<Order>,
407
432
  { state }: OrderTransitionStateAction,
408
433
  ) {
409
- const resolvedType = this._storage.getByResourceIdentifier(
434
+ const resolvedType = (await this._storage.getByResourceIdentifier(
410
435
  context.projectKey,
411
436
  state,
412
- ) as State | null;
437
+ )) as State | null;
413
438
 
414
439
  if (!resolvedType) {
415
- throw new Error(
416
- `No state found with key=${state.key} or id=${state.key}`,
440
+ throw new CommercetoolsError<ResourceNotFoundError>(
441
+ {
442
+ code: "ResourceNotFound",
443
+ message: `No state found with key=${state.key} or id=${state.key}`,
444
+ },
445
+ 404,
417
446
  );
418
447
  }
419
448
 
@@ -424,18 +453,22 @@ export class OrderUpdateHandler
424
453
  };
425
454
  }
426
455
 
427
- updateSyncInfo(
456
+ async updateSyncInfo(
428
457
  context: RepositoryContext,
429
458
  resource: Writable<Order>,
430
459
  { channel, externalId, syncedAt }: OrderUpdateSyncInfoAction,
431
460
  ) {
432
461
  if (!channel) return;
433
- const resolvedType = this._storage.getByResourceIdentifier(
462
+ const resolvedType = await this._storage.getByResourceIdentifier(
434
463
  context.projectKey,
435
464
  channel,
436
465
  );
437
466
  if (!resolvedType) {
438
- throw new Error(`Channel ${channel} not found`);
467
+ throw new CommercetoolsError<ReferencedResourceNotFoundError>({
468
+ code: "ReferencedResourceNotFound",
469
+ message: `Channel ${channel} not found`,
470
+ typeId: "channel",
471
+ });
439
472
  }
440
473
 
441
474
  const syncData: SyncInfo = {