@unchainedshop/core-orders 4.3.4 → 4.5.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 (84) hide show
  1. package/README.md +137 -3
  2. package/lib/db/OrderDeliveriesCollection.d.ts +8 -8
  3. package/lib/db/OrderDeliveriesCollection.js +6 -9
  4. package/lib/db/OrderDiscountsCollection.d.ts +7 -7
  5. package/lib/db/OrderDiscountsCollection.js +5 -8
  6. package/lib/db/OrderPaymentsCollection.d.ts +8 -8
  7. package/lib/db/OrderPaymentsCollection.js +6 -9
  8. package/lib/db/OrderPositionsCollection.d.ts +2 -3
  9. package/lib/db/OrderPositionsCollection.js +1 -3
  10. package/lib/db/OrdersCollection.d.ts +13 -10
  11. package/lib/db/OrdersCollection.js +7 -10
  12. package/lib/migrations/20250502111800-currency-code.d.ts +1 -2
  13. package/lib/migrations/20250502111800-currency-code.js +1 -2
  14. package/lib/module/buildFindSelector.d.ts +2 -3
  15. package/lib/module/buildFindSelector.js +6 -4
  16. package/lib/module/configureOrderDeliveriesModule.d.ts +2 -3
  17. package/lib/module/configureOrderDeliveriesModule.js +2 -7
  18. package/lib/module/configureOrderDiscountsModule.d.ts +1 -2
  19. package/lib/module/configureOrderDiscountsModule.js +2 -4
  20. package/lib/module/configureOrderPaymentsModule.d.ts +2 -3
  21. package/lib/module/configureOrderPaymentsModule.js +2 -9
  22. package/lib/module/configureOrderPositionsModule.d.ts +10 -3
  23. package/lib/module/configureOrderPositionsModule.js +48 -4
  24. package/lib/module/configureOrdersModule-mutations.d.ts +8 -4
  25. package/lib/module/configureOrdersModule-mutations.js +23 -3
  26. package/lib/module/configureOrdersModule-queries.d.ts +28 -4
  27. package/lib/module/configureOrdersModule-queries.js +127 -3
  28. package/lib/module/configureOrdersModule.d.ts +58 -40
  29. package/lib/module/configureOrdersModule.js +17 -23
  30. package/lib/orders-index.d.ts +13 -14
  31. package/lib/orders-index.js +13 -14
  32. package/lib/orders-settings.d.ts +1 -2
  33. package/lib/orders-settings.js +0 -1
  34. package/package.json +12 -10
  35. package/lib/db/OrderDeliveriesCollection.d.ts.map +0 -1
  36. package/lib/db/OrderDeliveriesCollection.js.map +0 -1
  37. package/lib/db/OrderDiscountsCollection.d.ts.map +0 -1
  38. package/lib/db/OrderDiscountsCollection.js.map +0 -1
  39. package/lib/db/OrderPaymentsCollection.d.ts.map +0 -1
  40. package/lib/db/OrderPaymentsCollection.js.map +0 -1
  41. package/lib/db/OrderPositionsCollection.d.ts.map +0 -1
  42. package/lib/db/OrderPositionsCollection.js.map +0 -1
  43. package/lib/db/OrdersCollection.d.ts.map +0 -1
  44. package/lib/db/OrdersCollection.js.map +0 -1
  45. package/lib/migrations/20250502111800-currency-code.d.ts.map +0 -1
  46. package/lib/migrations/20250502111800-currency-code.js.map +0 -1
  47. package/lib/module/buildFindSelector.d.ts.map +0 -1
  48. package/lib/module/buildFindSelector.js.map +0 -1
  49. package/lib/module/configureOrderDeliveriesModule.d.ts.map +0 -1
  50. package/lib/module/configureOrderDeliveriesModule.js.map +0 -1
  51. package/lib/module/configureOrderDiscountsModule.d.ts.map +0 -1
  52. package/lib/module/configureOrderDiscountsModule.js.map +0 -1
  53. package/lib/module/configureOrderPaymentsModule.d.ts.map +0 -1
  54. package/lib/module/configureOrderPaymentsModule.js.map +0 -1
  55. package/lib/module/configureOrderPositionsModule.d.ts.map +0 -1
  56. package/lib/module/configureOrderPositionsModule.js.map +0 -1
  57. package/lib/module/configureOrdersModule-mutations.d.ts.map +0 -1
  58. package/lib/module/configureOrdersModule-mutations.js.map +0 -1
  59. package/lib/module/configureOrdersModule-queries.d.ts.map +0 -1
  60. package/lib/module/configureOrdersModule-queries.js.map +0 -1
  61. package/lib/module/configureOrdersModule.d.ts.map +0 -1
  62. package/lib/module/configureOrdersModule.js.map +0 -1
  63. package/lib/orders-index.d.ts.map +0 -1
  64. package/lib/orders-index.js.map +0 -1
  65. package/lib/orders-settings.d.ts.map +0 -1
  66. package/lib/orders-settings.js.map +0 -1
  67. package/src/db/OrderDeliveriesCollection.ts +0 -34
  68. package/src/db/OrderDiscountsCollection.ts +0 -30
  69. package/src/db/OrderPaymentsCollection.ts +0 -35
  70. package/src/db/OrderPositionsCollection.ts +0 -32
  71. package/src/db/OrdersCollection.ts +0 -87
  72. package/src/migrations/20250502111800-currency-code.ts +0 -18
  73. package/src/module/buildFindSelector.test.ts +0 -121
  74. package/src/module/buildFindSelector.ts +0 -49
  75. package/src/module/configureOrderDeliveriesModule.ts +0 -157
  76. package/src/module/configureOrderDiscountsModule.ts +0 -95
  77. package/src/module/configureOrderPaymentsModule.ts +0 -224
  78. package/src/module/configureOrderPositionsModule.ts +0 -244
  79. package/src/module/configureOrdersModule-mutations.ts +0 -178
  80. package/src/module/configureOrdersModule-queries.ts +0 -159
  81. package/src/module/configureOrdersModule.ts +0 -257
  82. package/src/orders-index.ts +0 -13
  83. package/src/orders-settings.ts +0 -45
  84. package/tsconfig.json +0 -9
