@unchainedshop/core-orders 4.3.4 → 4.4.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 +9 -9
  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 +1 -2
  15. package/lib/module/buildFindSelector.js +1 -2
  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 +2 -3
  23. package/lib/module/configureOrderPositionsModule.js +1 -4
  24. package/lib/module/configureOrdersModule-mutations.d.ts +3 -4
  25. package/lib/module/configureOrdersModule-mutations.js +2 -3
  26. package/lib/module/configureOrdersModule-queries.d.ts +2 -3
  27. package/lib/module/configureOrdersModule-queries.js +3 -3
  28. package/lib/module/configureOrdersModule.d.ts +39 -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 +11 -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,178 +0,0 @@
1
- import { emit, registerEvents } from '@unchainedshop/events';
2
- import {
3
- Address,
4
- Contact,
5
- generateDbFilterById,
6
- generateDbObjectId,
7
- mongodb,
8
- } from '@unchainedshop/mongodb';
9
- import { Order, OrderStatus } from '../db/OrdersCollection.js';
10
- import { OrderPosition } from '../db/OrderPositionsCollection.js';
11
-
12
- const ORDER_EVENTS: string[] = [
13
- 'ORDER_CREATE',
14
- 'ORDER_REMOVE',
15
- 'ORDER_SET_DELIVERY_PROVIDER',
16
- 'ORDER_SET_PAYMENT_PROVIDER',
17
- 'ORDER_UPDATE',
18
- ];
19
-
20
- export const configureOrderModuleMutations = ({
21
- Orders,
22
- OrderPositions,
23
- }: {
24
- Orders: mongodb.Collection<Order>;
25
- OrderPositions: mongodb.Collection<OrderPosition>;
26
- }) => {
27
- registerEvents(ORDER_EVENTS);
28
-
29
- return {
30
- create: async ({
31
- userId,
32
- orderNumber,
33
- currencyCode,
34
- countryCode,
35
- billingAddress,
36
- contact,
37
- context,
38
- }: {
39
- userId: string;
40
- billingAddress?: Address;
41
- contact?: Contact;
42
- countryCode: string;
43
- currencyCode: string;
44
- orderNumber?: string;
45
- originEnrollmentId?: string;
46
- context?: Record<string, any>;
47
- }) => {
48
- const { insertedId: orderId } = await Orders.insertOne({
49
- _id: generateDbObjectId(),
50
- created: new Date(),
51
- status: null,
52
- billingAddress,
53
- contact,
54
- userId,
55
- currencyCode,
56
- countryCode,
57
- calculation: [],
58
- log: [],
59
- orderNumber,
60
- context: context || {},
61
- });
62
-
63
- const order = (await Orders.findOne(generateDbFilterById(orderId), {})) as Order;
64
-
65
- await emit('ORDER_CREATE', { order });
66
- return order;
67
- },
68
-
69
- delete: async (orderId: string) => {
70
- const { deletedCount } = await Orders.deleteOne({ _id: orderId });
71
- if (!deletedCount) return 0;
72
- await emit('ORDER_REMOVE', { orderId });
73
- return deletedCount;
74
- },
75
-
76
- setCartOwner: async ({ orderId, userId }: { orderId: string; userId: string }) => {
77
- await Orders.updateOne(generateDbFilterById(orderId), {
78
- $set: {
79
- userId,
80
- },
81
- });
82
- },
83
-
84
- moveCartPositions: async ({
85
- fromOrderId,
86
- toOrderId,
87
- }: {
88
- fromOrderId: string;
89
- toOrderId: string;
90
- }) => {
91
- await OrderPositions.updateMany(
92
- { orderId: fromOrderId },
93
- {
94
- $set: {
95
- orderId: toOrderId,
96
- },
97
- },
98
- );
99
- },
100
-
101
- updateBillingAddress: async (orderId: string, billingAddress: Address) => {
102
- const selector = generateDbFilterById(orderId);
103
- const order = await Orders.findOneAndUpdate(
104
- selector,
105
- {
106
- $set: {
107
- billingAddress,
108
- updated: new Date(),
109
- },
110
- },
111
- { returnDocument: 'after' },
112
- );
113
- if (!order) return null;
114
- await emit('ORDER_UPDATE', { order, field: 'billingAddress' });
115
- return order;
116
- },
117
-
118
- updateContact: async (orderId: string, contact: Contact) => {
119
- const selector = generateDbFilterById(orderId);
120
- const order = await Orders.findOneAndUpdate(
121
- selector,
122
- {
123
- $set: {
124
- contact,
125
- updated: new Date(),
126
- },
127
- },
128
- { returnDocument: 'after' },
129
- );
130
- if (!order) return null;
131
- await emit('ORDER_UPDATE', { order, field: 'contact' });
132
- return order;
133
- },
134
-
135
- updateCalculationSheet: async (orderId: string, calculation: any) => {
136
- const selector = generateDbFilterById(orderId);
137
- const order = await Orders.findOneAndUpdate(
138
- selector,
139
- {
140
- $set: {
141
- calculation,
142
- updated: new Date(),
143
- },
144
- },
145
- { returnDocument: 'after' },
146
- );
147
- if (!order) return null;
148
- await emit('ORDER_UPDATE', { order, field: 'calculation' });
149
- return order;
150
- },
151
-
152
- updateContext: async (orderId: string, context: any) => {
153
- const selector = generateDbFilterById<Order>(orderId);
154
- selector.status = { $in: [null, OrderStatus.PENDING] };
155
-
156
- if (!context || Object.keys(context).length === 0) return Orders.findOne(selector, {});
157
-
158
- const contextSetters = Object.fromEntries(
159
- Object.entries(context).map(([key, value]) => [`context.${key}`, value]),
160
- );
161
- const order = await Orders.findOneAndUpdate(
162
- selector,
163
- {
164
- $set: {
165
- ...contextSetters,
166
- updated: new Date(),
167
- },
168
- },
169
- { returnDocument: 'after' },
170
- );
171
- if (!order) return null;
172
- await emit('ORDER_UPDATE', { order, field: 'context' });
173
- return order;
174
- },
175
- };
176
- };
177
-
178
- export type OrderMutations = ReturnType<typeof configureOrderModuleMutations>;
@@ -1,159 +0,0 @@
1
- import { SortDirection, SortOption } from '@unchainedshop/utils';
2
- import { generateDbFilterById, buildSortOptions, mongodb } from '@unchainedshop/mongodb';
3
- import buildFindSelector from './buildFindSelector.js';
4
- import { Order, OrderQuery } from '../db/OrdersCollection.js';
5
-
6
- export interface OrderReport {
7
- newCount: number;
8
- checkoutCount: number;
9
- rejectCount: number;
10
- confirmCount: number;
11
- fulfillCount: number;
12
- }
13
- export interface OrderStatisticsRecord {
14
- date: string;
15
- total: {
16
- amount: number;
17
- currency: string;
18
- };
19
- }
20
- export interface OrderAggregateParams {
21
- match?: Record<string, any>;
22
- matchAfterGroup?: Record<string, any>;
23
- project?: Record<string, any>;
24
- group?: Record<string, any>;
25
- sort?: Record<string, number>;
26
- limit?: number;
27
- addFields?: Record<string, any>;
28
- pipeline?: any[];
29
- }
30
-
31
- export const configureOrdersModuleQueries = ({ Orders }: { Orders: mongodb.Collection<Order> }) => {
32
- return {
33
- isCart: (order: Order) => {
34
- return order.status === null;
35
- },
36
-
37
- cart: async ({
38
- orderNumber,
39
- countryCode,
40
- userId,
41
- }: {
42
- countryCode?: string;
43
- orderNumber?: string;
44
- userId: string;
45
- }) => {
46
- const selector: mongodb.Filter<Order> = {
47
- countryCode,
48
- status: { $eq: null },
49
- userId,
50
- };
51
-
52
- if (orderNumber) {
53
- selector.orderNumber = orderNumber;
54
- }
55
-
56
- const options: mongodb.FindOptions = {
57
- sort: {
58
- updated: -1,
59
- },
60
- };
61
- return Orders.findOne(selector, options);
62
- },
63
-
64
- count: async (query: OrderQuery): Promise<number> => {
65
- const orderCount = await Orders.countDocuments(buildFindSelector(query));
66
- return orderCount;
67
- },
68
- findOrder: async (
69
- {
70
- orderId,
71
- orderNumber,
72
- }: {
73
- orderId?: string;
74
- orderNumber?: string;
75
- },
76
- options?: mongodb.FindOptions,
77
- ) => {
78
- const selector = orderId ? generateDbFilterById(orderId) : { orderNumber };
79
- return Orders.findOne(selector, options);
80
- },
81
-
82
- findCartsToInvalidate: async (maxAgeDays = 30) => {
83
- const ONE_DAY_IN_MILLISECONDS = 86400000;
84
-
85
- const minValidDate = new Date(new Date().getTime() - maxAgeDays * ONE_DAY_IN_MILLISECONDS);
86
-
87
- const orders = await Orders.find({
88
- status: { $eq: null },
89
- updated: { $gte: minValidDate },
90
- }).toArray();
91
-
92
- return orders;
93
- },
94
-
95
- findOrders: async (
96
- {
97
- limit,
98
- offset,
99
- queryString,
100
- sort,
101
- ...query
102
- }: OrderQuery & {
103
- limit?: number;
104
- offset?: number;
105
- sort?: SortOption[];
106
- },
107
- options?: mongodb.FindOptions,
108
- ): Promise<Order[]> => {
109
- const defaultSortOption: SortOption[] = [{ key: 'created', value: SortDirection.DESC }];
110
- const findOptions: mongodb.FindOptions = {
111
- skip: offset,
112
- limit,
113
- sort: buildSortOptions(sort || defaultSortOption),
114
- };
115
- const selector = buildFindSelector({ queryString, ...query });
116
-
117
- if (queryString) {
118
- return Orders.find(selector, {
119
- ...options,
120
- projection: { score: { $meta: 'textScore' } },
121
- sort: { score: { $meta: 'textScore' } },
122
- }).toArray();
123
- }
124
-
125
- return Orders.find(selector, findOptions).toArray();
126
- },
127
- orderExists: async ({ orderId }: { orderId: string }): Promise<boolean> => {
128
- const orderCount = await Orders.countDocuments(generateDbFilterById(orderId), {
129
- limit: 1,
130
- });
131
- return !!orderCount;
132
- },
133
- aggregateOrders: async ({
134
- match,
135
- project,
136
- group,
137
- sort,
138
- limit,
139
- addFields,
140
- pipeline,
141
- }: OrderAggregateParams): Promise<mongodb.Document[]> => {
142
- const stages: mongodb.Document[] = [];
143
- if (pipeline?.length) {
144
- return await Orders.aggregate(pipeline).toArray();
145
- }
146
-
147
- if (match) stages.push({ $match: match });
148
- if (project) stages.push({ $project: project });
149
- if (group) stages.push({ $group: group });
150
- if (addFields) stages.push({ $addFields: addFields });
151
- if (sort) stages.push({ $sort: sort });
152
- if (typeof limit === 'number') stages.push({ $limit: limit });
153
-
154
- return Orders.aggregate(stages, { allowDiskUse: true }).toArray();
155
- },
156
- };
157
- };
158
-
159
- export type OrderQueries = ReturnType<typeof configureOrdersModuleQueries>;
@@ -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
- }