@unchainedshop/core-payment 3.0.0-alpha6 → 3.0.0-rc.11
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/lib/db/PaymentCredentialsCollection.d.ts +10 -3
- package/lib/db/PaymentCredentialsCollection.d.ts.map +1 -1
- package/lib/db/PaymentCredentialsCollection.js +3 -3
- package/lib/db/PaymentCredentialsCollection.js.map +1 -1
- package/lib/db/PaymentProvidersCollection.d.ts +16 -2
- package/lib/db/PaymentProvidersCollection.d.ts.map +1 -1
- package/lib/db/PaymentProvidersCollection.js +6 -0
- package/lib/db/PaymentProvidersCollection.js.map +1 -1
- package/lib/module/configurePaymentCredentialsModule.d.ts +11 -12
- package/lib/module/configurePaymentCredentialsModule.d.ts.map +1 -1
- package/lib/module/configurePaymentCredentialsModule.js +3 -3
- package/lib/module/configurePaymentCredentialsModule.js.map +1 -1
- package/lib/module/configurePaymentModule.d.ts +35 -10
- package/lib/module/configurePaymentModule.d.ts.map +1 -1
- package/lib/module/configurePaymentModule.js +2 -18
- package/lib/module/configurePaymentModule.js.map +1 -1
- package/lib/module/configurePaymentProvidersModule.d.ts +17 -41
- package/lib/module/configurePaymentProvidersModule.d.ts.map +1 -1
- package/lib/module/configurePaymentProvidersModule.js +0 -101
- package/lib/module/configurePaymentProvidersModule.js.map +1 -1
- package/lib/payment-index.d.ts +2 -8
- package/lib/payment-index.d.ts.map +1 -1
- package/lib/payment-index.js +2 -8
- package/lib/payment-index.js.map +1 -1
- package/lib/payment-settings.d.ts +6 -7
- package/lib/payment-settings.d.ts.map +1 -1
- package/lib/payment-settings.js +1 -1
- package/lib/payment-settings.js.map +1 -1
- package/package.json +13 -13
- package/src/db/PaymentCredentialsCollection.ts +13 -5
- package/src/db/PaymentProvidersCollection.ts +19 -2
- package/src/module/configurePaymentCredentialsModule.ts +42 -40
- package/src/module/configurePaymentModule.ts +5 -57
- package/src/module/configurePaymentProvidersModule.ts +27 -239
- package/src/module/payment-index.test.ts +1 -1
- package/src/payment-index.ts +2 -10
- package/src/payment-settings.ts +7 -8
- package/tsconfig.json +5 -7
- package/lib/director/PaymentAdapter.d.ts +0 -3
- package/lib/director/PaymentAdapter.d.ts.map +0 -1
- package/lib/director/PaymentAdapter.js +0 -49
- package/lib/director/PaymentAdapter.js.map +0 -1
- package/lib/director/PaymentDirector.d.ts +0 -3
- package/lib/director/PaymentDirector.d.ts.map +0 -1
- package/lib/director/PaymentDirector.js +0 -84
- package/lib/director/PaymentDirector.js.map +0 -1
- package/lib/director/PaymentError.d.ts +0 -7
- package/lib/director/PaymentError.d.ts.map +0 -1
- package/lib/director/PaymentError.js +0 -8
- package/lib/director/PaymentError.js.map +0 -1
- package/lib/director/PaymentPricingAdapter.d.ts +0 -46
- package/lib/director/PaymentPricingAdapter.d.ts.map +0 -1
- package/lib/director/PaymentPricingAdapter.js +0 -25
- package/lib/director/PaymentPricingAdapter.js.map +0 -1
- package/lib/director/PaymentPricingDirector.d.ts +0 -19
- package/lib/director/PaymentPricingDirector.d.ts.map +0 -1
- package/lib/director/PaymentPricingDirector.js +0 -58
- package/lib/director/PaymentPricingDirector.js.map +0 -1
- package/lib/director/PaymentPricingSheet.d.ts +0 -10
- package/lib/director/PaymentPricingSheet.d.ts.map +0 -1
- package/lib/director/PaymentPricingSheet.js +0 -75
- package/lib/director/PaymentPricingSheet.js.map +0 -1
- package/lib/director/PaymentProviderType.d.ts +0 -6
- package/lib/director/PaymentProviderType.d.ts.map +0 -1
- package/lib/director/PaymentProviderType.js +0 -7
- package/lib/director/PaymentProviderType.js.map +0 -1
- package/lib/types.d.ts +0 -84
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -17
- package/lib/types.js.map +0 -1
- package/src/director/PaymentAdapter.ts +0 -63
- package/src/director/PaymentDirector.ts +0 -99
- package/src/director/PaymentError.ts +0 -6
- package/src/director/PaymentPricingAdapter.ts +0 -87
- package/src/director/PaymentPricingDirector.ts +0 -101
- package/src/director/PaymentPricingSheet.ts +0 -87
- package/src/director/PaymentProviderType.ts +0 -5
- package/src/types.ts +0 -108
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-settings.js","sourceRoot":"","sources":["../src/payment-settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payment-settings.js","sourceRoot":"","sources":["../src/payment-settings.ts"],"names":[],"mappings":"AA+BA,MAAM,kBAAkB,GAAG,CAAC,IAAqB,EAAE,KAAsB,EAAE,EAAE;IAC3E,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,YAAY,GAAoB,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC5D,OAAO,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAA6B,KAAK,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,EAAE;IACnG,MAAM,+BAA+B,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,EAAE;QAClF,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,EAAE;YACnD,OAAO,wBAAwB,CAAC,GAAG,KAAK,iBAAiB,CAAC,iBAAiB,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAI,+BAA+B;QAAE,OAAO,+BAA+B,CAAC;IAC5E,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,wBAAwB,EAAE,IAAI;IAC9B,wBAAwB,EAAE,IAAI;IAE9B,iBAAiB,CAAC,EAChB,wBAAwB,GAAG,YAAY,EACvC,wBAAwB,GAAG,sBAAsB,GAClD,GAAG,EAAE;QACJ,eAAe,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;QACpE,eAAe,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;IACtE,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/core-payment",
|
|
3
|
-
"version": "3.0.0-
|
|
3
|
+
"version": "3.0.0-rc.11",
|
|
4
4
|
"main": "lib/payment-index.js",
|
|
5
|
-
"exports": {
|
|
6
|
-
".": "./lib/payment-index.js",
|
|
7
|
-
"./*": "./lib/*"
|
|
8
|
-
},
|
|
9
5
|
"types": "lib/payment-index.d.ts",
|
|
10
6
|
"type": "module",
|
|
11
7
|
"scripts": {
|
|
12
|
-
"clean": "
|
|
13
|
-
"
|
|
8
|
+
"clean": "tsc -b --clean",
|
|
9
|
+
"build": "tsc -b",
|
|
10
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
14
11
|
"watch": "tsc -w",
|
|
15
12
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest --detectOpenHandles --forceExit",
|
|
16
13
|
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch --detectOpenHandles --forceExit"
|
|
@@ -24,21 +21,24 @@
|
|
|
24
21
|
"ecommerce",
|
|
25
22
|
"core"
|
|
26
23
|
],
|
|
27
|
-
"
|
|
24
|
+
"authors": [
|
|
25
|
+
"Joël Meiller",
|
|
26
|
+
"Pascal Kaufmann"
|
|
27
|
+
],
|
|
28
28
|
"license": "EUPL-1.2",
|
|
29
29
|
"bugs": {
|
|
30
30
|
"url": "https://github.com/unchainedshop/unchained/issues"
|
|
31
31
|
},
|
|
32
32
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@unchainedshop/events": "^3.0.0-
|
|
35
|
-
"@unchainedshop/logger": "^3.0.0-
|
|
36
|
-
"@unchainedshop/utils": "^3.0.0-
|
|
34
|
+
"@unchainedshop/events": "^3.0.0-rc.11",
|
|
35
|
+
"@unchainedshop/logger": "^3.0.0-rc.11",
|
|
36
|
+
"@unchainedshop/utils": "^3.0.0-rc.11"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@types/node": "^22.
|
|
39
|
+
"@types/node": "^22.10.2",
|
|
40
40
|
"jest": "^29.7.0",
|
|
41
41
|
"ts-jest": "^29.2.5",
|
|
42
|
-
"typescript": "^5.
|
|
42
|
+
"typescript": "^5.7.2"
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
|
-
import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
|
|
2
|
-
|
|
1
|
+
import { mongodb, buildDbIndexes, TimestampFields } from '@unchainedshop/mongodb';
|
|
2
|
+
|
|
3
|
+
export type PaymentCredentials = {
|
|
4
|
+
_id?: string;
|
|
5
|
+
paymentProviderId: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
token?: string;
|
|
8
|
+
isPreferred?: boolean;
|
|
9
|
+
meta: any;
|
|
10
|
+
} & TimestampFields;
|
|
3
11
|
|
|
4
12
|
export const PaymentCredentialsCollection = async (db: mongodb.Db) => {
|
|
5
|
-
const
|
|
13
|
+
const PaymentCredentialsCol = db.collection<PaymentCredentials>('payment_credentials');
|
|
6
14
|
|
|
7
|
-
await buildDbIndexes<
|
|
15
|
+
await buildDbIndexes<PaymentCredentials>(PaymentCredentialsCol, [
|
|
8
16
|
{ index: { paymentProviderId: 1 } },
|
|
9
17
|
{ index: { userId: 1 } },
|
|
10
18
|
]);
|
|
11
19
|
|
|
12
|
-
return
|
|
20
|
+
return PaymentCredentialsCol;
|
|
13
21
|
};
|
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
|
|
2
|
-
|
|
1
|
+
import { mongodb, buildDbIndexes, TimestampFields } from '@unchainedshop/mongodb';
|
|
2
|
+
|
|
3
|
+
export enum PaymentProviderType {
|
|
4
|
+
CARD = 'CARD',
|
|
5
|
+
INVOICE = 'INVOICE',
|
|
6
|
+
GENERIC = 'GENERIC',
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type PaymentConfiguration = Array<{
|
|
10
|
+
key: string;
|
|
11
|
+
value: string | null;
|
|
12
|
+
}>;
|
|
13
|
+
|
|
14
|
+
export type PaymentProvider = {
|
|
15
|
+
_id?: string;
|
|
16
|
+
type: PaymentProviderType;
|
|
17
|
+
adapterKey: string;
|
|
18
|
+
configuration: PaymentConfiguration;
|
|
19
|
+
} & TimestampFields;
|
|
3
20
|
|
|
4
21
|
export const PaymentProvidersCollection = async (db: mongodb.Db) => {
|
|
5
22
|
const PaymentProviders = db.collection<PaymentProvider>('payment-providers');
|
|
@@ -1,42 +1,16 @@
|
|
|
1
1
|
import { mongodb, generateDbFilterById, generateDbObjectId } from '@unchainedshop/mongodb';
|
|
2
|
-
import { PaymentCredentials as PaymentCredentialsType } from '../
|
|
3
|
-
|
|
4
|
-
export type PaymentCredentialsModules = {
|
|
5
|
-
// Queries
|
|
6
|
-
|
|
7
|
-
credentialsExists: (query: { paymentCredentialsId: string }) => Promise<boolean>;
|
|
8
|
-
|
|
9
|
-
findPaymentCredential: (
|
|
10
|
-
query: {
|
|
11
|
-
paymentCredentialsId?: string;
|
|
12
|
-
userId?: string;
|
|
13
|
-
paymentProviderId?: string;
|
|
14
|
-
isPreferred?: boolean;
|
|
15
|
-
},
|
|
16
|
-
options?: mongodb.FindOptions,
|
|
17
|
-
) => Promise<PaymentCredentialsType>;
|
|
18
|
-
|
|
19
|
-
findPaymentCredentials: (
|
|
20
|
-
query: mongodb.Filter<PaymentCredentialsType>,
|
|
21
|
-
options?: mongodb.FindOptions,
|
|
22
|
-
) => Promise<Array<PaymentCredentialsType>>;
|
|
23
|
-
|
|
24
|
-
// Mutations
|
|
25
|
-
markPreferred: (query: { userId: string; paymentCredentialsId: string }) => Promise<void>;
|
|
26
|
-
|
|
27
|
-
upsertCredentials: (
|
|
28
|
-
doc: Pick<PaymentCredentialsType, 'userId' | 'paymentProviderId' | '_id' | 'token'> & {
|
|
29
|
-
[x: string]: any;
|
|
30
|
-
},
|
|
31
|
-
) => Promise<string | null>;
|
|
32
|
-
|
|
33
|
-
removeCredentials: (paymentCredentialsId: string) => Promise<PaymentCredentialsType>;
|
|
34
|
-
};
|
|
2
|
+
import { PaymentCredentials as PaymentCredentialsType } from '../db/PaymentCredentialsCollection.js';
|
|
35
3
|
|
|
36
4
|
export const configurePaymentCredentialsModule = (
|
|
37
5
|
PaymentCredentials: mongodb.Collection<PaymentCredentialsType>,
|
|
38
|
-
)
|
|
39
|
-
const markPreferred = async ({
|
|
6
|
+
) => {
|
|
7
|
+
const markPreferred = async ({
|
|
8
|
+
userId,
|
|
9
|
+
paymentCredentialsId,
|
|
10
|
+
}: {
|
|
11
|
+
userId: string;
|
|
12
|
+
paymentCredentialsId: string;
|
|
13
|
+
}): Promise<void> => {
|
|
40
14
|
await PaymentCredentials.updateOne(
|
|
41
15
|
{
|
|
42
16
|
_id: paymentCredentialsId,
|
|
@@ -63,7 +37,11 @@ export const configurePaymentCredentialsModule = (
|
|
|
63
37
|
return {
|
|
64
38
|
markPreferred,
|
|
65
39
|
|
|
66
|
-
credentialsExists: async ({
|
|
40
|
+
credentialsExists: async ({
|
|
41
|
+
paymentCredentialsId,
|
|
42
|
+
}: {
|
|
43
|
+
paymentCredentialsId: string;
|
|
44
|
+
}): Promise<boolean> => {
|
|
67
45
|
const credentialsCount = await PaymentCredentials.countDocuments(
|
|
68
46
|
generateDbFilterById(paymentCredentialsId),
|
|
69
47
|
{ limit: 1 },
|
|
@@ -71,7 +49,18 @@ export const configurePaymentCredentialsModule = (
|
|
|
71
49
|
return !!credentialsCount;
|
|
72
50
|
},
|
|
73
51
|
|
|
74
|
-
findPaymentCredential: async (
|
|
52
|
+
findPaymentCredential: async (
|
|
53
|
+
{
|
|
54
|
+
paymentCredentialsId,
|
|
55
|
+
userId,
|
|
56
|
+
paymentProviderId,
|
|
57
|
+
}: {
|
|
58
|
+
paymentCredentialsId?: string;
|
|
59
|
+
userId?: string;
|
|
60
|
+
paymentProviderId?: string;
|
|
61
|
+
},
|
|
62
|
+
options?: mongodb.FindOptions,
|
|
63
|
+
): Promise<PaymentCredentialsType> => {
|
|
75
64
|
return PaymentCredentials.findOne(
|
|
76
65
|
paymentCredentialsId
|
|
77
66
|
? generateDbFilterById(paymentCredentialsId)
|
|
@@ -80,12 +69,23 @@ export const configurePaymentCredentialsModule = (
|
|
|
80
69
|
);
|
|
81
70
|
},
|
|
82
71
|
|
|
83
|
-
findPaymentCredentials: async (
|
|
72
|
+
findPaymentCredentials: async (
|
|
73
|
+
query: mongodb.Filter<PaymentCredentialsType>,
|
|
74
|
+
options?: mongodb.FindOptions,
|
|
75
|
+
): Promise<Array<PaymentCredentialsType>> => {
|
|
84
76
|
const credentials = await PaymentCredentials.find(query, options).toArray();
|
|
85
77
|
return credentials;
|
|
86
78
|
},
|
|
87
79
|
|
|
88
|
-
upsertCredentials: async ({
|
|
80
|
+
upsertCredentials: async ({
|
|
81
|
+
userId,
|
|
82
|
+
paymentProviderId,
|
|
83
|
+
_id,
|
|
84
|
+
token,
|
|
85
|
+
...meta
|
|
86
|
+
}: Pick<PaymentCredentialsType, 'userId' | 'paymentProviderId' | '_id' | 'token'> & {
|
|
87
|
+
[x: string]: any;
|
|
88
|
+
}): Promise<string> => {
|
|
89
89
|
const insertedId = _id || generateDbObjectId();
|
|
90
90
|
const result = await PaymentCredentials.updateOne(
|
|
91
91
|
_id
|
|
@@ -123,10 +123,12 @@ export const configurePaymentCredentialsModule = (
|
|
|
123
123
|
return null;
|
|
124
124
|
},
|
|
125
125
|
|
|
126
|
-
removeCredentials: async (paymentCredentialsId) => {
|
|
126
|
+
removeCredentials: async (paymentCredentialsId: string): Promise<PaymentCredentialsType> => {
|
|
127
127
|
const selector = generateDbFilterById(paymentCredentialsId);
|
|
128
128
|
const paymentCredentials = await PaymentCredentials.findOneAndDelete(selector, {});
|
|
129
129
|
return paymentCredentials;
|
|
130
130
|
},
|
|
131
131
|
};
|
|
132
132
|
};
|
|
133
|
+
|
|
134
|
+
export type PaymentCredentialsModule = ReturnType<typeof configurePaymentCredentialsModule>;
|
|
@@ -1,41 +1,14 @@
|
|
|
1
|
-
import { UnchainedCore } from '@unchainedshop/core';
|
|
2
1
|
import { PaymentCredentialsCollection } from '../db/PaymentCredentialsCollection.js';
|
|
3
2
|
import { PaymentProvidersCollection } from '../db/PaymentProvidersCollection.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
PaymentCredentialsModules,
|
|
7
|
-
} from './configurePaymentCredentialsModule.js';
|
|
8
|
-
import {
|
|
9
|
-
configurePaymentProvidersModule,
|
|
10
|
-
PaymentProvidersModules,
|
|
11
|
-
} from './configurePaymentProvidersModule.js';
|
|
3
|
+
import { configurePaymentCredentialsModule } from './configurePaymentCredentialsModule.js';
|
|
4
|
+
import { configurePaymentProvidersModule } from './configurePaymentProvidersModule.js';
|
|
12
5
|
import { paymentSettings, PaymentSettingsOptions } from '../payment-settings.js';
|
|
13
|
-
import { PaymentContext, PaymentCredentials as PaymentCredentialsType } from '../types.js';
|
|
14
6
|
import { ModuleInput } from '@unchainedshop/mongodb';
|
|
15
|
-
export type PaymentModule = {
|
|
16
|
-
/*
|
|
17
|
-
* Payment Providers Module
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
registerCredentials: (
|
|
21
|
-
paymentProviderId: string,
|
|
22
|
-
paymentContext: PaymentContext,
|
|
23
|
-
unchainedAPI: UnchainedCore,
|
|
24
|
-
) => Promise<PaymentCredentialsType>;
|
|
25
|
-
|
|
26
|
-
paymentProviders: PaymentProvidersModules;
|
|
27
|
-
|
|
28
|
-
/*
|
|
29
|
-
* Payment Credentials Module
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
paymentCredentials: PaymentCredentialsModules;
|
|
33
|
-
};
|
|
34
7
|
|
|
35
8
|
export const configurePaymentModule = async ({
|
|
36
9
|
db,
|
|
37
10
|
options: paymentOptions = {},
|
|
38
|
-
}: ModuleInput<PaymentSettingsOptions>)
|
|
11
|
+
}: ModuleInput<PaymentSettingsOptions>) => {
|
|
39
12
|
const PaymentProviders = await PaymentProvidersCollection(db);
|
|
40
13
|
const PaymentCredentials = await PaymentCredentialsCollection(db);
|
|
41
14
|
|
|
@@ -44,35 +17,10 @@ export const configurePaymentModule = async ({
|
|
|
44
17
|
const paymentProviders = configurePaymentProvidersModule(PaymentProviders);
|
|
45
18
|
const paymentCredentials = configurePaymentCredentialsModule(PaymentCredentials);
|
|
46
19
|
|
|
47
|
-
const registerCredentials: PaymentModule['registerCredentials'] = async (
|
|
48
|
-
paymentProviderId,
|
|
49
|
-
paymentContext,
|
|
50
|
-
unchainedAPI,
|
|
51
|
-
) => {
|
|
52
|
-
const registration = await paymentProviders.register(
|
|
53
|
-
paymentProviderId,
|
|
54
|
-
paymentContext,
|
|
55
|
-
unchainedAPI,
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
if (!registration) return null;
|
|
59
|
-
|
|
60
|
-
const paymentCredentialsId = await paymentCredentials.upsertCredentials({
|
|
61
|
-
userId: paymentContext.userId,
|
|
62
|
-
paymentProviderId,
|
|
63
|
-
...registration,
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
return paymentCredentials.findPaymentCredential({
|
|
67
|
-
paymentCredentialsId,
|
|
68
|
-
userId: paymentContext.userId,
|
|
69
|
-
paymentProviderId,
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
|
|
73
20
|
return {
|
|
74
21
|
paymentProviders,
|
|
75
22
|
paymentCredentials,
|
|
76
|
-
registerCredentials,
|
|
77
23
|
};
|
|
78
24
|
};
|
|
25
|
+
|
|
26
|
+
export type PaymentModule = Awaited<ReturnType<typeof configurePaymentModule>>;
|
|
@@ -1,108 +1,12 @@
|
|
|
1
|
-
import { UnchainedCore } from '@unchainedshop/core';
|
|
2
|
-
import {
|
|
3
|
-
PaymentChargeActionResult,
|
|
4
|
-
PaymentContext,
|
|
5
|
-
PaymentCredentials,
|
|
6
|
-
PaymentError,
|
|
7
|
-
PaymentInterface,
|
|
8
|
-
PaymentProvider,
|
|
9
|
-
} from '../types.js';
|
|
10
1
|
import { emit, registerEvents } from '@unchainedshop/events';
|
|
11
2
|
import { generateDbFilterById, generateDbObjectId, mongodb } from '@unchainedshop/mongodb';
|
|
12
|
-
import {
|
|
13
|
-
import { PaymentPricingSheet } from '../director/PaymentPricingSheet.js';
|
|
14
|
-
import { PaymentDirector } from '../director/PaymentDirector.js';
|
|
15
|
-
import { paymentSettings } from '../payment-settings.js';
|
|
16
|
-
import { Order } from '@unchainedshop/core-orders';
|
|
17
|
-
import {
|
|
18
|
-
IPaymentPricingSheet,
|
|
19
|
-
PaymentPricingCalculation,
|
|
20
|
-
PaymentProviderType,
|
|
21
|
-
} from '../payment-index.js';
|
|
3
|
+
import { PaymentProvider } from '../db/PaymentProvidersCollection.js';
|
|
22
4
|
|
|
23
|
-
export
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
count: (query: mongodb.Filter<PaymentProvider>) => Promise<number>;
|
|
29
|
-
findProvider: (
|
|
30
|
-
query: mongodb.Filter<PaymentProvider> & {
|
|
31
|
-
paymentProviderId: string;
|
|
32
|
-
},
|
|
33
|
-
options?: mongodb.FindOptions,
|
|
34
|
-
) => Promise<PaymentProvider>;
|
|
35
|
-
findProviders: (
|
|
36
|
-
query: mongodb.Filter<PaymentProvider>,
|
|
37
|
-
options?: mongodb.FindOptions,
|
|
38
|
-
) => Promise<Array<PaymentProvider>>;
|
|
39
|
-
|
|
40
|
-
providerExists: (query: { paymentProviderId: string }) => Promise<boolean>;
|
|
41
|
-
|
|
42
|
-
// Payment adapter
|
|
43
|
-
findSupported: (
|
|
44
|
-
query: { order: Order },
|
|
45
|
-
unchainedAPI: UnchainedCore,
|
|
46
|
-
) => Promise<Array<PaymentProvider>>;
|
|
47
|
-
determineDefault: (
|
|
48
|
-
paymentProviders: Array<PaymentProvider>,
|
|
49
|
-
params: { order: Order; paymentCredentials?: Array<PaymentCredentials> },
|
|
50
|
-
unchainedAPI: UnchainedCore,
|
|
51
|
-
) => Promise<PaymentProvider>;
|
|
52
|
-
|
|
53
|
-
findInterface: (query: PaymentProvider) => PaymentInterface;
|
|
54
|
-
findInterfaces: (query: { type: PaymentProviderType }) => Array<PaymentInterface>;
|
|
55
|
-
|
|
56
|
-
pricingSheet: (params: {
|
|
57
|
-
calculation: Array<PaymentPricingCalculation>;
|
|
58
|
-
currency: string;
|
|
59
|
-
}) => IPaymentPricingSheet;
|
|
60
|
-
|
|
61
|
-
configurationError: (
|
|
62
|
-
paymentProvider: PaymentProvider,
|
|
63
|
-
unchainedAPI: UnchainedCore,
|
|
64
|
-
) => Promise<PaymentError>;
|
|
65
|
-
|
|
66
|
-
isActive: (paymentProvider: PaymentProvider, unchainedAPI: UnchainedCore) => Promise<boolean>;
|
|
67
|
-
|
|
68
|
-
isPayLaterAllowed: (paymentProvider: PaymentProvider, unchainedAPI: UnchainedCore) => Promise<boolean>;
|
|
69
|
-
|
|
70
|
-
calculate: (
|
|
71
|
-
pricingContext: PaymentPricingContext,
|
|
72
|
-
unchainedAPI: UnchainedCore,
|
|
73
|
-
) => Promise<Array<PaymentPricingCalculation>>;
|
|
74
|
-
|
|
75
|
-
charge: (
|
|
76
|
-
paymentProviderId: string,
|
|
77
|
-
paymentContext: PaymentContext,
|
|
78
|
-
unchainedAPI: UnchainedCore,
|
|
79
|
-
) => Promise<PaymentChargeActionResult | false>;
|
|
80
|
-
register: (
|
|
81
|
-
paymentProviderId: string,
|
|
82
|
-
paymentContext: PaymentContext,
|
|
83
|
-
unchainedAPI: UnchainedCore,
|
|
84
|
-
) => Promise<any>;
|
|
85
|
-
sign: (
|
|
86
|
-
paymentProviderId: string,
|
|
87
|
-
paymentContext: PaymentContext,
|
|
88
|
-
unchainedAPI: UnchainedCore,
|
|
89
|
-
) => Promise<string>;
|
|
90
|
-
validate: (
|
|
91
|
-
paymentProviderId: string,
|
|
92
|
-
paymentContext: PaymentContext,
|
|
93
|
-
unchainedAPI: UnchainedCore,
|
|
94
|
-
) => Promise<boolean>;
|
|
95
|
-
cancel: (
|
|
96
|
-
paymentProviderId: string,
|
|
97
|
-
paymentContext: PaymentContext,
|
|
98
|
-
unchainedAPI: UnchainedCore,
|
|
99
|
-
) => Promise<boolean>;
|
|
100
|
-
confirm: (
|
|
101
|
-
paymentProviderId: string,
|
|
102
|
-
paymentContext: PaymentContext,
|
|
103
|
-
unchainedAPI: UnchainedCore,
|
|
104
|
-
) => Promise<boolean>;
|
|
105
|
-
};
|
|
5
|
+
export interface PaymentInterface {
|
|
6
|
+
_id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
version: string;
|
|
9
|
+
}
|
|
106
10
|
|
|
107
11
|
const PAYMENT_PROVIDER_EVENTS: string[] = [
|
|
108
12
|
'PAYMENT_PROVIDER_CREATE',
|
|
@@ -114,47 +18,42 @@ export const buildFindSelector = ({ type }: mongodb.Filter<PaymentProvider> = {}
|
|
|
114
18
|
return { ...(type ? { type } : {}), deleted: null };
|
|
115
19
|
};
|
|
116
20
|
|
|
117
|
-
const asyncFilter = async (arr, predicate) => {
|
|
118
|
-
const results = await Promise.all(arr.map(predicate));
|
|
119
|
-
|
|
120
|
-
return arr.filter((_v, index) => results[index]);
|
|
121
|
-
};
|
|
122
|
-
|
|
123
21
|
export const configurePaymentProvidersModule = (
|
|
124
22
|
PaymentProviders: mongodb.Collection<PaymentProvider>,
|
|
125
|
-
)
|
|
23
|
+
) => {
|
|
126
24
|
registerEvents(PAYMENT_PROVIDER_EVENTS);
|
|
127
25
|
|
|
128
|
-
const getPaymentAdapter = async (
|
|
129
|
-
paymentProviderId: string,
|
|
130
|
-
paymentContext: PaymentContext,
|
|
131
|
-
unchainedAPI: UnchainedCore,
|
|
132
|
-
) => {
|
|
133
|
-
const provider = await PaymentProviders.findOne(generateDbFilterById(paymentProviderId), {});
|
|
134
|
-
|
|
135
|
-
return PaymentDirector.actions(provider, paymentContext, unchainedAPI);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
26
|
return {
|
|
139
27
|
// Queries
|
|
140
|
-
count: async (query) => {
|
|
28
|
+
count: async (query: mongodb.Filter<PaymentProvider>): Promise<number> => {
|
|
141
29
|
const providerCount = await PaymentProviders.countDocuments(buildFindSelector(query));
|
|
142
30
|
return providerCount;
|
|
143
31
|
},
|
|
144
32
|
|
|
145
|
-
findProvider: async (
|
|
33
|
+
findProvider: async (
|
|
34
|
+
{
|
|
35
|
+
paymentProviderId,
|
|
36
|
+
...query
|
|
37
|
+
}: mongodb.Filter<PaymentProvider> & {
|
|
38
|
+
paymentProviderId: string;
|
|
39
|
+
},
|
|
40
|
+
options?: mongodb.FindOptions,
|
|
41
|
+
): Promise<PaymentProvider> => {
|
|
146
42
|
return PaymentProviders.findOne(
|
|
147
43
|
paymentProviderId ? generateDbFilterById(paymentProviderId) : query,
|
|
148
44
|
options,
|
|
149
45
|
);
|
|
150
46
|
},
|
|
151
47
|
|
|
152
|
-
findProviders: async (
|
|
48
|
+
findProviders: async (
|
|
49
|
+
query: mongodb.Filter<PaymentProvider>,
|
|
50
|
+
options: mongodb.FindOptions = { sort: { created: 1 } },
|
|
51
|
+
): Promise<Array<PaymentProvider>> => {
|
|
153
52
|
const providers = PaymentProviders.find(buildFindSelector(query), options);
|
|
154
53
|
return providers.toArray();
|
|
155
54
|
},
|
|
156
55
|
|
|
157
|
-
providerExists: async ({ paymentProviderId }) => {
|
|
56
|
+
providerExists: async ({ paymentProviderId }: { paymentProviderId: string }): Promise<boolean> => {
|
|
158
57
|
const providerCount = await PaymentProviders.countDocuments(
|
|
159
58
|
generateDbFilterById(paymentProviderId, { deleted: null }),
|
|
160
59
|
{ limit: 1 },
|
|
@@ -162,124 +61,11 @@ export const configurePaymentProvidersModule = (
|
|
|
162
61
|
return !!providerCount;
|
|
163
62
|
},
|
|
164
63
|
|
|
165
|
-
findInterface: (paymentProvider) => {
|
|
166
|
-
const Adapter = PaymentDirector.getAdapter(paymentProvider.adapterKey);
|
|
167
|
-
if (!Adapter) return null;
|
|
168
|
-
return {
|
|
169
|
-
_id: Adapter.key,
|
|
170
|
-
label: Adapter.label,
|
|
171
|
-
version: Adapter.version,
|
|
172
|
-
};
|
|
173
|
-
},
|
|
174
|
-
|
|
175
|
-
pricingSheet: (params) => {
|
|
176
|
-
return PaymentPricingSheet(params);
|
|
177
|
-
},
|
|
178
|
-
|
|
179
|
-
findInterfaces: ({ type }) => {
|
|
180
|
-
return PaymentDirector.getAdapters()
|
|
181
|
-
.filter((Adapter) => Adapter.typeSupported(type))
|
|
182
|
-
.map((Adapter) => ({
|
|
183
|
-
_id: Adapter.key,
|
|
184
|
-
label: Adapter.label,
|
|
185
|
-
version: Adapter.version,
|
|
186
|
-
}));
|
|
187
|
-
},
|
|
188
|
-
|
|
189
|
-
findSupported: async (paymentContext, unchainedAPI) => {
|
|
190
|
-
const allProviders = await PaymentProviders.find({ deleted: null }).toArray();
|
|
191
|
-
const providers: PaymentProvider[] = await asyncFilter(
|
|
192
|
-
allProviders,
|
|
193
|
-
async (provider: PaymentProvider) => {
|
|
194
|
-
try {
|
|
195
|
-
const director = await PaymentDirector.actions(provider, paymentContext, unchainedAPI);
|
|
196
|
-
return director.isActive();
|
|
197
|
-
} catch {
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
return paymentSettings.filterSupportedProviders(
|
|
204
|
-
{
|
|
205
|
-
providers,
|
|
206
|
-
order: paymentContext.order,
|
|
207
|
-
},
|
|
208
|
-
unchainedAPI,
|
|
209
|
-
);
|
|
210
|
-
},
|
|
211
|
-
|
|
212
|
-
determineDefault: async (paymentProviders, deliveryContext, unchainedAPI) => {
|
|
213
|
-
return paymentSettings.determineDefaultProvider(
|
|
214
|
-
{
|
|
215
|
-
providers: paymentProviders,
|
|
216
|
-
...deliveryContext,
|
|
217
|
-
},
|
|
218
|
-
unchainedAPI,
|
|
219
|
-
);
|
|
220
|
-
},
|
|
221
|
-
|
|
222
|
-
// Payment Adapter
|
|
223
|
-
|
|
224
|
-
configurationError: async (paymentProvider, unchainedAPI) => {
|
|
225
|
-
const actions = await PaymentDirector.actions(paymentProvider, {}, unchainedAPI);
|
|
226
|
-
return actions.configurationError();
|
|
227
|
-
},
|
|
228
|
-
|
|
229
|
-
calculate: async (pricingContext, unchainedAPI) => {
|
|
230
|
-
const pricing = await PaymentPricingDirector.actions(pricingContext, unchainedAPI);
|
|
231
|
-
return pricing.calculate();
|
|
232
|
-
},
|
|
233
|
-
|
|
234
|
-
isActive: async (paymentProvider, unchainedAPI) => {
|
|
235
|
-
const actions = await PaymentDirector.actions(paymentProvider, {}, unchainedAPI);
|
|
236
|
-
return actions.isActive();
|
|
237
|
-
},
|
|
238
|
-
|
|
239
|
-
isPayLaterAllowed: async (paymentProvider, unchainedAPI) => {
|
|
240
|
-
const actions = await PaymentDirector.actions(paymentProvider, {}, unchainedAPI);
|
|
241
|
-
return actions.isPayLaterAllowed();
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
charge: async (paymentProviderId, paymentContext, unchainedAPI) => {
|
|
245
|
-
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, unchainedAPI);
|
|
246
|
-
return adapter.charge();
|
|
247
|
-
},
|
|
248
|
-
|
|
249
|
-
register: async (paymentProviderId, paymentContext, unchainedAPI) => {
|
|
250
|
-
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, unchainedAPI);
|
|
251
|
-
return adapter.register();
|
|
252
|
-
},
|
|
253
|
-
|
|
254
|
-
sign: async (paymentProviderId, paymentContext, unchainedAPI) => {
|
|
255
|
-
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, unchainedAPI);
|
|
256
|
-
return adapter.sign();
|
|
257
|
-
},
|
|
258
|
-
|
|
259
|
-
validate: async (paymentProviderId, paymentContext, unchainedAPI) => {
|
|
260
|
-
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, unchainedAPI);
|
|
261
|
-
return adapter.validate();
|
|
262
|
-
},
|
|
263
|
-
|
|
264
|
-
cancel: async (paymentProviderId, paymentContext, unchainedAPI) => {
|
|
265
|
-
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, unchainedAPI);
|
|
266
|
-
return adapter.cancel();
|
|
267
|
-
},
|
|
268
|
-
|
|
269
|
-
confirm: async (paymentProviderId, paymentContext, unchainedAPI) => {
|
|
270
|
-
const adapter = await getPaymentAdapter(paymentProviderId, paymentContext, unchainedAPI);
|
|
271
|
-
return adapter.confirm();
|
|
272
|
-
},
|
|
273
|
-
|
|
274
64
|
// Mutations
|
|
275
|
-
create: async (doc) => {
|
|
276
|
-
const Adapter = PaymentDirector.getAdapter(doc.adapterKey);
|
|
277
|
-
if (!Adapter) return null;
|
|
278
|
-
|
|
65
|
+
create: async (doc: PaymentProvider): Promise<PaymentProvider> => {
|
|
279
66
|
const { insertedId: paymentProviderId } = await PaymentProviders.insertOne({
|
|
280
67
|
_id: generateDbObjectId(),
|
|
281
68
|
created: new Date(),
|
|
282
|
-
configuration: Adapter.initialConfiguration,
|
|
283
69
|
...doc,
|
|
284
70
|
});
|
|
285
71
|
|
|
@@ -291,7 +77,7 @@ export const configurePaymentProvidersModule = (
|
|
|
291
77
|
return paymentProvider;
|
|
292
78
|
},
|
|
293
79
|
|
|
294
|
-
update: async (_id: string, doc: PaymentProvider) => {
|
|
80
|
+
update: async (_id: string, doc: PaymentProvider): Promise<PaymentProvider> => {
|
|
295
81
|
const paymentProvider = await PaymentProviders.findOneAndUpdate(
|
|
296
82
|
generateDbFilterById(_id),
|
|
297
83
|
{
|
|
@@ -306,7 +92,7 @@ export const configurePaymentProvidersModule = (
|
|
|
306
92
|
return paymentProvider;
|
|
307
93
|
},
|
|
308
94
|
|
|
309
|
-
delete: async (_id) => {
|
|
95
|
+
delete: async (_id: string): Promise<PaymentProvider> => {
|
|
310
96
|
const paymentProvider = await PaymentProviders.findOneAndUpdate(
|
|
311
97
|
generateDbFilterById(_id),
|
|
312
98
|
{
|
|
@@ -321,3 +107,5 @@ export const configurePaymentProvidersModule = (
|
|
|
321
107
|
},
|
|
322
108
|
};
|
|
323
109
|
};
|
|
110
|
+
|
|
111
|
+
export type PaymentProvidersModule = ReturnType<typeof configurePaymentProvidersModule>;
|
package/src/payment-index.ts
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
export * from './types.js';
|
|
2
1
|
export * from './module/configurePaymentModule.js';
|
|
3
2
|
export * from './payment-settings.js';
|
|
4
|
-
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './director/PaymentAdapter.js';
|
|
7
|
-
export * from './director/PaymentPricingAdapter.js';
|
|
8
|
-
export * from './director/PaymentPricingDirector.js';
|
|
9
|
-
export * from './director/PaymentPricingSheet.js';
|
|
10
|
-
|
|
11
|
-
export { PaymentError } from './director/PaymentError.js';
|
|
12
|
-
export { PaymentProviderType } from './director/PaymentProviderType.js';
|
|
3
|
+
export * from './db/PaymentCredentialsCollection.js';
|
|
4
|
+
export * from './db/PaymentProvidersCollection.js';
|