@labdigital/commercetools-mock 2.66.0 → 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 +3769 -2653
  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 +84 -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
@@ -16,6 +16,7 @@ import type {
16
16
  BusinessUnitChangeParentUnitAction,
17
17
  BusinessUnitChangeStatusAction,
18
18
  BusinessUnitDraft,
19
+ BusinessUnitKeyReference,
19
20
  BusinessUnitRemoveAddressAction,
20
21
  BusinessUnitRemoveAssociateAction,
21
22
  BusinessUnitRemoveBillingAddressIdAction,
@@ -34,10 +35,12 @@ import type {
34
35
  CompanyDraft,
35
36
  Division,
36
37
  DivisionDraft,
38
+ InvalidJsonInputError,
37
39
  InvalidOperationError,
38
40
  } from "@commercetools/platform-sdk";
39
41
  import type { Config } from "#src/config.ts";
40
42
  import { CommercetoolsError } from "#src/exceptions.ts";
43
+ import { BusinessUnitDraftSchema } from "#src/schemas/generated/business-unit.ts";
41
44
  import { generateRandomString, getBaseResourceProperties } from "../helpers.ts";
42
45
  import type { Writable } from "../types.ts";
43
46
  import type { UpdateHandlerInterface } from "./abstract.ts";
@@ -58,9 +61,13 @@ export class BusinessUnitRepository extends AbstractResourceRepository<"business
58
61
  constructor(config: Config) {
59
62
  super("business-unit", config);
60
63
  this.actions = new BusinessUnitUpdateHandler(this._storage);
64
+ this.draftSchema = BusinessUnitDraftSchema;
61
65
  }
62
66
 
63
- create(context: RepositoryContext, draft: BusinessUnitDraft): BusinessUnit {
67
+ async create(
68
+ context: RepositoryContext,
69
+ draft: BusinessUnitDraft,
70
+ ): Promise<BusinessUnit> {
64
71
  const addresses =
65
72
  draft.addresses?.map((address) => ({
66
73
  ...address,
@@ -83,18 +90,32 @@ export class BusinessUnitRepository extends AbstractResourceRepository<"business
83
90
  (i) => addresses[i].id,
84
91
  );
85
92
 
93
+ const stores = draft.stores
94
+ ? await Promise.all(
95
+ draft.stores.map((s) =>
96
+ getStoreKeyReference(s, context.projectKey, this._storage),
97
+ ),
98
+ )
99
+ : undefined;
100
+
101
+ const associates = draft.associates
102
+ ? await Promise.all(
103
+ draft.associates.map((a) =>
104
+ createAssociate(a, context.projectKey, this._storage),
105
+ ),
106
+ )
107
+ : [];
108
+
86
109
  const resource = {
87
- ...getBaseResourceProperties(),
110
+ ...getBaseResourceProperties(context.clientId),
88
111
  key: draft.key,
89
112
  status: draft.status,
90
- stores: draft.stores?.map((s) =>
91
- getStoreKeyReference(s, context.projectKey, this._storage),
92
- ),
113
+ stores,
93
114
  storeMode: draft.storeMode,
94
115
  name: draft.name,
95
116
  contactEmail: draft.contactEmail,
96
117
  addresses: addresses,
97
- custom: createCustomFields(
118
+ custom: await createCustomFields(
98
119
  draft.custom,
99
120
  context.projectKey,
100
121
  this._storage,
@@ -105,38 +126,56 @@ export class BusinessUnitRepository extends AbstractResourceRepository<"business
105
126
  defaultBillingAddressId: defaultBillingAddressId,
106
127
  associateMode: draft.associateMode,
107
128
  approvalRuleMode: draft.approvalRuleMode,
108
-
109
- associates:
110
- draft.associates?.map((a) =>
111
- createAssociate(a, context.projectKey, this._storage),
112
- ) ?? [],
129
+ associates,
113
130
  };
114
131
 
115
132
  if (this._isDivisionDraft(draft)) {
133
+ const parentUnit = await getBusinessUnitKeyReference(
134
+ draft.parentUnit,
135
+ context.projectKey,
136
+ this._storage,
137
+ );
138
+ // Look up the parent to determine the topLevelUnit
139
+ const parent = (await this._storage.getByResourceIdentifier(
140
+ context.projectKey,
141
+ parentUnit,
142
+ )) as BusinessUnit | undefined;
143
+ const topLevelUnit: BusinessUnitKeyReference = parent?.topLevelUnit ?? {
144
+ typeId: "business-unit",
145
+ key: parentUnit.key!,
146
+ };
116
147
  const division = {
117
148
  ...resource,
118
149
  unitType: "Division" as const,
119
- parentUnit: getBusinessUnitKeyReference(
120
- draft.parentUnit,
121
- context.projectKey,
122
- this._storage,
123
- ),
150
+ parentUnit,
151
+ topLevelUnit,
124
152
  } as Division;
125
153
 
126
- this.saveNew(context, division);
154
+ await this.saveNew(context, division);
127
155
  return division;
128
156
  }
129
157
  if (this._isCompanyDraft(draft)) {
130
158
  const company = {
131
159
  ...resource,
132
160
  unitType: "Company" as const,
161
+ topLevelUnit: {
162
+ typeId: "business-unit" as const,
163
+ key: draft.key,
164
+ },
133
165
  } as Company;
134
166
 
135
- this.saveNew(context, company);
167
+ await this.saveNew(context, company);
136
168
  return company;
137
169
  }
138
170
 
139
- throw new Error("Invalid business unit type");
171
+ throw new CommercetoolsError<InvalidJsonInputError>(
172
+ {
173
+ code: "InvalidJsonInput",
174
+ message: "Invalid business unit type",
175
+ detailedErrorMessage: "Invalid business unit type",
176
+ },
177
+ 400,
178
+ );
140
179
  }
141
180
 
142
181
  private _isCompanyDraft(draft: BusinessUnitDraft): draft is CompanyDraft {
@@ -153,7 +192,7 @@ class BusinessUnitUpdateHandler
153
192
  implements
154
193
  Partial<UpdateHandlerInterface<BusinessUnit, BusinessUnitUpdateAction>>
155
194
  {
156
- addAddress(
195
+ async addAddress(
157
196
  context: RepositoryContext,
158
197
  resource: Writable<BusinessUnit>,
159
198
  { address }: BusinessUnitAddAddressAction,
@@ -168,12 +207,12 @@ class BusinessUnitUpdateHandler
168
207
  }
169
208
  }
170
209
 
171
- addAssociate(
210
+ async addAssociate(
172
211
  context: RepositoryContext,
173
212
  resource: Writable<BusinessUnit>,
174
213
  { associate }: BusinessUnitAddAssociateAction,
175
214
  ) {
176
- const newAssociate = createAssociate(
215
+ const newAssociate = await createAssociate(
177
216
  associate,
178
217
  context.projectKey,
179
218
  this._storage,
@@ -183,12 +222,12 @@ class BusinessUnitUpdateHandler
183
222
  }
184
223
  }
185
224
 
186
- addStore(
225
+ async addStore(
187
226
  context: RepositoryContext,
188
227
  resource: Writable<BusinessUnit>,
189
228
  { store }: BusinessUnitAddStoreAction,
190
229
  ) {
191
- const newStore = getStoreKeyReference(
230
+ const newStore = await getStoreKeyReference(
192
231
  store,
193
232
  context.projectKey,
194
233
  this._storage,
@@ -249,12 +288,12 @@ class BusinessUnitUpdateHandler
249
288
  resource.name = name;
250
289
  }
251
290
 
252
- changeParentUnit(
291
+ async changeParentUnit(
253
292
  context: RepositoryContext,
254
293
  resource: Writable<BusinessUnit>,
255
294
  { parentUnit }: BusinessUnitChangeParentUnitAction,
256
295
  ) {
257
- resource.parentUnit = getBusinessUnitKeyReference(
296
+ resource.parentUnit = await getBusinessUnitKeyReference(
258
297
  parentUnit,
259
298
  context.projectKey,
260
299
  this._storage,
@@ -269,14 +308,18 @@ class BusinessUnitUpdateHandler
269
308
  resource.status = status;
270
309
  }
271
310
 
272
- setAssociates(
311
+ async setAssociates(
273
312
  context: RepositoryContext,
274
313
  resource: Writable<BusinessUnit>,
275
314
  { associates }: BusinessUnitSetAssociatesAction,
276
315
  ) {
277
- const newAssociates = associates
278
- .map((a) => createAssociate(a, context.projectKey, this._storage))
279
- .filter((a): a is Writable<Associate> => a !== undefined);
316
+ const newAssociates = (
317
+ await Promise.all(
318
+ associates.map((a) =>
319
+ createAssociate(a, context.projectKey, this._storage),
320
+ ),
321
+ )
322
+ ).filter((a): a is Writable<Associate> => a !== undefined);
280
323
  resource.associates = newAssociates || undefined;
281
324
  }
282
325
 
@@ -290,7 +333,7 @@ class BusinessUnitUpdateHandler
290
333
  );
291
334
  }
292
335
 
293
- changeAssociate(
336
+ async changeAssociate(
294
337
  context: RepositoryContext,
295
338
  resource: Writable<BusinessUnit>,
296
339
  { associate }: BusinessUnitChangeAssociateAction,
@@ -299,12 +342,16 @@ class BusinessUnitUpdateHandler
299
342
  (a) => a.customer.id === associate.customer.id,
300
343
  );
301
344
  if (existingAssociateIndex === -1) {
302
- throw new Error(
303
- `Associate with customer id ${associate.customer.id} not found`,
345
+ throw new CommercetoolsError<InvalidOperationError>(
346
+ {
347
+ code: "InvalidOperation",
348
+ message: `Associate with customer id ${associate.customer.id} not found`,
349
+ },
350
+ 400,
304
351
  );
305
352
  }
306
353
 
307
- const newAssociate = createAssociate(
354
+ const newAssociate = await createAssociate(
308
355
  associate,
309
356
  context.projectKey,
310
357
  this._storage,
@@ -322,20 +369,12 @@ class BusinessUnitUpdateHandler
322
369
  resource.contactEmail = contactEmail;
323
370
  }
324
371
 
325
- setCustomType(
372
+ async setCustomType(
326
373
  context: RepositoryContext,
327
374
  resource: Writable<BusinessUnit>,
328
375
  { type, fields }: BusinessUnitSetCustomTypeAction,
329
376
  ) {
330
- if (type) {
331
- resource.custom = createCustomFields(
332
- { type, fields },
333
- context.projectKey,
334
- this._storage,
335
- );
336
- } else {
337
- resource.custom = undefined;
338
- }
377
+ await this._setCustomType(context, resource, { type, fields });
339
378
  }
340
379
 
341
380
  setStoreMode(
@@ -378,7 +417,6 @@ class BusinessUnitUpdateHandler
378
417
  if (!resource.shippingAddressIds.includes(address.id)) {
379
418
  resource.shippingAddressIds.push(address.id);
380
419
  }
381
- return resource;
382
420
  }
383
421
 
384
422
  removeShippingAddressId(
@@ -450,10 +488,7 @@ class BusinessUnitUpdateHandler
450
488
  resource: Writable<BusinessUnit>,
451
489
  { name, value }: BusinessUnitSetCustomFieldAction,
452
490
  ) {
453
- if (!resource.custom) {
454
- throw new Error("Resource has no custom type");
455
- }
456
- resource.custom.fields[name] = value;
491
+ this._setCustomFieldValues(resource, { name, value });
457
492
  }
458
493
 
459
494
  setAddressCustomField(
@@ -463,32 +498,49 @@ class BusinessUnitUpdateHandler
463
498
  ) {
464
499
  const address = resource.addresses.find((addr) => addr.id === addressId);
465
500
  if (!address) {
466
- throw new Error(`Address with id ${addressId} not found`);
501
+ throw new CommercetoolsError<InvalidOperationError>(
502
+ {
503
+ code: "InvalidOperation",
504
+ message: `Address with id ${addressId} not found`,
505
+ },
506
+ 400,
507
+ );
467
508
  }
468
509
  if (!address.custom) {
469
510
  // If the address doesn't have custom fields, we need to initialize them
470
511
  // This might require a type to be set first, but we'll just create minimal structure
471
- throw new Error(
472
- "Address has no custom type set. Use setAddressCustomType first.",
512
+ throw new CommercetoolsError<InvalidOperationError>(
513
+ {
514
+ code: "InvalidOperation",
515
+ message:
516
+ "Address has no custom type set. Use setAddressCustomType first.",
517
+ },
518
+ 400,
473
519
  );
474
520
  }
475
521
  address.custom.fields[name] = value;
476
522
  }
477
523
 
478
- setAddressCustomType(
524
+ async setAddressCustomType(
479
525
  context: RepositoryContext,
480
526
  resource: Writable<BusinessUnit>,
481
527
  { addressId, type, fields }: BusinessUnitSetAddressCustomTypeAction,
482
528
  ) {
483
529
  const address = resource.addresses.find((addr) => addr.id === addressId);
484
530
  if (!address) {
485
- throw new Error(`Address with id ${addressId} not found`);
531
+ throw new CommercetoolsError<InvalidOperationError>(
532
+ {
533
+ code: "InvalidOperation",
534
+ message: `Address with id ${addressId} not found`,
535
+ },
536
+ 400,
537
+ );
486
538
  }
487
539
 
488
540
  if (!type) {
489
541
  address.custom = undefined;
490
542
  } else {
491
- address.custom = createCustomFields(
543
+ address.custom = await createCustomFields(
492
544
  { type, fields },
493
545
  context.projectKey,
494
546
  this._storage,