@@ -1,257 +0,0 @@
1
- import { generateDbFilterById, ModuleInput, mongodb } from '@unchainedshop/mongodb';
2
- import { createRequire } from 'node:module';
3
- import { OrderDeliveriesCollection } from '../db/OrderDeliveriesCollection.js';
4
- import { OrderDiscountsCollection } from '../db/OrderDiscountsCollection.js';
5
- import { OrderPaymentsCollection } from '../db/OrderPaymentsCollection.js';
6
- import { OrderPositionsCollection } from '../db/OrderPositionsCollection.js';
7
- import { OrdersCollection, Order, OrderStatus } from '../db/OrdersCollection.js';
8
- import { ordersSettings, OrdersSettingsOptions } from '../orders-settings.js';
9
- import { configureOrderDeliveriesModule } from './configureOrderDeliveriesModule.js';
10
- import { configureOrderDiscountsModule } from './configureOrderDiscountsModule.js';
11
- import { configureOrderPaymentsModule } from './configureOrderPaymentsModule.js';
12
- import { configureOrderPositionsModule } from './configureOrderPositionsModule.js';
13
- import { configureOrderModuleMutations } from './configureOrdersModule-mutations.js';
14
- import { configureOrdersModuleQueries } from './configureOrdersModule-queries.js';
15
- import { emit, registerEvents } from '@unchainedshop/events';
16
-
17
- import renameCurrencyCode from '../migrations/20250502111800-currency-code.js';
18
-
19
- // @kontsedal/locco uses a deprecated way of importing files in ESM (node16 behavior)
20
- const require = createRequire(import.meta.url);
21
- const { Locker, MongoAdapter } = require('@kontsedal/locco');
22
-
23
- const ORDER_EVENTS: string[] = [
24
- 'ORDER_CHECKOUT',
25
- 'ORDER_CONFIRMED',
26
- 'ORDER_REJECTED',
27
- 'ORDER_FULLFILLED',
28
- ];
29
-
30
- export const configureOrdersModule = async ({
31
- db,
32
- migrationRepository,
33
- options: orderOptions = {},
34
- }: ModuleInput<OrdersSettingsOptions>) => {
35
- // Migration v3 -> v4
36
- renameCurrencyCode(migrationRepository);
37
-
38
- registerEvents(ORDER_EVENTS);
39
-
40
- ordersSettings.configureSettings(orderOptions);
41
-
42
- const Orders = await OrdersCollection(db);
43
- const OrderDeliveries = await OrderDeliveriesCollection(db);
44
- const OrderDiscounts = await OrderDiscountsCollection(db);
45
- const OrderPayments = await OrderPaymentsCollection(db);
46
- const OrderPositions = await OrderPositionsCollection(db);
47
-
48
- const mongoAdapter = new MongoAdapter({
49
- client: {
50
- db: () => db,
51
- },
52
- });
53
- const locker = new Locker({
54
- adapter: mongoAdapter,
55
- retrySettings: { retryDelay: 200, retryTimes: 10 },
56
- });
57
-
58
- const orderQueries = configureOrdersModuleQueries({ Orders });
59
-
60
- const orderMutations = configureOrderModuleMutations({
61
- Orders,
62
- OrderPositions,
63
- });
64
-
65
- const orderDiscountsModule = configureOrderDiscountsModule({
66
- OrderDiscounts,
67
- });
68
-
69
- const orderPositionsModule = configureOrderPositionsModule({
70
- OrderPositions,
71
- });
72
-
73
- const orderPaymentsModule = configureOrderPaymentsModule({
74
- OrderPayments,
75
- });
76
-
77
- const orderDeliveriesModule = configureOrderDeliveriesModule({
78
- OrderDeliveries,
79
- });
80
-
81
- const findNewOrderNumber = async (order: Order, index = 0) => {
82
- const newHashID = ordersSettings.orderNumberHashFn(order, index);
83
- if ((await Orders.countDocuments({ orderNumber: newHashID }, { limit: 1 })) === 0) {
84
- return newHashID;
85
- }
86
- return findNewOrderNumber(order, index + 1);
87
- };
88
-
89
- return {
90
- ...orderQueries,
91
- ...orderMutations,
92
-
93
- // Subentities
94
- deliveries: orderDeliveriesModule,
95
- discounts: orderDiscountsModule,
96
- positions: orderPositionsModule,
97
- payments: orderPaymentsModule,
98
-
99
- updateStatus: async (
100
- orderId: string,
101
- { status, info }: { status: OrderStatus | null; info?: string },
102
- ) => {
103
- const selector = generateDbFilterById(orderId);
104
- const order = await Orders.findOne(selector, {});
105
-
106
- if (!order) return null;
107
- if (order.status === status) return order;
108
-
109
- const date = new Date();
110
- const $set: Partial<Order> = {
111
- status,
112
- updated: new Date(),
113
- };
114
- switch (status) {
115
- // explicitly use fallthrough here!
116
- case OrderStatus.FULLFILLED:
117
- $set.fullfilled = order.fullfilled || date;
118
- case OrderStatus.REJECTED: // eslint-disable-line no-fallthrough
119
- case OrderStatus.CONFIRMED:
120
- if (status === OrderStatus.REJECTED) {
121
- $set.rejected = order.rejected || date;
122
- } else {
123
- $set.confirmed = order.confirmed || date;
124
- }
125
- case OrderStatus.PENDING: // eslint-disable-line no-fallthrough
126
- $set.ordered = order.ordered || date;
127
- $set.orderNumber = order.orderNumber || (await findNewOrderNumber(order));
128
- break;
129
- default:
130
- break;
131
- }
132
-
133
- const modifier: mongodb.UpdateFilter<Order> = {
134
- $set,
135
- $push: {
136
- log: {
137
- date,
138
- status,
139
- info,
140
- },
141
- },
142
- };
143
-
144
- const modificationResult = await Orders.findOneAndUpdate(
145
- {
146
- ...selector,
147
- status: { $ne: status }, // Only update if status is different
148
- },
149
- modifier,
150
- {
151
- returnDocument: 'after',
152
- includeResultMetadata: true,
153
- },
154
- );
155
-
156
- if (modificationResult.ok) {
157
- if (order.status === null) {
158
- // The first time that an order transitions away from cart is a checkout event
159
- await emit('ORDER_CHECKOUT', { order: modificationResult.value, oldStatus: order.status });
160
- }
161
- switch (status) {
162
- case OrderStatus.FULLFILLED:
163
- await emit('ORDER_FULLFILLED', { order: modificationResult.value, oldStatus: order.status });
164
- break;
165
- case OrderStatus.REJECTED:
166
- await emit('ORDER_REJECTED', { order: modificationResult.value, oldStatus: order.status });
167
- break;
168
- case OrderStatus.CONFIRMED:
169
- await emit('ORDER_CONFIRMED', { order: modificationResult.value, oldStatus: order.status });
170
- break;
171
- default:
172
- break;
173
- }
174
- }
175
-
176
- return modificationResult.value || Orders.findOne(selector, {});
177
- },
178
-
179
- acquireLock: async (orderId: string, identifier: string, timeout = 5000) => {
180
- return await locker.lock(`order:${identifier}:${orderId}`, timeout).acquire();
181
- },
182
-
183
- setDeliveryProvider: async (orderId: string, deliveryProviderId: string) => {
184
- const delivery = await OrderDeliveries.findOne({
185
- orderId,
186
- deliveryProviderId,
187
- });
188
- const deliveryId =
189
- delivery?._id ||
190
- (
191
- await orderDeliveriesModule.create({
192
- calculation: [],
193
- deliveryProviderId,
194
- log: [],
195
- orderId,
196
- status: null,
197
- })
198
- )._id;
199
-
200
- const order = await Orders.findOneAndUpdate(
201
- { _id: orderId, deliveryId: { $ne: deliveryId } },
202
- {
203
- $set: {
204
- deliveryId,
205
- updated: new Date(),
206
- },
207
- },
208
- { returnDocument: 'after' },
209
- );
210
-
211
- if (!order) return null;
212
- await emit('ORDER_SET_DELIVERY_PROVIDER', {
213
- order,
214
- deliveryProviderId,
215
- });
216
-
217
- return order;
218
- },
219
-
220
- setPaymentProvider: async (orderId: string, paymentProviderId: string) => {
221
- const payment = await OrderPayments.findOne({
222
- orderId,
223
- paymentProviderId,
224
- });
225
-
226
- const paymentId =
227
- payment?._id ||
228
- (
229
- await orderPaymentsModule.create({
230
- calculation: [],
231
- paymentProviderId,
232
- log: [],
233
- orderId,
234
- status: null,
235
- })
236
- )._id;
237
-
238
- const order = await Orders.findOneAndUpdate(
239
- { _id: orderId, paymentId: { $ne: paymentId } },
240
- {
241
- $set: { paymentId, updated: new Date() },
242
- },
243
- { returnDocument: 'after' },
244
- );
245
-
246
- if (!order) return null;
247
- await emit('ORDER_SET_PAYMENT_PROVIDER', {
248
- order,
249
- paymentProviderId,
250
- });
251
-
252
- return order;
253
- },
254
- };
255
- };
256
-
257
- export type OrdersModule = Awaited<ReturnType<typeof configureOrdersModule>>;
@@ -1,13 +0,0 @@
1
- export * from './module/configureOrdersModule.js';
2
- export * from './module/configureOrderDeliveriesModule.js';
3
- export * from './module/configureOrderDiscountsModule.js';
4
- export * from './module/configureOrderPaymentsModule.js';
5
- export * from './module/configureOrderPositionsModule.js';
6
- export * from './module/configureOrdersModule-mutations.js';
7
- export * from './module/configureOrdersModule-queries.js';
8
- export * from './db/OrderDeliveriesCollection.js';
9
- export * from './db/OrderDiscountsCollection.js';
10
- export * from './db/OrderPaymentsCollection.js';
11
- export * from './db/OrderPositionsCollection.js';
12
- export * from './db/OrdersCollection.js';
13
- export * from './orders-settings.js';
@@ -1,45 +0,0 @@
1
- import { generateRandomHash } from '@unchainedshop/utils';
2
- import { Order } from './db/OrdersCollection.js';
3
-
4
- export interface OrderSettingsOrderPositionValidation<Product = unknown> {
5
- order: Order;
6
- product: Product;
7
- quantityDiff?: number;
8
- configuration?: { key: string; value: string }[] | null;
9
- }
10
-
11
- export interface OrdersSettings {
12
- ensureUserHasCart: boolean;
13
- orderNumberHashFn: (order: Order, index: number) => string;
14
- validateOrderPosition: <UnchainedAPI = unknown>(
15
- validationParams: OrderSettingsOrderPositionValidation,
16
- unchainedAPI: UnchainedAPI,
17
- ) => Promise<void>;
18
- lockOrderDuringCheckout: boolean;
19
- configureSettings: (options?: OrdersSettingsOptions) => void;
20
- }
21
- export type OrdersSettingsOptions = Omit<Partial<OrdersSettings>, 'configureSettings'>;
22
-
23
- export const defaultValidateOrderPosition = async ({ product }, { modules }: any) => {
24
- if (!modules.products.isActive(product)) {
25
- throw new Error('This product is inactive');
26
- }
27
- };
28
-
29
- export const ordersSettings: OrdersSettings = {
30
- ensureUserHasCart: false,
31
- orderNumberHashFn: generateRandomHash,
32
- validateOrderPosition: defaultValidateOrderPosition,
33
- lockOrderDuringCheckout: false,
34
- configureSettings({
35
- ensureUserHasCart,
36
- orderNumberHashFn,
37
- validateOrderPosition,
38
- lockOrderDuringCheckout,
39
- } = {}) {
40
- this.ensureUserHasCart = ensureUserHasCart || false;
41
- this.orderNumberHashFn = orderNumberHashFn || generateRandomHash;
42
- this.validateOrderPosition = validateOrderPosition || defaultValidateOrderPosition;
43
- this.lockOrderDuringCheckout = lockOrderDuringCheckout || false;
44
- },
45
- };
package/tsconfig.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "../shared/base.tsconfig.json",
3
- "compilerOptions": {
4
- "declarationDir": "./lib",
5
- "rootDir": "./src",
6
- "outDir": "./lib"
7
- },
8
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
9
- }