@unchainedshop/core-orders 3.0.0-alpha7 → 3.0.0-rc10

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 (141) hide show
  1. package/lib/db/OrderDeliveriesCollection.d.ts +21 -2
  2. package/lib/db/OrderDeliveriesCollection.d.ts.map +1 -1
  3. package/lib/db/OrderDeliveriesCollection.js +6 -0
  4. package/lib/db/OrderDeliveriesCollection.js.map +1 -1
  5. package/lib/db/OrderDiscountsCollection.d.ts +16 -2
  6. package/lib/db/OrderDiscountsCollection.d.ts.map +1 -1
  7. package/lib/db/OrderDiscountsCollection.js +5 -0
  8. package/lib/db/OrderDiscountsCollection.js.map +1 -1
  9. package/lib/db/OrderPaymentsCollection.d.ts +22 -2
  10. package/lib/db/OrderPaymentsCollection.d.ts.map +1 -1
  11. package/lib/db/OrderPaymentsCollection.js +6 -0
  12. package/lib/db/OrderPaymentsCollection.js.map +1 -1
  13. package/lib/db/OrderPositionsCollection.d.ts +22 -2
  14. package/lib/db/OrderPositionsCollection.d.ts.map +1 -1
  15. package/lib/db/OrderPositionsCollection.js.map +1 -1
  16. package/lib/db/OrdersCollection.d.ts +33 -2
  17. package/lib/db/OrdersCollection.d.ts.map +1 -1
  18. package/lib/db/OrdersCollection.js +8 -1
  19. package/lib/db/OrdersCollection.js.map +1 -1
  20. package/lib/module/buildFindSelector.d.ts +5 -0
  21. package/lib/module/buildFindSelector.d.ts.map +1 -0
  22. package/lib/module/buildFindSelector.js +18 -0
  23. package/lib/module/buildFindSelector.js.map +1 -0
  24. package/lib/module/configureOrderDeliveriesModule.d.ts +14 -27
  25. package/lib/module/configureOrderDeliveriesModule.d.ts.map +1 -1
  26. package/lib/module/configureOrderDeliveriesModule.js +8 -69
  27. package/lib/module/configureOrderDeliveriesModule.js.map +1 -1
  28. package/lib/module/configureOrderDiscountsModule.d.ts +17 -18
  29. package/lib/module/configureOrderDiscountsModule.d.ts.map +1 -1
  30. package/lib/module/configureOrderDiscountsModule.js +34 -143
  31. package/lib/module/configureOrderDiscountsModule.js.map +1 -1
  32. package/lib/module/configureOrderPaymentsModule.d.ts +17 -37
  33. package/lib/module/configureOrderPaymentsModule.d.ts.map +1 -1
  34. package/lib/module/configureOrderPaymentsModule.js +16 -124
  35. package/lib/module/configureOrderPaymentsModule.js.map +1 -1
  36. package/lib/module/configureOrderPositionsModule.d.ts +22 -41
  37. package/lib/module/configureOrderPositionsModule.d.ts.map +1 -1
  38. package/lib/module/configureOrderPositionsModule.js +22 -85
  39. package/lib/module/configureOrderPositionsModule.js.map +1 -1
  40. package/lib/module/configureOrdersModule-mutations.d.ts +5 -11
  41. package/lib/module/configureOrdersModule-mutations.d.ts.map +1 -1
  42. package/lib/module/configureOrdersModule-mutations.js +11 -50
  43. package/lib/module/configureOrdersModule-mutations.js.map +1 -1
  44. package/lib/module/configureOrdersModule-queries.d.ts +18 -6
  45. package/lib/module/configureOrdersModule-queries.d.ts.map +1 -1
  46. package/lib/module/configureOrdersModule-queries.js +35 -22
  47. package/lib/module/configureOrdersModule-queries.js.map +1 -1
  48. package/lib/module/configureOrdersModule.d.ts +11 -8
  49. package/lib/module/configureOrdersModule.d.ts.map +1 -1
  50. package/lib/module/configureOrdersModule.js +134 -154
  51. package/lib/module/configureOrdersModule.js.map +1 -1
  52. package/lib/orders-index.d.ts +11 -8
  53. package/lib/orders-index.d.ts.map +1 -1
  54. package/lib/orders-index.js +11 -8
  55. package/lib/orders-index.js.map +1 -1
  56. package/lib/orders-settings.d.ts +4 -8
  57. package/lib/orders-settings.d.ts.map +1 -1
  58. package/lib/orders-settings.js.map +1 -1
  59. package/package.json +13 -13
  60. package/src/db/OrderDeliveriesCollection.ts +25 -2
  61. package/src/db/OrderDiscountsCollection.ts +18 -2
  62. package/src/db/OrderPaymentsCollection.ts +26 -2
  63. package/src/db/OrderPositionsCollection.ts +21 -2
  64. package/src/db/OrdersCollection.ts +44 -2
  65. package/src/module/buildFindSelector.test.ts +8 -8
  66. package/src/module/buildFindSelector.ts +24 -0
  67. package/src/module/configureOrderDeliveriesModule.ts +29 -172
  68. package/src/module/configureOrderDiscountsModule.ts +46 -213
  69. package/src/module/configureOrderPaymentsModule.ts +58 -266
  70. package/src/module/configureOrderPositionsModule.ts +57 -208
  71. package/src/module/configureOrdersModule-mutations.ts +13 -85
  72. package/src/module/configureOrdersModule-queries.ts +61 -29
  73. package/src/module/configureOrdersModule.ts +181 -264
  74. package/src/orders-index.ts +11 -10
  75. package/src/orders-settings.ts +5 -7
  76. package/tsconfig.json +5 -7
  77. package/lib/db/OrderDiscountTrigger.d.ts +0 -5
  78. package/lib/db/OrderDiscountTrigger.d.ts.map +0 -1
  79. package/lib/db/OrderDiscountTrigger.js +0 -6
  80. package/lib/db/OrderDiscountTrigger.js.map +0 -1
  81. package/lib/director/OrderDiscountAdapter.d.ts +0 -4
  82. package/lib/director/OrderDiscountAdapter.d.ts.map +0 -1
  83. package/lib/director/OrderDiscountAdapter.js +0 -3
  84. package/lib/director/OrderDiscountAdapter.js.map +0 -1
  85. package/lib/director/OrderDiscountConfiguration.d.ts +0 -6
  86. package/lib/director/OrderDiscountConfiguration.d.ts.map +0 -1
  87. package/lib/director/OrderDiscountConfiguration.js +0 -2
  88. package/lib/director/OrderDiscountConfiguration.js.map +0 -1
  89. package/lib/director/OrderDiscountDirector.d.ts +0 -3
  90. package/lib/director/OrderDiscountDirector.d.ts.map +0 -1
  91. package/lib/director/OrderDiscountDirector.js +0 -3
  92. package/lib/director/OrderDiscountDirector.js.map +0 -1
  93. package/lib/director/OrderPricingAdapter.d.ts +0 -22
  94. package/lib/director/OrderPricingAdapter.d.ts.map +0 -1
  95. package/lib/director/OrderPricingAdapter.js +0 -25
  96. package/lib/director/OrderPricingAdapter.js.map +0 -1
  97. package/lib/director/OrderPricingDirector.d.ts +0 -18
  98. package/lib/director/OrderPricingDirector.d.ts.map +0 -1
  99. package/lib/director/OrderPricingDirector.js +0 -39
  100. package/lib/director/OrderPricingDirector.js.map +0 -1
  101. package/lib/director/OrderPricingSheet.d.ts +0 -36
  102. package/lib/director/OrderPricingSheet.d.ts.map +0 -1
  103. package/lib/director/OrderPricingSheet.js +0 -108
  104. package/lib/director/OrderPricingSheet.js.map +0 -1
  105. package/lib/module/configureOrdersModule-processing.d.ts +0 -32
  106. package/lib/module/configureOrdersModule-processing.d.ts.map +0 -1
  107. package/lib/module/configureOrdersModule-processing.js +0 -339
  108. package/lib/module/configureOrdersModule-processing.js.map +0 -1
  109. package/lib/module/configureOrdersModule-transformations.d.ts +0 -20
  110. package/lib/module/configureOrdersModule-transformations.d.ts.map +0 -1
  111. package/lib/module/configureOrdersModule-transformations.js +0 -111
  112. package/lib/module/configureOrdersModule-transformations.js.map +0 -1
  113. package/lib/service/migrateOrderCartService.d.ts +0 -10
  114. package/lib/service/migrateOrderCartService.d.ts.map +0 -1
  115. package/lib/service/migrateOrderCartService.js +0 -32
  116. package/lib/service/migrateOrderCartService.js.map +0 -1
  117. package/lib/service/nextUserCartService.d.ts +0 -11
  118. package/lib/service/nextUserCartService.d.ts.map +0 -1
  119. package/lib/service/nextUserCartService.js +0 -34
  120. package/lib/service/nextUserCartService.js.map +0 -1
  121. package/lib/service/orderServices.d.ts +0 -8
  122. package/lib/service/orderServices.d.ts.map +0 -1
  123. package/lib/service/orderServices.js +0 -7
  124. package/lib/service/orderServices.js.map +0 -1
  125. package/lib/types.d.ts +0 -116
  126. package/lib/types.d.ts.map +0 -1
  127. package/lib/types.js +0 -25
  128. package/lib/types.js.map +0 -1
  129. package/src/db/OrderDiscountTrigger.ts +0 -4
  130. package/src/director/OrderDiscountAdapter.ts +0 -8
  131. package/src/director/OrderDiscountConfiguration.ts +0 -5
  132. package/src/director/OrderDiscountDirector.ts +0 -5
  133. package/src/director/OrderPricingAdapter.ts +0 -61
  134. package/src/director/OrderPricingDirector.ts +0 -72
  135. package/src/director/OrderPricingSheet.ts +0 -146
  136. package/src/module/configureOrdersModule-processing.ts +0 -508
  137. package/src/module/configureOrdersModule-transformations.ts +0 -171
  138. package/src/service/migrateOrderCartService.ts +0 -53
  139. package/src/service/nextUserCartService.ts +0 -54
  140. package/src/service/orderServices.ts +0 -12
  141. package/src/types.ts +0 -129
