@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,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>;