@unchainedshop/core-payment 1.1.3
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/.npm/package/README +7 -0
- package/.npm/package/npm-shrinkwrap.json +205 -0
- package/.versions +54 -0
- package/README.md +3 -0
- package/lib/db/PaymentCredentialsCollection.d.ts +3 -0
- package/lib/db/PaymentCredentialsCollection.js +10 -0
- package/lib/db/PaymentCredentialsCollection.js.map +1 -0
- package/lib/db/PaymentCredentialsSchema.d.ts +1 -0
- package/lib/db/PaymentCredentialsSchema.js +11 -0
- package/lib/db/PaymentCredentialsSchema.js.map +1 -0
- package/lib/db/PaymentProvidersCollection.d.ts +3 -0
- package/lib/db/PaymentProvidersCollection.js +7 -0
- package/lib/db/PaymentProvidersCollection.js.map +1 -0
- package/lib/db/PaymentProvidersSchema.d.ts +1 -0
- package/lib/db/PaymentProvidersSchema.js +13 -0
- package/lib/db/PaymentProvidersSchema.js.map +1 -0
- package/lib/director/PaymentAdapter.d.ts +2 -0
- package/lib/director/PaymentAdapter.js +49 -0
- package/lib/director/PaymentAdapter.js.map +1 -0
- package/lib/director/PaymentDirector.d.ts +2 -0
- package/lib/director/PaymentDirector.js +84 -0
- package/lib/director/PaymentDirector.js.map +1 -0
- package/lib/director/PaymentError.d.ts +6 -0
- package/lib/director/PaymentError.js +8 -0
- package/lib/director/PaymentError.js.map +1 -0
- package/lib/director/PaymentPricingAdapter.d.ts +3 -0
- package/lib/director/PaymentPricingAdapter.js +25 -0
- package/lib/director/PaymentPricingAdapter.js.map +1 -0
- package/lib/director/PaymentPricingDirector.d.ts +2 -0
- package/lib/director/PaymentPricingDirector.js +49 -0
- package/lib/director/PaymentPricingDirector.js.map +1 -0
- package/lib/director/PaymentPricingSheet.d.ts +3 -0
- package/lib/director/PaymentPricingSheet.js +92 -0
- package/lib/director/PaymentPricingSheet.js.map +1 -0
- package/lib/director/PaymentProviderType.d.ts +5 -0
- package/lib/director/PaymentProviderType.js +7 -0
- package/lib/director/PaymentProviderType.js.map +1 -0
- package/lib/module/configurePaymentCredentialsModule.d.ts +3 -0
- package/lib/module/configurePaymentCredentialsModule.js +80 -0
- package/lib/module/configurePaymentCredentialsModule.js.map +1 -0
- package/lib/module/configurePaymentModule.d.ts +3 -0
- package/lib/module/configurePaymentModule.js +15 -0
- package/lib/module/configurePaymentModule.js.map +1 -0
- package/lib/module/configurePaymentProvidersModule.d.ts +3 -0
- package/lib/module/configurePaymentProvidersModule.js +161 -0
- package/lib/module/configurePaymentProvidersModule.js.map +1 -0
- package/lib/payment-index.d.ts +9 -0
- package/lib/payment-index.js +10 -0
- package/lib/payment-index.js.map +1 -0
- package/lib/payment-settings.d.ts +2 -0
- package/lib/payment-settings.js +36 -0
- package/lib/payment-settings.js.map +1 -0
- package/lib/service/cancelService.d.ts +2 -0
- package/lib/service/cancelService.js +13 -0
- package/lib/service/cancelService.js.map +1 -0
- package/lib/service/chargeService.d.ts +2 -0
- package/lib/service/chargeService.js +33 -0
- package/lib/service/chargeService.js.map +1 -0
- package/lib/service/confirmService.d.ts +2 -0
- package/lib/service/confirmService.js +13 -0
- package/lib/service/confirmService.js.map +1 -0
- package/lib/service/paymentServices.d.ts +2 -0
- package/lib/service/paymentServices.js +11 -0
- package/lib/service/paymentServices.js.map +1 -0
- package/lib/service/registerPaymentCredentialsService.d.ts +2 -0
- package/lib/service/registerPaymentCredentialsService.js +17 -0
- package/lib/service/registerPaymentCredentialsService.js.map +1 -0
- package/package.js +33 -0
- package/package.json +43 -0
- package/src/db/PaymentCredentialsCollection.ts +14 -0
- package/src/db/PaymentCredentialsSchema.js +14 -0
- package/src/db/PaymentProvidersCollection.ts +11 -0
- package/src/db/PaymentProvidersSchema.js +16 -0
- package/src/director/PaymentAdapter.ts +63 -0
- package/src/director/PaymentDirector.ts +99 -0
- package/src/director/PaymentError.ts +6 -0
- package/src/director/PaymentPricingAdapter.ts +41 -0
- package/src/director/PaymentPricingDirector.ts +66 -0
- package/src/director/PaymentPricingSheet.ts +112 -0
- package/src/director/PaymentProviderType.ts +5 -0
- package/src/module/configurePaymentCredentialsModule.ts +110 -0
- package/src/module/configurePaymentModule.ts +22 -0
- package/src/module/configurePaymentProvidersModule.ts +230 -0
- package/src/payment-index.ts +12 -0
- package/src/payment-settings.ts +52 -0
- package/src/service/cancelService.ts +24 -0
- package/src/service/chargeService.ts +47 -0
- package/src/service/confirmService.ts +24 -0
- package/src/service/paymentServices.ts +12 -0
- package/src/service/registerPaymentCredentialsService.ts +28 -0
- package/tests/payment-index.test.ts +47 -0
- package/tsconfig.build.json +26 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { Context } from '@unchainedshop/types/api';
|
|
2
|
+
import { Collection, ModuleMutations } from '@unchainedshop/types/common';
|
|
3
|
+
import {
|
|
4
|
+
PaymentContext,
|
|
5
|
+
PaymentModule,
|
|
6
|
+
PaymentProvider,
|
|
7
|
+
PaymentProviderQuery,
|
|
8
|
+
} from '@unchainedshop/types/payments';
|
|
9
|
+
import { emit, registerEvents } from '@unchainedshop/events';
|
|
10
|
+
import { generateDbFilterById, generateDbMutations } from '@unchainedshop/utils';
|
|
11
|
+
import { PaymentPricingDirector } from '../director/PaymentPricingDirector';
|
|
12
|
+
import { PaymentPricingSheet } from '../director/PaymentPricingSheet';
|
|
13
|
+
import { PaymentProvidersSchema } from '../db/PaymentProvidersSchema';
|
|
14
|
+
import { PaymentDirector } from '../director/PaymentDirector';
|
|
15
|
+
import { paymentSettings } from '../payment-settings';
|
|
16
|
+
|
|
17
|
+
const PAYMENT_PROVIDER_EVENTS: string[] = [
|
|
18
|
+
'PAYMENT_PROVIDER_CREATE',
|
|
19
|
+
'PAYMENT_PROVIDER_UPDATE',
|
|
20
|
+
'PAYMENT_PROVIDER_REMOVE',
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const buildFindSelector = ({ type }: PaymentProviderQuery = {}) => {
|
|
24
|
+
return { ...(type ? { type } : {}), deleted: null };
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const asyncFilter = async (arr, predicate) => {
|
|
28
|
+
const results = await Promise.all(arr.map(predicate));
|
|
29
|
+
|
|
30
|
+
return arr.filter((_v, index) => results[index]);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const configurePaymentProvidersModule = (
|
|
34
|
+
PaymentProviders: Collection<PaymentProvider>,
|
|
35
|
+
): PaymentModule['paymentProviders'] => {
|
|
36
|
+
registerEvents(PAYMENT_PROVIDER_EVENTS);
|
|
37
|
+
|
|
38
|
+
const mutations = generateDbMutations<PaymentProvider>(
|
|
39
|
+
PaymentProviders,
|
|
40
|
+
PaymentProvidersSchema,
|
|
41
|
+
) as ModuleMutations<PaymentProvider>;
|
|
42
|
+
|
|
43
|
+
const getPaymentAdapter = async (
|
|
44
|
+
paymentProviderId: string,
|
|
45
|
+
paymentContext: PaymentContext,
|
|
46
|
+
requestContext: Context,
|
|
47
|
+
) => {
|
|
48
|
+
const provider = await PaymentProviders.findOne(generateDbFilterById(paymentProviderId), {});
|
|
49
|
+
|
|
50
|
+
return PaymentDirector.actions(provider, paymentContext, requestContext);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
// Queries
|
|
55
|
+
count: async (query) => {
|
|
56
|
+
const providerCount = await PaymentProviders.countDocuments(buildFindSelector(query));
|
|
57
|
+
return providerCount;
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
findProvider: async ({ paymentProviderId, ...query }, options) => {
|
|
61
|
+
return PaymentProviders.findOne(
|
|
62
|
+
paymentProviderId ? generateDbFilterById(paymentProviderId) : query,
|
|
63
|
+
options,
|
|
64
|
+
);
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
findProviders: async (query, options) => {
|
|
68
|
+
const providers = PaymentProviders.find(buildFindSelector(query), options);
|
|
69
|
+
return providers.toArray();
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
providerExists: async ({ paymentProviderId }) => {
|
|
73
|
+
const providerCount = await PaymentProviders.countDocuments(
|
|
74
|
+
generateDbFilterById(paymentProviderId, { deleted: null }),
|
|
75
|
+
{ limit: 1 },
|
|
76
|
+
);
|
|
77
|
+
return !!providerCount;
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
findInterface: (paymentProvider) => {
|
|
81
|
+
const Adapter = PaymentDirector.getAdapter(paymentProvider.adapterKey);
|
|
82
|
+
if (!Adapter) return null;
|
|
83
|
+
return {
|
|
84
|
+
_id: Adapter.key,
|
|
85
|
+
label: Adapter.label,
|
|
86
|
+
version: Adapter.version,
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
pricingSheet: (params) => {
|
|
91
|
+
return PaymentPricingSheet(params);
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
findInterfaces: ({ type }) => {
|
|
95
|
+
return PaymentDirector.getAdapters()
|
|
96
|
+
.filter((Adapter) => Adapter.typeSupported(type))
|
|
97
|
+
.map((Adapter) => ({
|
|
98
|
+
_id: Adapter.key,
|
|
99
|
+
label: Adapter.label,
|
|
100
|
+
version: Adapter.version,
|
|
101
|
+
}));
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
findSupported: async (paymentContext, requestContext) => {
|
|
105
|
+
const allProviders = await PaymentProviders.find({ deleted: null }).toArray();
|
|
106
|
+
const providers: PaymentProvider[] = await asyncFilter(
|
|
107
|
+
allProviders,
|
|
108
|
+
async (provider: PaymentProvider) => {
|
|
109
|
+
try {
|
|
110
|
+
const director = await PaymentDirector.actions(provider, paymentContext, requestContext);
|
|
111
|
+
return director.isActive();
|
|
112
|
+
} catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
return paymentSettings.filterSupportedProviders(
|
|
119
|
+
{
|
|
120
|
+
providers,
|
|
121
|
+
order: paymentContext.order,
|
|
122
|
+
},
|
|
123
|
+
requestContext,
|
|
124
|
+
);
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
determineDefault: async (paymentProviders, deliveryContext, requestContext) => {
|
|
128
|
+
return paymentSettings.determineDefaultProvider(
|
|
129
|
+
{
|
|
130
|
+
providers: paymentProviders,
|
|
131
|
+
...deliveryContext,
|
|
132
|
+
},
|
|
133
|
+
requestContext,
|
|
134
|
+
);
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
// Payment Adapter
|
|
138
|
+
|
|
139
|
+
configurationError: async (paymentProvider, requestContext) => {
|
|
140
|
+
const actions = await PaymentDirector.actions(paymentProvider, {}, requestContext);
|
|
141
|
+
return actions.configurationError();
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
calculate: async (pricingContext, requestContext) => {
|
|
145
|
+
const pricing = await PaymentPricingDirector.actions(pricingContext, requestContext);
|
|
146
|
+
return pricing.calculate();
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
isActive: async (paymentProvider, requestContext) => {
|
|
150
|
+
const actions = await PaymentDirector.actions(paymentProvider, {}, requestContext);
|
|
151
|
+
return actions.isActive();
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
isPayLaterAllowed: async (paymentProvider, requestContext) => {
|
|
155
|
+
const actions = await PaymentDirector.actions(paymentProvider, {}, requestContext);
|
|
156
|
+
return actions.isPayLaterAllowed();
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
charge: async (paymentProviderId, paymentContext, requestContext) => {
|
|
160
|
+
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, requestContext);
|
|
161
|
+
return adapter.charge();
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
register: async (paymentProviderId, paymentContext, requestContext) => {
|
|
165
|
+
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, requestContext);
|
|
166
|
+
return adapter.register();
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
sign: async (paymentProviderId, paymentContext, requestContext) => {
|
|
170
|
+
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, requestContext);
|
|
171
|
+
return adapter.sign();
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
validate: async (paymentProviderId, paymentContext, requestContext) => {
|
|
175
|
+
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, requestContext);
|
|
176
|
+
return adapter.validate();
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
cancel: async (paymentProviderId, paymentContext, requestContext) => {
|
|
180
|
+
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, requestContext);
|
|
181
|
+
return adapter.cancel();
|
|
182
|
+
},
|
|
183
|
+
|
|
184
|
+
confirm: async (paymentProviderId, paymentContext, requestContext) => {
|
|
185
|
+
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, requestContext);
|
|
186
|
+
return adapter.confirm();
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
// Mutations
|
|
190
|
+
create: async (doc, userId) => {
|
|
191
|
+
const Adapter = PaymentDirector.getAdapter(doc.adapterKey);
|
|
192
|
+
if (!Adapter) return null;
|
|
193
|
+
|
|
194
|
+
const paymentProviderId = await mutations.create(
|
|
195
|
+
{
|
|
196
|
+
configuration: Adapter.initialConfiguration,
|
|
197
|
+
...doc,
|
|
198
|
+
},
|
|
199
|
+
userId,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
const paymentProvider = await PaymentProviders.findOne(
|
|
203
|
+
generateDbFilterById(paymentProviderId),
|
|
204
|
+
{},
|
|
205
|
+
);
|
|
206
|
+
emit('PAYMENT_PROVIDER_CREATE', { paymentProvider });
|
|
207
|
+
return paymentProvider;
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
update: async (_id: string, doc: PaymentProvider, userId: string) => {
|
|
211
|
+
await mutations.update(_id, doc, userId);
|
|
212
|
+
const paymentProvider = await PaymentProviders.findOne(generateDbFilterById(_id), {});
|
|
213
|
+
emit('PAYMENT_PROVIDER_UPDATE', { paymentProvider });
|
|
214
|
+
return paymentProvider;
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
delete: async (_id, userId) => {
|
|
218
|
+
await mutations.delete(_id, userId);
|
|
219
|
+
const paymentProvider = await PaymentProviders.findOne(generateDbFilterById(_id), {});
|
|
220
|
+
emit('PAYMENT_PROVIDER_REMOVE', { paymentProvider });
|
|
221
|
+
return paymentProvider;
|
|
222
|
+
},
|
|
223
|
+
|
|
224
|
+
deletePermanently: async (_id, userId) => {
|
|
225
|
+
const deliveryProvider = await PaymentProviders.findOne(generateDbFilterById(_id), {});
|
|
226
|
+
await mutations.deletePermanently(_id, userId);
|
|
227
|
+
return deliveryProvider;
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { configurePaymentModule } from './module/configurePaymentModule';
|
|
2
|
+
|
|
3
|
+
export { paymentServices } from './service/paymentServices';
|
|
4
|
+
export { paymentSettings } from './payment-settings';
|
|
5
|
+
|
|
6
|
+
export { PaymentDirector } from './director/PaymentDirector';
|
|
7
|
+
export { PaymentAdapter } from './director/PaymentAdapter';
|
|
8
|
+
export { PaymentError } from './director/PaymentError';
|
|
9
|
+
export { PaymentProviderType } from './director/PaymentProviderType';
|
|
10
|
+
|
|
11
|
+
export { PaymentPricingAdapter } from './director/PaymentPricingAdapter';
|
|
12
|
+
export { PaymentPricingDirector } from './director/PaymentPricingDirector';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PaymentProvider,
|
|
3
|
+
PaymentSettings,
|
|
4
|
+
FilterProviders,
|
|
5
|
+
DetermineDefaultProvider,
|
|
6
|
+
} from '@unchainedshop/types/payments';
|
|
7
|
+
import { createLogger } from '@unchainedshop/logger';
|
|
8
|
+
|
|
9
|
+
const logger = createLogger('unchained:core-payment');
|
|
10
|
+
|
|
11
|
+
const sortByCreationDate = (left: PaymentProvider, right: PaymentProvider) => {
|
|
12
|
+
return new Date(left.created).getTime() - new Date(right.created).getTime();
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const allProviders: FilterProviders = async ({ providers }) => {
|
|
16
|
+
return providers.sort(sortByCreationDate);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const firstProviderIsDefault: DetermineDefaultProvider = async ({ providers, paymentCredentials }) => {
|
|
20
|
+
const foundSupportedPreferredProvider = providers.find((supportedPaymentProvider) => {
|
|
21
|
+
return paymentCredentials.some((paymentCredential) => {
|
|
22
|
+
return supportedPaymentProvider._id === paymentCredential.paymentProviderId;
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
if (foundSupportedPreferredProvider) return foundSupportedPreferredProvider;
|
|
26
|
+
return providers?.length > 0 && providers[0];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const defaultFilterSupportedProviders =
|
|
30
|
+
(sortProviders) =>
|
|
31
|
+
async ({ providers }) => {
|
|
32
|
+
return providers.sort(sortProviders);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const paymentSettings: PaymentSettings = {
|
|
36
|
+
filterSupportedProviders: null,
|
|
37
|
+
determineDefaultProvider: null,
|
|
38
|
+
|
|
39
|
+
configureSettings({
|
|
40
|
+
sortProviders = undefined,
|
|
41
|
+
filterSupportedProviders = allProviders,
|
|
42
|
+
determineDefaultProvider = firstProviderIsDefault,
|
|
43
|
+
} = {}) {
|
|
44
|
+
if (sortProviders) {
|
|
45
|
+
logger.warn('sortProviders is deprecated, please specifc filterSupportedProviders instead');
|
|
46
|
+
paymentSettings.filterSupportedProviders = defaultFilterSupportedProviders(sortProviders);
|
|
47
|
+
} else {
|
|
48
|
+
paymentSettings.filterSupportedProviders = filterSupportedProviders;
|
|
49
|
+
}
|
|
50
|
+
paymentSettings.determineDefaultProvider = determineDefaultProvider;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CancelService } from '@unchainedshop/types/payments';
|
|
2
|
+
|
|
3
|
+
export const cancelService: CancelService = async (
|
|
4
|
+
{ paymentContext, paymentProviderId },
|
|
5
|
+
requestContext,
|
|
6
|
+
) => {
|
|
7
|
+
const { modules, userId } = requestContext;
|
|
8
|
+
|
|
9
|
+
const normalizedContext = {
|
|
10
|
+
...paymentContext,
|
|
11
|
+
userId,
|
|
12
|
+
paymentProviderId,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const result = await modules.payment.paymentProviders.cancel(
|
|
16
|
+
paymentProviderId,
|
|
17
|
+
normalizedContext,
|
|
18
|
+
requestContext,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (!result) return false;
|
|
22
|
+
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ChargeService } from '@unchainedshop/types/payments';
|
|
2
|
+
|
|
3
|
+
export const chargeService: ChargeService = async (
|
|
4
|
+
{ paymentContext, paymentProviderId },
|
|
5
|
+
requestContext,
|
|
6
|
+
) => {
|
|
7
|
+
const { modules, userId } = requestContext;
|
|
8
|
+
|
|
9
|
+
const paymentCredentials =
|
|
10
|
+
paymentContext.transactionContext?.paymentCredentials ||
|
|
11
|
+
(await modules.payment.paymentCredentials.findPaymentCredential({
|
|
12
|
+
userId,
|
|
13
|
+
paymentProviderId,
|
|
14
|
+
isPreferred: true,
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
const normalizedContext = {
|
|
18
|
+
...paymentContext,
|
|
19
|
+
userId,
|
|
20
|
+
paymentProviderId,
|
|
21
|
+
transactionContext: {
|
|
22
|
+
...paymentContext.transactionContext,
|
|
23
|
+
paymentCredentials,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const result = await modules.payment.paymentProviders.charge(
|
|
28
|
+
paymentProviderId,
|
|
29
|
+
normalizedContext,
|
|
30
|
+
requestContext,
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
if (!result) return false;
|
|
34
|
+
|
|
35
|
+
const { credentials, ...strippedResult } = result;
|
|
36
|
+
|
|
37
|
+
if (credentials) {
|
|
38
|
+
const { token, ...meta } = credentials;
|
|
39
|
+
await modules.payment.paymentCredentials.upsertCredentials({
|
|
40
|
+
userId,
|
|
41
|
+
paymentProviderId,
|
|
42
|
+
token,
|
|
43
|
+
...meta,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return strippedResult;
|
|
47
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ConfirmService } from '@unchainedshop/types/payments';
|
|
2
|
+
|
|
3
|
+
export const confirmService: ConfirmService = async (
|
|
4
|
+
{ paymentContext, paymentProviderId },
|
|
5
|
+
requestContext,
|
|
6
|
+
) => {
|
|
7
|
+
const { modules, userId } = requestContext;
|
|
8
|
+
|
|
9
|
+
const normalizedContext = {
|
|
10
|
+
...paymentContext,
|
|
11
|
+
userId,
|
|
12
|
+
paymentProviderId,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const result = await modules.payment.paymentProviders.confirm(
|
|
16
|
+
paymentProviderId,
|
|
17
|
+
normalizedContext,
|
|
18
|
+
requestContext,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (!result) return false;
|
|
22
|
+
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PaymentServices } from '@unchainedshop/types/payments';
|
|
2
|
+
import { chargeService } from './chargeService';
|
|
3
|
+
import { cancelService } from './cancelService';
|
|
4
|
+
import { confirmService } from './confirmService';
|
|
5
|
+
import { registerPaymentCredentialsService } from './registerPaymentCredentialsService';
|
|
6
|
+
|
|
7
|
+
export const paymentServices: PaymentServices = {
|
|
8
|
+
charge: chargeService,
|
|
9
|
+
registerPaymentCredentials: registerPaymentCredentialsService,
|
|
10
|
+
cancel: cancelService,
|
|
11
|
+
confirm: confirmService,
|
|
12
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { RegisterPaymentCredentialsService } from '@unchainedshop/types/payments';
|
|
2
|
+
|
|
3
|
+
export const registerPaymentCredentialsService: RegisterPaymentCredentialsService = async (
|
|
4
|
+
paymentProviderId,
|
|
5
|
+
paymentContext,
|
|
6
|
+
requestContext,
|
|
7
|
+
) => {
|
|
8
|
+
const { modules, userId } = requestContext;
|
|
9
|
+
const registration = await modules.payment.paymentProviders.register(
|
|
10
|
+
paymentProviderId,
|
|
11
|
+
paymentContext,
|
|
12
|
+
requestContext,
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
if (!registration) return null;
|
|
16
|
+
|
|
17
|
+
const paymentCredentialsId = await modules.payment.paymentCredentials.upsertCredentials({
|
|
18
|
+
userId,
|
|
19
|
+
paymentProviderId,
|
|
20
|
+
...registration,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return modules.payment.paymentCredentials.findPaymentCredential({
|
|
24
|
+
paymentCredentialsId,
|
|
25
|
+
userId,
|
|
26
|
+
paymentProviderId,
|
|
27
|
+
});
|
|
28
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { assert } from 'chai';
|
|
2
|
+
import { initDb } from 'meteor/unchained:mongodb';
|
|
3
|
+
import { configurePaymentModule } from '@unchainedshop/core-payment';
|
|
4
|
+
|
|
5
|
+
describe('Test exports', () => {
|
|
6
|
+
let module;
|
|
7
|
+
|
|
8
|
+
before(async () => {
|
|
9
|
+
const db = await initDb();
|
|
10
|
+
module = await configurePaymentModule({ db });
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('Check Bookmarks module', async () => {
|
|
14
|
+
assert.ok(module);
|
|
15
|
+
assert.isFunction(module.findCurrency);
|
|
16
|
+
assert.isFunction(module.findPayment);
|
|
17
|
+
assert.isFunction(module.currencyExists);
|
|
18
|
+
assert.isFunction(module.create);
|
|
19
|
+
assert.isFunction(module.update);
|
|
20
|
+
assert.isFunction(module.delete);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('Mutate currency', async () => {
|
|
24
|
+
const currencyId = await module.create(
|
|
25
|
+
{
|
|
26
|
+
authorId: 'Test-User-1',
|
|
27
|
+
isoCode: 'CHF',
|
|
28
|
+
},
|
|
29
|
+
'Test-User-1'
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
assert.ok(currencyId);
|
|
33
|
+
const currency = await module.findCurrency(currencyId);
|
|
34
|
+
|
|
35
|
+
assert.ok(currency);
|
|
36
|
+
assert.equal(currency._id, currencyId);
|
|
37
|
+
assert.equal(currency.isoCode, 'CHF');
|
|
38
|
+
assert.equal(currency.userId, 'Test-User-1');
|
|
39
|
+
assert.isDefined(currency.created);
|
|
40
|
+
assert.isUndefined(currency.updated);
|
|
41
|
+
assert.isUndefined(currency.updatedBy);
|
|
42
|
+
assert.equal(currency.createdBy, 'Test-User-1');
|
|
43
|
+
|
|
44
|
+
const deletedCount = await module.delete(currencyId);
|
|
45
|
+
assert.equal(deletedCount, 1);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"allowSyntheticDefaultImports": true,
|
|
5
|
+
"declaration": true,
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"experimentalDecorators": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"lib": ["esnext"],
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "node",
|
|
12
|
+
"noImplicitReturns": true,
|
|
13
|
+
"noUnusedLocals": false,
|
|
14
|
+
"outDir": "lib",
|
|
15
|
+
"preserveWatchOutput": true,
|
|
16
|
+
"skipLibCheck": true,
|
|
17
|
+
"sourceMap": true,
|
|
18
|
+
"target": "esnext",
|
|
19
|
+
"types": ["node"],
|
|
20
|
+
"baseUrl": ".", // This must be specified if "paths" is.
|
|
21
|
+
"paths": {
|
|
22
|
+
"meteor/unchained:*": ["node_modules/@unchainedshop/types/index.d.ts"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"include": ["src"]
|
|
26
|
+
}
|