@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.
- package/README.md +137 -3
- package/lib/db/OrderDeliveriesCollection.d.ts +8 -8
- package/lib/db/OrderDeliveriesCollection.js +6 -9
- package/lib/db/OrderDiscountsCollection.d.ts +7 -7
- package/lib/db/OrderDiscountsCollection.js +5 -8
- package/lib/db/OrderPaymentsCollection.d.ts +8 -8
- package/lib/db/OrderPaymentsCollection.js +6 -9
- package/lib/db/OrderPositionsCollection.d.ts +2 -3
- package/lib/db/OrderPositionsCollection.js +1 -3
- package/lib/db/OrdersCollection.d.ts +13 -10
- package/lib/db/OrdersCollection.js +7 -10
- package/lib/migrations/20250502111800-currency-code.d.ts +1 -2
- package/lib/migrations/20250502111800-currency-code.js +1 -2
- package/lib/module/buildFindSelector.d.ts +2 -3
- package/lib/module/buildFindSelector.js +6 -4
- package/lib/module/configureOrderDeliveriesModule.d.ts +2 -3
- package/lib/module/configureOrderDeliveriesModule.js +2 -7
- package/lib/module/configureOrderDiscountsModule.d.ts +1 -2
- package/lib/module/configureOrderDiscountsModule.js +2 -4
- package/lib/module/configureOrderPaymentsModule.d.ts +2 -3
- package/lib/module/configureOrderPaymentsModule.js +2 -9
- package/lib/module/configureOrderPositionsModule.d.ts +10 -3
- package/lib/module/configureOrderPositionsModule.js +48 -4
- package/lib/module/configureOrdersModule-mutations.d.ts +8 -4
- package/lib/module/configureOrdersModule-mutations.js +23 -3
- package/lib/module/configureOrdersModule-queries.d.ts +28 -4
- package/lib/module/configureOrdersModule-queries.js +127 -3
- package/lib/module/configureOrdersModule.d.ts +58 -40
- package/lib/module/configureOrdersModule.js +17 -23
- package/lib/orders-index.d.ts +13 -14
- package/lib/orders-index.js +13 -14
- package/lib/orders-settings.d.ts +1 -2
- package/lib/orders-settings.js +0 -1
- package/package.json +12 -10
- package/lib/db/OrderDeliveriesCollection.d.ts.map +0 -1
- package/lib/db/OrderDeliveriesCollection.js.map +0 -1
- package/lib/db/OrderDiscountsCollection.d.ts.map +0 -1
- package/lib/db/OrderDiscountsCollection.js.map +0 -1
- package/lib/db/OrderPaymentsCollection.d.ts.map +0 -1
- package/lib/db/OrderPaymentsCollection.js.map +0 -1
- package/lib/db/OrderPositionsCollection.d.ts.map +0 -1
- package/lib/db/OrderPositionsCollection.js.map +0 -1
- package/lib/db/OrdersCollection.d.ts.map +0 -1
- package/lib/db/OrdersCollection.js.map +0 -1
- package/lib/migrations/20250502111800-currency-code.d.ts.map +0 -1
- package/lib/migrations/20250502111800-currency-code.js.map +0 -1
- package/lib/module/buildFindSelector.d.ts.map +0 -1
- package/lib/module/buildFindSelector.js.map +0 -1
- package/lib/module/configureOrderDeliveriesModule.d.ts.map +0 -1
- package/lib/module/configureOrderDeliveriesModule.js.map +0 -1
- package/lib/module/configureOrderDiscountsModule.d.ts.map +0 -1
- package/lib/module/configureOrderDiscountsModule.js.map +0 -1
- package/lib/module/configureOrderPaymentsModule.d.ts.map +0 -1
- package/lib/module/configureOrderPaymentsModule.js.map +0 -1
- package/lib/module/configureOrderPositionsModule.d.ts.map +0 -1
- package/lib/module/configureOrderPositionsModule.js.map +0 -1
- package/lib/module/configureOrdersModule-mutations.d.ts.map +0 -1
- package/lib/module/configureOrdersModule-mutations.js.map +0 -1
- package/lib/module/configureOrdersModule-queries.d.ts.map +0 -1
- package/lib/module/configureOrdersModule-queries.js.map +0 -1
- package/lib/module/configureOrdersModule.d.ts.map +0 -1
- package/lib/module/configureOrdersModule.js.map +0 -1
- package/lib/orders-index.d.ts.map +0 -1
- package/lib/orders-index.js.map +0 -1
- package/lib/orders-settings.d.ts.map +0 -1
- package/lib/orders-settings.js.map +0 -1
- package/src/db/OrderDeliveriesCollection.ts +0 -34
- package/src/db/OrderDiscountsCollection.ts +0 -30
- package/src/db/OrderPaymentsCollection.ts +0 -35
- package/src/db/OrderPositionsCollection.ts +0 -32
- package/src/db/OrdersCollection.ts +0 -87
- package/src/migrations/20250502111800-currency-code.ts +0 -18
- package/src/module/buildFindSelector.test.ts +0 -121
- package/src/module/buildFindSelector.ts +0 -49
- package/src/module/configureOrderDeliveriesModule.ts +0 -157
- package/src/module/configureOrderDiscountsModule.ts +0 -95
- package/src/module/configureOrderPaymentsModule.ts +0 -224
- package/src/module/configureOrderPositionsModule.ts +0 -244
- package/src/module/configureOrdersModule-mutations.ts +0 -178
- package/src/module/configureOrdersModule-queries.ts +0 -159
- package/src/module/configureOrdersModule.ts +0 -257
- package/src/orders-index.ts +0 -13
- package/src/orders-settings.ts +0 -45
- 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>>;
|
package/src/orders-index.ts
DELETED
|
@@ -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';
|
package/src/orders-settings.ts
DELETED
|
@@ -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
|
-
};
|