@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.
- package/README.md +31 -8
- package/dist/abstract-BKFcva6S.mjs +1044 -0
- package/dist/abstract-BKFcva6S.mjs.map +1 -0
- package/dist/config-BcNSzPZz.d.mts +1718 -0
- package/dist/index.d.mts +50 -1633
- package/dist/index.mjs +3771 -2654
- package/dist/index.mjs.map +1 -1
- package/dist/storage/sqlite.d.mts +59 -0
- package/dist/storage/sqlite.mjs +234 -0
- package/dist/storage/sqlite.mjs.map +1 -0
- package/package.json +26 -29
- package/src/ctMock.ts +125 -136
- package/src/helpers.ts +14 -6
- package/src/index.ts +5 -0
- package/src/lib/masking.ts +4 -5
- package/src/lib/product-review-statistics.test.ts +257 -294
- package/src/lib/review-statistics.ts +17 -4
- package/src/oauth/helpers.ts +7 -4
- package/src/oauth/server.test.ts +102 -62
- package/src/oauth/server.ts +215 -213
- package/src/oauth/store.ts +20 -6
- package/src/orderSearch.ts +3 -3
- package/src/product-projection-search.ts +38 -20
- package/src/product-search-availability.test.ts +31 -52
- package/src/product-search.ts +19 -10
- package/src/projectAPI.ts +6 -22
- package/src/repositories/abstract.ts +182 -48
- package/src/repositories/as-associate.test.ts +19 -19
- package/src/repositories/associate-role.ts +12 -23
- package/src/repositories/attribute-group.test.ts +23 -23
- package/src/repositories/attribute-group.ts +6 -4
- package/src/repositories/business-unit.test.ts +63 -57
- package/src/repositories/business-unit.ts +107 -55
- package/src/repositories/cart/actions.ts +96 -65
- package/src/repositories/cart/helpers.ts +15 -11
- package/src/repositories/cart/index.test.ts +136 -30
- package/src/repositories/cart/index.ts +76 -59
- package/src/repositories/cart-discount/actions.ts +12 -44
- package/src/repositories/cart-discount/index.ts +20 -8
- package/src/repositories/category/actions.ts +27 -27
- package/src/repositories/category/index.test.ts +13 -9
- package/src/repositories/category/index.ts +40 -23
- package/src/repositories/channel.test.ts +53 -51
- package/src/repositories/channel.ts +12 -22
- package/src/repositories/custom-object.ts +34 -25
- package/src/repositories/customer/actions.ts +47 -25
- package/src/repositories/customer/index.test.ts +11 -11
- package/src/repositories/customer/index.ts +65 -35
- package/src/repositories/customer-group.test.ts +44 -42
- package/src/repositories/customer-group.ts +12 -22
- package/src/repositories/discount-code/actions.ts +3 -19
- package/src/repositories/discount-code/index.ts +9 -4
- package/src/repositories/discount-group/index.ts +8 -3
- package/src/repositories/extension.test.ts +27 -27
- package/src/repositories/extension.ts +10 -5
- package/src/repositories/helpers.ts +126 -47
- package/src/repositories/inventory-entry/actions.ts +3 -24
- package/src/repositories/inventory-entry/index.ts +19 -11
- package/src/repositories/my-customer.ts +13 -12
- package/src/repositories/my-order.ts +5 -2
- package/src/repositories/order/actions.ts +89 -56
- package/src/repositories/order/index.test.ts +36 -31
- package/src/repositories/order/index.ts +83 -49
- package/src/repositories/order-edit.ts +8 -3
- package/src/repositories/payment/actions.ts +64 -44
- package/src/repositories/payment/helpers.ts +3 -3
- package/src/repositories/payment/index.ts +28 -12
- package/src/repositories/product/actions.ts +133 -98
- package/src/repositories/product/helpers.ts +29 -16
- package/src/repositories/product/index.ts +42 -25
- package/src/repositories/product-discount.ts +6 -4
- package/src/repositories/product-projection.ts +41 -21
- package/src/repositories/product-selection.ts +8 -15
- package/src/repositories/product-tailoring.ts +22 -3
- package/src/repositories/product-type.ts +45 -4
- package/src/repositories/project.ts +57 -13
- package/src/repositories/quote/actions.ts +5 -28
- package/src/repositories/quote/index.ts +29 -6
- package/src/repositories/quote-request/actions.ts +5 -28
- package/src/repositories/quote-request/index.test.ts +3 -3
- package/src/repositories/quote-request/index.ts +31 -11
- package/src/repositories/quote-staged/actions.ts +5 -28
- package/src/repositories/quote-staged/index.ts +22 -8
- package/src/repositories/recurrence-policy/index.ts +6 -4
- package/src/repositories/recurring-order/actions.ts +7 -32
- package/src/repositories/recurring-order/index.ts +8 -6
- package/src/repositories/review.test.ts +147 -142
- package/src/repositories/review.ts +31 -37
- package/src/repositories/shipping-method/actions.ts +11 -28
- package/src/repositories/shipping-method/index.ts +26 -15
- package/src/repositories/shopping-list/actions.ts +21 -31
- package/src/repositories/shopping-list/index.ts +44 -22
- package/src/repositories/standalone-price.ts +6 -4
- package/src/repositories/state.ts +15 -9
- package/src/repositories/store.ts +21 -32
- package/src/repositories/subscription.test.ts +22 -22
- package/src/repositories/subscription.ts +8 -3
- package/src/repositories/tax-category/index.ts +8 -3
- package/src/repositories/type/actions.ts +21 -3
- package/src/repositories/type/index.ts +5 -3
- package/src/repositories/zone.test.ts +112 -77
- package/src/repositories/zone.ts +5 -3
- package/src/schemas/generated/associate-role.ts +13 -0
- package/src/schemas/generated/attribute-group.ts +12 -0
- package/src/schemas/generated/business-unit.ts +38 -0
- package/src/schemas/generated/cart-discount.ts +33 -0
- package/src/schemas/generated/cart.ts +61 -0
- package/src/schemas/generated/category.ts +25 -0
- package/src/schemas/generated/channel.ts +21 -0
- package/src/schemas/generated/common.ts +1372 -0
- package/src/schemas/generated/custom-object.ts +11 -0
- package/src/schemas/generated/customer-group.ts +11 -0
- package/src/schemas/generated/customer.ts +47 -0
- package/src/schemas/generated/discount-code.ts +25 -0
- package/src/schemas/generated/discount-group.ts +13 -0
- package/src/schemas/generated/extension.ts +15 -0
- package/src/schemas/generated/index.ts +42 -0
- package/src/schemas/generated/inventory-entry.ts +20 -0
- package/src/schemas/generated/my-quote-request.ts +10 -0
- package/src/schemas/generated/order-edit.ts +18 -0
- package/src/schemas/generated/order-from-cart.ts +25 -0
- package/src/schemas/generated/payment.ts +30 -0
- package/src/schemas/generated/product-discount.ts +20 -0
- package/src/schemas/generated/product-selection.ts +18 -0
- package/src/schemas/generated/product-tailoring.ts +26 -0
- package/src/schemas/generated/product-type.ts +12 -0
- package/src/schemas/generated/product.ts +37 -0
- package/src/schemas/generated/quote-request.ts +19 -0
- package/src/schemas/generated/quote.ts +18 -0
- package/src/schemas/generated/recurrence-policy.ts +15 -0
- package/src/schemas/generated/recurring-order.ts +19 -0
- package/src/schemas/generated/review.ts +24 -0
- package/src/schemas/generated/shipping-method.ts +24 -0
- package/src/schemas/generated/shopping-list.ts +28 -0
- package/src/schemas/generated/staged-quote.ts +18 -0
- package/src/schemas/generated/standalone-price.ts +32 -0
- package/src/schemas/generated/state.ts +20 -0
- package/src/schemas/generated/store.ts +23 -0
- package/src/schemas/generated/subscription.ts +20 -0
- package/src/schemas/generated/tax-category.ts +12 -0
- package/src/schemas/generated/type.ts +17 -0
- package/src/schemas/generated/zone.ts +12 -0
- package/src/schemas/update-request.ts +3 -5
- package/src/server.ts +32 -4
- package/src/services/abstract.ts +207 -101
- package/src/services/as-associate-cart.test.ts +28 -36
- package/src/services/as-associate-cart.ts +15 -12
- package/src/services/as-associate-order.test.ts +33 -40
- package/src/services/as-associate-order.ts +15 -12
- package/src/services/as-associate-quote-request.ts +15 -12
- package/src/services/as-associate-shopping-list.test.ts +25 -35
- package/src/services/as-associate-shopping-list.ts +15 -12
- package/src/services/as-associate.test.ts +21 -15
- package/src/services/as-associate.ts +23 -22
- package/src/services/associate-roles.test.ts +16 -22
- package/src/services/associate-roles.ts +2 -2
- package/src/services/attribute-group.test.ts +40 -44
- package/src/services/attribute-group.ts +2 -2
- package/src/services/business-units.test.ts +227 -163
- package/src/services/business-units.ts +2 -2
- package/src/services/cart-discount.test.ts +253 -187
- package/src/services/cart-discount.ts +2 -2
- package/src/services/cart.test.ts +833 -832
- package/src/services/cart.ts +31 -12
- package/src/services/category.test.ts +208 -130
- package/src/services/category.ts +2 -2
- package/src/services/channel.test.ts +39 -44
- package/src/services/channel.ts +2 -2
- package/src/services/custom-object.test.ts +103 -79
- package/src/services/custom-object.ts +106 -38
- package/src/services/customer-group.test.ts +39 -44
- package/src/services/customer-group.ts +2 -2
- package/src/services/customer.test.ts +357 -292
- package/src/services/customer.ts +70 -23
- package/src/services/discount-code.test.ts +57 -68
- package/src/services/discount-code.ts +2 -2
- package/src/services/discount-group.test.ts +111 -134
- package/src/services/discount-group.ts +2 -2
- package/src/services/draft-validation.test.ts +255 -0
- package/src/services/extension.test.ts +39 -44
- package/src/services/extension.ts +2 -2
- package/src/services/inventory-entry.test.ts +106 -87
- package/src/services/inventory-entry.ts +2 -2
- package/src/services/my-business-unit.test.ts +82 -112
- package/src/services/my-business-unit.ts +25 -19
- package/src/services/my-cart.test.ts +46 -41
- package/src/services/my-cart.ts +32 -28
- package/src/services/my-customer.test.ts +153 -88
- package/src/services/my-customer.ts +130 -61
- package/src/services/my-order.ts +15 -12
- package/src/services/my-payment.test.ts +30 -24
- package/src/services/my-payment.ts +2 -2
- package/src/services/my-shopping-list.ts +2 -2
- package/src/services/order.test.ts +332 -276
- package/src/services/order.ts +45 -27
- package/src/services/payment.test.ts +31 -29
- package/src/services/payment.ts +2 -2
- package/src/services/product-discount.test.ts +39 -46
- package/src/services/product-discount.ts +2 -2
- package/src/services/product-projection.test.ts +176 -166
- package/src/services/product-projection.ts +31 -15
- package/src/services/product-selection.test.ts +17 -9
- package/src/services/product-selection.ts +2 -2
- package/src/services/product-type.test.ts +80 -21
- package/src/services/product-type.ts +2 -2
- package/src/services/product.test.ts +569 -534
- package/src/services/product.ts +14 -7
- package/src/services/project.test.ts +22 -12
- package/src/services/project.ts +28 -13
- package/src/services/quote-request.test.ts +36 -39
- package/src/services/quote-request.ts +2 -2
- package/src/services/quote-staged.ts +2 -2
- package/src/services/quote.ts +2 -2
- package/src/services/recurrence-policy.test.ts +114 -139
- package/src/services/recurrence-policy.ts +2 -2
- package/src/services/recurring-order.test.ts +149 -194
- package/src/services/recurring-order.ts +2 -2
- package/src/services/reviews.test.ts +127 -106
- package/src/services/reviews.ts +2 -2
- package/src/services/shipping-method.test.ts +96 -125
- package/src/services/shipping-method.ts +24 -12
- package/src/services/shopping-list.test.ts +183 -141
- package/src/services/shopping-list.ts +2 -2
- package/src/services/standalone-price.test.ts +60 -46
- package/src/services/standalone-price.ts +2 -2
- package/src/services/state.test.ts +20 -25
- package/src/services/state.ts +2 -2
- package/src/services/store.test.ts +26 -45
- package/src/services/store.ts +2 -2
- package/src/services/subscription.test.ts +39 -44
- package/src/services/subscription.ts +2 -2
- package/src/services/tax-category.test.ts +33 -36
- package/src/services/tax-category.ts +2 -2
- package/src/services/type.test.ts +45 -44
- package/src/services/type.ts +2 -2
- package/src/services/zone.test.ts +40 -44
- package/src/services/zone.ts +2 -2
- package/src/shipping.ts +41 -11
- package/src/storage/abstract.ts +248 -17
- package/src/storage/in-memory.ts +147 -290
- package/src/storage/sqlite.ts +429 -0
- package/src/storage/storage-map.ts +75 -0
- package/src/storage/storage.test-helpers.ts +97 -0
- package/src/storage/storage.test.ts +802 -0
- package/src/testing/associate-role.ts +28 -0
- package/src/testing/attribute-group.ts +27 -0
- package/src/testing/business-unit.ts +9 -8
- package/src/testing/cart-discount.ts +34 -0
- package/src/testing/cart.ts +20 -0
- package/src/testing/category.ts +25 -0
- package/src/testing/channel.ts +23 -0
- package/src/testing/custom-object.ts +27 -0
- package/src/testing/customer-group.ts +26 -0
- package/src/testing/customer.ts +36 -33
- package/src/testing/discount-code.ts +29 -0
- package/src/testing/discount-group.ts +27 -0
- package/src/testing/extension.ts +32 -0
- package/src/testing/index.ts +33 -0
- package/src/testing/inventory-entry.ts +26 -0
- package/src/testing/order.ts +27 -0
- package/src/testing/payment.ts +23 -0
- package/src/testing/product-discount.ts +33 -0
- package/src/testing/product-selection.ts +28 -0
- package/src/testing/product-type.ts +27 -0
- package/src/testing/product.ts +38 -0
- package/src/testing/quote-request.ts +29 -0
- package/src/testing/recurrence-policy.ts +33 -0
- package/src/testing/recurring-order.ts +32 -0
- package/src/testing/review.ts +24 -0
- package/src/testing/shipping-method.ts +31 -0
- package/src/testing/shopping-list.ts +25 -0
- package/src/testing/standalone-price.ts +31 -0
- package/src/testing/state.ts +21 -0
- package/src/testing/store.ts +26 -0
- package/src/testing/subscription.ts +38 -0
- package/src/testing/tax-category.ts +27 -0
- package/src/testing/type.ts +9 -6
- package/src/testing/zone.ts +22 -0
- package/src/validate.test.ts +122 -0
- package/src/validate.ts +78 -7
- package/src/.env +0 -0
|
@@ -19,8 +19,8 @@ describe("Order repository", () => {
|
|
|
19
19
|
};
|
|
20
20
|
const repository = new OrderRepository(config);
|
|
21
21
|
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
storage.clear();
|
|
22
|
+
beforeEach(async () => {
|
|
23
|
+
await storage.clear();
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
test("create from cart", async () => {
|
|
@@ -143,10 +143,10 @@ describe("Order repository", () => {
|
|
|
143
143
|
},
|
|
144
144
|
};
|
|
145
145
|
|
|
146
|
-
storage.add("dummy", "cart", cart);
|
|
146
|
+
await storage.add("dummy", "cart", cart);
|
|
147
147
|
const ctx = { projectKey: "dummy" };
|
|
148
148
|
|
|
149
|
-
const result = repository.create(ctx, {
|
|
149
|
+
const result = await repository.create(ctx, {
|
|
150
150
|
cart: {
|
|
151
151
|
id: cart.id,
|
|
152
152
|
typeId: "cart",
|
|
@@ -155,7 +155,7 @@ describe("Order repository", () => {
|
|
|
155
155
|
});
|
|
156
156
|
expect(result.cart?.id).toBe(cart.id);
|
|
157
157
|
|
|
158
|
-
const items = repository.query(ctx);
|
|
158
|
+
const items = await repository.query(ctx);
|
|
159
159
|
expect(items.count).toBe(1);
|
|
160
160
|
|
|
161
161
|
expect(result.orderNumber).not.toBeUndefined();
|
|
@@ -192,7 +192,7 @@ describe("Order repository", () => {
|
|
|
192
192
|
expect(result.shippingInfo).toEqual(cart.shippingInfo);
|
|
193
193
|
});
|
|
194
194
|
|
|
195
|
-
test("should calculate taxed price when creating order from cart", () => {
|
|
195
|
+
test("should calculate taxed price when creating order from cart", async () => {
|
|
196
196
|
const cart: Cart = {
|
|
197
197
|
...getBaseResourceProperties(),
|
|
198
198
|
id: "cart-with-taxed-items",
|
|
@@ -279,9 +279,9 @@ describe("Order repository", () => {
|
|
|
279
279
|
inventoryMode: "None",
|
|
280
280
|
};
|
|
281
281
|
|
|
282
|
-
storage.add("dummy", "cart", cart);
|
|
282
|
+
await storage.add("dummy", "cart", cart);
|
|
283
283
|
const ctx = { projectKey: "dummy" };
|
|
284
|
-
const result = repository.create(ctx, {
|
|
284
|
+
const result = await repository.create(ctx, {
|
|
285
285
|
cart: { id: cart.id, typeId: "cart" },
|
|
286
286
|
version: cart.version,
|
|
287
287
|
});
|
|
@@ -293,7 +293,7 @@ describe("Order repository", () => {
|
|
|
293
293
|
});
|
|
294
294
|
|
|
295
295
|
test("create order in store", async () => {
|
|
296
|
-
storage.add("dummy", "store", {
|
|
296
|
+
await storage.add("dummy", "store", {
|
|
297
297
|
...getBaseResourceProperties(),
|
|
298
298
|
id: "store-123",
|
|
299
299
|
key: "testStore",
|
|
@@ -305,7 +305,7 @@ describe("Order repository", () => {
|
|
|
305
305
|
productSelections: [],
|
|
306
306
|
});
|
|
307
307
|
|
|
308
|
-
storage.add("dummy", "business-unit", {
|
|
308
|
+
await storage.add("dummy", "business-unit", {
|
|
309
309
|
...getBaseResourceProperties(),
|
|
310
310
|
id: "business-unit-123",
|
|
311
311
|
unitType: "Company",
|
|
@@ -321,9 +321,11 @@ describe("Order repository", () => {
|
|
|
321
321
|
key: "test-business-unit",
|
|
322
322
|
},
|
|
323
323
|
approvalRuleMode: "Explicit",
|
|
324
|
+
shippingAddressIds: [],
|
|
325
|
+
billingAddressIds: [],
|
|
324
326
|
});
|
|
325
327
|
|
|
326
|
-
storage.add("dummy", "customer", {
|
|
328
|
+
await storage.add("dummy", "customer", {
|
|
327
329
|
...getBaseResourceProperties(),
|
|
328
330
|
id: "customer-123",
|
|
329
331
|
email: "test@example.com",
|
|
@@ -339,6 +341,9 @@ describe("Order repository", () => {
|
|
|
339
341
|
stores: [],
|
|
340
342
|
isEmailVerified: true,
|
|
341
343
|
authenticationMode: "Password" as const,
|
|
344
|
+
shippingAddressIds: [],
|
|
345
|
+
billingAddressIds: [],
|
|
346
|
+
customerGroupAssignments: [],
|
|
342
347
|
});
|
|
343
348
|
|
|
344
349
|
const draft: OrderImportDraft = {
|
|
@@ -362,7 +367,7 @@ describe("Order repository", () => {
|
|
|
362
367
|
};
|
|
363
368
|
|
|
364
369
|
const ctx = { projectKey: "dummy", storeKey: "testStore" };
|
|
365
|
-
const result = repository.import(ctx, draft);
|
|
370
|
+
const result = await repository.import(ctx, draft);
|
|
366
371
|
|
|
367
372
|
expect(result.orderNumber).toBe("100000002");
|
|
368
373
|
expect(result.store?.key).toBe("testStore");
|
|
@@ -374,8 +379,8 @@ describe("Order repository", () => {
|
|
|
374
379
|
expect(result.paymentState).toBe("Paid");
|
|
375
380
|
});
|
|
376
381
|
|
|
377
|
-
test("should calculate taxed price when importing order", () => {
|
|
378
|
-
storage.add("dummy", "product", {
|
|
382
|
+
test("should calculate taxed price when importing order", async () => {
|
|
383
|
+
await storage.add("dummy", "product", {
|
|
379
384
|
...getBaseResourceProperties(),
|
|
380
385
|
id: "product-import",
|
|
381
386
|
productType: {
|
|
@@ -450,7 +455,7 @@ describe("Order repository", () => {
|
|
|
450
455
|
customLineItems: [],
|
|
451
456
|
};
|
|
452
457
|
|
|
453
|
-
const result = repository.import({ projectKey: "dummy" }, draft);
|
|
458
|
+
const result = await repository.import({ projectKey: "dummy" }, draft);
|
|
454
459
|
expect(result.taxedPrice).toBeDefined();
|
|
455
460
|
expect(result.taxedPrice?.totalNet.centAmount).toBe(1000);
|
|
456
461
|
expect(result.taxedPrice?.totalGross.centAmount).toBe(1210);
|
|
@@ -458,7 +463,7 @@ describe("Order repository", () => {
|
|
|
458
463
|
});
|
|
459
464
|
|
|
460
465
|
test("import exiting product", async () => {
|
|
461
|
-
storage.add("dummy", "product", {
|
|
466
|
+
await storage.add("dummy", "product", {
|
|
462
467
|
id: "15fc56ba-a74e-4cf8-b4b0-bada5c101541",
|
|
463
468
|
masterData: {
|
|
464
469
|
// @ts-expect-error
|
|
@@ -563,7 +568,7 @@ describe("Order repository", () => {
|
|
|
563
568
|
],
|
|
564
569
|
};
|
|
565
570
|
|
|
566
|
-
repository.import({ projectKey: "dummy" }, draft);
|
|
571
|
+
await repository.import({ projectKey: "dummy" }, draft);
|
|
567
572
|
});
|
|
568
573
|
/*
|
|
569
574
|
test('import non exiting product', async () => {
|
|
@@ -697,7 +702,7 @@ describe("Order repository", () => {
|
|
|
697
702
|
*/
|
|
698
703
|
|
|
699
704
|
describe("shippingInfo functionality", () => {
|
|
700
|
-
test("createShippingInfo creates basic shipping info", () => {
|
|
705
|
+
test("createShippingInfo creates basic shipping info", async () => {
|
|
701
706
|
// Create a zone for Netherlands
|
|
702
707
|
const zone = {
|
|
703
708
|
...getBaseResourceProperties(),
|
|
@@ -757,9 +762,9 @@ describe("Order repository", () => {
|
|
|
757
762
|
],
|
|
758
763
|
};
|
|
759
764
|
|
|
760
|
-
storage.add("dummy", "zone", zone);
|
|
761
|
-
storage.add("dummy", "shipping-method", shippingMethod);
|
|
762
|
-
storage.add("dummy", "tax-category", taxCategory);
|
|
765
|
+
await storage.add("dummy", "zone", zone);
|
|
766
|
+
await storage.add("dummy", "shipping-method", shippingMethod);
|
|
767
|
+
await storage.add("dummy", "tax-category", taxCategory);
|
|
763
768
|
|
|
764
769
|
const order: Order = {
|
|
765
770
|
...getBaseResourceProperties(),
|
|
@@ -795,7 +800,7 @@ describe("Order repository", () => {
|
|
|
795
800
|
};
|
|
796
801
|
|
|
797
802
|
const ctx = { projectKey: "dummy" };
|
|
798
|
-
const result = repository.createShippingInfo(ctx, order, {
|
|
803
|
+
const result = await repository.createShippingInfo(ctx, order, {
|
|
799
804
|
typeId: "shipping-method",
|
|
800
805
|
id: "shipping-method-123",
|
|
801
806
|
});
|
|
@@ -810,7 +815,7 @@ describe("Order repository", () => {
|
|
|
810
815
|
expect(result.taxCategory?.id).toBe("tax-category-123");
|
|
811
816
|
});
|
|
812
817
|
|
|
813
|
-
test("import order with shippingInfo", () => {
|
|
818
|
+
test("import order with shippingInfo", async () => {
|
|
814
819
|
// Create required resources
|
|
815
820
|
const zone = {
|
|
816
821
|
...getBaseResourceProperties(),
|
|
@@ -869,9 +874,9 @@ describe("Order repository", () => {
|
|
|
869
874
|
],
|
|
870
875
|
};
|
|
871
876
|
|
|
872
|
-
storage.add("dummy", "zone", zone);
|
|
873
|
-
storage.add("dummy", "shipping-method", shippingMethod);
|
|
874
|
-
storage.add("dummy", "tax-category", taxCategory);
|
|
877
|
+
await storage.add("dummy", "zone", zone);
|
|
878
|
+
await storage.add("dummy", "shipping-method", shippingMethod);
|
|
879
|
+
await storage.add("dummy", "tax-category", taxCategory);
|
|
875
880
|
|
|
876
881
|
const draft: OrderImportDraft = {
|
|
877
882
|
orderNumber: "imported-order-123",
|
|
@@ -938,7 +943,7 @@ describe("Order repository", () => {
|
|
|
938
943
|
};
|
|
939
944
|
|
|
940
945
|
const ctx = { projectKey: "dummy" };
|
|
941
|
-
const result = repository.import(ctx, draft);
|
|
946
|
+
const result = await repository.import(ctx, draft);
|
|
942
947
|
|
|
943
948
|
expect(result.shippingInfo).toBeDefined();
|
|
944
949
|
expect(result.shippingInfo?.shippingMethodName).toBe("Standard Shipping");
|
|
@@ -952,7 +957,7 @@ describe("Order repository", () => {
|
|
|
952
957
|
expect(result.shippingInfo?.deliveries).toEqual([]);
|
|
953
958
|
});
|
|
954
959
|
|
|
955
|
-
test("createShippingInfo throws error for non-existent shipping method", () => {
|
|
960
|
+
test("createShippingInfo throws error for non-existent shipping method", async () => {
|
|
956
961
|
const order: Order = {
|
|
957
962
|
...getBaseResourceProperties(),
|
|
958
963
|
orderNumber: "order-456",
|
|
@@ -989,12 +994,12 @@ describe("Order repository", () => {
|
|
|
989
994
|
|
|
990
995
|
const ctx = { projectKey: "dummy" };
|
|
991
996
|
|
|
992
|
-
expect(
|
|
997
|
+
await expect(
|
|
993
998
|
repository.createShippingInfo(ctx, order, {
|
|
994
999
|
typeId: "shipping-method",
|
|
995
1000
|
id: "non-existent-shipping-method",
|
|
996
|
-
})
|
|
997
|
-
|
|
1001
|
+
}),
|
|
1002
|
+
).rejects.toThrow(
|
|
998
1003
|
/The shipping method with ID 'non-existent-shipping-method' is not allowed/,
|
|
999
1004
|
);
|
|
1000
1005
|
});
|
|
@@ -4,6 +4,7 @@ import type {
|
|
|
4
4
|
CartReference,
|
|
5
5
|
CustomLineItem,
|
|
6
6
|
CustomLineItemImportDraft,
|
|
7
|
+
DuplicateFieldError,
|
|
7
8
|
GeneralError,
|
|
8
9
|
LineItem,
|
|
9
10
|
LineItemImportDraft,
|
|
@@ -13,8 +14,9 @@ import type {
|
|
|
13
14
|
OrderPagedSearchResponse,
|
|
14
15
|
OrderSearchRequest,
|
|
15
16
|
Product,
|
|
16
|
-
ProductPagedQueryResponse,
|
|
17
17
|
ProductVariant,
|
|
18
|
+
ReferencedResourceNotFoundError,
|
|
19
|
+
ResourceNotFoundError,
|
|
18
20
|
ShippingInfo,
|
|
19
21
|
ShippingMethodDoesNotMatchCartError,
|
|
20
22
|
ShippingMethodReference,
|
|
@@ -30,6 +32,7 @@ import {
|
|
|
30
32
|
calculateTaxTotals,
|
|
31
33
|
} from "#src/lib/tax.ts";
|
|
32
34
|
import { OrderSearch } from "#src/orderSearch.ts";
|
|
35
|
+
import { OrderFromCartDraftSchema } from "#src/schemas/generated/order-from-cart.ts";
|
|
33
36
|
import {
|
|
34
37
|
createShippingInfoFromMethod,
|
|
35
38
|
getShippingMethodsMatchingCart,
|
|
@@ -55,11 +58,15 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
55
58
|
super("order", config);
|
|
56
59
|
this.actions = new OrderUpdateHandler(config.storage);
|
|
57
60
|
this._searchService = new OrderSearch(config);
|
|
61
|
+
this.draftSchema = OrderFromCartDraftSchema;
|
|
58
62
|
}
|
|
59
63
|
|
|
60
|
-
create(
|
|
64
|
+
async create(
|
|
65
|
+
context: RepositoryContext,
|
|
66
|
+
draft: OrderFromCartDraft,
|
|
67
|
+
): Promise<Order> {
|
|
61
68
|
assert(draft.cart, "draft.cart is missing");
|
|
62
|
-
return this.createFromCart(
|
|
69
|
+
return await this.createFromCart(
|
|
63
70
|
context,
|
|
64
71
|
{
|
|
65
72
|
id: draft.cart.id!,
|
|
@@ -69,21 +76,27 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
69
76
|
);
|
|
70
77
|
}
|
|
71
78
|
|
|
72
|
-
createFromCart(
|
|
79
|
+
async createFromCart(
|
|
73
80
|
context: RepositoryContext,
|
|
74
81
|
cartReference: CartReference,
|
|
75
82
|
orderNumber?: string,
|
|
76
83
|
) {
|
|
77
|
-
const cart = this._storage.getByResourceIdentifier(
|
|
84
|
+
const cart = (await this._storage.getByResourceIdentifier(
|
|
78
85
|
context.projectKey,
|
|
79
86
|
cartReference,
|
|
80
|
-
) as Cart | null;
|
|
87
|
+
)) as Cart | null;
|
|
81
88
|
if (!cart) {
|
|
82
|
-
throw new
|
|
89
|
+
throw new CommercetoolsError<ResourceNotFoundError>(
|
|
90
|
+
{
|
|
91
|
+
code: "ResourceNotFound",
|
|
92
|
+
message: "Cannot find cart",
|
|
93
|
+
},
|
|
94
|
+
404,
|
|
95
|
+
);
|
|
83
96
|
}
|
|
84
97
|
|
|
85
98
|
const resource: Writable<Order> = {
|
|
86
|
-
...getBaseResourceProperties(),
|
|
99
|
+
...getBaseResourceProperties(context.clientId),
|
|
87
100
|
anonymousId: cart.anonymousId,
|
|
88
101
|
billingAddress: cart.billingAddress,
|
|
89
102
|
cart: cartReference,
|
|
@@ -127,14 +140,28 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
127
140
|
resource.taxedPrice = resource.taxedPrice ?? taxedPrice;
|
|
128
141
|
resource.taxedShippingPrice =
|
|
129
142
|
resource.taxedShippingPrice ?? taxedShippingPrice;
|
|
130
|
-
return this.saveNew(context, resource);
|
|
143
|
+
return await this.saveNew(context, resource);
|
|
131
144
|
}
|
|
132
145
|
|
|
133
|
-
import(
|
|
146
|
+
async import(
|
|
147
|
+
context: RepositoryContext,
|
|
148
|
+
draft: OrderImportDraft,
|
|
149
|
+
): Promise<Order> {
|
|
134
150
|
// TODO: Check if order with given orderNumber already exists
|
|
135
151
|
assert(this, "OrderRepository not valid");
|
|
152
|
+
const lineItems = await Promise.all(
|
|
153
|
+
draft.lineItems?.map((item) =>
|
|
154
|
+
this.lineItemFromImportDraft(context, item),
|
|
155
|
+
) || [],
|
|
156
|
+
);
|
|
157
|
+
const customLineItems = await Promise.all(
|
|
158
|
+
draft.customLineItems?.map((item) =>
|
|
159
|
+
this.customLineItemFromImportDraft(context, item),
|
|
160
|
+
) || [],
|
|
161
|
+
);
|
|
162
|
+
|
|
136
163
|
const resource: Writable<Order> = {
|
|
137
|
-
...getBaseResourceProperties(),
|
|
164
|
+
...getBaseResourceProperties(context.clientId),
|
|
138
165
|
|
|
139
166
|
billingAddress: createAddress(
|
|
140
167
|
draft.billingAddress,
|
|
@@ -147,7 +174,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
147
174
|
this._storage,
|
|
148
175
|
),
|
|
149
176
|
|
|
150
|
-
custom: createCustomFields(
|
|
177
|
+
custom: await createCustomFields(
|
|
151
178
|
draft.custom,
|
|
152
179
|
context.projectKey,
|
|
153
180
|
this._storage,
|
|
@@ -166,21 +193,15 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
166
193
|
shippingMode: "Single",
|
|
167
194
|
shipping: [],
|
|
168
195
|
shippingInfo: undefined,
|
|
169
|
-
store: resolveStoreReference(
|
|
196
|
+
store: await resolveStoreReference(
|
|
170
197
|
draft.store,
|
|
171
198
|
context.projectKey,
|
|
172
199
|
this._storage,
|
|
173
200
|
),
|
|
174
201
|
syncInfo: [],
|
|
175
202
|
|
|
176
|
-
lineItems
|
|
177
|
-
|
|
178
|
-
this.lineItemFromImportDraft.bind(this)(context, item),
|
|
179
|
-
) || [],
|
|
180
|
-
customLineItems:
|
|
181
|
-
draft.customLineItems?.map((item) =>
|
|
182
|
-
this.customLineItemFromImportDraft.bind(this)(context, item),
|
|
183
|
-
) || [],
|
|
203
|
+
lineItems,
|
|
204
|
+
customLineItems,
|
|
184
205
|
|
|
185
206
|
totalPrice: createCentPrecisionMoney(draft.totalPrice),
|
|
186
207
|
};
|
|
@@ -192,7 +213,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
192
213
|
// get id when reference is by key only
|
|
193
214
|
if (shippingMethodRef.key && !shippingMethodRef.id) {
|
|
194
215
|
const shippingMethod =
|
|
195
|
-
this._storage.getByResourceIdentifier<"shipping-method">(
|
|
216
|
+
await this._storage.getByResourceIdentifier<"shipping-method">(
|
|
196
217
|
context.projectKey,
|
|
197
218
|
shippingMethodRef,
|
|
198
219
|
);
|
|
@@ -205,7 +226,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
205
226
|
shippingMethodRef.id = shippingMethod.id;
|
|
206
227
|
}
|
|
207
228
|
|
|
208
|
-
resource.shippingInfo = this.createShippingInfo(context, resource, {
|
|
229
|
+
resource.shippingInfo = await this.createShippingInfo(context, resource, {
|
|
209
230
|
typeId: "shipping-method",
|
|
210
231
|
id: shippingMethodRef.id as string,
|
|
211
232
|
});
|
|
@@ -221,13 +242,13 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
221
242
|
resource.taxedShippingPrice =
|
|
222
243
|
resource.taxedShippingPrice ?? taxedShippingPrice;
|
|
223
244
|
|
|
224
|
-
return this.saveNew(context, resource);
|
|
245
|
+
return await this.saveNew(context, resource);
|
|
225
246
|
}
|
|
226
247
|
|
|
227
|
-
private lineItemFromImportDraft(
|
|
248
|
+
private async lineItemFromImportDraft(
|
|
228
249
|
context: RepositoryContext,
|
|
229
250
|
draft: LineItemImportDraft,
|
|
230
|
-
): LineItem {
|
|
251
|
+
): Promise<LineItem> {
|
|
231
252
|
let product: Product;
|
|
232
253
|
let variant: ProductVariant | undefined;
|
|
233
254
|
|
|
@@ -237,11 +258,11 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
237
258
|
sku: draft.variant.sku,
|
|
238
259
|
};
|
|
239
260
|
|
|
240
|
-
const items = this._storage.query(context.projectKey, "product", {
|
|
261
|
+
const items = await this._storage.query(context.projectKey, "product", {
|
|
241
262
|
where: [
|
|
242
263
|
`masterData(current(masterVariant(sku="${draft.variant.sku}"))) or masterData(current(variants(sku="${draft.variant.sku}")))`,
|
|
243
264
|
],
|
|
244
|
-
})
|
|
265
|
+
});
|
|
245
266
|
|
|
246
267
|
if (items.count !== 1) {
|
|
247
268
|
throw new CommercetoolsError<GeneralError>({
|
|
@@ -262,7 +283,11 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
262
283
|
throw new Error("Internal state error");
|
|
263
284
|
}
|
|
264
285
|
} else {
|
|
265
|
-
throw new
|
|
286
|
+
throw new CommercetoolsError<ReferencedResourceNotFoundError>({
|
|
287
|
+
code: "ReferencedResourceNotFound",
|
|
288
|
+
message: "No product found",
|
|
289
|
+
typeId: "product",
|
|
290
|
+
});
|
|
266
291
|
}
|
|
267
292
|
|
|
268
293
|
const quantity = draft.quantity ?? 1;
|
|
@@ -272,8 +297,8 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
272
297
|
});
|
|
273
298
|
|
|
274
299
|
return {
|
|
275
|
-
...getBaseResourceProperties(),
|
|
276
|
-
custom: createCustomFields(
|
|
300
|
+
...getBaseResourceProperties(context.clientId),
|
|
301
|
+
custom: await createCustomFields(
|
|
277
302
|
draft.custom,
|
|
278
303
|
context.projectKey,
|
|
279
304
|
this._storage,
|
|
@@ -305,10 +330,10 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
305
330
|
} satisfies LineItem;
|
|
306
331
|
}
|
|
307
332
|
|
|
308
|
-
private customLineItemFromImportDraft(
|
|
333
|
+
private async customLineItemFromImportDraft(
|
|
309
334
|
context: RepositoryContext,
|
|
310
335
|
draft: CustomLineItemImportDraft,
|
|
311
|
-
): CustomLineItem {
|
|
336
|
+
): Promise<CustomLineItem> {
|
|
312
337
|
const quantity = draft.quantity ?? 1;
|
|
313
338
|
const totalPrice = createCentPrecisionMoney({
|
|
314
339
|
currencyCode: draft.money.currencyCode,
|
|
@@ -316,8 +341,8 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
316
341
|
});
|
|
317
342
|
|
|
318
343
|
return {
|
|
319
|
-
...getBaseResourceProperties(),
|
|
320
|
-
custom: createCustomFields(
|
|
344
|
+
...getBaseResourceProperties(context.clientId),
|
|
345
|
+
custom: await createCustomFields(
|
|
321
346
|
draft.custom,
|
|
322
347
|
context.projectKey,
|
|
323
348
|
this._storage,
|
|
@@ -340,32 +365,41 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
340
365
|
} satisfies CustomLineItem;
|
|
341
366
|
}
|
|
342
367
|
|
|
343
|
-
getWithOrderNumber(
|
|
368
|
+
async getWithOrderNumber(
|
|
344
369
|
context: RepositoryContext,
|
|
345
370
|
orderNumber: string,
|
|
346
371
|
params: QueryParams = {},
|
|
347
|
-
): Order | undefined {
|
|
348
|
-
const result = this._storage.query(
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
372
|
+
): Promise<Order | undefined> {
|
|
373
|
+
const result = await this._storage.query(
|
|
374
|
+
context.projectKey,
|
|
375
|
+
this.getTypeId(),
|
|
376
|
+
{
|
|
377
|
+
...params,
|
|
378
|
+
where: [`orderNumber="${orderNumber}"`],
|
|
379
|
+
},
|
|
380
|
+
);
|
|
352
381
|
if (result.count === 1) {
|
|
353
382
|
return result.results[0] as Order;
|
|
354
383
|
}
|
|
355
384
|
|
|
356
385
|
// Catch this for now, should be checked when creating/updating
|
|
357
386
|
if (result.count > 1) {
|
|
358
|
-
throw new
|
|
387
|
+
throw new CommercetoolsError<DuplicateFieldError>({
|
|
388
|
+
code: "DuplicateField",
|
|
389
|
+
message: "Duplicate order numbers",
|
|
390
|
+
field: "orderNumber",
|
|
391
|
+
duplicateValue: orderNumber,
|
|
392
|
+
});
|
|
359
393
|
}
|
|
360
394
|
|
|
361
395
|
return;
|
|
362
396
|
}
|
|
363
397
|
|
|
364
|
-
createShippingInfo(
|
|
398
|
+
async createShippingInfo(
|
|
365
399
|
context: RepositoryContext,
|
|
366
400
|
resource: Writable<Order>,
|
|
367
401
|
shippingMethodRef: ShippingMethodReference,
|
|
368
|
-
): ShippingInfo {
|
|
402
|
+
): Promise<ShippingInfo> {
|
|
369
403
|
const cartLikeForMatching: Writable<Cart> = {
|
|
370
404
|
...resource,
|
|
371
405
|
cartState: "Active" as const,
|
|
@@ -380,7 +414,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
380
414
|
shippingInfo: undefined,
|
|
381
415
|
};
|
|
382
416
|
|
|
383
|
-
const shippingMethods = getShippingMethodsMatchingCart(
|
|
417
|
+
const shippingMethods = await getShippingMethodsMatchingCart(
|
|
384
418
|
context,
|
|
385
419
|
this._storage,
|
|
386
420
|
cartLikeForMatching,
|
|
@@ -400,7 +434,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
400
434
|
});
|
|
401
435
|
}
|
|
402
436
|
|
|
403
|
-
const baseShippingInfo = createShippingInfoFromMethod(
|
|
437
|
+
const baseShippingInfo = await createShippingInfoFromMethod(
|
|
404
438
|
context,
|
|
405
439
|
this._storage,
|
|
406
440
|
resource,
|
|
@@ -413,10 +447,10 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
|
|
|
413
447
|
};
|
|
414
448
|
}
|
|
415
449
|
|
|
416
|
-
search(
|
|
450
|
+
async search(
|
|
417
451
|
context: RepositoryContext,
|
|
418
452
|
searchRequest: OrderSearchRequest,
|
|
419
|
-
): OrderPagedSearchResponse {
|
|
420
|
-
return this._searchService.search(context.projectKey, searchRequest);
|
|
453
|
+
): Promise<OrderPagedSearchResponse> {
|
|
454
|
+
return await this._searchService.search(context.projectKey, searchRequest);
|
|
421
455
|
}
|
|
422
456
|
}
|
|
@@ -4,6 +4,7 @@ import type {
|
|
|
4
4
|
OrderEditResult,
|
|
5
5
|
} from "@commercetools/platform-sdk";
|
|
6
6
|
import type { Config } from "#src/config.ts";
|
|
7
|
+
import { OrderEditDraftSchema } from "#src/schemas/generated/order-edit.ts";
|
|
7
8
|
import { getBaseResourceProperties } from "../helpers.ts";
|
|
8
9
|
import type { RepositoryContext } from "./abstract.ts";
|
|
9
10
|
import { AbstractResourceRepository } from "./abstract.ts";
|
|
@@ -11,17 +12,21 @@ import { AbstractResourceRepository } from "./abstract.ts";
|
|
|
11
12
|
export class OrderEditRepository extends AbstractResourceRepository<"order-edit"> {
|
|
12
13
|
constructor(config: Config) {
|
|
13
14
|
super("order-edit", config);
|
|
15
|
+
this.draftSchema = OrderEditDraftSchema;
|
|
14
16
|
}
|
|
15
17
|
|
|
16
|
-
create(
|
|
18
|
+
async create(
|
|
19
|
+
context: RepositoryContext,
|
|
20
|
+
draft: OrderEditDraft,
|
|
21
|
+
): Promise<OrderEdit> {
|
|
17
22
|
const resource: OrderEdit = {
|
|
18
|
-
...getBaseResourceProperties(),
|
|
23
|
+
...getBaseResourceProperties(context.clientId),
|
|
19
24
|
stagedActions: draft.stagedActions ?? [],
|
|
20
25
|
resource: draft.resource,
|
|
21
26
|
result: {
|
|
22
27
|
type: "NotProcessed",
|
|
23
28
|
} as OrderEditResult,
|
|
24
29
|
};
|
|
25
|
-
return this.saveNew(context, resource);
|
|
30
|
+
return await this.saveNew(context, resource);
|
|
26
31
|
}
|
|
27
32
|
}
|