@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
@@ -12,9 +12,7 @@ import type {
12
12
  CartDiscountSetValidFromAndUntilAction,
13
13
  CartDiscountSetValidUntilAction,
14
14
  CartDiscountUpdateAction,
15
- InvalidOperationError,
16
15
  } from "@commercetools/platform-sdk";
17
- import { CommercetoolsError } from "#src/exceptions.ts";
18
16
  import { getStoreKeyReference } from "#src/repositories/helpers.ts";
19
17
  import type { Writable } from "#src/types.ts";
20
18
  import type { UpdateHandlerInterface } from "../abstract.ts";
@@ -54,50 +52,15 @@ export class CartDiscountUpdateHandler
54
52
  resource: Writable<CartDiscount>,
55
53
  { name, value }: CartDiscountSetCustomFieldAction,
56
54
  ) {
57
- if (!resource.custom) {
58
- return;
59
- }
60
- if (value === null) {
61
- if (name in resource.custom.fields) {
62
- delete resource.custom.fields[name];
63
- } else {
64
- throw new CommercetoolsError<InvalidOperationError>(
65
- {
66
- code: "InvalidOperation",
67
- message: `Cannot remove custom field ${name} because it does not exist.`,
68
- },
69
- 400,
70
- );
71
- }
72
- } else {
73
- resource.custom.fields[name] = value;
74
- }
55
+ this._setCustomFieldValues(resource, { name, value });
75
56
  }
76
57
 
