@labdigital/commercetools-mock 2.17.0 → 2.18.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/dist/index.cjs +4219 -3989
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +268 -415
- package/dist/index.d.ts +268 -415
- package/dist/index.js +4219 -3989
- package/dist/index.js.map +1 -1
- package/package.json +44 -46
- package/src/constants.ts +2 -2
- package/src/ctMock.test.ts +11 -11
- package/src/ctMock.ts +141 -127
- package/src/deprecation.ts +8 -0
- package/src/exceptions.ts +17 -15
- package/src/helpers.ts +32 -32
- package/src/index.test.ts +128 -128
- package/src/index.ts +3 -3
- package/src/lib/expandParser.ts +13 -13
- package/src/lib/haversine.test.ts +9 -9
- package/src/lib/haversine.ts +11 -11
- package/src/lib/masking.ts +11 -11
- package/src/lib/parser.ts +2 -2
- package/src/lib/password.ts +23 -3
- package/src/lib/predicateParser.test.ts +185 -183
- package/src/lib/predicateParser.ts +234 -234
- package/src/lib/projectionSearchFilter.test.ts +103 -101
- package/src/lib/projectionSearchFilter.ts +152 -150
- package/src/lib/proxy.ts +5 -5
- package/src/oauth/errors.ts +4 -4
- package/src/oauth/helpers.ts +6 -6
- package/src/oauth/server.test.ts +110 -67
- package/src/oauth/server.ts +161 -141
- package/src/oauth/store.ts +49 -44
- package/src/priceSelector.test.ts +35 -35
- package/src/priceSelector.ts +30 -30
- package/src/product-projection-search.ts +136 -134
- package/src/projectAPI.test.ts +7 -7
- package/src/projectAPI.ts +24 -22
- package/src/repositories/abstract.ts +168 -116
- package/src/repositories/associate-role.ts +90 -77
- package/src/repositories/attribute-group.ts +51 -40
- package/src/repositories/business-unit.ts +168 -148
- package/src/repositories/cart/actions.ts +489 -0
- package/src/repositories/cart/helpers.ts +30 -0
- package/src/repositories/cart/index.ts +180 -0
- package/src/repositories/cart-discount/actions.ts +148 -0
- package/src/repositories/cart-discount/index.ts +86 -0
- package/src/repositories/category/actions.ts +231 -0
- package/src/repositories/category/index.ts +52 -0
- package/src/repositories/channel.ts +88 -90
- package/src/repositories/custom-object.ts +46 -45
- package/src/repositories/customer/actions.ts +165 -0
- package/src/repositories/customer/index.ts +79 -0
- package/src/repositories/customer-group.ts +66 -55
- package/src/repositories/discount-code/actions.ts +149 -0
- package/src/repositories/discount-code/index.ts +50 -0
- package/src/repositories/errors.ts +10 -10
- package/src/repositories/extension.ts +64 -62
- package/src/repositories/helpers.ts +117 -118
- package/src/repositories/index.ts +80 -79
- package/src/repositories/inventory-entry/actions.ts +84 -0
- package/src/repositories/inventory-entry/index.ts +44 -0
- package/src/repositories/my-customer.ts +114 -0
- package/src/repositories/my-order.ts +8 -8
- package/src/repositories/order/actions.ts +281 -0
- package/src/repositories/{order.test.ts → order/index.test.ts} +77 -77
- package/src/repositories/order/index.ts +260 -0
- package/src/repositories/order-edit.ts +10 -23
- package/src/repositories/payment/actions.ts +305 -0
- package/src/repositories/payment/helpers.ts +17 -0
- package/src/repositories/payment/index.ts +56 -0
- package/src/repositories/product/actions.ts +943 -0
- package/src/repositories/product/helpers.ts +98 -0
- package/src/repositories/product/index.ts +130 -0
- package/src/repositories/product-discount.ts +127 -117
- package/src/repositories/product-projection.ts +56 -62
- package/src/repositories/product-selection.ts +31 -28
- package/src/repositories/product-type.ts +136 -134
- package/src/repositories/project.ts +133 -118
- package/src/repositories/quote-request.ts +7 -19
- package/src/repositories/quote.ts +7 -22
- package/src/repositories/review.ts +13 -26
- package/src/repositories/shipping-method/actions.ts +198 -0
- package/src/repositories/shipping-method/helpers.ts +10 -0
- package/src/repositories/shipping-method/index.ts +138 -0
- package/src/repositories/shopping-list/actions.ts +295 -0
- package/src/repositories/shopping-list/index.ts +122 -0
- package/src/repositories/staged-quote.ts +7 -20
- package/src/repositories/standalone-price.ts +57 -44
- package/src/repositories/state.ts +113 -68
- package/src/repositories/store.ts +106 -94
- package/src/repositories/subscription.ts +46 -22
- package/src/repositories/tax-category/actions.ts +94 -0
- package/src/repositories/tax-category/helpers.ts +8 -0
- package/src/repositories/tax-category/index.ts +25 -0
- package/src/repositories/type/actions.ts +162 -0
- package/src/repositories/type/index.ts +24 -0
- package/src/repositories/zone.ts +62 -58
- package/src/server.ts +9 -9
- package/src/services/abstract.ts +75 -72
- package/src/services/associate-roles.test.ts +27 -27
- package/src/services/associate-roles.ts +7 -7
- package/src/services/attribute-group.ts +7 -7
- package/src/services/business-units.test.ts +28 -28
- package/src/services/business-units.ts +7 -7
- package/src/services/cart-discount.test.ts +199 -199
- package/src/services/cart-discount.ts +7 -7
- package/src/services/cart.test.ts +261 -261
- package/src/services/cart.ts +22 -21
- package/src/services/category.test.ts +121 -121
- package/src/services/category.ts +7 -7
- package/src/services/channel.ts +7 -7
- package/src/services/custom-object.test.ts +130 -130
- package/src/services/custom-object.ts +34 -31
- package/src/services/customer-group.ts +7 -7
- package/src/services/customer.test.ts +205 -205
- package/src/services/customer.ts +31 -29
- package/src/services/discount-code.ts +7 -7
- package/src/services/extension.ts +7 -7
- package/src/services/index.ts +85 -81
- package/src/services/inventory-entry.test.ts +106 -106
- package/src/services/inventory-entry.ts +7 -7
- package/src/services/my-cart.test.ts +56 -56
- package/src/services/my-cart.ts +20 -20
- package/src/services/my-customer.test.ts +155 -104
- package/src/services/my-customer.ts +61 -75
- package/src/services/my-order.ts +16 -16
- package/src/services/my-payment.test.ts +40 -40
- package/src/services/my-payment.ts +7 -7
- package/src/services/my-shopping-list.ts +7 -7
- package/src/services/order.test.ts +243 -243
- package/src/services/order.ts +23 -18
- package/src/services/payment.test.ts +40 -40
- package/src/services/payment.ts +7 -7
- package/src/services/product-discount.ts +7 -7
- package/src/services/product-projection.test.ts +190 -190
- package/src/services/product-projection.ts +34 -32
- package/src/services/product-selection.test.ts +19 -19
- package/src/services/product-selection.ts +7 -7
- package/src/services/product-type.test.ts +38 -38
- package/src/services/product-type.ts +7 -7
- package/src/services/product.test.ts +658 -656
- package/src/services/product.ts +7 -7
- package/src/services/project.test.ts +24 -24
- package/src/services/project.ts +17 -17
- package/src/services/reviews.ts +7 -7
- package/src/services/shipping-method.test.ts +78 -78
- package/src/services/shipping-method.ts +16 -16
- package/src/services/shopping-list.test.ts +170 -170
- package/src/services/shopping-list.ts +7 -7
- package/src/services/standalone-price.test.ts +112 -112
- package/src/services/standalone-price.ts +7 -7
- package/src/services/state.test.ts +30 -30
- package/src/services/state.ts +7 -7
- package/src/services/store.test.ts +40 -40
- package/src/services/store.ts +7 -7
- package/src/services/subscription.ts +7 -7
- package/src/services/tax-category.test.ts +43 -43
- package/src/services/tax-category.ts +7 -7
- package/src/services/type.ts +7 -7
- package/src/services/zone.ts +7 -7
- package/src/shippingCalculator.test.ts +43 -43
- package/src/shippingCalculator.ts +23 -23
- package/src/storage/abstract.ts +36 -34
- package/src/storage/in-memory.ts +237 -233
- package/src/storage/index.ts +2 -2
- package/src/types.ts +91 -91
- package/src/repositories/cart-discount.ts +0 -219
- package/src/repositories/cart.ts +0 -659
- package/src/repositories/category.ts +0 -256
- package/src/repositories/customer.ts +0 -228
- package/src/repositories/discount-code.ts +0 -181
- package/src/repositories/inventory-entry.ts +0 -109
- package/src/repositories/order.ts +0 -514
- package/src/repositories/payment.ts +0 -342
- package/src/repositories/product.ts +0 -1106
- package/src/repositories/shipping-method.ts +0 -312
- package/src/repositories/shopping-list.ts +0 -392
- package/src/repositories/tax-category.ts +0 -111
- package/src/repositories/type.ts +0 -172
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
FieldDefinition,
|
|
3
|
+
InvalidOperationError,
|
|
4
|
+
Type,
|
|
5
|
+
TypeAddEnumValueAction,
|
|
6
|
+
TypeAddFieldDefinitionAction,
|
|
7
|
+
TypeChangeEnumValueLabelAction,
|
|
8
|
+
TypeChangeFieldDefinitionOrderAction,
|
|
9
|
+
TypeChangeNameAction,
|
|
10
|
+
TypeRemoveFieldDefinitionAction,
|
|
11
|
+
TypeSetDescriptionAction,
|
|
12
|
+
TypeUpdateAction,
|
|
13
|
+
} from "@commercetools/platform-sdk";
|
|
14
|
+
import isEqual from "lodash.isequal";
|
|
15
|
+
import { CommercetoolsError } from "~src/exceptions";
|
|
16
|
+
import type { Writable } from "~src/types";
|
|
17
|
+
import { AbstractUpdateHandler, RepositoryContext } from "../abstract";
|
|
18
|
+
|
|
19
|
+
type TypeUpdateHandlerMethod<T> = (
|
|
20
|
+
context: RepositoryContext,
|
|
21
|
+
resource: Writable<Type>,
|
|
22
|
+
action: T,
|
|
23
|
+
) => void;
|
|
24
|
+
|
|
25
|
+
type TypeUpdateActions = Partial<{
|
|
26
|
+
[P in TypeUpdateAction as P["action"]]: TypeUpdateHandlerMethod<P>;
|
|
27
|
+
}>;
|
|
28
|
+
|
|
29
|
+
export class TypeUpdateHandler
|
|
30
|
+
extends AbstractUpdateHandler
|
|
31
|
+
implements TypeUpdateActions
|
|
32
|
+
{
|
|
33
|
+
addEnumValue(
|
|
34
|
+
context: RepositoryContext,
|
|
35
|
+
resource: Writable<Type>,
|
|
36
|
+
{ fieldName, value }: TypeAddEnumValueAction,
|
|
37
|
+
) {
|
|
38
|
+
resource.fieldDefinitions.forEach((field) => {
|
|
39
|
+
if (field.name === fieldName) {
|
|
40
|
+
// TODO, should be done better i suppose
|
|
41
|
+
if (field.type.name === "Enum") {
|
|
42
|
+
field.type.values.push(value);
|
|
43
|
+
} else if (
|
|
44
|
+
field.type.name === "Set" &&
|
|
45
|
+
field.type.elementType.name === "Enum"
|
|
46
|
+
) {
|
|
47
|
+
field.type.elementType.values.push(value);
|
|
48
|
+
} else {
|
|
49
|
+
throw new Error("Type is not a Enum (or Set of Enum)");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
addFieldDefinition(
|
|
56
|
+
context: RepositoryContext,
|
|
57
|
+
resource: Writable<Type>,
|
|
58
|
+
{ fieldDefinition }: TypeAddFieldDefinitionAction,
|
|
59
|
+
) {
|
|
60
|
+
resource.fieldDefinitions.push(fieldDefinition);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
changeEnumValueLabel(
|
|
64
|
+
context: RepositoryContext,
|
|
65
|
+
resource: Writable<Type>,
|
|
66
|
+
{ fieldName, value }: TypeChangeEnumValueLabelAction,
|
|
67
|
+
) {
|
|
68
|
+
resource.fieldDefinitions.forEach((field) => {
|
|
69
|
+
if (field.name === fieldName) {
|
|
70
|
+
// TODO, should be done better i suppose
|
|
71
|
+
if (field.type.name === "Enum") {
|
|
72
|
+
field.type.values.forEach((v) => {
|
|
73
|
+
if (v.key === value.key) {
|
|
74
|
+
v.label = value.label;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
} else if (
|
|
78
|
+
field.type.name === "Set" &&
|
|
79
|
+
field.type.elementType.name === "Enum"
|
|
80
|
+
) {
|
|
81
|
+
field.type.elementType.values.forEach((v) => {
|
|
82
|
+
if (v.key === value.key) {
|
|
83
|
+
v.label = value.label;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
} else {
|
|
87
|
+
throw new Error("Type is not a Enum (or Set of Enum)");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
changeFieldDefinitionOrder(
|
|
94
|
+
context: RepositoryContext,
|
|
95
|
+
resource: Writable<Type>,
|
|
96
|
+
{ fieldNames }: TypeChangeFieldDefinitionOrderAction,
|
|
97
|
+
) {
|
|
98
|
+
const fields = new Map(
|
|
99
|
+
resource.fieldDefinitions.map((item) => [item.name, item]),
|
|
100
|
+
);
|
|
101
|
+
const result: FieldDefinition[] = [];
|
|
102
|
+
let current = resource.fieldDefinitions;
|
|
103
|
+
|
|
104
|
+
fieldNames.forEach((fieldName) => {
|
|
105
|
+
const field = fields.get(fieldName);
|
|
106
|
+
if (field === undefined) {
|
|
107
|
+
throw new Error("New field");
|
|
108
|
+
}
|
|
109
|
+
result.push(field);
|
|
110
|
+
|
|
111
|
+
// Remove from current items
|
|
112
|
+
current = current.filter((f) => f.name !== fieldName);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
if (
|
|
116
|
+
isEqual(
|
|
117
|
+
fieldNames,
|
|
118
|
+
resource.fieldDefinitions.map((item) => item.name),
|
|
119
|
+
)
|
|
120
|
+
) {
|
|
121
|
+
throw new CommercetoolsError<InvalidOperationError>({
|
|
122
|
+
code: "InvalidOperation",
|
|
123
|
+
message: "'fieldDefinitions' has no changes.",
|
|
124
|
+
action: {
|
|
125
|
+
action: "changeFieldDefinitionOrder",
|
|
126
|
+
fieldNames: fieldNames,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
resource.fieldDefinitions = result;
|
|
132
|
+
// Add fields which were not specified in the order as last items. Not
|
|
133
|
+
// sure if this follows commercetools
|
|
134
|
+
resource.fieldDefinitions.push(...current);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
changeName(
|
|
138
|
+
context: RepositoryContext,
|
|
139
|
+
resource: Writable<Type>,
|
|
140
|
+
{ name }: TypeChangeNameAction,
|
|
141
|
+
) {
|
|
142
|
+
resource.name = name;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
removeFieldDefinition(
|
|
146
|
+
context: RepositoryContext,
|
|
147
|
+
resource: Writable<Type>,
|
|
148
|
+
{ fieldName }: TypeRemoveFieldDefinitionAction,
|
|
149
|
+
) {
|
|
150
|
+
resource.fieldDefinitions = resource.fieldDefinitions.filter(
|
|
151
|
+
(f) => f.name !== fieldName,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
setDescription(
|
|
156
|
+
context: RepositoryContext,
|
|
157
|
+
resource: Writable<Type>,
|
|
158
|
+
{ description }: TypeSetDescriptionAction,
|
|
159
|
+
) {
|
|
160
|
+
resource.description = description;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Type, TypeDraft } from "@commercetools/platform-sdk";
|
|
2
|
+
import { getBaseResourceProperties } from "~src/helpers";
|
|
3
|
+
import { AbstractStorage } from "~src/storage/abstract";
|
|
4
|
+
import { AbstractResourceRepository, RepositoryContext } from "../abstract";
|
|
5
|
+
import { TypeUpdateHandler } from "./actions";
|
|
6
|
+
|
|
7
|
+
export class TypeRepository extends AbstractResourceRepository<"type"> {
|
|
8
|
+
constructor(storage: AbstractStorage) {
|
|
9
|
+
super("type", storage);
|
|
10
|
+
this.actions = new TypeUpdateHandler(storage);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
create(context: RepositoryContext, draft: TypeDraft): Type {
|
|
14
|
+
const resource: Type = {
|
|
15
|
+
...getBaseResourceProperties(),
|
|
16
|
+
key: draft.key,
|
|
17
|
+
name: draft.name,
|
|
18
|
+
resourceTypeIds: draft.resourceTypeIds,
|
|
19
|
+
fieldDefinitions: draft.fieldDefinitions || [],
|
|
20
|
+
description: draft.description,
|
|
21
|
+
};
|
|
22
|
+
return this.saveNew(context, resource);
|
|
23
|
+
}
|
|
24
|
+
}
|
package/src/repositories/zone.ts
CHANGED
|
@@ -7,14 +7,21 @@ import type {
|
|
|
7
7
|
ZoneSetDescriptionAction,
|
|
8
8
|
ZoneSetKeyAction,
|
|
9
9
|
ZoneUpdateAction,
|
|
10
|
-
} from
|
|
11
|
-
import { getBaseResourceProperties } from
|
|
12
|
-
import
|
|
13
|
-
import {
|
|
10
|
+
} from "@commercetools/platform-sdk";
|
|
11
|
+
import { getBaseResourceProperties } from "../helpers";
|
|
12
|
+
import { AbstractStorage } from "../storage/abstract";
|
|
13
|
+
import type { Writable } from "../types";
|
|
14
|
+
import {
|
|
15
|
+
AbstractResourceRepository,
|
|
16
|
+
AbstractUpdateHandler,
|
|
17
|
+
RepositoryContext,
|
|
18
|
+
UpdateHandlerInterface,
|
|
19
|
+
} from "./abstract";
|
|
14
20
|
|
|
15
|
-
export class ZoneRepository extends AbstractResourceRepository<
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
export class ZoneRepository extends AbstractResourceRepository<"zone"> {
|
|
22
|
+
constructor(storage: AbstractStorage) {
|
|
23
|
+
super("zone", storage);
|
|
24
|
+
this.actions = new ZoneUpdateHandler(storage);
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
create(context: RepositoryContext, draft: ZoneDraft): Zone {
|
|
@@ -24,58 +31,55 @@ export class ZoneRepository extends AbstractResourceRepository<'zone'> {
|
|
|
24
31
|
locations: draft.locations || [],
|
|
25
32
|
name: draft.name,
|
|
26
33
|
description: draft.description,
|
|
27
|
-
}
|
|
28
|
-
this.saveNew(context, resource)
|
|
29
|
-
|
|
34
|
+
};
|
|
35
|
+
return this.saveNew(context, resource);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
class ZoneUpdateHandler
|
|
40
|
+
extends AbstractUpdateHandler
|
|
41
|
+
implements Partial<UpdateHandlerInterface<Zone, ZoneUpdateAction>>
|
|
42
|
+
{
|
|
43
|
+
addLocation(
|
|
44
|
+
context: RepositoryContext,
|
|
45
|
+
resource: Writable<Zone>,
|
|
46
|
+
{ location }: ZoneAddLocationAction,
|
|
47
|
+
) {
|
|
48
|
+
resource.locations.push(location);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
changeName(
|
|
52
|
+
context: RepositoryContext,
|
|
53
|
+
resource: Writable<Zone>,
|
|
54
|
+
{ name }: ZoneChangeNameAction,
|
|
55
|
+
) {
|
|
56
|
+
resource.name = name;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
removeLocation(
|
|
60
|
+
context: RepositoryContext,
|
|
61
|
+
resource: Writable<Zone>,
|
|
62
|
+
{ location }: ZoneRemoveLocationAction,
|
|
63
|
+
) {
|
|
64
|
+
resource.locations = resource.locations.filter(
|
|
65
|
+
(loc) =>
|
|
66
|
+
!(loc.country === location.country && loc.state === location.state),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
setDescription(
|
|
71
|
+
context: RepositoryContext,
|
|
72
|
+
resource: Writable<Zone>,
|
|
73
|
+
{ description }: ZoneSetDescriptionAction,
|
|
74
|
+
) {
|
|
75
|
+
resource.description = description;
|
|
30
76
|
}
|
|
31
77
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
action: any
|
|
39
|
-
) => void
|
|
40
|
-
>
|
|
41
|
-
> = {
|
|
42
|
-
addLocation: (
|
|
43
|
-
context: RepositoryContext,
|
|
44
|
-
resource: Writable<Zone>,
|
|
45
|
-
{ location }: ZoneAddLocationAction
|
|
46
|
-
) => {
|
|
47
|
-
resource.locations.push(location)
|
|
48
|
-
},
|
|
49
|
-
removeLocation: (
|
|
50
|
-
context: RepositoryContext,
|
|
51
|
-
resource: Writable<Zone>,
|
|
52
|
-
{ location }: ZoneRemoveLocationAction
|
|
53
|
-
) => {
|
|
54
|
-
resource.locations = resource.locations.filter(
|
|
55
|
-
(loc) =>
|
|
56
|
-
!(loc.country === location.country && loc.state === location.state)
|
|
57
|
-
)
|
|
58
|
-
},
|
|
59
|
-
changeName: (
|
|
60
|
-
context: RepositoryContext,
|
|
61
|
-
resource: Writable<Zone>,
|
|
62
|
-
{ name }: ZoneChangeNameAction
|
|
63
|
-
) => {
|
|
64
|
-
resource.name = name
|
|
65
|
-
},
|
|
66
|
-
setDescription: (
|
|
67
|
-
context: RepositoryContext,
|
|
68
|
-
resource: Writable<Zone>,
|
|
69
|
-
{ description }: ZoneSetDescriptionAction
|
|
70
|
-
) => {
|
|
71
|
-
resource.description = description
|
|
72
|
-
},
|
|
73
|
-
setKey: (
|
|
74
|
-
context: RepositoryContext,
|
|
75
|
-
resource: Writable<Zone>,
|
|
76
|
-
{ key }: ZoneSetKeyAction
|
|
77
|
-
) => {
|
|
78
|
-
resource.key = key
|
|
79
|
-
},
|
|
78
|
+
setKey(
|
|
79
|
+
context: RepositoryContext,
|
|
80
|
+
resource: Writable<Zone>,
|
|
81
|
+
{ key }: ZoneSetKeyAction,
|
|
82
|
+
) {
|
|
83
|
+
resource.key = key;
|
|
80
84
|
}
|
|
81
85
|
}
|
package/src/server.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { CommercetoolsMock } from
|
|
1
|
+
import { CommercetoolsMock } from "./index";
|
|
2
2
|
|
|
3
|
-
process.on(
|
|
4
|
-
console.info(
|
|
5
|
-
process.exit()
|
|
6
|
-
})
|
|
3
|
+
process.on("SIGINT", function () {
|
|
4
|
+
console.info("Stopping server...");
|
|
5
|
+
process.exit();
|
|
6
|
+
});
|
|
7
7
|
|
|
8
|
-
const instance = new CommercetoolsMock()
|
|
8
|
+
const instance = new CommercetoolsMock();
|
|
9
9
|
|
|
10
|
-
let port = 3000
|
|
10
|
+
let port = 3000;
|
|
11
11
|
|
|
12
|
-
if (process.env.HTTP_SERVER_PORT) port = parseInt(process.env.HTTP_SERVER_PORT)
|
|
12
|
+
if (process.env.HTTP_SERVER_PORT) port = parseInt(process.env.HTTP_SERVER_PORT);
|
|
13
13
|
|
|
14
|
-
instance.runServer(port)
|
|
14
|
+
instance.runServer(port);
|
package/src/services/abstract.ts
CHANGED
|
@@ -1,95 +1,98 @@
|
|
|
1
|
-
import type { Update } from
|
|
2
|
-
import { type Request, type Response
|
|
3
|
-
import { ParsedQs } from
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import type { Update } from "@commercetools/platform-sdk";
|
|
2
|
+
import { Router, type Request, type Response } from "express";
|
|
3
|
+
import { ParsedQs } from "qs";
|
|
4
|
+
import { queryParamsArray } from "../helpers";
|
|
5
|
+
import { AbstractResourceRepository } from "../repositories/abstract";
|
|
6
|
+
import { getRepositoryContext } from "../repositories/helpers";
|
|
7
7
|
|
|
8
8
|
export default abstract class AbstractService {
|
|
9
|
-
|
|
10
|
-
public abstract repository: AbstractResourceRepository<any>
|
|
9
|
+
public abstract repository: AbstractResourceRepository<any>;
|
|
11
10
|
|
|
12
|
-
createStatusCode = 201
|
|
11
|
+
createStatusCode = 201;
|
|
13
12
|
|
|
14
13
|
constructor(parent: Router) {
|
|
15
|
-
this.registerRoutes(parent)
|
|
14
|
+
this.registerRoutes(parent);
|
|
16
15
|
}
|
|
17
16
|
|
|
17
|
+
protected abstract getBasePath(): string;
|
|
18
|
+
|
|
18
19
|
extraRoutes(router: Router) {}
|
|
19
20
|
|
|
20
21
|
registerRoutes(parent: Router) {
|
|
21
|
-
const basePath = this.getBasePath()
|
|
22
|
-
const router = Router({ mergeParams: true })
|
|
22
|
+
const basePath = this.getBasePath();
|
|
23
|
+
const router = Router({ mergeParams: true });
|
|
23
24
|
|
|
24
25
|
// Bind this first since the `/:id` routes are currently a bit to greedy
|
|
25
|
-
this.extraRoutes(router)
|
|
26
|
+
this.extraRoutes(router);
|
|
26
27
|
|
|
27
|
-
router.get(
|
|
28
|
-
router.get(
|
|
29
|
-
router.get(
|
|
28
|
+
router.get("/", this.get.bind(this));
|
|
29
|
+
router.get("/key=:key", this.getWithKey.bind(this)); // same thing goes for the key routes
|
|
30
|
+
router.get("/:id", this.getWithId.bind(this));
|
|
30
31
|
|
|
31
|
-
router.delete(
|
|
32
|
-
router.delete(
|
|
32
|
+
router.delete("/key=:key", this.deleteWithKey.bind(this));
|
|
33
|
+
router.delete("/:id", this.deleteWithId.bind(this));
|
|
33
34
|
|
|
34
|
-
router.post(
|
|
35
|
-
router.post(
|
|
36
|
-
router.post(
|
|
35
|
+
router.post("/", this.post.bind(this));
|
|
36
|
+
router.post("/key=:key", this.postWithKey.bind(this));
|
|
37
|
+
router.post("/:id", this.postWithId.bind(this));
|
|
37
38
|
|
|
38
|
-
parent.use(`/${basePath}`, router)
|
|
39
|
+
parent.use(`/${basePath}`, router);
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
get(request: Request, response: Response) {
|
|
42
|
-
const limit = this._parseParam(request.query.limit)
|
|
43
|
-
const offset = this._parseParam(request.query.offset)
|
|
43
|
+
const limit = this._parseParam(request.query.limit);
|
|
44
|
+
const offset = this._parseParam(request.query.offset);
|
|
44
45
|
|
|
45
46
|
const result = this.repository.query(getRepositoryContext(request), {
|
|
46
47
|
expand: this._parseParam(request.query.expand),
|
|
47
48
|
where: this._parseParam(request.query.where),
|
|
48
49
|
limit: limit !== undefined ? Number(limit) : undefined,
|
|
49
50
|
offset: offset !== undefined ? Number(offset) : undefined,
|
|
50
|
-
})
|
|
51
|
-
return response.status(200).send(result)
|
|
51
|
+
});
|
|
52
|
+
return response.status(200).send(result);
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
getWithId(request: Request, response: Response) {
|
|
55
|
-
const result = this._expandWithId(request, request.params[
|
|
56
|
+
const result = this._expandWithId(request, request.params["id"]);
|
|
56
57
|
if (!result) {
|
|
57
|
-
return response.status(404).send()
|
|
58
|
+
return response.status(404).send();
|
|
58
59
|
}
|
|
59
|
-
return response.status(200).send(result)
|
|
60
|
+
return response.status(200).send(result);
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
getWithKey(request: Request, response: Response) {
|
|
63
64
|
const result = this.repository.getByKey(
|
|
64
65
|
getRepositoryContext(request),
|
|
65
|
-
request.params[
|
|
66
|
-
{
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
request.params["key"],
|
|
67
|
+
{
|
|
68
|
+
expand: this._parseParam(request.query.expand),
|
|
69
|
+
},
|
|
70
|
+
);
|
|
71
|
+
if (!result) return response.status(404).send();
|
|
72
|
+
return response.status(200).send(result);
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
deleteWithId(request: Request, response: Response) {
|
|
73
76
|
const result = this.repository.delete(
|
|
74
77
|
getRepositoryContext(request),
|
|
75
|
-
request.params[
|
|
78
|
+
request.params["id"],
|
|
76
79
|
{
|
|
77
80
|
expand: this._parseParam(request.query.expand),
|
|
78
|
-
}
|
|
79
|
-
)
|
|
81
|
+
},
|
|
82
|
+
);
|
|
80
83
|
if (!result) {
|
|
81
|
-
return response.status(404).send(
|
|
84
|
+
return response.status(404).send("Not found");
|
|
82
85
|
}
|
|
83
|
-
return response.status(200).send(result)
|
|
86
|
+
return response.status(200).send(result);
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
deleteWithKey(request: Request, response: Response) {
|
|
87
90
|
const resource = this.repository.getByKey(
|
|
88
91
|
getRepositoryContext(request),
|
|
89
|
-
request.params[
|
|
90
|
-
)
|
|
92
|
+
request.params["key"],
|
|
93
|
+
);
|
|
91
94
|
if (!resource) {
|
|
92
|
-
return response.status(404).send(
|
|
95
|
+
return response.status(404).send("Not found");
|
|
93
96
|
}
|
|
94
97
|
|
|
95
98
|
const result = this.repository.delete(
|
|
@@ -97,63 +100,63 @@ export default abstract class AbstractService {
|
|
|
97
100
|
resource.id,
|
|
98
101
|
{
|
|
99
102
|
expand: this._parseParam(request.query.expand),
|
|
100
|
-
}
|
|
101
|
-
)
|
|
103
|
+
},
|
|
104
|
+
);
|
|
102
105
|
if (!result) {
|
|
103
|
-
return response.status(404).send(
|
|
106
|
+
return response.status(404).send("Not found");
|
|
104
107
|
}
|
|
105
|
-
return response.status(200).send(result)
|
|
108
|
+
return response.status(200).send(result);
|
|
106
109
|
}
|
|
107
110
|
|
|
108
111
|
post(request: Request, response: Response) {
|
|
109
|
-
const draft = request.body
|
|
112
|
+
const draft = request.body;
|
|
110
113
|
const resource = this.repository.create(
|
|
111
114
|
getRepositoryContext(request),
|
|
112
|
-
draft
|
|
113
|
-
)
|
|
114
|
-
const result = this._expandWithId(request, resource.id)
|
|
115
|
-
return response.status(this.createStatusCode).send(result)
|
|
115
|
+
draft,
|
|
116
|
+
);
|
|
117
|
+
const result = this._expandWithId(request, resource.id);
|
|
118
|
+
return response.status(this.createStatusCode).send(result);
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
postWithId(request: Request, response: Response) {
|
|
119
|
-
const updateRequest: Update = request.body
|
|
122
|
+
const updateRequest: Update = request.body;
|
|
120
123
|
const resource = this.repository.get(
|
|
121
124
|
getRepositoryContext(request),
|
|
122
|
-
request.params[
|
|
123
|
-
)
|
|
125
|
+
request.params["id"],
|
|
126
|
+
);
|
|
124
127
|
if (!resource) {
|
|
125
|
-
return response.status(404).send(
|
|
128
|
+
return response.status(404).send("Not found");
|
|
126
129
|
}
|
|
127
130
|
|
|
128
131
|
const updatedResource = this.repository.processUpdateActions(
|
|
129
132
|
getRepositoryContext(request),
|
|
130
133
|
resource,
|
|
131
134
|
updateRequest.version,
|
|
132
|
-
updateRequest.actions
|
|
133
|
-
)
|
|
135
|
+
updateRequest.actions,
|
|
136
|
+
);
|
|
134
137
|
|
|
135
|
-
const result = this._expandWithId(request, updatedResource.id)
|
|
136
|
-
return response.status(200).send(result)
|
|
138
|
+
const result = this._expandWithId(request, updatedResource.id);
|
|
139
|
+
return response.status(200).send(result);
|
|
137
140
|
}
|
|
138
141
|
|
|
139
142
|
postWithKey(request: Request, response: Response) {
|
|
140
|
-
const updateRequest: Update = request.body
|
|
143
|
+
const updateRequest: Update = request.body;
|
|
141
144
|
const resource = this.repository.getByKey(
|
|
142
145
|
getRepositoryContext(request),
|
|
143
|
-
request.params[
|
|
144
|
-
)
|
|
146
|
+
request.params["key"],
|
|
147
|
+
);
|
|
145
148
|
if (!resource) {
|
|
146
|
-
return response.status(404).send(
|
|
149
|
+
return response.status(404).send("Not found");
|
|
147
150
|
}
|
|
148
151
|
const updatedResource = this.repository.processUpdateActions(
|
|
149
152
|
getRepositoryContext(request),
|
|
150
153
|
resource,
|
|
151
154
|
updateRequest.version,
|
|
152
|
-
updateRequest.actions
|
|
153
|
-
)
|
|
155
|
+
updateRequest.actions,
|
|
156
|
+
);
|
|
154
157
|
|
|
155
|
-
const result = this._expandWithId(request, updatedResource.id)
|
|
156
|
-
return response.status(200).send(result)
|
|
158
|
+
const result = this._expandWithId(request, updatedResource.id);
|
|
159
|
+
return response.status(200).send(result);
|
|
157
160
|
}
|
|
158
161
|
|
|
159
162
|
protected _expandWithId(request: Request, resourceId: string) {
|
|
@@ -162,15 +165,15 @@ export default abstract class AbstractService {
|
|
|
162
165
|
resourceId,
|
|
163
166
|
{
|
|
164
167
|
expand: this._parseParam(request.query.expand),
|
|
165
|
-
}
|
|
166
|
-
)
|
|
167
|
-
return result
|
|
168
|
+
},
|
|
169
|
+
);
|
|
170
|
+
return result;
|
|
168
171
|
}
|
|
169
172
|
|
|
170
173
|
// No idea what i'm doing
|
|
171
174
|
protected _parseParam(
|
|
172
|
-
value: string | ParsedQs | string[] | ParsedQs[] | undefined
|
|
175
|
+
value: string | ParsedQs | string[] | ParsedQs[] | undefined,
|
|
173
176
|
): string[] | undefined {
|
|
174
|
-
return queryParamsArray(value)
|
|
177
|
+
return queryParamsArray(value);
|
|
175
178
|
}
|
|
176
179
|
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
1
|
+
import { AssociateRole } from "@commercetools/platform-sdk";
|
|
2
|
+
import supertest from "supertest";
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
4
|
+
import { CommercetoolsMock } from "../ctMock";
|
|
5
5
|
|
|
6
|
-
describe(
|
|
7
|
-
const ctMock = new CommercetoolsMock()
|
|
8
|
-
let associateRole: AssociateRole | undefined
|
|
6
|
+
describe("Associate roles query", () => {
|
|
7
|
+
const ctMock = new CommercetoolsMock();
|
|
8
|
+
let associateRole: AssociateRole | undefined;
|
|
9
9
|
|
|
10
10
|
beforeEach(async () => {
|
|
11
11
|
const response = await supertest(ctMock.app)
|
|
12
|
-
.post(
|
|
12
|
+
.post("/dummy/associate-roles")
|
|
13
13
|
.send({
|
|
14
|
-
name:
|
|
14
|
+
name: "example-role",
|
|
15
15
|
buyerAssignable: false,
|
|
16
|
-
key:
|
|
17
|
-
permissions: [
|
|
18
|
-
})
|
|
16
|
+
key: "example-role-associate-role",
|
|
17
|
+
permissions: ["ViewMyQuotes", "ViewMyOrders", "ViewMyCarts"],
|
|
18
|
+
});
|
|
19
19
|
|
|
20
|
-
expect(response.status).toBe(201)
|
|
20
|
+
expect(response.status).toBe(201);
|
|
21
21
|
|
|
22
|
-
associateRole = response.body as AssociateRole
|
|
23
|
-
})
|
|
22
|
+
associateRole = response.body as AssociateRole;
|
|
23
|
+
});
|
|
24
24
|
|
|
25
25
|
afterEach(() => {
|
|
26
|
-
ctMock.clear()
|
|
27
|
-
})
|
|
26
|
+
ctMock.clear();
|
|
27
|
+
});
|
|
28
28
|
|
|
29
|
-
test(
|
|
29
|
+
test("no filter", async () => {
|
|
30
30
|
const response = await supertest(ctMock.app)
|
|
31
|
-
.get(
|
|
32
|
-
.query(
|
|
33
|
-
.send()
|
|
31
|
+
.get("/dummy/associate-roles")
|
|
32
|
+
.query("{}")
|
|
33
|
+
.send();
|
|
34
34
|
|
|
35
|
-
expect(response.status).toBe(200)
|
|
36
|
-
expect(response.body.count).toBe(1)
|
|
35
|
+
expect(response.status).toBe(200);
|
|
36
|
+
expect(response.body.count).toBe(1);
|
|
37
37
|
|
|
38
|
-
associateRole = response.body.results[0] as AssociateRole
|
|
38
|
+
associateRole = response.body.results[0] as AssociateRole;
|
|
39
39
|
|
|
40
|
-
expect(associateRole.key).toBe(
|
|
41
|
-
})
|
|
42
|
-
})
|
|
40
|
+
expect(associateRole.key).toBe("example-role-associate-role");
|
|
41
|
+
});
|
|
42
|
+
});
|