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

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 (190) hide show
  1. package/lib/db/OrderDeliveriesCollection.d.ts +1 -1
  2. package/lib/db/OrderDeliveriesCollection.d.ts.map +1 -1
  3. package/lib/db/OrderDiscountsCollection.d.ts +1 -1
  4. package/lib/db/OrderDiscountsCollection.d.ts.map +1 -1
  5. package/lib/db/OrderPaymentsCollection.d.ts +1 -1
  6. package/lib/db/OrderPaymentsCollection.d.ts.map +1 -1
  7. package/lib/db/OrderPositionsCollection.d.ts +1 -1
  8. package/lib/db/OrderPositionsCollection.d.ts.map +1 -1
  9. package/lib/director/OrderDiscountAdapter.d.ts +2 -2
  10. package/lib/director/OrderDiscountAdapter.d.ts.map +1 -1
  11. package/lib/director/OrderDiscountAdapter.js.map +1 -1
  12. package/lib/director/OrderDiscountDirector.d.ts +1 -1
  13. package/lib/director/OrderDiscountDirector.d.ts.map +1 -1
  14. package/lib/director/OrderDiscountDirector.js.map +1 -1
  15. package/lib/director/OrderPricingAdapter.d.ts +3 -3
  16. package/lib/director/OrderPricingAdapter.d.ts.map +1 -1
  17. package/lib/director/OrderPricingAdapter.js.map +1 -1
  18. package/lib/director/OrderPricingDirector.d.ts +1 -1
  19. package/lib/director/OrderPricingDirector.d.ts.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 +7 -68
  27. package/lib/module/configureOrderDeliveriesModule.js.map +1 -1
  28. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.d.ts +24 -0
  29. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.d.ts.map +1 -0
  30. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.js +101 -0
  31. package/lib/module/configureOrderDeliveriesModule_BACKUP_54554.js.map +1 -0
  32. package/lib/module/configureOrderDeliveriesModule_BASE_54554.d.ts +36 -0
  33. package/lib/module/configureOrderDeliveriesModule_BASE_54554.d.ts.map +1 -0
  34. package/lib/module/configureOrderDeliveriesModule_BASE_54554.js +162 -0
  35. package/lib/module/configureOrderDeliveriesModule_BASE_54554.js.map +1 -0
  36. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.d.ts +23 -0
  37. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.d.ts.map +1 -0
  38. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.js +97 -0
  39. package/lib/module/configureOrderDeliveriesModule_LOCAL_54554.js.map +1 -0
  40. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.d.ts +37 -0
  41. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.d.ts.map +1 -0
  42. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.js +166 -0
  43. package/lib/module/configureOrderDeliveriesModule_REMOTE_54554.js.map +1 -0
  44. package/lib/module/configureOrderDiscountsModule.d.ts +17 -18
  45. package/lib/module/configureOrderDiscountsModule.d.ts.map +1 -1
  46. package/lib/module/configureOrderDiscountsModule.js +31 -140
  47. package/lib/module/configureOrderDiscountsModule.js.map +1 -1
  48. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.d.ts +26 -0
  49. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.d.ts.map +1 -0
  50. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.js +69 -0
  51. package/lib/module/configureOrderDiscountsModule_BACKUP_55046.js.map +1 -0
  52. package/lib/module/configureOrderDiscountsModule_BASE_55046.d.ts +26 -0
  53. package/lib/module/configureOrderDiscountsModule_BASE_55046.d.ts.map +1 -0
  54. package/lib/module/configureOrderDiscountsModule_BASE_55046.js +178 -0
  55. package/lib/module/configureOrderDiscountsModule_BASE_55046.js.map +1 -0
  56. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.d.ts +25 -0
  57. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.d.ts.map +1 -0
  58. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.js +65 -0
  59. package/lib/module/configureOrderDiscountsModule_LOCAL_55046.js.map +1 -0
  60. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.d.ts +27 -0
  61. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.d.ts.map +1 -0
  62. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.js +182 -0
  63. package/lib/module/configureOrderDiscountsModule_REMOTE_55046.js.map +1 -0
  64. package/lib/module/configureOrderPaymentsModule.d.ts +17 -37
  65. package/lib/module/configureOrderPaymentsModule.d.ts.map +1 -1
  66. package/lib/module/configureOrderPaymentsModule.js +10 -118
  67. package/lib/module/configureOrderPaymentsModule.js.map +1 -1
  68. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.d.ts +32 -0
  69. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.d.ts.map +1 -0
  70. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.js +135 -0
  71. package/lib/module/configureOrderPaymentsModule_BACKUP_55464.js.map +1 -0
  72. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.d.ts +32 -0
  73. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.d.ts.map +1 -0
  74. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.js +135 -0
  75. package/lib/module/configureOrderPaymentsModule_BACKUP_55877.js.map +1 -0
  76. package/lib/module/configureOrderPaymentsModule_BASE_55464.d.ts +51 -0
  77. package/lib/module/configureOrderPaymentsModule_BASE_55464.d.ts.map +1 -0
  78. package/lib/module/configureOrderPaymentsModule_BASE_55464.js +243 -0
  79. package/lib/module/configureOrderPaymentsModule_BASE_55464.js.map +1 -0
  80. package/lib/module/configureOrderPaymentsModule_BASE_55877.d.ts +51 -0
  81. package/lib/module/configureOrderPaymentsModule_BASE_55877.d.ts.map +1 -0
  82. package/lib/module/configureOrderPaymentsModule_BASE_55877.js +243 -0
  83. package/lib/module/configureOrderPaymentsModule_BASE_55877.js.map +1 -0
  84. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.d.ts +31 -0
  85. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.d.ts.map +1 -0
  86. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.js +131 -0
  87. package/lib/module/configureOrderPaymentsModule_LOCAL_55464.js.map +1 -0
  88. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.d.ts +31 -0
  89. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.d.ts.map +1 -0
  90. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.js +131 -0
  91. package/lib/module/configureOrderPaymentsModule_LOCAL_55877.js.map +1 -0
  92. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.d.ts +52 -0
  93. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.d.ts.map +1 -0
  94. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.js +247 -0
  95. package/lib/module/configureOrderPaymentsModule_REMOTE_55464.js.map +1 -0
  96. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.d.ts +52 -0
  97. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.d.ts.map +1 -0
  98. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.js +247 -0
  99. package/lib/module/configureOrderPaymentsModule_REMOTE_55877.js.map +1 -0
  100. package/lib/module/configureOrderPositionsModule.d.ts +22 -41
  101. package/lib/module/configureOrderPositionsModule.d.ts.map +1 -1
  102. package/lib/module/configureOrderPositionsModule.js +19 -82
  103. package/lib/module/configureOrderPositionsModule.js.map +1 -1
  104. package/lib/module/configureOrderPositionsModule_BACKUP_56197.d.ts +44 -0
  105. package/lib/module/configureOrderPositionsModule_BACKUP_56197.d.ts.map +1 -0
  106. package/lib/module/configureOrderPositionsModule_BACKUP_56197.js +138 -0
  107. package/lib/module/configureOrderPositionsModule_BACKUP_56197.js.map +1 -0
  108. package/lib/module/configureOrderPositionsModule_BASE_56197.d.ts +60 -0
  109. package/lib/module/configureOrderPositionsModule_BASE_56197.d.ts.map +1 -0
  110. package/lib/module/configureOrderPositionsModule_BASE_56197.js +201 -0
  111. package/lib/module/configureOrderPositionsModule_BASE_56197.js.map +1 -0
  112. package/lib/module/configureOrderPositionsModule_LOCAL_56197.d.ts +43 -0
  113. package/lib/module/configureOrderPositionsModule_LOCAL_56197.d.ts.map +1 -0
  114. package/lib/module/configureOrderPositionsModule_LOCAL_56197.js +134 -0
  115. package/lib/module/configureOrderPositionsModule_LOCAL_56197.js.map +1 -0
  116. package/lib/module/configureOrderPositionsModule_REMOTE_56197.d.ts +61 -0
  117. package/lib/module/configureOrderPositionsModule_REMOTE_56197.d.ts.map +1 -0
  118. package/lib/module/configureOrderPositionsModule_REMOTE_56197.js +205 -0
  119. package/lib/module/configureOrderPositionsModule_REMOTE_56197.js.map +1 -0
  120. package/lib/module/configureOrdersModule-mutations.d.ts +4 -11
  121. package/lib/module/configureOrdersModule-mutations.d.ts.map +1 -1
  122. package/lib/module/configureOrdersModule-mutations.js +10 -49
  123. package/lib/module/configureOrdersModule-mutations.js.map +1 -1
  124. package/lib/module/configureOrdersModule-processing.d.ts +4 -8
  125. package/lib/module/configureOrdersModule-processing.d.ts.map +1 -1
  126. package/lib/module/configureOrdersModule-processing.js +3 -1
  127. package/lib/module/configureOrdersModule-processing.js.map +1 -1
  128. package/lib/module/configureOrdersModule-queries.d.ts +10 -5
  129. package/lib/module/configureOrdersModule-queries.d.ts.map +1 -1
  130. package/lib/module/configureOrdersModule-queries.js +35 -22
  131. package/lib/module/configureOrdersModule-queries.js.map +1 -1
  132. package/lib/module/configureOrdersModule-transformations.d.ts +2 -3
  133. package/lib/module/configureOrdersModule-transformations.d.ts.map +1 -1
  134. package/lib/module/configureOrdersModule-transformations.js +3 -3
  135. package/lib/module/configureOrdersModule-transformations.js.map +1 -1
  136. package/lib/module/configureOrdersModule.d.ts +11 -8
  137. package/lib/module/configureOrdersModule.d.ts.map +1 -1
  138. package/lib/module/configureOrdersModule.js +133 -153
  139. package/lib/module/configureOrdersModule.js.map +1 -1
  140. package/lib/orders-index.d.ts +0 -7
  141. package/lib/orders-index.d.ts.map +1 -1
  142. package/lib/orders-index.js +0 -7
  143. package/lib/orders-index.js.map +1 -1
  144. package/lib/orders-settings.d.ts +3 -7
  145. package/lib/orders-settings.d.ts.map +1 -1
  146. package/lib/orders-settings.js.map +1 -1
  147. package/lib/types.d.ts +8 -9
  148. package/lib/types.d.ts.map +1 -1
  149. package/lib/types.js.map +1 -1
  150. package/package.json +9 -12
  151. package/src/db/OrderDeliveriesCollection.ts +1 -1
  152. package/src/db/OrderDiscountsCollection.ts +1 -1
  153. package/src/db/OrderPaymentsCollection.ts +1 -1
  154. package/src/db/OrderPositionsCollection.ts +1 -1
  155. package/src/module/buildFindSelector.test.ts +1 -1
  156. package/src/module/buildFindSelector.ts +24 -0
  157. package/src/module/configureOrderDeliveriesModule.ts +29 -172
  158. package/src/module/configureOrderDiscountsModule.ts +44 -210
  159. package/src/module/configureOrderPaymentsModule.ts +51 -261
  160. package/src/module/configureOrderPositionsModule.ts +54 -205
  161. package/src/module/configureOrdersModule-mutations.ts +12 -85
  162. package/src/module/configureOrdersModule-queries.ts +53 -29
  163. package/src/module/configureOrdersModule.ts +180 -263
  164. package/src/orders-index.ts +0 -9
  165. package/src/orders-settings.ts +4 -6
  166. package/src/types.ts +8 -9
  167. package/tsconfig.json +5 -7
  168. package/lib/service/migrateOrderCartService.d.ts +0 -10
  169. package/lib/service/migrateOrderCartService.d.ts.map +0 -1
  170. package/lib/service/migrateOrderCartService.js +0 -32
  171. package/lib/service/migrateOrderCartService.js.map +0 -1
  172. package/lib/service/nextUserCartService.d.ts +0 -11
  173. package/lib/service/nextUserCartService.d.ts.map +0 -1
  174. package/lib/service/nextUserCartService.js +0 -34
  175. package/lib/service/nextUserCartService.js.map +0 -1
  176. package/lib/service/orderServices.d.ts +0 -8
  177. package/lib/service/orderServices.d.ts.map +0 -1
  178. package/lib/service/orderServices.js +0 -7
  179. package/lib/service/orderServices.js.map +0 -1
  180. package/src/director/OrderDiscountAdapter.ts +0 -8
  181. package/src/director/OrderDiscountConfiguration.ts +0 -5
  182. package/src/director/OrderDiscountDirector.ts +0 -5
  183. package/src/director/OrderPricingAdapter.ts +0 -61
  184. package/src/director/OrderPricingDirector.ts +0 -72
  185. package/src/director/OrderPricingSheet.ts +0 -146
  186. package/src/module/configureOrdersModule-processing.ts +0 -508
  187. package/src/module/configureOrdersModule-transformations.ts +0 -171
  188. package/src/service/migrateOrderCartService.ts +0 -53
  189. package/src/service/nextUserCartService.ts +0 -54
  190. package/src/service/orderServices.ts +0 -12