77
- setCustomType(
58
+ async setCustomType(
78
59
  context: RepositoryContext,
79
60
  resource: Writable<CartDiscount>,
80
61
  { type, fields }: CartDiscountSetCustomTypeAction,
81
62
  ) {
82
- if (!type) {
83
- resource.custom = undefined;
84
- } else {
85
- const resolvedType = this._storage.getByResourceIdentifier(
86
- context.projectKey,
87
- type,
88
- );
89
- if (!resolvedType) {
90
- throw new Error(`Type ${type} not found`);
91
- }
92
-
93
- resource.custom = {
94
- type: {
95
- typeId: "type",
96
- id: resolvedType.id,
97
- },
98
- fields: fields || {},
99
- };
100
- }
63
+ await this._setCustomType(context, resource, { type, fields });
101
64
  }
102
65
 
103
66
  setDescription(
@@ -116,14 +79,19 @@ export class CartDiscountUpdateHandler
116
79
  resource.key = key;
117
80
  }
118
81
 
119
- setStores(
82
+ async setStores(
120
83
  context: RepositoryContext,
121
84
  resource: Writable<CartDiscount>,
122
85
  { stores }: CartDiscountSetStoresAction,
123
86
  ) {
124
- resource.stores = stores?.map((s) =>
125
- getStoreKeyReference(s, context.projectKey, this._storage),
126
- );
87
+ const resolvedStores = stores
88
+ ? await Promise.all(
89
+ stores.map((s) =>
90
+ getStoreKeyReference(s, context.projectKey, this._storage),
91
+ ),
92
+ )
93
+ : undefined;
94
+ resource.stores = resolvedStores as Writable<CartDiscount>["stores"];
127
95
  }
128
96
 
129
97
  setValidFrom(
@@ -6,9 +6,11 @@ import type {
6
6
  CartDiscountValueFixed,
7
7
  CartDiscountValueGiftLineItem,
8
8
  CartDiscountValueRelative,
9
+ RecurringOrderScope,
9
10
  } from "@commercetools/platform-sdk";
10
11
  import type { Config } from "#src/config.ts";
11
12
  import { getBaseResourceProperties } from "#src/helpers.ts";
13
+ import { CartDiscountDraftSchema } from "#src/schemas/generated/cart-discount.ts";
12
14
  import {
13
15
  AbstractResourceRepository,
14
16
  type RepositoryContext,
@@ -24,20 +26,27 @@ export class CartDiscountRepository extends AbstractResourceRepository<"cart-dis
24
26
  constructor(config: Config) {
25
27
  super("cart-discount", config);
26
28
  this.actions = new CartDiscountUpdateHandler(config.storage);
29
+ this.draftSchema = CartDiscountDraftSchema;
27
30
  }
28
31
 
29
- create(context: RepositoryContext, draft: CartDiscountDraft): CartDiscount {
32
+ async create(
33
+ context: RepositoryContext,
34
+ draft: CartDiscountDraft,
35
+ ): Promise<CartDiscount> {
36
+ const stores = await Promise.all(
37
+ draft.stores?.map((s) =>
38
+ getStoreKeyReference(s, context.projectKey, this._storage),
39
+ ) ?? [],
40
+ );
41
+
30
42
  const resource: CartDiscount = {
31
- ...getBaseResourceProperties(),
43
+ ...getBaseResourceProperties(context.clientId),
32
44
  key: draft.key,
33
45
  description: draft.description,
34
46
  cartPredicate: draft.cartPredicate,
35
47
  isActive: draft.isActive || false,
36
48
  name: draft.name,
37
- stores:
38
- draft.stores?.map((s) =>
39
- getStoreKeyReference(s, context.projectKey, this._storage),
40
- ) ?? [],
49
+ stores,
41
50
  references: [],
42
51
  target: draft.target,
43
52
  requiresDiscountCode: draft.requiresDiscountCode || false,
@@ -46,13 +55,16 @@ export class CartDiscountRepository extends AbstractResourceRepository<"cart-dis
46
55
  validFrom: draft.validFrom,
47
56
  validUntil: draft.validUntil,
48
57
  value: this.transformValueDraft(draft.value),
49
- custom: createCustomFields(
58
+ custom: await createCustomFields(
50
59
  draft.custom,
51
60
  context.projectKey,
52
61
  this._storage,
53
62
  ),
63
+ recurringOrderScope: draft.recurringOrderScope
64
+ ? ({ type: draft.recurringOrderScope.type } as RecurringOrderScope)
65
+ : ({ type: "AnyOrder" } as RecurringOrderScope),
54
66
  };
55
- return this.saveNew(context, resource);
67
+ return await this.saveNew(context, resource);
56
68
  }
57
69
 
58
70
  private transformValueDraft(value: CartDiscountValueDraft) {
@@ -18,8 +18,10 @@ import type {
18
18
  CategorySetMetaKeywordsAction,
19
19
  CategorySetMetaTitleAction,
20
20
  CategoryUpdateAction,
21
+ ReferencedResourceNotFoundError,
21
22
  } from "@commercetools/platform-sdk";
22
23
  import { v4 as uuidv4 } from "uuid";
24
+ import { CommercetoolsError } from "#src/exceptions.ts";
23
25
  import type { Writable } from "#src/types.ts";
24
26
  import type { RepositoryContext, UpdateHandlerInterface } from "../abstract.ts";
25
27
  import { AbstractUpdateHandler } from "../abstract.ts";
@@ -29,15 +31,15 @@ export class CategoryUpdateHandler
29
31
  extends AbstractUpdateHandler
30
32
  implements Partial<UpdateHandlerInterface<Category, CategoryUpdateAction>>
31
33
  {
32
- addAsset(
34
+ async addAsset(
33
35
  context: RepositoryContext,
34
36
  resource: Writable<Category>,
35
37
  { asset }: CategoryAddAssetAction,
36
38
  ) {
37
39
  if (!resource.assets) {
38
- resource.assets = [this.assetFromAssetDraft(asset, context)];
40
+ resource.assets = [await this.assetFromAssetDraft(asset, context)];
39
41
  } else {
40
- resource.assets.push(this.assetFromAssetDraft(asset, context));
42
+ resource.assets.push(await this.assetFromAssetDraft(asset, context));
41
43
  }
42
44
  }
43
45
 
@@ -64,17 +66,26 @@ export class CategoryUpdateHandler
64
66
  resource.name = name;
65
67
  }
66
68
 
67
- changeParent(
69
+ async changeParent(
68
70
  context: RepositoryContext,
69
71
  resource: Writable<Category>,
70
72
  { parent }: CategoryChangeParentAction,
71
73
  ) {
72
- const category = this._storage.getByResourceIdentifier(
74
+ const category = await this._storage.getByResourceIdentifier(
73
75
  context.projectKey,
74
76
  parent,
75
77
  );
76
78
  if (!category) {
77
- throw new Error("No category found for reference");
79
+ throw new CommercetoolsError<ReferencedResourceNotFoundError>(
80
+ {
81
+ code: "ReferencedResourceNotFound",
82
+ message: "No category found for reference",
83
+ typeId: "category",
84
+ id: parent.id,
85
+ key: parent.key,
86
+ },
87
+ 400,
88
+ );
78
89
  }
79
90
  resource.parent = {
80
91
  typeId: "category",
@@ -147,30 +158,15 @@ export class CategoryUpdateHandler
147
158
  resource: Writable<Category>,
148
159
  { name, value }: CategorySetCustomFieldAction,
149
160
  ) {
150
- if (!resource.custom) {
151
- return;
152
- }
153
- if (value === null) {
154
- delete resource.custom.fields[name];
155
- } else {
156
- resource.custom.fields[name] = value;
157
- }
161
+ this._setCustomFieldValues(resource, { name, value });
158
162
  }
159
163
 
160
- setCustomType(
164
+ async setCustomType(
161
165
  context: RepositoryContext,
162
166
  resource: Writable<Category>,
163
167
  { type, fields }: CategorySetCustomTypeAction,
164
168
  ) {
165
- if (type) {
166
- resource.custom = createCustomFields(
167
- { type, fields },
168
- context.projectKey,
169
- this._storage,
170
- );
171
- } else {
172
- resource.custom = undefined;
173
- }
169
+ await this._setCustomType(context, resource, { type, fields });
174
170
  }
175
171
 
176
172
  setDescription(
@@ -213,12 +209,16 @@ export class CategoryUpdateHandler
213
209
  resource.metaTitle = metaTitle;
214
210
  }
215
211
 
216
- assetFromAssetDraft = (
212
+ assetFromAssetDraft = async (
217
213
  draft: AssetDraft,
218
214
  context: RepositoryContext,
219
- ): Asset => ({
215
+ ): Promise<Asset> => ({
220
216
  ...draft,
221
217
  id: uuidv4(),
222
- custom: createCustomFields(draft.custom, context.projectKey, this._storage),
218
+ custom: await createCustomFields(
219
+ draft.custom,
220
+ context.projectKey,
221
+ this._storage,
222
+ ),
223
223
  });
224
224
  }
@@ -9,7 +9,7 @@ describe("Order repository", () => {
9
9
  const repository = new CategoryRepository(config);
10
10
 
11
11
  test("valid ancestors", async () => {
12
- const root = repository.create(
12
+ const root = await repository.create(
13
13
  { projectKey: "dummy" },
14
14
  {
15
15
  key: "root",
@@ -22,7 +22,7 @@ describe("Order repository", () => {
22
22
  },
23
23
  );
24
24
 
25
- const level1 = repository.create(
25
+ const level1 = await repository.create(
26
26
  { projectKey: "dummy" },
27
27
  {
28
28
  key: "level-1",
@@ -39,7 +39,7 @@ describe("Order repository", () => {
39
39
  },
40
40
  );
41
41
 
42
- const level2 = repository.create(
42
+ const level2 = await repository.create(
43
43
  { projectKey: "dummy" },
44
44
  {
45
45
  key: "level-2",
@@ -56,7 +56,7 @@ describe("Order repository", () => {
56
56
  },
57
57
  );
58
58
 
59
- const level3 = repository.create(
59
+ const level3 = await repository.create(
60
60
  { projectKey: "dummy" },
61
61
  {
62
62
  key: "level-3",
@@ -73,7 +73,7 @@ describe("Order repository", () => {
73
73
  },
74
74
  );
75
75
 
76
- const result = repository.get({ projectKey: "dummy" }, level3.id);
76
+ const result = await repository.get({ projectKey: "dummy" }, level3.id);
77
77
  expect(result?.ancestors).toHaveLength(3);
78
78
  expect(result?.ancestors).toEqual([
79
79
  { id: level2.id, typeId: "category" },
@@ -81,9 +81,13 @@ describe("Order repository", () => {
81
81
  { id: root.id, typeId: "category" },
82
82
  ]);
83
83
 
84
- const expandResult = repository.get({ projectKey: "dummy" }, level3.id, {
85
- expand: ["ancestors[*]"],
86
- });
84
+ const expandResult = await repository.get(
85
+ { projectKey: "dummy" },
86
+ level3.id,
87
+ {
88
+ expand: ["ancestors[*]"],
89
+ },
90
+ );
87
91
  expect(expandResult?.ancestors).toHaveLength(3);
88
92
  expect(expandResult?.ancestors).toEqual([
89
93
  { id: level2.id, typeId: "category", obj: level2 },
@@ -91,7 +95,7 @@ describe("Order repository", () => {
91
95
  { id: root.id, typeId: "category", obj: root },
92
96
  ]);
93
97
 
94
- const queryResult = repository.query(
98
+ const queryResult = await repository.query(
95
99
  { projectKey: "dummy" },
96
100
  {
97
101
  where: [`id="${level3.id}"`],
@@ -7,24 +7,50 @@ import { v4 as uuidv4 } from "uuid";
7
7
  import type { Config } from "#src/config.ts";
8
8
  import { getBaseResourceProperties } from "#src/helpers.ts";
9
9
  import { parseExpandClause } from "#src/lib/expandParser.ts";
10
+ import { CategoryDraftSchema } from "#src/schemas/generated/category.ts";
10
11
  import type { Writable } from "#src/types.ts";
11
12
  import type { GetParams } from "../abstract.ts";
12
13
  import {
13
14
  AbstractResourceRepository,
14
15
  type RepositoryContext,
15
16
  } from "../abstract.ts";
16
- import { createCustomFields } from "../helpers.ts";
17
+ import {
18
+ createCustomFields,
19
+ getReferenceFromResourceIdentifier,
20
+ } from "../helpers.ts";
17
21
  import { CategoryUpdateHandler } from "./actions.ts";
18
22
 
19
23
  export class CategoryRepository extends AbstractResourceRepository<"category"> {
20
24
  constructor(config: Config) {
21
25
  super("category", config);
22
26
  this.actions = new CategoryUpdateHandler(this._storage);
27
+ this.draftSchema = CategoryDraftSchema;
23
28
  }
24
29
 
25
- create(context: RepositoryContext, draft: CategoryDraft): Category {
30
+ async create(
31
+ context: RepositoryContext,
32
+ draft: CategoryDraft,
33
+ ): Promise<Category> {
34
+ const assets = draft.assets
35
+ ? await Promise.all(
36
+ draft.assets.map(async (d) => ({
37
+ id: uuidv4(),
38
+ name: d.name,
39
+ description: d.description,
40
+ sources: d.sources,
41
+ tags: d.tags,
42
+ key: d.key,
43
+ custom: await createCustomFields(
44
+ d.custom,
45
+ context.projectKey,
46
+ this._storage,
47
+ ),
48
+ })),
49
+ )
50
+ : [];
51
+
26
52
  const resource: Category = {
27
- ...getBaseResourceProperties(),
53
+ ...getBaseResourceProperties(context.clientId),
28
54
  key: draft.key,
29
55
  name: draft.name,
30
56
  slug: draft.slug,
@@ -34,37 +60,28 @@ export class CategoryRepository extends AbstractResourceRepository<"category"> {
34
60
  orderHint: draft.orderHint || "",
35
61
  externalId: draft.externalId || "",
36
62
  parent: draft.parent
37
- ? { typeId: "category", id: draft.parent.id! }
38
- : undefined,
39
- ancestors: [], // Resolved at runtime
40
- assets:
41
- draft.assets?.map((d) => ({
42
- id: uuidv4(),
43
- name: d.name,
44
- description: d.description,
45
- sources: d.sources,
46
- tags: d.tags,
47
- key: d.key,
48
- custom: createCustomFields(
49
- draft.custom,
63
+ ? await getReferenceFromResourceIdentifier<CategoryReference>(
64
+ draft.parent,
50
65
  context.projectKey,
51
66
  this._storage,
52
- ),
53
- })) || [],
54
- custom: createCustomFields(
67
+ )
68
+ : undefined,
69
+ ancestors: [], // Resolved at runtime
70
+ assets,
71
+ custom: await createCustomFields(
55
72
  draft.custom,
56
73
  context.projectKey,
57
74
  this._storage,
58
75
  ),
59
76
  };
60
- return this.saveNew(context, resource);
77
+ return await this.saveNew(context, resource);
61
78
  }
62
79
 
63
- postProcessResource(
80
+ async postProcessResource(
64
81
  context: RepositoryContext,
65
82
  resource: Writable<Category>,
66
83
  params?: GetParams,
67
- ): Category {
84
+ ): Promise<Category> {
68
85
  let node: Category = resource;
69
86
  const ancestors: CategoryReference[] = [];
70
87
 
@@ -79,7 +96,7 @@ export class CategoryRepository extends AbstractResourceRepository<"category"> {
79
96
  );
80
97
 
81
98
  while (node.parent) {
82
- node = this._storage.getByResourceIdentifier<"category">(
99
+ node = await this._storage.getByResourceIdentifier<"category">(
83
100
  context.projectKey,
84
101
  node.parent,
85
102
  );