@@ -1,251 +1,78 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
1
  import { emit, registerEvents } from '@unchainedshop/events';
3
2
  import { generateDbFilterById, generateDbObjectId, mongodb } from '@unchainedshop/mongodb';
4
- import { OrderDiscountTrigger } from '../db/OrderDiscountTrigger.js';
5
- import { OrderDiscountDirector } from '../director/OrderDiscountDirector.js';
6
- import { Order, OrderDiscount } from '../types.js';
7
- import {
8
- IPricingSheet,
9
- PricingCalculation,
10
- DiscountAdapterActions,
11
- DiscountContext,
12
- } from '@unchainedshop/utils';
13
-
14
- export type OrderDiscountsModule = {
15
- // Queries
16
- findOrderDiscount: (
17
- params: { discountId: string },
18
- options?: mongodb.FindOptions,
19
- ) => Promise<OrderDiscount>;
20
- findOrderDiscounts: (params: { orderId: string }) => Promise<Array<OrderDiscount>>;
21
-
22
- // Transformations
23
- interface: (
24
- orderDiscount: OrderDiscount,
25
- unchainedAPI: UnchainedCore,
26
- ) => Promise<DiscountAdapterActions<any>>;
27
-
28
- isValid: (orderDiscount: OrderDiscount, unchainedAPI: UnchainedCore) => Promise<boolean>;
29
-
30
- // Adapter
31
- configurationForPricingAdapterKey: (
32
- orderDiscount: OrderDiscount,
33
- adapterKey: string,
34
- calculationSheet: IPricingSheet<PricingCalculation>,
35
- pricingContext: DiscountContext & UnchainedCore,
36
- ) => Promise<any>;
37
-
38
- // Mutations
39
- createManualOrderDiscount: (
40
- params: { code: string; order: Order },
41
- unchainedAPI: UnchainedCore,
42
- ) => Promise<OrderDiscount>;
43
-
44
- create: (doc: OrderDiscount) => Promise<OrderDiscount>;
45
- update: (orderDiscountId: string, doc: OrderDiscount) => Promise<OrderDiscount>;
46
- delete: (orderDiscountId: string, unchainedAPI: UnchainedCore) => Promise<OrderDiscount>;
47
- };
3
+ import { OrderDiscount, OrderDiscountTrigger } from '../db/OrderDiscountsCollection.js';
48
4
 