@@ -1,63 +1,14 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
1
  import { emit, registerEvents } from '@unchainedshop/events';
3
2
  import { generateDbFilterById, generateDbObjectId, mongodb } from '@unchainedshop/mongodb';
4
3
  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
- };
4
+ import { OrderDiscount } from '../types.js';
48
5
 
49
6
  const ORDER_DISCOUNT_EVENTS: string[] = [
50
7
  'ORDER_CREATE_DISCOUNT',
51
8
  'ORDER_UPDATE_DISCOUNT',
52
9
  'ORDER_REMOVE_DISCOUNT',
53
- 'ORDER_ADD_DISCOUNT',
54
10
  ];
55
11
 
56
- const OrderDiscountErrorCode = {
57
- CODE_ALREADY_PRESENT: 'CODE_ALREADY_PRESENT',
58
- CODE_NOT_VALID: 'CODE_NOT_VALID',
59
- };
60
-
61
12
  export const buildFindByIdSelector = (orderDiscountId: string) =>
62
13
  generateDbFilterById(orderDiscountId) as mongodb.Filter<OrderDiscount>;
63
14
 
@@ -65,187 +16,64 @@ export const configureOrderDiscountsModule = ({
65
16
  OrderDiscounts,
66
17
  }: {
67
18
  OrderDiscounts: mongodb.Collection<OrderDiscount>;
68
- }): OrderDiscountsModule => {
19
+ }) => {
69
20
  registerEvents(ORDER_DISCOUNT_EVENTS);
70
21
 
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
22
  return {
157
23
  // Queries
158
- findOrderDiscount: async ({ discountId }, options) => {
24
+ findOrderDiscount: async (
25
+ { discountId }: { discountId: string },
26
+ options?: mongodb.FindOptions,
27
+ ): Promise<OrderDiscount> => {
159
28
  return OrderDiscounts.findOne(buildFindByIdSelector(discountId), options);
160
29
  },
161
- findOrderDiscounts: async ({ orderId }) => {
30
+
31
+ findOrderDiscounts: async ({ orderId }: { orderId: string }): Promise<Array<OrderDiscount>> => {
162
32
  const discounts = OrderDiscounts.find({ orderId });
163
33
  return discounts.toArray();
164
34
  },
165
35
 
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,
36
+ create: async (doc: OrderDiscount): Promise<OrderDiscount> => {
37
+ const normalizedTrigger = doc.trigger || OrderDiscountTrigger.USER;
38
+ const { insertedId: discountId } = await OrderDiscounts.insertOne({
39
+ _id: generateDbObjectId(),
40
+ created: new Date(),
41
+ ...doc,
42
+ trigger: normalizedTrigger,
182
43
  });
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,
44
+ const discount = await OrderDiscounts.findOne({
45
+ _id: discountId,
198
46
  });
47
+ await emit('ORDER_CREATE_DISCOUNT', { discount });
48
+ return discount;
199
49
  },
200
50
 
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
- });
51
+ delete: async (orderDiscountId: string): Promise<OrderDiscount> => {
52
+ const selector = buildFindByIdSelector(orderDiscountId);
53
+ const orderDiscount = await OrderDiscounts.findOneAndDelete(selector);
54
+ await emit('ORDER_REMOVE_DISCOUNT', { discount: orderDiscount });
55
+ return orderDiscount;
56
+ },
213
57
 
214
- if (discountKey) {
215
- const newDiscount = await createDiscount({
216
- orderId: order._id,
58
+ isDiscountCodeUsed: async ({ code, orderId }): Promise<boolean> => {
59
+ return (
60
+ (await OrderDiscounts.countDocuments({
217
61
  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);
62
+ orderId,
63
+ })) > 0
64
+ );
232
65
  },
233
66
 
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;
67
+ findSpareDiscount: async ({ code }): Promise<OrderDiscount> => {
68
+ return OrderDiscounts.findOne({
69
+ code,
70
+ orderId: { $in: [undefined, null] },
71
+ });
242
72
  },
243
73
 
244
- delete: deleteDiscount,
245
-
246
- update: async (orderDiscountId, doc) => {
74
+ update: async (orderDiscountId: string, doc: OrderDiscount): Promise<OrderDiscount> => {
247
75
  const discount = await OrderDiscounts.findOneAndUpdate(
248
- generateDbFilterById(orderDiscountId),
76
+ { _id: orderDiscountId },
249
77
  {
250
78
  $set: {
251
79
  updated: new Date(),
@@ -258,5 +86,11 @@ export const configureOrderDiscountsModule = ({
258
86
  await emit('ORDER_UPDATE_DISCOUNT', { discount });
259
87
  return discount;
260
88
  },
89
+ deleteOrderDiscounts: async (orderId: string) => {
90
+ const { deletedCount } = await OrderDiscounts.deleteMany({ orderId });
91
+ return deletedCount;
92
+ },
261
93
  };
262
94
  };
95
+
96
+ export type OrderDiscountsModule = ReturnType<typeof configureOrderDiscountsModule>;
@@ -1,94 +1,7 @@
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 { Order, OrderDiscount, OrderPayment, OrderPaymentStatus } from '../types.js';
5
- import { IPaymentPricingSheet } from '@unchainedshop/core-payment';
6
- import { OrderPricingDiscount } from '../director/OrderPricingDirector.js';
7
-
8
- export type OrderPaymentsModule = {
9
- // Queries
10
- findOrderPayment: (
11
- params: {
12
- orderPaymentId: string;
13
- },
14
- options?: mongodb.FindOptions,
15
- ) => Promise<OrderPayment>;
16
-
17
- findOrderPaymentByContextData: (
18
- params: {
19
- context: any;
20
- },
21
- options?: mongodb.FindOptions,
22
- ) => Promise<OrderPayment>;
23
-
24
- countOrderPaymentsByContextData: (
25
- params: {
26
- context: any;
27
- },
28
- options?: mongodb.FindOptions,
29
- ) => Promise<number>;
30
-
31
- // Transformations
32
- discounts: (
33
- orderPayment: OrderPayment,
34
- params: { order: Order; orderDiscount: OrderDiscount },
35
- unchainedAPI: UnchainedCore,
36
- ) => Array<OrderPricingDiscount>;
37
- isBlockingOrderConfirmation: (
38
- orderPayment: OrderPayment,
39
- unchainedAPI: UnchainedCore,
40
- ) => Promise<boolean>;
41
- isBlockingOrderFullfillment: (orderPayment: OrderPayment) => boolean;
42
- normalizedStatus: (orderPayment: OrderPayment) => string;
43
- pricingSheet: (
44
- orderPayment: OrderPayment,
45
- currency: string,
46
- unchainedAPI: UnchainedCore,
47
- ) => IPaymentPricingSheet;
48
-
49
- // Mutations
50
- create: (doc: OrderPayment) => Promise<OrderPayment>;
51
-
52
- cancel: (
53
- orderPayment: OrderPayment,
54
- paymentContext: {
55
- transactionContext: any;
56
- userId: string;
57
- },
58
- unchainedAPI: UnchainedCore,
59
- ) => Promise<OrderPayment>;
60
-
61
- confirm: (
62
- orderPayment: OrderPayment,
63
- paymentContext: {
64
- transactionContext: any;
65
- userId: string;
66
- },
67
- unchainedAPI: UnchainedCore,
68
- ) => Promise<OrderPayment>;
69
-
70
- charge: (
71
- orderPayment: OrderPayment,
72
- paymentContext: {
73
- transactionContext: any;
74
- userId: string;
75
- },
76
- unchainedAPI: UnchainedCore,
77
- ) => Promise<OrderPayment>;
78
-
79
- logEvent: (orderPaymentId: string, event: any) => Promise<boolean>;
80
-
81
- markAsPaid: (payment: OrderPayment, meta: any) => Promise<void>;
82
-
83
- updateContext: (orderPaymentId: string, context: any) => Promise<OrderPayment | null>;
84
-
85
- updateStatus: (
86
- orderPaymentId: string,
87
- params: { transactionId?: string; status: OrderPaymentStatus; info?: string },
88
- ) => Promise<OrderPayment>;
89
-
90
- updateCalculation: (orderPayment: OrderPayment, unchainedAPI: UnchainedCore) => Promise<OrderPayment>;
91
- };
3
+ import { OrderPayment, OrderPaymentStatus } from '../types.js';
4
+ import { PricingCalculation } from '@unchainedshop/utils';
92
5
 
93
6
  const ORDER_PAYMENT_EVENTS: string[] = ['ORDER_UPDATE_PAYMENT', 'ORDER_SIGN_PAYMENT', 'ORDER_PAY'];
94
7
 
@@ -117,32 +30,23 @@ export const configureOrderPaymentsModule = ({
117
30
  OrderPayments,
118
31
  }: {
119
32
  OrderPayments: mongodb.Collection<OrderPayment>;
120
- }): OrderPaymentsModule => {
33
+ }) => {
121
34
  registerEvents(ORDER_PAYMENT_EVENTS);
122
35
 
123
- const normalizedStatus: OrderPaymentsModule['normalizedStatus'] = (orderPayment) => {
36
+ const normalizedStatus = (orderPayment: OrderPayment) => {
124
37
  return orderPayment.status === null
125
38
  ? OrderPaymentStatus.OPEN
126
39
  : (orderPayment.status as OrderPaymentStatus);
127
40
  };
128
41
 
129
- const buildPaymentProviderActionsContext = (
130
- orderPayment: OrderPayment,
131
- { transactionContext, ...rest }: { transactionContext: any; userId: string },
132
- ) => ({
133
- ...rest,
134
- orderPayment,
135
- paymentProviderId: orderPayment.paymentProviderId,
136
- transactionContext: {
137
- ...(transactionContext || {}),
138
- ...(orderPayment.context || {}),
139
- },
140
- });
141
-
142
- const updateStatus: OrderPaymentsModule['updateStatus'] = async (
143
- orderPaymentId,
144
- { status, transactionId, info },
145
- ) => {
42
+ const updateStatus = async (
43
+ orderPaymentId: string,
44
+ {
45
+ transactionId,
46
+ status,
47
+ info,
48
+ }: { transactionId?: string; status: OrderPaymentStatus; info?: string },
49
+ ): Promise<OrderPayment> => {
146
50
  const date = new Date();
147
51
  const modifier: mongodb.UpdateFilter<OrderPayment> = {
148
52
  $set: { status, updated: new Date() },
@@ -171,61 +75,46 @@ export const configureOrderPaymentsModule = ({
171
75
 
172
76
  return {
173
77
  // Queries
174
- findOrderPayment: async ({ orderPaymentId }, options) => {
78
+ findOrderPayment: async (
79
+ {
80
+ orderPaymentId,
81
+ }: {
82
+ orderPaymentId: string;
83
+ },
84
+ options?: mongodb.FindOptions,
85
+ ): Promise<OrderPayment> => {
175
86
  return OrderPayments.findOne(buildFindByIdSelector(orderPaymentId), options);
176
87
  },
177
- findOrderPaymentByContextData: async ({ context }, options) => {
88
+ findOrderPaymentByContextData: async (
89
+ {
90
+ context,
91
+ }: {
92
+ context: any;
93
+ },
94
+ options?: mongodb.FindOptions,
95
+ ): Promise<OrderPayment> => {
178
96
  const selector = buildFindByContextDataSelector(context);
179
97
 
180
98
  return OrderPayments.findOne(selector, options);
181
99
  },
182
- countOrderPaymentsByContextData: async ({ context }, options) => {
100
+ countOrderPaymentsByContextData: async (
101
+ {
102
+ context,
103
+ }: {
104
+ context: any;
105
+ },
106
+ options?: mongodb.FindOptions,
107
+ ) => {
183
108
  const selector = buildFindByContextDataSelector(context);
184
109
 
185
110
  return OrderPayments.countDocuments(selector, options);
186
111
  },
187
- // Transformations
188
- discounts: (orderPayment, { order, orderDiscount }, context) => {
189
- const { modules } = context;
190
- if (!orderPayment) return [];
191
- const pricingSheet = modules.orders.payments.pricingSheet(orderPayment, order.currency, context);
192
- return pricingSheet.discountPrices(orderDiscount._id).map((discount) => ({
193
- payment: orderPayment,
194
- ...discount,
195
- }));
196
- },
197
-
198
- isBlockingOrderConfirmation: async (orderPayment, unchainedAPI) => {
199
- if (orderPayment.status === OrderPaymentStatus.PAID) return false;
200
-
201
- const provider = await unchainedAPI.modules.payment.paymentProviders.findProvider({
202
- paymentProviderId: orderPayment.paymentProviderId,
203
- });
204
-
205
- const isPayLaterAllowed = await unchainedAPI.modules.payment.paymentProviders.isPayLaterAllowed(
206
- provider,
207
- unchainedAPI,
208
- );
209
-
210
- return !isPayLaterAllowed;
211
- },
212
- isBlockingOrderFullfillment: (orderPayment) => {
213
- if (orderPayment.status === OrderPaymentStatus.PAID) return false;
214
- return true;
215
- },
216
112
 
217
113
  normalizedStatus,
218
114
 
219
- pricingSheet: (orderPayment, currency, { modules }) => {
220
- return modules.payment.paymentProviders.pricingSheet({
221
- calculation: orderPayment.calculation,
222
- currency,
223
- });
224
- },
225
-
226
115
  // Mutations
227
116
 
228
- create: async (doc) => {
117
+ create: async (doc: OrderPayment): Promise<OrderPayment> => {
229
118
  const { insertedId: orderPaymentId } = await OrderPayments.insertOne({
230
119
  _id: generateDbObjectId(),
231
120
  created: new Date(),
@@ -239,108 +128,7 @@ export const configureOrderPaymentsModule = ({
239
128
  return orderPayment;
240
129
  },
241
130
 
242
- confirm: async (orderPayment, paymentContext, unchainedAPI) => {
243
- const { modules } = unchainedAPI;
244
-
245
- if (normalizedStatus(orderPayment) !== OrderPaymentStatus.PAID) {
246
- return orderPayment;
247
- }
248
-
249
- const arbitraryResponseData = await modules.payment.paymentProviders.confirm(
250
- orderPayment.paymentProviderId,
251
- buildPaymentProviderActionsContext(orderPayment, paymentContext),
252
- unchainedAPI,
253
- );
254
-
255
- if (arbitraryResponseData) {
256
- return updateStatus(orderPayment._id, {
257
- status: OrderPaymentStatus.PAID,
258
- info: JSON.stringify(arbitraryResponseData),
259
- });
260
- }
261
-
262
- return orderPayment;
263
- },
264
-
265
- cancel: async (orderPayment, paymentContext, unchainedAPI) => {
266
- const { modules } = unchainedAPI;
267
-
268
- if (normalizedStatus(orderPayment) !== OrderPaymentStatus.PAID) {
269
- return orderPayment;
270
- }
271
-
272
- const arbitraryResponseData = await modules.payment.paymentProviders.cancel(
273
- orderPayment.paymentProviderId,
274
- buildPaymentProviderActionsContext(orderPayment, paymentContext),
275
- unchainedAPI,
276
- );
277
-
278
- if (arbitraryResponseData) {
279
- return updateStatus(orderPayment._id, {
280
- status: OrderPaymentStatus.REFUNDED,
281
- info: JSON.stringify(arbitraryResponseData),
282
- });
283
- }
284
-
285
- return orderPayment;
286
- },
287
-
288
- charge: async (orderPayment, context, unchainedAPI) => {
289
- const { modules } = unchainedAPI;
290
-
291
- if (normalizedStatus(orderPayment) !== OrderPaymentStatus.OPEN) {
292
- return orderPayment;
293
- }
294
-
295
- const paymentCredentials =
296
- context.transactionContext?.paymentCredentials ||
297
- (await modules.payment.paymentCredentials.findPaymentCredential({
298
- userId: context.userId,
299
- paymentProviderId: orderPayment.paymentProviderId,
300
- isPreferred: true,
301
- }));
302
-
303
- const paymentContext = buildPaymentProviderActionsContext(orderPayment, {
304
- ...context,
305
- transactionContext: {
306
- ...context.transactionContext,
307
- paymentCredentials,
308
- },
309
- });
310
-
311
- const result = await modules.payment.paymentProviders.charge(
312
- orderPayment.paymentProviderId,
313
- paymentContext,
314
- unchainedAPI,
315
- );
316
-
317
- if (!result) return orderPayment;
318
-
319
- const { credentials, ...arbitraryResponseData } = result;
320
-
321
- if (credentials) {
322
- const { token, ...meta } = credentials;
323
- await modules.payment.paymentCredentials.upsertCredentials({
324
- userId: paymentContext.userId,
325
- paymentProviderId: orderPayment.paymentProviderId,
326
- token,
327
- ...meta,
328
- });
329
- }
330
-
331
- if (arbitraryResponseData) {
332
- const { transactionId, ...info } = arbitraryResponseData;
333
- return updateStatus(orderPayment._id, {
334
- transactionId,
335
- status: OrderPaymentStatus.PAID,
336
- info: JSON.stringify(info),
337
- });
338
- }
339
-
340
- return orderPayment;
341
- },
342
-
343
- logEvent: async (orderPaymentId, event) => {
131
+ logEvent: async (orderPaymentId: string, event: any): Promise<boolean> => {
344
132
  const date = new Date();
345
133
  const modifier = {
346
134
  $push: {
@@ -356,7 +144,7 @@ export const configureOrderPaymentsModule = ({
356
144
  return true;
357
145
  },
358
146
 
359
- markAsPaid: async (orderPayment, meta) => {
147
+ markAsPaid: async (orderPayment: OrderPayment, meta: any) => {
360
148
  if (normalizedStatus(orderPayment) !== OrderPaymentStatus.OPEN) return;
361
149
 
362
150
  await updateStatus(orderPayment._id, {
@@ -366,7 +154,7 @@ export const configureOrderPaymentsModule = ({
366
154
  await emit('ORDER_PAY', { orderPayment });
367
155
  },
368
156
 
369
- updateContext: async (orderPaymentId, context) => {
157
+ updateContext: async (orderPaymentId: string, context: any): Promise<OrderPayment> => {
370
158
  const selector = buildFindByIdSelector(orderPaymentId);
371
159
  if (!context || Object.keys(context).length === 0) return OrderPayments.findOne(selector, {});
372
160
 
@@ -396,16 +184,12 @@ export const configureOrderPaymentsModule = ({
396
184
 
397
185
  updateStatus,
398
186
 
399
- updateCalculation: async (orderPayment, unchainedAPI) => {
400
- const calculation = await unchainedAPI.modules.payment.paymentProviders.calculate(
401
- {
402
- item: orderPayment,
403
- },
404
- unchainedAPI,
405
- );
406
-
187
+ updateCalculation: async <T extends PricingCalculation>(
188
+ orderPaymentId: string,
189
+ calculation: Array<T>,
190
+ ) => {
407
191
  return OrderPayments.findOneAndUpdate(
408
- buildFindByIdSelector(orderPayment._id),
192
+ buildFindByIdSelector(orderPaymentId),
409
193
  {
410
194
  $set: {
411
195
  calculation,
@@ -417,5 +201,11 @@ export const configureOrderPaymentsModule = ({
417
201
  },
418
202
  );
419
203
  },
204
+ deleteOrderPayments: async (orderId: string) => {
205
+ const { deletedCount } = await OrderPayments.deleteMany({ orderId });
206
+ return deletedCount;
207
+ },
420
208
  };
421
209
  };
210
+
211
+ export type OrderPaymentsModule = ReturnType<typeof configureOrderPaymentsModule>;