@smartsoft001/revolut 1.1.90 → 1.2.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/.eslintrc +13 -0
- package/README.md +25 -4
- package/jest.config.ts +27 -0
- package/package.json +3 -29
- package/project.json +46 -0
- package/src/index.ts +2 -0
- package/src/lib/revolut.config.ts +10 -0
- package/src/lib/revolut.service.spec.ts +179 -0
- package/src/lib/revolut.service.ts +128 -0
- package/tsconfig.json +13 -0
- package/tsconfig.lib.json +11 -0
- package/tsconfig.spec.json +20 -0
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -6
- package/src/index.js.map +0 -1
- package/src/lib/revolut.config.d.ts +0 -8
- package/src/lib/revolut.config.js +0 -11
- package/src/lib/revolut.config.js.map +0 -1
- package/src/lib/revolut.service.d.ts +0 -32
- package/src/lib/revolut.service.js +0 -97
- package/src/lib/revolut.service.js.map +0 -1
- package/test-setup.js +0 -1
- package/test-setup.js.map +0 -1
- /package/{test-setup.d.ts → test-setup.ts} +0 -0
package/.eslintrc
ADDED
package/README.md
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 📦 @smartsoft001/revolut
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
 
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 🚀 Usage
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
`npm i @smartsoft001/revolut`
|
|
8
|
+
|
|
9
|
+
## 🛠️ Services & Methods
|
|
10
|
+
|
|
11
|
+
### PaypalService
|
|
12
|
+
|
|
13
|
+
Methods:
|
|
14
|
+
|
|
15
|
+
<table>
|
|
16
|
+
<tr>
|
|
17
|
+
<td>create</td>
|
|
18
|
+
<td>Creates a new order with payment provider (Revolut)</td>
|
|
19
|
+
</tr>
|
|
20
|
+
<tr>
|
|
21
|
+
<td>confirm</td>
|
|
22
|
+
<td>Fetches the current status of an existing transaction/order</td>
|
|
23
|
+
</tr>
|
|
24
|
+
<tr>
|
|
25
|
+
<td>refund</td>
|
|
26
|
+
<td>Refund handling (unsupported)</td>
|
|
27
|
+
</tr>
|
|
28
|
+
</table>
|
package/jest.config.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
export default {
|
|
3
|
+
displayName: 'shared-revolut',
|
|
4
|
+
globals: {},
|
|
5
|
+
testEnvironment: 'node',
|
|
6
|
+
transform: {
|
|
7
|
+
'^.+\\.[tj]sx?$': [
|
|
8
|
+
'ts-jest',
|
|
9
|
+
{
|
|
10
|
+
tsConfig: '<rootDir>/tsconfig.spec.json',
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
|
15
|
+
coverageDirectory: '../../../coverage/libs/shared/revolut',
|
|
16
|
+
preset: '../../../jest.preset.js',
|
|
17
|
+
/* TODO: Update to latest Jest snapshotFormat
|
|
18
|
+
* By default Nx has kept the older style of Jest Snapshot formats
|
|
19
|
+
* to prevent breaking of any existing tests with snapshots.
|
|
20
|
+
* It's recommend you update to the latest format.
|
|
21
|
+
* You can do this by removing snapshotFormat property
|
|
22
|
+
* and running tests with --update-snapshot flag.
|
|
23
|
+
* Example: From within the project directory, run "nx test --update-snapshot"
|
|
24
|
+
* More info: https://jestjs.io/docs/upgrading-to-jest29#snapshot-format
|
|
25
|
+
*/
|
|
26
|
+
snapshotFormat: { escapeString: true, printBasicPrototype: true },
|
|
27
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartsoft001/revolut",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Utils for revolut",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/emiljuchnikowski/smartsoft.git"
|
|
@@ -11,31 +11,5 @@
|
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/emiljuchnikowski/smartsoft/issues"
|
|
13
13
|
},
|
|
14
|
-
"homepage": "https://github.com/emiljuchnikowski/smartsoft#readme"
|
|
15
|
-
"dependencies": {
|
|
16
|
-
"@angular/common": "16.1.3",
|
|
17
|
-
"@angular/core": "16.1.3",
|
|
18
|
-
"@angular/platform-browser-dynamic": "16.1.3",
|
|
19
|
-
"@nestjs/axios": "3.0.0",
|
|
20
|
-
"@nestjs/common": "^10.0.5",
|
|
21
|
-
"@nestjs/core": "^10.0.5",
|
|
22
|
-
"flatted": "^3.2.4",
|
|
23
|
-
"guid-typescript": "1.0.9",
|
|
24
|
-
"lodash": "^4.17.20",
|
|
25
|
-
"md5": "2.3.0",
|
|
26
|
-
"reflect-metadata": "0.1.13",
|
|
27
|
-
"rxjs": "7.8.1",
|
|
28
|
-
"typeorm": "0.3.17"
|
|
29
|
-
},
|
|
30
|
-
"peerDependencies": {
|
|
31
|
-
"@smartsoft001/domain-core": "1.1.90",
|
|
32
|
-
"@smartsoft001/models": "1.1.90",
|
|
33
|
-
"@smartsoft001/trans-domain": "1.1.90",
|
|
34
|
-
"@smartsoft001/users": "1.1.90",
|
|
35
|
-
"@smartsoft001/utils": "1.1.90",
|
|
36
|
-
"util": "0.12.5",
|
|
37
|
-
"tslib": "2.5.3"
|
|
38
|
-
},
|
|
39
|
-
"main": "./src/index.js",
|
|
40
|
-
"types": "./src/index.d.ts"
|
|
14
|
+
"homepage": "https://github.com/emiljuchnikowski/smartsoft#readme"
|
|
41
15
|
}
|
package/project.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "shared-revolut",
|
|
3
|
+
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "packages/shared/revolut/src",
|
|
5
|
+
"projectType": "library",
|
|
6
|
+
"generators": {},
|
|
7
|
+
"targets": {
|
|
8
|
+
"lint": {
|
|
9
|
+
"executor": "@nx/eslint:lint",
|
|
10
|
+
"options": {
|
|
11
|
+
"lintFilePatterns": [
|
|
12
|
+
"packages/shared/revolut/**/*.{ts,tsx,js,jsx}",
|
|
13
|
+
"packages/shared/revolut/package.json"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"test": {
|
|
18
|
+
"executor": "@nx/jest:jest",
|
|
19
|
+
"options": {
|
|
20
|
+
"jestConfig": "packages/shared/revolut/jest.config.ts",
|
|
21
|
+
"passWithNoTests": true
|
|
22
|
+
},
|
|
23
|
+
"outputs": ["{workspaceRoot}/coverage/packages/shared/revolut"]
|
|
24
|
+
},
|
|
25
|
+
"build": {
|
|
26
|
+
"executor": "@nx/esbuild:esbuild",
|
|
27
|
+
"outputs": ["{options.outputPath}"],
|
|
28
|
+
"options": {
|
|
29
|
+
"outputPath": "dist/packages/shared/revolut",
|
|
30
|
+
"tsConfig": "packages/shared/revolut/tsconfig.lib.json",
|
|
31
|
+
"packageJson": "packages/shared/revolut/package.json",
|
|
32
|
+
"main": "packages/shared/revolut/src/index.ts",
|
|
33
|
+
"assets": ["packages/shared/revolut/*.md"]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"deploy": {
|
|
37
|
+
"executor": "ngx-deploy-npm:deploy",
|
|
38
|
+
"options": {
|
|
39
|
+
"access": "public",
|
|
40
|
+
"distFolderPath": "dist/packages/shared/revolut"
|
|
41
|
+
},
|
|
42
|
+
"dependsOn": ["build"]
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"tags": ["scope:shared", "type:util"]
|
|
46
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
+
import { HttpService } from '@nestjs/axios';
|
|
3
|
+
import { ModuleRef } from '@nestjs/core';
|
|
4
|
+
import { of } from 'rxjs';
|
|
5
|
+
|
|
6
|
+
import { Trans } from '@smartsoft001/trans-domain';
|
|
7
|
+
|
|
8
|
+
import { RevolutService } from './revolut.service';
|
|
9
|
+
import { RevolutConfig } from './revolut.config';
|
|
10
|
+
|
|
11
|
+
const mockHttpService = {
|
|
12
|
+
post: jest.fn(),
|
|
13
|
+
get: jest.fn(),
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const mockModuleRef = {
|
|
17
|
+
get: jest.fn(),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const mockRevolutConfig = {
|
|
21
|
+
token: 'mock-token',
|
|
22
|
+
test: true,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
describe('revolut: RevolutService', () => {
|
|
26
|
+
let service: RevolutService;
|
|
27
|
+
|
|
28
|
+
beforeEach(async () => {
|
|
29
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
30
|
+
providers: [
|
|
31
|
+
RevolutService,
|
|
32
|
+
{ provide: RevolutConfig, useValue: mockRevolutConfig },
|
|
33
|
+
{ provide: HttpService, useValue: mockHttpService },
|
|
34
|
+
{ provide: ModuleRef, useValue: mockModuleRef },
|
|
35
|
+
],
|
|
36
|
+
}).compile();
|
|
37
|
+
|
|
38
|
+
service = module.get<RevolutService>(RevolutService);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
afterEach(() => {
|
|
42
|
+
jest.clearAllMocks();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('create', () => {
|
|
46
|
+
it('should create a payment and return orderId and responseData', async () => {
|
|
47
|
+
const mockResponse = {
|
|
48
|
+
data: {
|
|
49
|
+
public_id: 'test-order-id',
|
|
50
|
+
id: 'test-internal-id',
|
|
51
|
+
state: 'PENDING',
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
mockHttpService.post.mockReturnValue(of(mockResponse));
|
|
56
|
+
|
|
57
|
+
const result = await service.create({
|
|
58
|
+
id: 'test-id',
|
|
59
|
+
name: 'test-name',
|
|
60
|
+
amount: 1000,
|
|
61
|
+
email: 'test@example.com',
|
|
62
|
+
clientIp: '127.0.0.1',
|
|
63
|
+
data: {},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
expect(result).toEqual({
|
|
67
|
+
orderId: 'test-order-id',
|
|
68
|
+
responseData: mockResponse.data,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should use sandbox URL when test mode is enabled', async () => {
|
|
73
|
+
const mockResponse = {
|
|
74
|
+
data: {
|
|
75
|
+
public_id: 'test-order-id',
|
|
76
|
+
id: 'test-internal-id',
|
|
77
|
+
state: 'PENDING',
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
mockHttpService.post.mockReturnValue(of(mockResponse));
|
|
82
|
+
|
|
83
|
+
await service.create({
|
|
84
|
+
id: 'test-id',
|
|
85
|
+
name: 'test-name',
|
|
86
|
+
amount: 1000,
|
|
87
|
+
email: 'test@example.com',
|
|
88
|
+
clientIp: '127.0.0.1',
|
|
89
|
+
data: {},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(mockHttpService.post).toHaveBeenCalledWith(
|
|
93
|
+
'https://sandbox-merchant.revolut.com/api/1.0/orders',
|
|
94
|
+
expect.any(Object),
|
|
95
|
+
expect.objectContaining({
|
|
96
|
+
headers: expect.objectContaining({
|
|
97
|
+
Authorization: 'Bearer mock-token',
|
|
98
|
+
}),
|
|
99
|
+
}),
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe('getStatus', () => {
|
|
105
|
+
it('should return the status and data of a payment', async () => {
|
|
106
|
+
const mockResponse = {
|
|
107
|
+
data: {
|
|
108
|
+
id: 'test-internal-id',
|
|
109
|
+
state: 'PROCESSING',
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
mockHttpService.get.mockReturnValue(of(mockResponse));
|
|
114
|
+
|
|
115
|
+
const result = await service.getStatus({
|
|
116
|
+
data: {},
|
|
117
|
+
history: [
|
|
118
|
+
{
|
|
119
|
+
status: 'started',
|
|
120
|
+
data: { responseData: { id: 'test-internal-id' } },
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
} as Trans<any>);
|
|
124
|
+
|
|
125
|
+
expect(result).toEqual({
|
|
126
|
+
status: 'completed',
|
|
127
|
+
data: mockResponse.data,
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('should map different states to correct statuses', async () => {
|
|
132
|
+
const testCases = [
|
|
133
|
+
{ state: 'PROCESSING', expectedStatus: 'completed' },
|
|
134
|
+
{ state: 'CANCELLED', expectedStatus: 'canceled' },
|
|
135
|
+
{ state: 'FAILED', expectedStatus: 'canceled' },
|
|
136
|
+
{ state: 'PENDING', expectedStatus: 'pending' },
|
|
137
|
+
{ state: 'UNKNOWN', expectedStatus: 'UNKNOWN' },
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
for (const testCase of testCases) {
|
|
141
|
+
const mockResponse = {
|
|
142
|
+
data: {
|
|
143
|
+
id: 'test-internal-id',
|
|
144
|
+
state: testCase.state,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
mockHttpService.get.mockReturnValue(of(mockResponse));
|
|
149
|
+
|
|
150
|
+
const result = await service.getStatus({
|
|
151
|
+
data: {},
|
|
152
|
+
history: [
|
|
153
|
+
{
|
|
154
|
+
status: 'started',
|
|
155
|
+
data: { responseData: { id: 'test-internal-id' } },
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
} as Trans<any>);
|
|
159
|
+
|
|
160
|
+
expect(result.status).toBe(testCase.expectedStatus);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe('refund', () => {
|
|
166
|
+
it('should reject with "Revolut not support" message', async () => {
|
|
167
|
+
await expect(
|
|
168
|
+
service.refund(
|
|
169
|
+
{
|
|
170
|
+
amount: 1000,
|
|
171
|
+
data: {},
|
|
172
|
+
history: [],
|
|
173
|
+
} as Trans<any>,
|
|
174
|
+
'test comment',
|
|
175
|
+
),
|
|
176
|
+
).rejects.toEqual('Revolut does not support refund');
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { HttpService } from '@nestjs/axios';
|
|
2
|
+
import { Injectable, Logger, Optional } from '@nestjs/common';
|
|
3
|
+
import { ModuleRef } from '@nestjs/core';
|
|
4
|
+
import {
|
|
5
|
+
ITransPaymentSingleService,
|
|
6
|
+
Trans,
|
|
7
|
+
TransStatus,
|
|
8
|
+
} from '@smartsoft001/trans-domain';
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
IRevolutConfigProvider,
|
|
12
|
+
REVOLUT_CONFIG_PROVIDER,
|
|
13
|
+
RevolutConfig,
|
|
14
|
+
} from './revolut.config';
|
|
15
|
+
|
|
16
|
+
@Injectable()
|
|
17
|
+
export class RevolutService implements ITransPaymentSingleService {
|
|
18
|
+
constructor(
|
|
19
|
+
private readonly httpService: HttpService,
|
|
20
|
+
private readonly moduleRef: ModuleRef,
|
|
21
|
+
@Optional() private readonly config: RevolutConfig,
|
|
22
|
+
) {}
|
|
23
|
+
|
|
24
|
+
async create(obj: {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
amount: number;
|
|
28
|
+
firstName?: string;
|
|
29
|
+
lastName?: string;
|
|
30
|
+
email?: string;
|
|
31
|
+
contactPhone?: string;
|
|
32
|
+
clientIp: string;
|
|
33
|
+
data: any;
|
|
34
|
+
}): Promise<{ orderId: string; responseData: any }> {
|
|
35
|
+
const config = await this.getConfig(obj.data);
|
|
36
|
+
|
|
37
|
+
const data = {
|
|
38
|
+
amount: obj.amount,
|
|
39
|
+
description: obj.name,
|
|
40
|
+
capture_mode: 'AUTOMATIC',
|
|
41
|
+
merchant_order_ext_ref: obj.id,
|
|
42
|
+
customer_email: obj.email,
|
|
43
|
+
currency: 'PLN',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const response = await this.httpService
|
|
47
|
+
.post(this.getBaseUrl(config) + '/api/1.0/orders', data, {
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
Authorization: 'Bearer ' + config.token,
|
|
51
|
+
},
|
|
52
|
+
maxRedirects: 0,
|
|
53
|
+
})
|
|
54
|
+
.toPromise();
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
responseData: response.data,
|
|
58
|
+
orderId: response.data['public_id'],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async getStatus<T>(
|
|
63
|
+
trans: Trans<T>,
|
|
64
|
+
): Promise<{ status: TransStatus; data: any }> {
|
|
65
|
+
const config = await this.getConfig(trans.data);
|
|
66
|
+
|
|
67
|
+
const historyItem = trans.history.find((h) => h.status === 'started');
|
|
68
|
+
|
|
69
|
+
const response = await this.httpService
|
|
70
|
+
.get(
|
|
71
|
+
this.getBaseUrl(config) +
|
|
72
|
+
'/api/1.0/orders/' +
|
|
73
|
+
(historyItem.data as any).responseData.id,
|
|
74
|
+
{
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
Authorization: 'Bearer ' + config.token,
|
|
78
|
+
},
|
|
79
|
+
maxRedirects: 0,
|
|
80
|
+
},
|
|
81
|
+
)
|
|
82
|
+
.toPromise();
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
data: response.data,
|
|
86
|
+
status: this.getStatusFromExternal(response.data['state']),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
refund(trans: Trans<any>, comment: string): Promise<any> {
|
|
91
|
+
return Promise.reject('Revolut does not support refund');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private getBaseUrl(config: RevolutConfig): string {
|
|
95
|
+
if (config.test) return 'https://sandbox-merchant.revolut.com';
|
|
96
|
+
|
|
97
|
+
return 'https://merchant.revolut.com/api';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private async getConfig(data: any): Promise<RevolutConfig> {
|
|
101
|
+
try {
|
|
102
|
+
const provider: IRevolutConfigProvider = this.moduleRef.get(
|
|
103
|
+
REVOLUT_CONFIG_PROVIDER,
|
|
104
|
+
{ strict: false },
|
|
105
|
+
);
|
|
106
|
+
return await provider.get(data);
|
|
107
|
+
} catch (e) {
|
|
108
|
+
Logger.warn('Revolut config provider not found', RevolutService.name);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return this.config;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private getStatusFromExternal(status: string): any {
|
|
115
|
+
switch (status) {
|
|
116
|
+
case 'PROCESSING':
|
|
117
|
+
return 'completed';
|
|
118
|
+
case 'CANCELLED':
|
|
119
|
+
return 'canceled';
|
|
120
|
+
case 'FAILED':
|
|
121
|
+
return 'canceled';
|
|
122
|
+
case 'PENDING':
|
|
123
|
+
return 'pending';
|
|
124
|
+
default:
|
|
125
|
+
return status;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"outDir": "../../../dist/out-tsc",
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"types": ["node"]
|
|
8
|
+
},
|
|
9
|
+
"exclude": ["**/*.spec.ts", "**/*.test.ts", "jest.config.ts"],
|
|
10
|
+
"include": ["**/*.ts"]
|
|
11
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../../../dist/out-tsc",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"types": ["jest", "node"]
|
|
7
|
+
},
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*.spec.ts",
|
|
10
|
+
"**/*.test.ts",
|
|
11
|
+
"**/*.spec.tsx",
|
|
12
|
+
"**/*.test.tsx",
|
|
13
|
+
"**/*.spec.js",
|
|
14
|
+
"**/*.test.js",
|
|
15
|
+
"**/*.spec.jsx",
|
|
16
|
+
"**/*.test.jsx",
|
|
17
|
+
"**/*.d.ts",
|
|
18
|
+
"jest.config.ts"
|
|
19
|
+
]
|
|
20
|
+
}
|
package/src/index.d.ts
DELETED
package/src/index.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
tslib_1.__exportStar(require("./lib/revolut.config"), exports);
|
|
5
|
-
tslib_1.__exportStar(require("./lib/revolut.service"), exports);
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/shared/revolut/src/index.ts"],"names":[],"mappings":";;;AAAA,+DAAqC;AACrC,gEAAsC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IRevolutConfigProvider = exports.REVOLUT_CONFIG_PROVIDER = exports.RevolutConfig = void 0;
|
|
4
|
-
class RevolutConfig {
|
|
5
|
-
}
|
|
6
|
-
exports.RevolutConfig = RevolutConfig;
|
|
7
|
-
exports.REVOLUT_CONFIG_PROVIDER = "REVOLUT_CONFIG_PROVIDER";
|
|
8
|
-
class IRevolutConfigProvider {
|
|
9
|
-
}
|
|
10
|
-
exports.IRevolutConfigProvider = IRevolutConfigProvider;
|
|
11
|
-
//# sourceMappingURL=revolut.config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"revolut.config.js","sourceRoot":"","sources":["../../../../../../libs/shared/revolut/src/lib/revolut.config.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;CAGzB;AAHD,sCAGC;AAEY,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AAEjE,MAAsB,sBAAsB;CAE3C;AAFD,wDAEC"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { ModuleRef } from "@nestjs/core";
|
|
2
|
-
import { HttpService } from "@nestjs/axios";
|
|
3
|
-
import { ITransPaymentSingleService, Trans, TransStatus } from "@smartsoft001/trans-domain";
|
|
4
|
-
import { RevolutConfig } from "./revolut.config";
|
|
5
|
-
export declare class RevolutService implements ITransPaymentSingleService {
|
|
6
|
-
private readonly httpService;
|
|
7
|
-
private readonly moduleRef;
|
|
8
|
-
private readonly config;
|
|
9
|
-
constructor(httpService: HttpService, moduleRef: ModuleRef, config: RevolutConfig);
|
|
10
|
-
create(obj: {
|
|
11
|
-
id: string;
|
|
12
|
-
name: string;
|
|
13
|
-
amount: number;
|
|
14
|
-
firstName?: string;
|
|
15
|
-
lastName?: string;
|
|
16
|
-
email?: string;
|
|
17
|
-
contactPhone?: string;
|
|
18
|
-
clientIp: string;
|
|
19
|
-
data: any;
|
|
20
|
-
}): Promise<{
|
|
21
|
-
orderId: string;
|
|
22
|
-
responseData: any;
|
|
23
|
-
}>;
|
|
24
|
-
getStatus<T>(trans: Trans<T>): Promise<{
|
|
25
|
-
status: TransStatus;
|
|
26
|
-
data: any;
|
|
27
|
-
}>;
|
|
28
|
-
refund(trans: Trans<any>, comment: string): Promise<any>;
|
|
29
|
-
private getBaseUrl;
|
|
30
|
-
private getConfig;
|
|
31
|
-
private getStatusFromExternal;
|
|
32
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var RevolutService_1;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.RevolutService = void 0;
|
|
5
|
-
const tslib_1 = require("tslib");
|
|
6
|
-
const common_1 = require("@nestjs/common");
|
|
7
|
-
const core_1 = require("@nestjs/core");
|
|
8
|
-
const axios_1 = require("@nestjs/axios");
|
|
9
|
-
const revolut_config_1 = require("./revolut.config");
|
|
10
|
-
let RevolutService = exports.RevolutService = RevolutService_1 = class RevolutService {
|
|
11
|
-
constructor(httpService, moduleRef, config) {
|
|
12
|
-
this.httpService = httpService;
|
|
13
|
-
this.moduleRef = moduleRef;
|
|
14
|
-
this.config = config;
|
|
15
|
-
}
|
|
16
|
-
async create(obj) {
|
|
17
|
-
const config = await this.getConfig(obj.data);
|
|
18
|
-
const data = {
|
|
19
|
-
amount: obj.amount,
|
|
20
|
-
description: obj.name,
|
|
21
|
-
capture_mode: "AUTOMATIC",
|
|
22
|
-
merchant_order_ext_ref: obj.id,
|
|
23
|
-
customer_email: obj.email,
|
|
24
|
-
currency: "PLN",
|
|
25
|
-
};
|
|
26
|
-
const response = await this.httpService
|
|
27
|
-
.post(this.getBaseUrl(config) + "/api/1.0/orders", data, {
|
|
28
|
-
headers: {
|
|
29
|
-
"Content-Type": "application/json",
|
|
30
|
-
Authorization: "Bearer " + config.token
|
|
31
|
-
},
|
|
32
|
-
maxRedirects: 0,
|
|
33
|
-
})
|
|
34
|
-
.toPromise();
|
|
35
|
-
return {
|
|
36
|
-
responseData: response.data,
|
|
37
|
-
orderId: response.data["public_id"],
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
async getStatus(trans) {
|
|
41
|
-
const config = await this.getConfig(trans.data);
|
|
42
|
-
const historyItem = trans.history.find(h => h.status === 'started');
|
|
43
|
-
const response = await this.httpService
|
|
44
|
-
.get(this.getBaseUrl(config) + "/api/1.0/orders/" + historyItem.data.responseData.id, {
|
|
45
|
-
headers: {
|
|
46
|
-
"Content-Type": "application/json",
|
|
47
|
-
Authorization: "Bearer " + config.token
|
|
48
|
-
},
|
|
49
|
-
maxRedirects: 0,
|
|
50
|
-
})
|
|
51
|
-
.toPromise();
|
|
52
|
-
return {
|
|
53
|
-
data: response.data,
|
|
54
|
-
status: this.getStatusFromExternal(response.data["state"]),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
refund(trans, comment) {
|
|
58
|
-
return Promise.reject('Revolut not support');
|
|
59
|
-
}
|
|
60
|
-
getBaseUrl(config) {
|
|
61
|
-
if (config.test)
|
|
62
|
-
return "https://sandbox-merchant.revolut.com";
|
|
63
|
-
return "https://merchant.revolut.com/api";
|
|
64
|
-
}
|
|
65
|
-
async getConfig(data) {
|
|
66
|
-
try {
|
|
67
|
-
const provider = this.moduleRef.get(revolut_config_1.REVOLUT_CONFIG_PROVIDER, { strict: false });
|
|
68
|
-
return await provider.get(data);
|
|
69
|
-
}
|
|
70
|
-
catch (e) {
|
|
71
|
-
common_1.Logger.warn("Revolut config provider not found", RevolutService_1.name);
|
|
72
|
-
}
|
|
73
|
-
return this.config;
|
|
74
|
-
}
|
|
75
|
-
getStatusFromExternal(status) {
|
|
76
|
-
switch (status) {
|
|
77
|
-
case "PROCESSING":
|
|
78
|
-
return "completed";
|
|
79
|
-
case "CANCELLED":
|
|
80
|
-
return "canceled";
|
|
81
|
-
case "FAILED":
|
|
82
|
-
return "canceled";
|
|
83
|
-
case "PENDING":
|
|
84
|
-
return "pending";
|
|
85
|
-
default:
|
|
86
|
-
return status;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
exports.RevolutService = RevolutService = RevolutService_1 = tslib_1.__decorate([
|
|
91
|
-
(0, common_1.Injectable)(),
|
|
92
|
-
tslib_1.__param(2, (0, common_1.Optional)()),
|
|
93
|
-
tslib_1.__metadata("design:paramtypes", [axios_1.HttpService,
|
|
94
|
-
core_1.ModuleRef,
|
|
95
|
-
revolut_config_1.RevolutConfig])
|
|
96
|
-
], RevolutService);
|
|
97
|
-
//# sourceMappingURL=revolut.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"revolut.service.js","sourceRoot":"","sources":["../../../../../../libs/shared/revolut/src/lib/revolut.service.ts"],"names":[],"mappings":"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"}
|
package/test-setup.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=test-setup.js.map
|
package/test-setup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../../../../libs/shared/revolut/test-setup.ts"],"names":[],"mappings":""}
|
|
File without changes
|