@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
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
85
|
-
|
|
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 {
|
|
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(
|
|
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
|
-
?
|
|
38
|
-
|
|
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
|
-
|
|
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
|
);
|