@labdigital/commercetools-mock 2.17.1 → 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.
Files changed (178) hide show
  1. package/dist/index.cjs +4186 -3974
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +266 -413
  4. package/dist/index.d.ts +266 -413
  5. package/dist/index.js +4186 -3974
  6. package/dist/index.js.map +1 -1
  7. package/package.json +44 -46
  8. package/src/constants.ts +2 -2
  9. package/src/ctMock.test.ts +11 -11
  10. package/src/ctMock.ts +141 -127
  11. package/src/deprecation.ts +8 -0
  12. package/src/exceptions.ts +17 -15
  13. package/src/helpers.ts +32 -32
  14. package/src/index.test.ts +128 -128
  15. package/src/index.ts +3 -3
  16. package/src/lib/expandParser.ts +13 -13
  17. package/src/lib/haversine.test.ts +9 -9
  18. package/src/lib/haversine.ts +11 -11
  19. package/src/lib/masking.ts +11 -11
  20. package/src/lib/parser.ts +2 -2
  21. package/src/lib/password.ts +23 -3
  22. package/src/lib/predicateParser.test.ts +185 -183
  23. package/src/lib/predicateParser.ts +234 -234
  24. package/src/lib/projectionSearchFilter.test.ts +103 -101
  25. package/src/lib/projectionSearchFilter.ts +152 -150
  26. package/src/lib/proxy.ts +5 -5
  27. package/src/oauth/errors.ts +4 -4
  28. package/src/oauth/helpers.ts +6 -6
  29. package/src/oauth/server.test.ts +86 -86
  30. package/src/oauth/server.ts +158 -144
  31. package/src/oauth/store.ts +44 -43
  32. package/src/priceSelector.test.ts +35 -35
  33. package/src/priceSelector.ts +30 -30
  34. package/src/product-projection-search.ts +136 -134
  35. package/src/projectAPI.test.ts +7 -7
  36. package/src/projectAPI.ts +24 -22
  37. package/src/repositories/abstract.ts +168 -116
  38. package/src/repositories/associate-role.ts +90 -77
  39. package/src/repositories/attribute-group.ts +51 -40
  40. package/src/repositories/business-unit.ts +168 -148
  41. package/src/repositories/cart/actions.ts +489 -0
  42. package/src/repositories/cart/helpers.ts +30 -0
  43. package/src/repositories/cart/index.ts +180 -0
  44. package/src/repositories/cart-discount/actions.ts +148 -0
  45. package/src/repositories/cart-discount/index.ts +86 -0
  46. package/src/repositories/category/actions.ts +231 -0
  47. package/src/repositories/category/index.ts +52 -0
  48. package/src/repositories/channel.ts +88 -90
  49. package/src/repositories/custom-object.ts +46 -45
  50. package/src/repositories/customer/actions.ts +165 -0
  51. package/src/repositories/customer/index.ts +79 -0
  52. package/src/repositories/customer-group.ts +66 -55
  53. package/src/repositories/discount-code/actions.ts +149 -0
  54. package/src/repositories/discount-code/index.ts +50 -0
  55. package/src/repositories/errors.ts +10 -10
  56. package/src/repositories/extension.ts +64 -62
  57. package/src/repositories/helpers.ts +117 -118
  58. package/src/repositories/index.ts +80 -79
  59. package/src/repositories/inventory-entry/actions.ts +84 -0
  60. package/src/repositories/inventory-entry/index.ts +44 -0
  61. package/src/repositories/my-customer.ts +114 -0
  62. package/src/repositories/my-order.ts +8 -8
  63. package/src/repositories/order/actions.ts +281 -0
  64. package/src/repositories/{order.test.ts → order/index.test.ts} +77 -77
  65. package/src/repositories/order/index.ts +260 -0
  66. package/src/repositories/order-edit.ts +10 -23
  67. package/src/repositories/payment/actions.ts +305 -0
  68. package/src/repositories/payment/helpers.ts +17 -0
  69. package/src/repositories/payment/index.ts +56 -0
  70. package/src/repositories/product/actions.ts +943 -0
  71. package/src/repositories/product/helpers.ts +98 -0
  72. package/src/repositories/product/index.ts +130 -0
  73. package/src/repositories/product-discount.ts +127 -117
  74. package/src/repositories/product-projection.ts +56 -62
  75. package/src/repositories/product-selection.ts +31 -28
  76. package/src/repositories/product-type.ts +136 -134
  77. package/src/repositories/project.ts +133 -118
  78. package/src/repositories/quote-request.ts +7 -19
  79. package/src/repositories/quote.ts +7 -22
  80. package/src/repositories/review.ts +13 -26
  81. package/src/repositories/shipping-method/actions.ts +198 -0
  82. package/src/repositories/shipping-method/helpers.ts +10 -0
  83. package/src/repositories/shipping-method/index.ts +138 -0
  84. package/src/repositories/shopping-list/actions.ts +295 -0
  85. package/src/repositories/shopping-list/index.ts +122 -0
  86. package/src/repositories/staged-quote.ts +7 -20
  87. package/src/repositories/standalone-price.ts +57 -44
  88. package/src/repositories/state.ts +113 -68
  89. package/src/repositories/store.ts +106 -94
  90. package/src/repositories/subscription.ts +46 -22
  91. package/src/repositories/tax-category/actions.ts +94 -0
  92. package/src/repositories/tax-category/helpers.ts +8 -0
  93. package/src/repositories/tax-category/index.ts +25 -0
  94. package/src/repositories/type/actions.ts +162 -0
  95. package/src/repositories/type/index.ts +24 -0
  96. package/src/repositories/zone.ts +62 -58
  97. package/src/server.ts +9 -9
  98. package/src/services/abstract.ts +75 -72
  99. package/src/services/associate-roles.test.ts +27 -27
  100. package/src/services/associate-roles.ts +7 -7
  101. package/src/services/attribute-group.ts +7 -7
  102. package/src/services/business-units.test.ts +28 -28
  103. package/src/services/business-units.ts +7 -7
  104. package/src/services/cart-discount.test.ts +199 -199
  105. package/src/services/cart-discount.ts +7 -7
  106. package/src/services/cart.test.ts +261 -261
  107. package/src/services/cart.ts +22 -21
  108. package/src/services/category.test.ts +121 -121
  109. package/src/services/category.ts +7 -7
  110. package/src/services/channel.ts +7 -7
  111. package/src/services/custom-object.test.ts +130 -130
  112. package/src/services/custom-object.ts +34 -31
  113. package/src/services/customer-group.ts +7 -7
  114. package/src/services/customer.test.ts +205 -205
  115. package/src/services/customer.ts +23 -36
  116. package/src/services/discount-code.ts +7 -7
  117. package/src/services/extension.ts +7 -7
  118. package/src/services/index.ts +85 -81
  119. package/src/services/inventory-entry.test.ts +106 -106
  120. package/src/services/inventory-entry.ts +7 -7
  121. package/src/services/my-cart.test.ts +56 -56
  122. package/src/services/my-cart.ts +20 -20
  123. package/src/services/my-customer.test.ts +155 -104
  124. package/src/services/my-customer.ts +61 -75
  125. package/src/services/my-order.ts +16 -16
  126. package/src/services/my-payment.test.ts +40 -40
  127. package/src/services/my-payment.ts +7 -7
  128. package/src/services/my-shopping-list.ts +7 -7
  129. package/src/services/order.test.ts +243 -243
  130. package/src/services/order.ts +23 -18
  131. package/src/services/payment.test.ts +40 -40
  132. package/src/services/payment.ts +7 -7
  133. package/src/services/product-discount.ts +7 -7
  134. package/src/services/product-projection.test.ts +190 -190
  135. package/src/services/product-projection.ts +34 -32
  136. package/src/services/product-selection.test.ts +19 -19
  137. package/src/services/product-selection.ts +7 -7
  138. package/src/services/product-type.test.ts +38 -38
  139. package/src/services/product-type.ts +7 -7
  140. package/src/services/product.test.ts +658 -656
  141. package/src/services/product.ts +7 -7
  142. package/src/services/project.test.ts +24 -24
  143. package/src/services/project.ts +17 -17
  144. package/src/services/reviews.ts +7 -7
  145. package/src/services/shipping-method.test.ts +78 -78
  146. package/src/services/shipping-method.ts +16 -16
  147. package/src/services/shopping-list.test.ts +170 -170
  148. package/src/services/shopping-list.ts +7 -7
  149. package/src/services/standalone-price.test.ts +112 -112
  150. package/src/services/standalone-price.ts +7 -7
  151. package/src/services/state.test.ts +30 -30
  152. package/src/services/state.ts +7 -7
  153. package/src/services/store.test.ts +40 -40
  154. package/src/services/store.ts +7 -7
  155. package/src/services/subscription.ts +7 -7
  156. package/src/services/tax-category.test.ts +43 -43
  157. package/src/services/tax-category.ts +7 -7
  158. package/src/services/type.ts +7 -7
  159. package/src/services/zone.ts +7 -7
  160. package/src/shippingCalculator.test.ts +43 -43
  161. package/src/shippingCalculator.ts +23 -23
  162. package/src/storage/abstract.ts +36 -34
  163. package/src/storage/in-memory.ts +237 -233
  164. package/src/storage/index.ts +2 -2
  165. package/src/types.ts +91 -91
  166. package/src/repositories/cart-discount.ts +0 -219
  167. package/src/repositories/cart.ts +0 -659
  168. package/src/repositories/category.ts +0 -256
  169. package/src/repositories/customer.ts +0 -228
  170. package/src/repositories/discount-code.ts +0 -181
  171. package/src/repositories/inventory-entry.ts +0 -109
  172. package/src/repositories/order.ts +0 -514
  173. package/src/repositories/payment.ts +0 -342
  174. package/src/repositories/product.ts +0 -1106
  175. package/src/repositories/shipping-method.ts +0 -312
  176. package/src/repositories/shopping-list.ts +0 -392
  177. package/src/repositories/tax-category.ts +0 -111
  178. 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
