@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
|
@@ -1,28 +1,16 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
QuoteRequest,
|
|
3
3
|
QuoteRequestDraft,
|
|
4
|
-
|
|
5
|
-
} from
|
|
6
|
-
import
|
|
7
|
-
import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
|
|
4
|
+
} from "@commercetools/platform-sdk";
|
|
5
|
+
import { AbstractStorage } from "~src/storage";
|
|
6
|
+
import { AbstractResourceRepository, RepositoryContext } from "./abstract";
|
|
8
7
|
|
|
9
|
-
export class QuoteRequestRepository extends AbstractResourceRepository<
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
export class QuoteRequestRepository extends AbstractResourceRepository<"quote-request"> {
|
|
9
|
+
constructor(storage: AbstractStorage) {
|
|
10
|
+
super("quote-request", storage);
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
create(context: RepositoryContext, draft: QuoteRequestDraft): QuoteRequest {
|
|
15
|
-
throw new Error(
|
|
14
|
+
throw new Error("not implemented");
|
|
16
15
|
}
|
|
17
|
-
|
|
18
|
-
actions: Partial<
|
|
19
|
-
Record<
|
|
20
|
-
QuoteRequestUpdateAction['action'],
|
|
21
|
-
(
|
|
22
|
-
context: RepositoryContext,
|
|
23
|
-
resource: Writable<QuoteRequest>,
|
|
24
|
-
action: any
|
|
25
|
-
) => void
|
|
26
|
-
>
|
|
27
|
-
> = {}
|
|
28
16
|
}
|
|
@@ -1,28 +1,13 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
QuoteUpdateAction,
|
|
5
|
-
} from '@commercetools/platform-sdk'
|
|
6
|
-
import type { Writable } from '../types.js'
|
|
7
|
-
import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
|
|
1
|
+
import type { Quote, QuoteDraft } from "@commercetools/platform-sdk";
|
|
2
|
+
import { AbstractStorage } from "~src/storage";
|
|
3
|
+
import { AbstractResourceRepository, RepositoryContext } from "./abstract";
|
|
8
4
|
|
|
9
|
-
export class QuoteRepository extends AbstractResourceRepository<
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
export class QuoteRepository extends AbstractResourceRepository<"quote"> {
|
|
6
|
+
constructor(storage: AbstractStorage) {
|
|
7
|
+
super("quote", storage);
|
|
12
8
|
}
|
|
13
9
|
|
|
14
10
|
create(context: RepositoryContext, draft: QuoteDraft): Quote {
|
|
15
|
-
throw new Error(
|
|
11
|
+
throw new Error("not implemented");
|
|
16
12
|
}
|
|
17
|
-
|
|
18
|
-
actions: Partial<
|
|
19
|
-
Record<
|
|
20
|
-
QuoteUpdateAction['action'],
|
|
21
|
-
(
|
|
22
|
-
context: RepositoryContext,
|
|
23
|
-
resource: Writable<Quote>,
|
|
24
|
-
action: any
|
|
25
|
-
) => void
|
|
26
|
-
>
|
|
27
|
-
> = {}
|
|
28
13
|
}
|
|
@@ -3,24 +3,23 @@ import {
|
|
|
3
3
|
ProductReference,
|
|
4
4
|
type Review,
|
|
5
5
|
type ReviewDraft,
|
|
6
|
-
type ReviewUpdateAction,
|
|
7
6
|
type StateReference,
|
|
8
|
-
} from
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import { AbstractResourceRepository, RepositoryContext } from
|
|
7
|
+
} from "@commercetools/platform-sdk";
|
|
8
|
+
import { AbstractStorage } from "~src/storage";
|
|
9
|
+
import { getBaseResourceProperties } from "../helpers";
|
|
10
|
+
import { AbstractResourceRepository, RepositoryContext } from "./abstract";
|
|
12
11
|
import {
|
|
13
12
|
createCustomFields,
|
|
14
13
|
getReferenceFromResourceIdentifier,
|
|
15
|
-
} from
|
|
14
|
+
} from "./helpers";
|
|
16
15
|
|
|
17
|
-
export class ReviewRepository extends AbstractResourceRepository<
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
export class ReviewRepository extends AbstractResourceRepository<"review"> {
|
|
17
|
+
constructor(storage: AbstractStorage) {
|
|
18
|
+
super("review", storage);
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
create(context: RepositoryContext, draft: ReviewDraft): Review {
|
|
23
|
-
if (!draft.target) throw new Error(
|
|
22
|
+
if (!draft.target) throw new Error("Missing target");
|
|
24
23
|
const resource: Review = {
|
|
25
24
|
...getBaseResourceProperties(),
|
|
26
25
|
|
|
@@ -34,7 +33,7 @@ export class ReviewRepository extends AbstractResourceRepository<'review'> {
|
|
|
34
33
|
? getReferenceFromResourceIdentifier<StateReference>(
|
|
35
34
|
draft.state,
|
|
36
35
|
context.projectKey,
|
|
37
|
-
this._storage
|
|
36
|
+
this._storage,
|
|
38
37
|
)
|
|
39
38
|
: undefined,
|
|
40
39
|
target: draft.target
|
|
@@ -46,21 +45,9 @@ export class ReviewRepository extends AbstractResourceRepository<'review'> {
|
|
|
46
45
|
custom: createCustomFields(
|
|
47
46
|
draft.custom,
|
|
48
47
|
context.projectKey,
|
|
49
|
-
this._storage
|
|
48
|
+
this._storage,
|
|
50
49
|
),
|
|
51
|
-
}
|
|
52
|
-
this.saveNew(context, resource)
|
|
53
|
-
return resource
|
|
50
|
+
};
|
|
51
|
+
return this.saveNew(context, resource);
|
|
54
52
|
}
|
|
55
|
-
|
|
56
|
-
actions: Partial<
|
|
57
|
-
Record<
|
|
58
|
-
ReviewUpdateAction['action'],
|
|
59
|
-
(
|
|
60
|
-
context: RepositoryContext,
|
|
61
|
-
resource: Writable<Review>,
|
|
62
|
-
action: any
|
|
63
|
-
) => void
|
|
64
|
-
>
|
|
65
|
-
> = {}
|
|
66
53
|
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ShippingMethodChangeTaxCategoryAction,
|
|
3
|
+
ShippingMethodRemoveShippingRateAction,
|
|
4
|
+
type ShippingMethod,
|
|
5
|
+
type ShippingMethodAddShippingRateAction,
|
|
6
|
+
type ShippingMethodAddZoneAction,
|
|
7
|
+
type ShippingMethodChangeIsDefaultAction,
|
|
8
|
+
type ShippingMethodChangeNameAction,
|
|
9
|
+
type ShippingMethodRemoveZoneAction,
|
|
10
|
+
type ShippingMethodSetCustomFieldAction,
|
|
11
|
+
type ShippingMethodSetCustomTypeAction,
|
|
12
|
+
type ShippingMethodSetDescriptionAction,
|
|
13
|
+
type ShippingMethodSetKeyAction,
|
|
14
|
+
type ShippingMethodSetLocalizedDescriptionAction,
|
|
15
|
+
type ShippingMethodSetLocalizedNameAction,
|
|
16
|
+
type ShippingMethodSetPredicateAction,
|
|
17
|
+
type ShippingMethodUpdateAction,
|
|
18
|
+
type ZoneReference,
|
|
19
|
+
} from "@commercetools/platform-sdk";
|
|
20
|
+
import deepEqual from "deep-equal";
|
|
21
|
+
import type { Writable } from "../../types";
|
|
22
|
+
import {
|
|
23
|
+
AbstractUpdateHandler,
|
|
24
|
+
RepositoryContext,
|
|
25
|
+
UpdateHandlerInterface,
|
|
26
|
+
} from "../abstract";
|
|
27
|
+
import {
|
|
28
|
+
createCustomFields,
|
|
29
|
+
getReferenceFromResourceIdentifier,
|
|
30
|
+
} from "../helpers";
|
|
31
|
+
import { transformShippingRate } from "./helpers";
|
|
32
|
+
|
|
33
|
+
export class ShippingMethodUpdateHandler
|
|
34
|
+
extends AbstractUpdateHandler
|
|
35
|
+
implements UpdateHandlerInterface<ShippingMethod, ShippingMethodUpdateAction>
|
|
36
|
+
{
|
|
37
|
+
changeTaxCategory: (
|
|
38
|
+
context: RepositoryContext,
|
|
39
|
+
resource: Writable<ShippingMethod>,
|
|
40
|
+
action: ShippingMethodChangeTaxCategoryAction,
|
|
41
|
+
) => void;
|
|
42
|
+
|
|
43
|
+
addShippingRate(
|
|
44
|
+
_context: RepositoryContext,
|
|
45
|
+
resource: Writable<ShippingMethod>,
|
|
46
|
+
{ shippingRate, zone }: ShippingMethodAddShippingRateAction,
|
|
47
|
+
) {
|
|
48
|
+
const rate = transformShippingRate(shippingRate);
|
|
49
|
+
|
|
50
|
+
resource.zoneRates.forEach((zoneRate) => {
|
|
51
|
+
if (zoneRate.zone.id === zone.id) {
|
|
52
|
+
zoneRate.shippingRates.push(rate);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
resource.zoneRates.push({
|
|
57
|
+
zone: {
|
|
58
|
+
typeId: "zone",
|
|
59
|
+
id: zone.id!,
|
|
60
|
+
},
|
|
61
|
+
shippingRates: [rate],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
addZone(
|
|
66
|
+
context: RepositoryContext,
|
|
67
|
+
resource: Writable<ShippingMethod>,
|
|
68
|
+
{ zone }: ShippingMethodAddZoneAction,
|
|
69
|
+
) {
|
|
70
|
+
const zoneReference = getReferenceFromResourceIdentifier<ZoneReference>(
|
|
71
|
+
zone,
|
|
72
|
+
context.projectKey,
|
|
73
|
+
this._storage,
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
if (resource.zoneRates === undefined) {
|
|
77
|
+
resource.zoneRates = [];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
resource.zoneRates.push({
|
|
81
|
+
zone: zoneReference,
|
|
82
|
+
shippingRates: [],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
changeIsDefault(
|
|
87
|
+
_context: RepositoryContext,
|
|
88
|
+
resource: Writable<ShippingMethod>,
|
|
89
|
+
{ isDefault }: ShippingMethodChangeIsDefaultAction,
|
|
90
|
+
) {
|
|
91
|
+
resource.isDefault = isDefault;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
changeName(
|
|
95
|
+
_context: RepositoryContext,
|
|
96
|
+
resource: Writable<ShippingMethod>,
|
|
97
|
+
{ name }: ShippingMethodChangeNameAction,
|
|
98
|
+
) {
|
|
99
|
+
resource.name = name;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
removeShippingRate(
|
|
103
|
+
_context: RepositoryContext,
|
|
104
|
+
resource: Writable<ShippingMethod>,
|
|
105
|
+
{ shippingRate, zone }: ShippingMethodRemoveShippingRateAction,
|
|
106
|
+
) {
|
|
107
|
+
const rate = transformShippingRate(shippingRate);
|
|
108
|
+
|
|
109
|
+
resource.zoneRates.forEach((zoneRate) => {
|
|
110
|
+
if (zoneRate.zone.id === zone.id) {
|
|
111
|
+
zoneRate.shippingRates = zoneRate.shippingRates.filter(
|
|
112
|
+
(otherRate) => !deepEqual(rate, otherRate),
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
removeZone(
|
|
119
|
+
_context: RepositoryContext,
|
|
120
|
+
resource: Writable<ShippingMethod>,
|
|
121
|
+
{ zone }: ShippingMethodRemoveZoneAction,
|
|
122
|
+
) {
|
|
123
|
+
resource.zoneRates = resource.zoneRates.filter(
|
|
124
|
+
(zoneRate) => zoneRate.zone.id !== zone.id,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
setCustomField(
|
|
129
|
+
context: RepositoryContext,
|
|
130
|
+
resource: Writable<ShippingMethod>,
|
|
131
|
+
{ name, value }: ShippingMethodSetCustomFieldAction,
|
|
132
|
+
) {
|
|
133
|
+
if (!resource.custom) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (value === null) {
|
|
137
|
+
delete resource.custom.fields[name];
|
|
138
|
+
} else {
|
|
139
|
+
resource.custom.fields[name] = value;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
setCustomType(
|
|
144
|
+
context: RepositoryContext,
|
|
145
|
+
resource: Writable<ShippingMethod>,
|
|
146
|
+
{ type, fields }: ShippingMethodSetCustomTypeAction,
|
|
147
|
+
) {
|
|
148
|
+
if (type) {
|
|
149
|
+
resource.custom = createCustomFields(
|
|
150
|
+
{ type, fields },
|
|
151
|
+
context.projectKey,
|
|
152
|
+
this._storage,
|
|
153
|
+
);
|
|
154
|
+
} else {
|
|
155
|
+
resource.custom = undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
setDescription(
|
|
160
|
+
_context: RepositoryContext,
|
|
161
|
+
resource: Writable<ShippingMethod>,
|
|
162
|
+
{ description }: ShippingMethodSetDescriptionAction,
|
|
163
|
+
) {
|
|
164
|
+
resource.description = description;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
setKey(
|
|
168
|
+
_context: RepositoryContext,
|
|
169
|
+
resource: Writable<ShippingMethod>,
|
|
170
|
+
{ key }: ShippingMethodSetKeyAction,
|
|
171
|
+
) {
|
|
172
|
+
resource.key = key;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
setLocalizedDescription(
|
|
176
|
+
_context: RepositoryContext,
|
|
177
|
+
resource: Writable<ShippingMethod>,
|
|
178
|
+
{ localizedDescription }: ShippingMethodSetLocalizedDescriptionAction,
|
|
179
|
+
) {
|
|
180
|
+
resource.localizedDescription = localizedDescription;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
setLocalizedName(
|
|
184
|
+
_context: RepositoryContext,
|
|
185
|
+
resource: Writable<ShippingMethod>,
|
|
186
|
+
{ localizedName }: ShippingMethodSetLocalizedNameAction,
|
|
187
|
+
) {
|
|
188
|
+
resource.localizedName = localizedName;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
setPredicate(
|
|
192
|
+
_context: RepositoryContext,
|
|
193
|
+
resource: Writable<ShippingMethod>,
|
|
194
|
+
{ predicate }: ShippingMethodSetPredicateAction,
|
|
195
|
+
) {
|
|
196
|
+
resource.predicate = predicate;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ShippingRate, ShippingRateDraft } from "@commercetools/platform-sdk";
|
|
2
|
+
import { createTypedMoney } from "../helpers";
|
|
3
|
+
|
|
4
|
+
export const transformShippingRate = (
|
|
5
|
+
rate: ShippingRateDraft,
|
|
6
|
+
): ShippingRate => ({
|
|
7
|
+
price: createTypedMoney(rate.price),
|
|
8
|
+
freeAbove: rate.freeAbove && createTypedMoney(rate.freeAbove),
|
|
9
|
+
tiers: rate.tiers || [],
|
|
10
|
+
});
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {
|
|
2
|
+
InvalidOperationError,
|
|
3
|
+
type ShippingMethod,
|
|
4
|
+
type ShippingMethodDraft,
|
|
5
|
+
type ZoneRate,
|
|
6
|
+
type ZoneRateDraft,
|
|
7
|
+
type ZoneReference,
|
|
8
|
+
} from "@commercetools/platform-sdk";
|
|
9
|
+
import { CommercetoolsError } from "~src/exceptions";
|
|
10
|
+
import { getBaseResourceProperties } from "../../helpers";
|
|
11
|
+
import { markMatchingShippingRate } from "../../shippingCalculator";
|
|
12
|
+
import { AbstractStorage } from "../../storage/abstract";
|
|
13
|
+
import {
|
|
14
|
+
AbstractResourceRepository,
|
|
15
|
+
GetParams,
|
|
16
|
+
RepositoryContext,
|
|
17
|
+
} from "../abstract";
|
|
18
|
+
import {
|
|
19
|
+
createCustomFields,
|
|
20
|
+
getReferenceFromResourceIdentifier,
|
|
21
|
+
} from "../helpers";
|
|
22
|
+
import { ShippingMethodUpdateHandler } from "./actions";
|
|
23
|
+
import { transformShippingRate } from "./helpers";
|
|
24
|
+
|
|
25
|
+
export class ShippingMethodRepository extends AbstractResourceRepository<"shipping-method"> {
|
|
26
|
+
constructor(storage: AbstractStorage) {
|
|
27
|
+
super("shipping-method", storage);
|
|
28
|
+
this.actions = new ShippingMethodUpdateHandler(storage);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
create(
|
|
32
|
+
context: RepositoryContext,
|
|
33
|
+
draft: ShippingMethodDraft,
|
|
34
|
+
): ShippingMethod {
|
|
35
|
+
const resource: ShippingMethod = {
|
|
36
|
+
...getBaseResourceProperties(),
|
|
37
|
+
...draft,
|
|
38
|
+
taxCategory: getReferenceFromResourceIdentifier(
|
|
39
|
+
draft.taxCategory,
|
|
40
|
+
context.projectKey,
|
|
41
|
+
this._storage,
|
|
42
|
+
),
|
|
43
|
+
zoneRates: draft.zoneRates?.map((z) =>
|
|
44
|
+
this._transformZoneRateDraft(context, z),
|
|
45
|
+
),
|
|
46
|
+
custom: createCustomFields(
|
|
47
|
+
draft.custom,
|
|
48
|
+
context.projectKey,
|
|
49
|
+
this._storage,
|
|
50
|
+
),
|
|
51
|
+
};
|
|
52
|
+
return this.saveNew(context, resource);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* Retrieves all the ShippingMethods that can ship to the shipping address of
|
|
57
|
+
* the given Cart. Each ShippingMethod contains exactly one ShippingRate with
|
|
58
|
+
* the flag isMatching set to true. This ShippingRate is used when the
|
|
59
|
+
* ShippingMethod is added to the Cart.
|
|
60
|
+
*/
|
|
61
|
+
public matchingCart(
|
|
62
|
+
context: RepositoryContext,
|
|
63
|
+
cartId: string,
|
|
64
|
+
params: GetParams = {},
|
|
65
|
+
) {
|
|
66
|
+
const cart = this._storage.get(context.projectKey, "cart", cartId);
|
|
67
|
+
if (!cart) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!cart.shippingAddress?.country) {
|
|
72
|
+
throw new CommercetoolsError<InvalidOperationError>({
|
|
73
|
+
code: "InvalidOperation",
|
|
74
|
+
message: `The cart with ID '${cart.id}' does not have a shipping address set.`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Get all shipping methods that have a zone that matches the shipping address
|
|
79
|
+
const zones = this._storage.query<"zone">(context.projectKey, "zone", {
|
|
80
|
+
where: [`locations(country="${cart.shippingAddress.country}"))`],
|
|
81
|
+
limit: 100,
|
|
82
|
+
});
|
|
83
|
+
const zoneIds = zones.results.map((zone) => zone.id);
|
|
84
|
+
const shippingMethods = this.query(context, {
|
|
85
|
+
"where": [
|
|
86
|
+
`zoneRates(zone(id in (:zoneIds)))`,
|
|
87
|
+
`zoneRates(shippingRates(price(currencyCode="${cart.totalPrice.currencyCode}")))`,
|
|
88
|
+
],
|
|
89
|
+
"var.zoneIds": zoneIds,
|
|
90
|
+
"expand": params.expand,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Make sure that each shipping method has exactly one shipping rate and
|
|
94
|
+
// that the shipping rate is marked as matching
|
|
95
|
+
const results = shippingMethods.results
|
|
96
|
+
.map((shippingMethod) => {
|
|
97
|
+
// Iterate through the zoneRates, process the shipping rates and filter
|
|
98
|
+
// out all zoneRates which have no matching shipping rates left
|
|
99
|
+
const rates = shippingMethod.zoneRates
|
|
100
|
+
.map((zoneRate) => ({
|
|
101
|
+
zone: zoneRate.zone,
|
|
102
|
+
|
|
103
|
+
// Iterate through the shippingRates and mark the matching ones
|
|
104
|
+
// then we filter out the non-matching ones
|
|
105
|
+
shippingRates: zoneRate.shippingRates
|
|
106
|
+
.map((rate) => markMatchingShippingRate(cart, rate))
|
|
107
|
+
.filter((rate) => rate.isMatching),
|
|
108
|
+
}))
|
|
109
|
+
.filter((zoneRate) => zoneRate.shippingRates.length > 0);
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
...shippingMethod,
|
|
113
|
+
zoneRates: rates,
|
|
114
|
+
};
|
|
115
|
+
})
|
|
116
|
+
.filter((shippingMethod) => shippingMethod.zoneRates.length > 0);
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
...shippingMethods,
|
|
120
|
+
results: results,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private _transformZoneRateDraft(
|
|
125
|
+
context: RepositoryContext,
|
|
126
|
+
draft: ZoneRateDraft,
|
|
127
|
+
): ZoneRate {
|
|
128
|
+
return {
|
|
129
|
+
...draft,
|
|
130
|
+
zone: getReferenceFromResourceIdentifier<ZoneReference>(
|
|
131
|
+
draft.zone,
|
|
132
|
+
context.projectKey,
|
|
133
|
+
this._storage,
|
|
134
|
+
),
|
|
135
|
+
shippingRates: draft.shippingRates?.map(transformShippingRate),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|