49
5
  const ORDER_DISCOUNT_EVENTS: string[] = [
50
6
  'ORDER_CREATE_DISCOUNT',
51
7
  'ORDER_UPDATE_DISCOUNT',
52
8
  'ORDER_REMOVE_DISCOUNT',
53
- 'ORDER_ADD_DISCOUNT',
54
9
  ];
55
10
 
56
- const OrderDiscountErrorCode = {
57
- CODE_ALREADY_PRESENT: 'CODE_ALREADY_PRESENT',
58
- CODE_NOT_VALID: 'CODE_NOT_VALID',
59
- };
60
-
61
- export const buildFindByIdSelector = (orderDiscountId: string) =>
11
+ export const buildFindOrderDiscountByIdSelector = (orderDiscountId: string) =>
62
12
  generateDbFilterById(orderDiscountId) as mongodb.Filter<OrderDiscount>;
63
13
 
64
14
  export const configureOrderDiscountsModule = ({
65
15
  OrderDiscounts,
66
16
  }: {
67
17
  OrderDiscounts: mongodb.Collection<OrderDiscount>;
68
- }): OrderDiscountsModule => {
18
+ }) => {
69
19
  registerEvents(ORDER_DISCOUNT_EVENTS);
70
20
 
71
- const getAdapter = async (orderDiscount: OrderDiscount, unchainedAPI: UnchainedCore) => {
72
- const order = await unchainedAPI.modules.orders.findOrder({
73
- orderId: orderDiscount.orderId,
74
- });
75
- const Adapter = OrderDiscountDirector.getAdapter(orderDiscount.discountKey);
76
- if (!Adapter) return null;
77
- const adapter = await Adapter.actions({
78
- context: { order, orderDiscount, code: orderDiscount.code, ...unchainedAPI },
79
- });
80
- return adapter;
81
- };
82
-
83
- const createDiscount: OrderDiscountsModule['create'] = async (doc) => {
84
- const normalizedTrigger = doc.trigger || OrderDiscountTrigger.USER;
85
- const { insertedId: discountId } = await OrderDiscounts.insertOne({
86
- _id: generateDbObjectId(),
87
- created: new Date(),
88
- ...doc,
89
- trigger: normalizedTrigger,
90
- });
91
- const discount = await OrderDiscounts.findOne(buildFindByIdSelector(discountId));
92
- return discount;
93
- };
94
-
95
- const deleteDiscount: OrderDiscountsModule['delete'] = async (orderDiscountId, unchainedAPI) => {
96
- const selector = buildFindByIdSelector(orderDiscountId);
97
- const discount = await OrderDiscounts.findOne(selector, {});
98
- if (discount.trigger === OrderDiscountTrigger.USER) {
99
- // Release
100
- const adapter = await getAdapter(discount, unchainedAPI);
101
- if (!adapter) return null;
102
- await adapter.release();
103
- }
104
- await OrderDiscounts.deleteOne(selector);
105
- await emit('ORDER_REMOVE_DISCOUNT', { discount });
106
- return discount;
107
- };
108
-
109
- const updateDiscount: OrderDiscountsModule['update'] = async (orderDiscountId, doc) => {
110
- const discount = await OrderDiscounts.findOneAndUpdate(
111
- generateDbFilterById(orderDiscountId),
112
- {
113
- $set: {
114
- updated: new Date(),
115
- ...doc,
116
- },
117
- },
118
- { returnDocument: 'after' },
119
- );
120
- await emit('ORDER_UPDATE_DISCOUNT', { discount });
121
- return discount;
122
- };
123
-
124
- const reserveDiscount = async (orderDiscount: OrderDiscount, unchainedAPI: UnchainedCore) => {
125
- const adapter = await getAdapter(orderDiscount, unchainedAPI);
126
- if (!adapter) return null;
127
-
128
- const reservation = await adapter.reserve({
129
- code: orderDiscount.code,
130
- });
131
-
132
- return updateDiscount(orderDiscount._id, { orderId: orderDiscount.orderId, reservation });
133
- };
134
-
135
- const grabDiscount = async (
136
- { code, orderId }: { code: string; orderId: string },
137
- unchainedAPI: UnchainedCore,
138
- ) => {
139
- const existingDiscount = await OrderDiscounts.findOne({ code, orderId });
140
- if (existingDiscount) throw new Error(OrderDiscountErrorCode.CODE_ALREADY_PRESENT);
141
- const discount = await OrderDiscounts.findOne({ code, orderId: null });
142
- if (!discount) return null;
143
- const discountId = discount._id;
144
- try {
145
- const updatedDiscount = await updateDiscount(discountId, { orderId });
146
- const reservedDiscount = await reserveDiscount(updatedDiscount, unchainedAPI);
147
- return reservedDiscount;
148
- } catch (error) {
149
- // Rollback
150
- await updateDiscount(discountId, { orderId: discount.orderId });
151
-
152
- throw error;
153
- }
154
- };
155
-
156
21
  return {
157
22
  // Queries
158
- findOrderDiscount: async ({ discountId }, options) => {
159
- return OrderDiscounts.findOne(buildFindByIdSelector(discountId), options);
23
+ findOrderDiscount: async (
24
+ { discountId }: { discountId: string },
25
+ options?: mongodb.FindOptions,
26
+ ): Promise<OrderDiscount> => {
27
+ return OrderDiscounts.findOne(buildFindOrderDiscountByIdSelector(discountId), options);
160
28
  },
161
- findOrderDiscounts: async ({ orderId }) => {
29
+
30
+ findOrderDiscounts: async ({ orderId }: { orderId: string }): Promise<Array<OrderDiscount>> => {
162
31
  const discounts = OrderDiscounts.find({ orderId });
163
32
  return discounts.toArray();
164
33
  },
165
34
 
166
- // Transformations
167
- interface: async (orderDiscount, unchainedAPI) => {
168
- const adapter = await getAdapter(orderDiscount, unchainedAPI);
169
- return adapter;
170
- },
171
-
172
- isValid: async (orderDiscount, unchainedAPI) => {
173
- const adapter = await getAdapter(orderDiscount, unchainedAPI);
174
- if (!adapter) return null;
175
-
176
- if (orderDiscount.trigger === OrderDiscountTrigger.SYSTEM) {
177
- return adapter.isValidForSystemTriggering();
178
- }
179
-
180
- return adapter.isValidForCodeTriggering({
181
- code: orderDiscount.code,
35
+ create: async (doc: OrderDiscount): Promise<OrderDiscount> => {
36
+ const normalizedTrigger = doc.trigger || OrderDiscountTrigger.USER;
37
+ const { insertedId: discountId } = await OrderDiscounts.insertOne({
38
+ _id: generateDbObjectId(),
39
+ created: new Date(),
40
+ ...doc,
41
+ trigger: normalizedTrigger,
182
42
  });
183
- },
184
-
185
- // Adapter
186
- configurationForPricingAdapterKey: async (
187
- orderDiscount,
188
- adapterKey,
189
- calculationSheet,
190
- unchainedAPI,
191
- ) => {
192
- const adapter = await getAdapter(orderDiscount, unchainedAPI);
193
- if (!adapter) return null;
194
-
195
- return adapter.discountForPricingAdapterKey({
196
- pricingAdapterKey: adapterKey,
197
- calculationSheet,
43
+ const discount = await OrderDiscounts.findOne({
44
+ _id: discountId,
198
45
  });
46
+ await emit('ORDER_CREATE_DISCOUNT', { discount });
47
+ return discount;
199
48
  },
200
49
 
201
- // Mutations
202
- createManualOrderDiscount: async ({ order, code }, unchainedAPI) => {
203
- // Try to grab single-usage-discount
204
- if (!code) throw new Error(OrderDiscountErrorCode.CODE_NOT_VALID);
205
-
206
- const fetchedDiscount = await grabDiscount({ code, orderId: order._id }, unchainedAPI);
207
- if (fetchedDiscount) return fetchedDiscount;
208
-
209
- const director = await OrderDiscountDirector.actions({ order, code }, unchainedAPI);
210
- const discountKey = await director.resolveDiscountKeyFromStaticCode({
211
- code,
212
- });
50
+ delete: async (orderDiscountId: string): Promise<OrderDiscount> => {
51
+ const selector = buildFindOrderDiscountByIdSelector(orderDiscountId);
52
+ const orderDiscount = await OrderDiscounts.findOneAndDelete(selector);
53
+ await emit('ORDER_REMOVE_DISCOUNT', { discount: orderDiscount });
54
+ return orderDiscount;
55
+ },
213
56
 
214
- if (discountKey) {
215
- const newDiscount = await createDiscount({
216
- orderId: order._id,
57
+ isDiscountCodeUsed: async ({ code, orderId }): Promise<boolean> => {
58
+ return (
59
+ (await OrderDiscounts.countDocuments({
217
60
  code,
218
- discountKey,
219
- });
220
-
221
- try {
222
- const reservedDiscount = await reserveDiscount(newDiscount, unchainedAPI);
223
- await emit('ORDER_ADD_DISCOUNT', { discount: reserveDiscount });
224
- return reservedDiscount;
225
- } catch (error) {
226
- await deleteDiscount(newDiscount._id, unchainedAPI);
227
- throw error;
228
- }
229
- }
230
-
231
- throw new Error(OrderDiscountErrorCode.CODE_NOT_VALID);
61
+ orderId,
62
+ })) > 0
63
+ );
232
64
  },
233
65
 
234
- create: async (doc) => {
235
- const discount = await createDiscount(doc);
236
-
237
- if (discount.trigger === OrderDiscountTrigger.USER) {
238
- await emit('ORDER_CREATE_DISCOUNT', { discount });
239
- }
240
-
241
- return discount;
66
+ findSpareDiscount: async ({ code }): Promise<OrderDiscount> => {
67
+ return OrderDiscounts.findOne({
68
+ code,
69
+ orderId: { $in: [undefined, null] },
70
+ });
242
71
  },
243
72
 
244
- delete: deleteDiscount,
245
-
246
- update: async (orderDiscountId, doc) => {
73
+ update: async (orderDiscountId: string, doc: OrderDiscount): Promise<OrderDiscount> => {
247
74
  const discount = await OrderDiscounts.findOneAndUpdate(
248
- generateDbFilterById(orderDiscountId),
75
+ { _id: orderDiscountId },
249
76
  {
250
77
  $set: {
251
78
  updated: new Date(),
@@ -258,5 +85,11 @@ export const configureOrderDiscountsModule = ({
258
85
  await emit('ORDER_UPDATE_DISCOUNT', { discount });
259
86
  return discount;
260
87
  },
88
+ deleteOrderDiscounts: async (orderId: string) => {
89
+ const { deletedCount } = await OrderDiscounts.deleteMany({ orderId });
90
+ return deletedCount;
91
+ },
261
92
  };
262
93
  };
94
+
95
+ export type OrderDiscountsModule = ReturnType<typeof configureOrderDiscountsModule>;