+ }
@@ -7,14 +7,21 @@ import type {
7
7
  ZoneSetDescriptionAction,
8
8
  ZoneSetKeyAction,
9
9
  ZoneUpdateAction,
10
- } from '@commercetools/platform-sdk'
11
- import { getBaseResourceProperties } from '../helpers.js'
12
- import type { Writable } from '../types.js'
13
- import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
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<'zone'> {
16
- getTypeId() {
17
- return 'zone' as const
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
- return resource
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
- actions: Partial<
33
- Record<
34
- ZoneUpdateAction['action'],
35
- (
36
- context: RepositoryContext,
37
- resource: Writable<Zone>,
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 './index.js'
1
+ import { CommercetoolsMock } from "./index";
2
2
 
3
- process.on('SIGINT', function () {
4
- console.info('Stopping server...')
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);
@@ -1,95 +1,98 @@
1
- import type { Update } from '@commercetools/platform-sdk'
2
- import { type Request, type Response, Router } from 'express'
3
- import { ParsedQs } from 'qs'
4
- import { AbstractResourceRepository } from '../repositories/abstract.js'
5
- import { getRepositoryContext } from '../repositories/helpers.js'
6
- import { queryParamsArray } from '../helpers.js'
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
- protected abstract getBasePath(): string
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('/', this.get.bind(this))
28
- router.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes
29
- router.get('/:id', this.getWithId.bind(this))
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('/key=:key', this.deleteWithKey.bind(this))
32
- router.delete('/:id', this.deleteWithId.bind(this))
32
+ router.delete("/key=:key", this.deleteWithKey.bind(this));
33
+ router.delete("/:id", this.deleteWithId.bind(this));
33
34
 
34
- router.post('/', this.post.bind(this))
35
- router.post('/key=:key', this.postWithKey.bind(this))
36
- router.post('/:id', this.postWithId.bind(this))
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['id'])
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['key'],
66
- { expand: this._parseParam(request.query.expand) }
67
- )
68
- if (!result) return response.status(404).send()
69
- return response.status(200).send(result)
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['id'],
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('Not found')
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['key']
90
- )
92
+ request.params["key"],
93
+ );
91
94
  if (!resource) {
92
- return response.status(404).send('Not found')
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('Not found')
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['id']
123
- )
125
+ request.params["id"],
126
+ );
124
127
  if (!resource) {
125
- return response.status(404).send('Not found')
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['key']
144
- )
146
+ request.params["key"],
147
+ );
145
148
  if (!resource) {
146
- return response.status(404).send('Not found')
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 { CommercetoolsMock } from '../ctMock.js'
2
- import { AssociateRole } from '@commercetools/platform-sdk'
3
- import supertest from 'supertest'
4
- import { beforeEach, afterEach, describe, expect, test } from 'vitest'
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('Associate roles query', () => {
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('/dummy/associate-roles')
12
+ .post("/dummy/associate-roles")
13
13
  .send({
14
- name: 'example-role',
14
+ name: "example-role",
15
15
  buyerAssignable: false,
16
- key: 'example-role-associate-role',
17
- permissions: ['ViewMyQuotes', 'ViewMyOrders', 'ViewMyCarts'],
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('no filter', async () => {
29
+ test("no filter", async () => {
30
30
  const response = await supertest(ctMock.app)
31
- .get('/dummy/associate-roles')
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('example-role-associate-role')
41
- })
42
- })
40
+ expect(associateRole.key).toBe("example-role-associate-role");
41
+ });
42
+ });