@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,121 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert';
|
|
3
|
-
import { OrderStatus } from '../db/OrdersCollection.js';
|
|
4
|
-
import { buildFindByIdSelector as buildFindByIdSelectorForDelivery } from './configureOrderDeliveriesModule.js';
|
|
5
|
-
import { buildFindOrderDiscountByIdSelector } from './configureOrderDiscountsModule.js';
|
|
6
|
-
import {
|
|
7
|
-
buildFindOrderPaymentByIdSelector,
|
|
8
|
-
buildFindByContextDataSelector,
|
|
9
|
-
} from './configureOrderPaymentsModule.js';
|
|
10
|
-
import { buildFindOrderPositionByIdSelector } from './configureOrderPositionsModule.js';
|
|
11
|
-
import buildFindSelectorForOrder from './buildFindSelector.js';
|
|
12
|
-
|
|
13
|
-
describe('OrderPosition', () => {
|
|
14
|
-
describe('buildFindSelector', () => {
|
|
15
|
-
it('Return filter object when passed no argument', () => {
|
|
16
|
-
assert.deepStrictEqual(buildFindSelectorForOrder({}), { status: { $ne: null } });
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('Return filter object when passed includeCarts, queryString, status, userId and (status should take precedence over includeCarts)', () => {
|
|
20
|
-
assert.deepStrictEqual(
|
|
21
|
-
buildFindSelectorForOrder({
|
|
22
|
-
includeCarts: false,
|
|
23
|
-
queryString: 'hello world',
|
|
24
|
-
status: [OrderStatus.CONFIRMED],
|
|
25
|
-
userId: 'admin-id',
|
|
26
|
-
}),
|
|
27
|
-
{
|
|
28
|
-
userId: 'admin-id',
|
|
29
|
-
status: {
|
|
30
|
-
$in: ['CONFIRMED'],
|
|
31
|
-
},
|
|
32
|
-
$text: { $search: 'hello world' },
|
|
33
|
-
},
|
|
34
|
-
);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('Return filter object when passed includeCarts, queryString, userId', () => {
|
|
38
|
-
assert.deepStrictEqual(
|
|
39
|
-
buildFindSelectorForOrder({
|
|
40
|
-
includeCarts: true,
|
|
41
|
-
queryString: 'hello world',
|
|
42
|
-
userId: 'admin-id',
|
|
43
|
-
}),
|
|
44
|
-
{
|
|
45
|
-
userId: 'admin-id',
|
|
46
|
-
$text: { $search: 'hello world' },
|
|
47
|
-
},
|
|
48
|
-
);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('Return filter object when passed queryString, userId', () => {
|
|
52
|
-
assert.deepStrictEqual(
|
|
53
|
-
buildFindSelectorForOrder({ queryString: 'hello world', userId: 'admin-id' }),
|
|
54
|
-
{
|
|
55
|
-
userId: 'admin-id',
|
|
56
|
-
$text: { $search: 'hello world' },
|
|
57
|
-
status: { $ne: null },
|
|
58
|
-
},
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('Return filter object when passed queryString', () => {
|
|
63
|
-
assert.deepStrictEqual(buildFindSelectorForOrder({ queryString: 'hello world' }), {
|
|
64
|
-
$text: { $search: 'hello world' },
|
|
65
|
-
status: { $ne: null },
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
describe('OrderDelivery', () => {
|
|
72
|
-
describe('buildFindByIdSelector', () => {
|
|
73
|
-
it('Return correct db _id selector', () => {
|
|
74
|
-
assert.deepStrictEqual(buildFindByIdSelectorForDelivery('order-delivery-id'), {
|
|
75
|
-
_id: 'order-delivery-id',
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
describe('OrderDiscount', () => {
|
|
82
|
-
describe('buildFindByIdSelector', () => {
|
|
83
|
-
it('Return correct db _id selector', () => {
|
|
84
|
-
assert.deepStrictEqual(buildFindOrderDiscountByIdSelector('order-discount-id'), {
|
|
85
|
-
_id: 'order-discount-id',
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
describe('OrderPayment', () => {
|
|
92
|
-
describe('buildFindByIdSelector', () => {
|
|
93
|
-
it('Return correct db _id selector', () => {
|
|
94
|
-
assert.deepStrictEqual(buildFindOrderPaymentByIdSelector('order-payment-id'), {
|
|
95
|
-
_id: 'order-payment-id',
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
describe('buildFindByContextDataSelector', () => {
|
|
101
|
-
it('Return correct db context field selector object', () => {
|
|
102
|
-
assert.deepStrictEqual(
|
|
103
|
-
buildFindByContextDataSelector({ first: 'first value', second: 'second value' }),
|
|
104
|
-
{
|
|
105
|
-
'context.first': 'first value',
|
|
106
|
-
'context.second': 'second value',
|
|
107
|
-
},
|
|
108
|
-
);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
describe('OrderPosition', () => {
|
|
114
|
-
describe('buildFindByIdSelector', () => {
|
|
115
|
-
it('Return correct db _id selector', () => {
|
|
116
|
-
assert.deepStrictEqual(buildFindOrderPositionByIdSelector('order-position-id'), {
|
|
117
|
-
_id: 'order-position-id',
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
});
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { OrderQuery, Order } from '../db/OrdersCollection.js';
|
|
2
|
-
import { assertDocumentDBCompatMode, mongodb } from '@unchainedshop/mongodb';
|
|
3
|
-
|
|
4
|
-
export const buildFindSelector = ({
|
|
5
|
-
includeCarts,
|
|
6
|
-
status,
|
|
7
|
-
userId,
|
|
8
|
-
queryString,
|
|
9
|
-
paymentIds,
|
|
10
|
-
deliveryIds,
|
|
11
|
-
dateRange,
|
|
12
|
-
...rest
|
|
13
|
-
}: OrderQuery) => {
|
|
14
|
-
const selector: mongodb.Filter<Order> = { ...rest };
|
|
15
|
-
|
|
16
|
-
if (userId) {
|
|
17
|
-
selector.userId = userId;
|
|
18
|
-
}
|
|
19
|
-
if (dateRange) {
|
|
20
|
-
const dateFilter: mongodb.Filter<Order> = {};
|
|
21
|
-
if (dateRange.start) dateFilter.$gte = new Date(dateRange.start);
|
|
22
|
-
if (dateRange.end) dateFilter.$lte = new Date(dateRange.end);
|
|
23
|
-
if (Object.keys(dateFilter).length > 0) {
|
|
24
|
-
selector.ordered = dateFilter;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (Array.isArray(deliveryIds) && deliveryIds?.length) {
|
|
29
|
-
selector.deliveryId = { $in: deliveryIds };
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (Array.isArray(paymentIds) && paymentIds?.length) {
|
|
33
|
-
selector.paymentId = { $in: paymentIds };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (Array.isArray(status) && status?.length) {
|
|
37
|
-
selector.status = { $in: status };
|
|
38
|
-
} else if (!includeCarts) {
|
|
39
|
-
selector.status = { $ne: null };
|
|
40
|
-
}
|
|
41
|
-
if (queryString) {
|
|
42
|
-
assertDocumentDBCompatMode();
|
|
43
|
-
(selector as any).$text = { $search: queryString };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return selector;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
export default buildFindSelector;
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { mongodb, generateDbFilterById, generateDbObjectId } from '@unchainedshop/mongodb';
|
|
2
|
-
import { emit, registerEvents } from '@unchainedshop/events';
|
|
3
|
-
import { PricingCalculation } from '@unchainedshop/utils';
|
|
4
|
-
import { OrderDelivery, OrderDeliveryStatus } from '../db/OrderDeliveriesCollection.js';
|
|
5
|
-
|
|
6
|
-
const ORDER_DELIVERY_EVENTS: string[] = ['ORDER_DELIVER', 'ORDER_UPDATE_DELIVERY'];
|
|
7
|
-
|
|
8
|
-
export const buildFindByIdSelector = (orderDeliveryId: string) =>
|
|
9
|
-
generateDbFilterById(orderDeliveryId) as mongodb.Filter<OrderDelivery>;
|
|
10
|
-
|
|
11
|
-
export const configureOrderDeliveriesModule = ({
|
|
12
|
-
OrderDeliveries,
|
|
13
|
-
}: {
|
|
14
|
-
OrderDeliveries: mongodb.Collection<OrderDelivery>;
|
|
15
|
-
}) => {
|
|
16
|
-
registerEvents(ORDER_DELIVERY_EVENTS);
|
|
17
|
-
|
|
18
|
-
const normalizedStatus = (orderDelivery: OrderDelivery) => {
|
|
19
|
-
return orderDelivery.status === null
|
|
20
|
-
? OrderDeliveryStatus.OPEN
|
|
21
|
-
: (orderDelivery.status as OrderDeliveryStatus);
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const updateStatus = async (
|
|
25
|
-
orderDeliveryId: string,
|
|
26
|
-
{ status, info }: { status: OrderDeliveryStatus; info?: string },
|
|
27
|
-
) => {
|
|
28
|
-
const date = new Date();
|
|
29
|
-
const modifier: mongodb.UpdateFilter<OrderDelivery> = {
|
|
30
|
-
$set: { status, updated: new Date() },
|
|
31
|
-
$push: {
|
|
32
|
-
log: {
|
|
33
|
-
date,
|
|
34
|
-
status,
|
|
35
|
-
info,
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
if (status === OrderDeliveryStatus.DELIVERED) {
|
|
40
|
-
// eslint-disable-next-line
|
|
41
|
-
// @ts-ignore
|
|
42
|
-
modifier.$set.delivered = date;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const selector = buildFindByIdSelector(orderDeliveryId);
|
|
46
|
-
return OrderDeliveries.findOneAndUpdate(selector, modifier, { returnDocument: 'after' });
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
// Queries
|
|
51
|
-
findDelivery: async (
|
|
52
|
-
{ orderDeliveryId }: { orderDeliveryId: string },
|
|
53
|
-
options?: mongodb.FindOptions,
|
|
54
|
-
) => {
|
|
55
|
-
return OrderDeliveries.findOne(buildFindByIdSelector(orderDeliveryId), options);
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
findDeliveryByProvidersId: async (
|
|
59
|
-
{ deliveryProviderIds }: { deliveryProviderIds: string[] },
|
|
60
|
-
options?: mongodb.FindOptions,
|
|
61
|
-
): Promise<OrderDelivery[]> => {
|
|
62
|
-
if (!deliveryProviderIds?.length) return [];
|
|
63
|
-
return OrderDeliveries.find(
|
|
64
|
-
{ deliveryProviderId: { $in: deliveryProviderIds } },
|
|
65
|
-
options,
|
|
66
|
-
).toArray();
|
|
67
|
-
},
|
|
68
|
-
|
|
69
|
-
normalizedStatus,
|
|
70
|
-
|
|
71
|
-
// Mutations
|
|
72
|
-
|
|
73
|
-
create: async (
|
|
74
|
-
doc: Omit<OrderDelivery, '_id' | 'created'> & Pick<Partial<OrderDelivery>, '_id' | 'created'>,
|
|
75
|
-
) => {
|
|
76
|
-
const { insertedId: orderDeliveryId } = await OrderDeliveries.insertOne({
|
|
77
|
-
_id: generateDbObjectId(),
|
|
78
|
-
created: new Date(),
|
|
79
|
-
...doc,
|
|
80
|
-
context: doc.context || {},
|
|
81
|
-
status: null,
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
const orderDelivery = (await OrderDeliveries.findOne(
|
|
85
|
-
buildFindByIdSelector(orderDeliveryId),
|
|
86
|
-
)) as OrderDelivery;
|
|
87
|
-
return orderDelivery;
|
|
88
|
-
},
|
|
89
|
-
|
|
90
|
-
delete: async (orderDeliveryId: string) => {
|
|
91
|
-
const { deletedCount } = await OrderDeliveries.deleteOne({ _id: orderDeliveryId });
|
|
92
|
-
return deletedCount;
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
markAsDelivered: async (orderDelivery: OrderDelivery) => {
|
|
96
|
-
if (normalizedStatus(orderDelivery) !== OrderDeliveryStatus.OPEN) return;
|
|
97
|
-
const updatedOrderDelivery = await updateStatus(orderDelivery._id, {
|
|
98
|
-
status: OrderDeliveryStatus.DELIVERED,
|
|
99
|
-
info: 'mark delivered manually',
|
|
100
|
-
});
|
|
101
|
-
await emit('ORDER_DELIVER', { orderDelivery: updatedOrderDelivery });
|
|
102
|
-
return updatedOrderDelivery;
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
updateContext: async (orderDeliveryId: string, context: any) => {
|
|
106
|
-
const selector = buildFindByIdSelector(orderDeliveryId);
|
|
107
|
-
if (!context || Object.keys(context).length === 0) return OrderDeliveries.findOne(selector, {});
|
|
108
|
-
const contextSetters = Object.fromEntries(
|
|
109
|
-
Object.entries(context).map(([key, value]) => [`context.${key}`, value]),
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
const orderDelivery = await OrderDeliveries.findOneAndUpdate(
|
|
113
|
-
selector,
|
|
114
|
-
{
|
|
115
|
-
$set: {
|
|
116
|
-
...contextSetters,
|
|
117
|
-
updated: new Date(),
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
{ returnDocument: 'after' },
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
if (!orderDelivery) return null;
|
|
124
|
-
await emit('ORDER_UPDATE_DELIVERY', {
|
|
125
|
-
orderDelivery,
|
|
126
|
-
});
|
|
127
|
-
return orderDelivery;
|
|
128
|
-
},
|
|
129
|
-
|
|
130
|
-
updateStatus,
|
|
131
|
-
|
|
132
|
-
updateCalculation: async <T extends PricingCalculation>(
|
|
133
|
-
orderDeliveryId: string,
|
|
134
|
-
calculation: T[],
|
|
135
|
-
) => {
|
|
136
|
-
return OrderDeliveries.findOneAndUpdate(
|
|
137
|
-
{ _id: orderDeliveryId },
|
|
138
|
-
{
|
|
139
|
-
$set: {
|
|
140
|
-
calculation,
|
|
141
|
-
updated: new Date(),
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
returnDocument: 'after',
|
|
146
|
-
},
|
|
147
|
-
);
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
deleteOrderDeliveries: async (orderId: string) => {
|
|
151
|
-
const { deletedCount } = await OrderDeliveries.deleteMany({ orderId });
|
|
152
|
-
return deletedCount;
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
export type OrderDeliveriesModule = ReturnType<typeof configureOrderDeliveriesModule>;
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { emit, registerEvents } from '@unchainedshop/events';
|
|
2
|
-
import { generateDbFilterById, generateDbObjectId, mongodb } from '@unchainedshop/mongodb';
|
|
3
|
-
import { OrderDiscount, OrderDiscountTrigger } from '../db/OrderDiscountsCollection.js';
|
|
4
|
-
|
|
5
|
-
const ORDER_DISCOUNT_EVENTS: string[] = [
|
|
6
|
-
'ORDER_CREATE_DISCOUNT',
|
|
7
|
-
'ORDER_UPDATE_DISCOUNT',
|
|
8
|
-
'ORDER_REMOVE_DISCOUNT',
|
|
9
|
-
];
|
|
10
|
-
|
|
11
|
-
export const buildFindOrderDiscountByIdSelector = (orderDiscountId: string) =>
|
|
12
|
-
generateDbFilterById(orderDiscountId) as mongodb.Filter<OrderDiscount>;
|
|
13
|
-
|
|
14
|
-
export const configureOrderDiscountsModule = ({
|
|
15
|
-
OrderDiscounts,
|
|
16
|
-
}: {
|
|
17
|
-
OrderDiscounts: mongodb.Collection<OrderDiscount>;
|
|
18
|
-
}) => {
|
|
19
|
-
registerEvents(ORDER_DISCOUNT_EVENTS);
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
// Queries
|
|
23
|
-
findOrderDiscount: async ({ discountId }: { discountId: string }, options?: mongodb.FindOptions) => {
|
|
24
|
-
return OrderDiscounts.findOne(buildFindOrderDiscountByIdSelector(discountId), options);
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
findOrderDiscounts: async ({ orderId }: { orderId: string }): Promise<OrderDiscount[]> => {
|
|
28
|
-
const discounts = OrderDiscounts.find({ orderId });
|
|
29
|
-
return discounts.toArray();
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
create: async (
|
|
33
|
-
doc: Omit<OrderDiscount, '_id' | 'created' | 'trigger'> &
|
|
34
|
-
Pick<Partial<OrderDiscount>, '_id' | 'created' | 'trigger'>,
|
|
35
|
-
): Promise<OrderDiscount> => {
|
|
36
|
-
const normalizedTrigger = doc.trigger || OrderDiscountTrigger.USER;
|
|
37
|
-
const { insertedId: discountId } = await OrderDiscounts.insertOne({
|
|
38
|
-
_id: generateDbObjectId(),
|
|
39
|
-
created: new Date(),
|
|
40
|
-
...doc,
|
|
41
|
-
trigger: normalizedTrigger,
|
|
42
|
-
});
|
|
43
|
-
const discount = (await OrderDiscounts.findOne({
|
|
44
|
-
_id: discountId,
|
|
45
|
-
})) as OrderDiscount;
|
|
46
|
-
await emit('ORDER_CREATE_DISCOUNT', { discount });
|
|
47
|
-
return discount;
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
delete: async (orderDiscountId: string) => {
|
|
51
|
-
const selector = buildFindOrderDiscountByIdSelector(orderDiscountId);
|
|
52
|
-
const orderDiscount = await OrderDiscounts.findOneAndDelete(selector);
|
|
53
|
-
await emit('ORDER_REMOVE_DISCOUNT', { discount: orderDiscount });
|
|
54
|
-
return orderDiscount;
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
isDiscountCodeUsed: async ({ code, orderId }): Promise<boolean> => {
|
|
58
|
-
return (
|
|
59
|
-
(await OrderDiscounts.countDocuments({
|
|
60
|
-
code,
|
|
61
|
-
orderId,
|
|
62
|
-
})) > 0
|
|
63
|
-
);
|
|
64
|
-
},
|
|
65
|
-
|
|
66
|
-
findSpareDiscount: async ({ code }) => {
|
|
67
|
-
return OrderDiscounts.findOne({
|
|
68
|
-
code,
|
|
69
|
-
orderId: { $exists: false },
|
|
70
|
-
});
|
|
71
|
-
},
|
|
72
|
-
|
|
73
|
-
update: async (orderDiscountId: string, doc: Partial<OrderDiscount>) => {
|
|
74
|
-
const discount = await OrderDiscounts.findOneAndUpdate(
|
|
75
|
-
{ _id: orderDiscountId },
|
|
76
|
-
{
|
|
77
|
-
$set: {
|
|
78
|
-
updated: new Date(),
|
|
79
|
-
...doc,
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
{ returnDocument: 'after' },
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
await emit('ORDER_UPDATE_DISCOUNT', { discount });
|
|
86
|
-
return discount;
|
|
87
|
-
},
|
|
88
|
-
deleteOrderDiscounts: async (orderId: string) => {
|
|
89
|
-
const { deletedCount } = await OrderDiscounts.deleteMany({ orderId });
|
|
90
|
-
return deletedCount;
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
export type OrderDiscountsModule = ReturnType<typeof configureOrderDiscountsModule>;
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { emit, registerEvents } from '@unchainedshop/events';
|
|
2
|
-
import { generateDbFilterById, generateDbObjectId, mongodb } from '@unchainedshop/mongodb';
|
|
3
|
-
import { PricingCalculation } from '@unchainedshop/utils';
|
|
4
|
-
import { OrderPayment, OrderPaymentStatus } from '../db/OrderPaymentsCollection.js';
|
|
5
|
-
|
|
6
|
-
const ORDER_PAYMENT_EVENTS: string[] = ['ORDER_UPDATE_PAYMENT', 'ORDER_SIGN_PAYMENT', 'ORDER_PAY'];
|
|
7
|
-
|
|
8
|
-
export const buildFindOrderPaymentByIdSelector = (orderPaymentId: string) =>
|
|
9
|
-
generateDbFilterById(orderPaymentId) as mongodb.Filter<OrderPayment>;
|
|
10
|
-
|
|
11
|
-
export const buildFindByContextDataSelector = (context: any) => {
|
|
12
|
-
const contextKeys = Object.keys(context);
|
|
13
|
-
|
|
14
|
-
if (contextKeys.length === 0) return null;
|
|
15
|
-
|
|
16
|
-
const selector: mongodb.Filter<OrderPayment> = contextKeys.reduce(
|
|
17
|
-
(currentSelector, key) =>
|
|
18
|
-
context[key] !== undefined
|
|
19
|
-
? {
|
|
20
|
-
...currentSelector,
|
|
21
|
-
[`context.${key}`]: context[key],
|
|
22
|
-
}
|
|
23
|
-
: currentSelector,
|
|
24
|
-
{},
|
|
25
|
-
);
|
|
26
|
-
return selector;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export const configureOrderPaymentsModule = ({
|
|
30
|
-
OrderPayments,
|
|
31
|
-
}: {
|
|
32
|
-
OrderPayments: mongodb.Collection<OrderPayment>;
|
|
33
|
-
}) => {
|
|
34
|
-
registerEvents(ORDER_PAYMENT_EVENTS);
|
|
35
|
-
|
|
36
|
-
const normalizedStatus = (orderPayment: OrderPayment) => {
|
|
37
|
-
return orderPayment.status === null
|
|
38
|
-
? OrderPaymentStatus.OPEN
|
|
39
|
-
: (orderPayment.status as OrderPaymentStatus);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const updateStatus = async (
|
|
43
|
-
orderPaymentId: string,
|
|
44
|
-
{
|
|
45
|
-
transactionId,
|
|
46
|
-
status,
|
|
47
|
-
info,
|
|
48
|
-
}: { transactionId?: string; status: OrderPaymentStatus; info?: string },
|
|
49
|
-
) => {
|
|
50
|
-
const date = new Date();
|
|
51
|
-
const modifier: mongodb.UpdateFilter<OrderPayment> = {
|
|
52
|
-
$set: { status, updated: new Date() },
|
|
53
|
-
$push: {
|
|
54
|
-
log: {
|
|
55
|
-
date,
|
|
56
|
-
status,
|
|
57
|
-
info,
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
if (transactionId) {
|
|
62
|
-
// eslint-disable-next-line
|
|
63
|
-
// @ts-ignore
|
|
64
|
-
modifier.$set.transactionId = transactionId;
|
|
65
|
-
}
|
|
66
|
-
if (status === OrderPaymentStatus.PAID) {
|
|
67
|
-
// eslint-disable-next-line
|
|
68
|
-
// @ts-ignore
|
|
69
|
-
modifier.$set.paid = date;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const selector = buildFindOrderPaymentByIdSelector(orderPaymentId);
|
|
73
|
-
return OrderPayments.findOneAndUpdate(selector, modifier, { returnDocument: 'after' });
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
// Queries
|
|
78
|
-
findOrderPayment: async (
|
|
79
|
-
{
|
|
80
|
-
orderPaymentId,
|
|
81
|
-
}: {
|
|
82
|
-
orderPaymentId: string;
|
|
83
|
-
},
|
|
84
|
-
options?: mongodb.FindOptions,
|
|
85
|
-
) => {
|
|
86
|
-
return OrderPayments.findOne(buildFindOrderPaymentByIdSelector(orderPaymentId), options);
|
|
87
|
-
},
|
|
88
|
-
|
|
89
|
-
findOrderPaymentsByProviderIds: async (
|
|
90
|
-
{
|
|
91
|
-
paymentProviderIds,
|
|
92
|
-
}: {
|
|
93
|
-
paymentProviderIds: string[];
|
|
94
|
-
},
|
|
95
|
-
options?: mongodb.FindOptions,
|
|
96
|
-
): Promise<OrderPayment[]> => {
|
|
97
|
-
if (!paymentProviderIds?.length) return [];
|
|
98
|
-
return OrderPayments.find({ paymentProviderId: { $in: paymentProviderIds } }, options).toArray();
|
|
99
|
-
},
|
|
100
|
-
findOrderPaymentByContextData: async (
|
|
101
|
-
{
|
|
102
|
-
context,
|
|
103
|
-
}: {
|
|
104
|
-
context: any;
|
|
105
|
-
},
|
|
106
|
-
options?: mongodb.FindOptions,
|
|
107
|
-
) => {
|
|
108
|
-
const selector = buildFindByContextDataSelector(context);
|
|
109
|
-
if (!selector) return null;
|
|
110
|
-
return OrderPayments.findOne(selector, options);
|
|
111
|
-
},
|
|
112
|
-
countOrderPaymentsByContextData: async (
|
|
113
|
-
{
|
|
114
|
-
context,
|
|
115
|
-
}: {
|
|
116
|
-
context: any;
|
|
117
|
-
},
|
|
118
|
-
options?: mongodb.FindOptions,
|
|
119
|
-
) => {
|
|
120
|
-
const selector = buildFindByContextDataSelector(context);
|
|
121
|
-
if (!selector) return 0;
|
|
122
|
-
return OrderPayments.countDocuments(selector, options);
|
|
123
|
-
},
|
|
124
|
-
|
|
125
|
-
normalizedStatus,
|
|
126
|
-
|
|
127
|
-
// Mutations
|
|
128
|
-
|
|
129
|
-
create: async (
|
|
130
|
-
doc: Omit<OrderPayment, '_id' | 'created'> & Pick<Partial<OrderPayment>, '_id' | 'created'>,
|
|
131
|
-
): Promise<OrderPayment> => {
|
|
132
|
-
const { insertedId: orderPaymentId } = await OrderPayments.insertOne({
|
|
133
|
-
_id: generateDbObjectId(),
|
|
134
|
-
created: new Date(),
|
|
135
|
-
...doc,
|
|
136
|
-
status: null,
|
|
137
|
-
context: doc.context || {},
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
const orderPayment = (await OrderPayments.findOne(
|
|
141
|
-
buildFindOrderPaymentByIdSelector(orderPaymentId),
|
|
142
|
-
)) as OrderPayment;
|
|
143
|
-
|
|
144
|
-
return orderPayment;
|
|
145
|
-
},
|
|
146
|
-
|
|
147
|
-
logEvent: async (orderPaymentId: string, event: any): Promise<boolean> => {
|
|
148
|
-
const date = new Date();
|
|
149
|
-
const modifier = {
|
|
150
|
-
$push: {
|
|
151
|
-
log: {
|
|
152
|
-
date,
|
|
153
|
-
status: undefined,
|
|
154
|
-
info: JSON.stringify(event),
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
};
|
|
158
|
-
await OrderPayments.updateOne(generateDbFilterById(orderPaymentId), modifier);
|
|
159
|
-
|
|
160
|
-
return true;
|
|
161
|
-
},
|
|
162
|
-
|
|
163
|
-
markAsPaid: async (orderPayment: OrderPayment, meta: any) => {
|
|
164
|
-
if (normalizedStatus(orderPayment) !== OrderPaymentStatus.OPEN) return;
|
|
165
|
-
|
|
166
|
-
await updateStatus(orderPayment._id, {
|
|
167
|
-
status: OrderPaymentStatus.PAID,
|
|
168
|
-
info: meta ? JSON.stringify(meta) : 'mark paid manually',
|
|
169
|
-
});
|
|
170
|
-
await emit('ORDER_PAY', { orderPayment });
|
|
171
|
-
},
|
|
172
|
-
|
|
173
|
-
updateContext: async (orderPaymentId: string, context: any) => {
|
|
174
|
-
const selector = buildFindOrderPaymentByIdSelector(orderPaymentId);
|
|
175
|
-
if (!context || Object.keys(context).length === 0) return OrderPayments.findOne(selector, {});
|
|
176
|
-
|
|
177
|
-
const contextSetters = Object.fromEntries(
|
|
178
|
-
Object.entries(context).map(([key, value]) => [`context.${key}`, value]),
|
|
179
|
-
);
|
|
180
|
-
const orderPayment = await OrderPayments.findOneAndUpdate(
|
|
181
|
-
selector,
|
|
182
|
-
{
|
|
183
|
-
$set: {
|
|
184
|
-
...contextSetters,
|
|
185
|
-
updated: new Date(),
|
|
186
|
-
},
|
|
187
|
-
},
|
|
188
|
-
{ returnDocument: 'after' },
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
if (!orderPayment) return null;
|
|
192
|
-
await emit('ORDER_UPDATE_PAYMENT', {
|
|
193
|
-
orderPayment,
|
|
194
|
-
});
|
|
195
|
-
return orderPayment;
|
|
196
|
-
},
|
|
197
|
-
|
|
198
|
-
updateStatus,
|
|
199
|
-
|
|
200
|
-
updateCalculation: async <T extends PricingCalculation>(
|
|
201
|
-
orderPaymentId: string,
|
|
202
|
-
calculation: T[],
|
|
203
|
-
) => {
|
|
204
|
-
return OrderPayments.findOneAndUpdate(
|
|
205
|
-
buildFindOrderPaymentByIdSelector(orderPaymentId),
|
|
206
|
-
{
|
|
207
|
-
$set: {
|
|
208
|
-
calculation,
|
|
209
|
-
updated: new Date(),
|
|
210
|
-
},
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
returnDocument: 'after',
|
|
214
|
-
},
|
|
215
|
-
);
|
|
216
|
-
},
|
|
217
|
-
deleteOrderPayments: async (orderId: string) => {
|
|
218
|
-
const { deletedCount } = await OrderPayments.deleteMany({ orderId });
|
|
219
|
-
return deletedCount;
|
|
220
|
-
},
|
|
221
|
-
};
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
export type OrderPaymentsModule = ReturnType<typeof configureOrderPaymentsModule>;
|