@grtsnx/payba3 1.0.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/CHANGELOG.md +14 -0
- package/CODE_OF_CONDUCT.md +24 -0
- package/CONTRIBUTING.md +149 -0
- package/LICENSE +21 -0
- package/README.md +282 -0
- package/SECURITY.md +53 -0
- package/SUPPORT.md +27 -0
- package/assets/payba3-logo.svg +17 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +24 -0
- package/dist/lib/lib.module.d.ts +2 -0
- package/dist/lib/lib.module.js +37 -0
- package/dist/lib/lib.module.js.map +1 -0
- package/dist/lib/monnify/config/monnify.helper.d.ts +24 -0
- package/dist/lib/monnify/config/monnify.helper.js +234 -0
- package/dist/lib/monnify/config/monnify.helper.js.map +1 -0
- package/dist/lib/monnify/config/monnify.types.d.ts +93 -0
- package/dist/lib/monnify/config/monnify.types.js +3 -0
- package/dist/lib/monnify/config/monnify.types.js.map +1 -0
- package/dist/lib/monnify/monnify.module.d.ts +2 -0
- package/dist/lib/monnify/monnify.module.js +22 -0
- package/dist/lib/monnify/monnify.module.js.map +1 -0
- package/dist/lib/monnify/monnify.service.d.ts +19 -0
- package/dist/lib/monnify/monnify.service.js +113 -0
- package/dist/lib/monnify/monnify.service.js.map +1 -0
- package/dist/lib/mono/config/mono.helper.d.ts +11 -0
- package/dist/lib/mono/config/mono.helper.js +78 -0
- package/dist/lib/mono/config/mono.helper.js.map +1 -0
- package/dist/lib/mono/config/mono.types.d.ts +48 -0
- package/dist/lib/mono/config/mono.types.js +3 -0
- package/dist/lib/mono/config/mono.types.js.map +1 -0
- package/dist/lib/mono/mono.module.d.ts +2 -0
- package/dist/lib/mono/mono.module.js +22 -0
- package/dist/lib/mono/mono.module.js.map +1 -0
- package/dist/lib/mono/mono.service.d.ts +15 -0
- package/dist/lib/mono/mono.service.js +77 -0
- package/dist/lib/mono/mono.service.js.map +1 -0
- package/dist/lib/opay/config/opay.helper.d.ts +17 -0
- package/dist/lib/opay/config/opay.helper.js +175 -0
- package/dist/lib/opay/config/opay.helper.js.map +1 -0
- package/dist/lib/opay/config/opay.types.d.ts +73 -0
- package/dist/lib/opay/config/opay.types.js +3 -0
- package/dist/lib/opay/config/opay.types.js.map +1 -0
- package/dist/lib/opay/opay.module.d.ts +2 -0
- package/dist/lib/opay/opay.module.js +22 -0
- package/dist/lib/opay/opay.module.js.map +1 -0
- package/dist/lib/opay/opay.service.d.ts +17 -0
- package/dist/lib/opay/opay.service.js +104 -0
- package/dist/lib/opay/opay.service.js.map +1 -0
- package/dist/lib/payba3.service.d.ts +16 -0
- package/dist/lib/payba3.service.js +59 -0
- package/dist/lib/payba3.service.js.map +1 -0
- package/dist/lib/payba3.types.d.ts +18 -0
- package/dist/lib/payba3.types.js +13 -0
- package/dist/lib/payba3.types.js.map +1 -0
- package/dist/lib/paystack/config/paystack.helper.d.ts +15 -0
- package/dist/lib/paystack/config/paystack.helper.js +134 -0
- package/dist/lib/paystack/config/paystack.helper.js.map +1 -0
- package/dist/lib/paystack/config/paystack.types.d.ts +92 -0
- package/dist/lib/paystack/config/paystack.types.js +3 -0
- package/dist/lib/paystack/config/paystack.types.js.map +1 -0
- package/dist/lib/paystack/paystack.module.d.ts +2 -0
- package/dist/lib/paystack/paystack.module.js +22 -0
- package/dist/lib/paystack/paystack.module.js.map +1 -0
- package/dist/lib/paystack/paystack.service.d.ts +33 -0
- package/dist/lib/paystack/paystack.service.js +328 -0
- package/dist/lib/paystack/paystack.service.js.map +1 -0
- package/dist/lib/qoreid/config/qoreid.helper.d.ts +19 -0
- package/dist/lib/qoreid/config/qoreid.helper.js +132 -0
- package/dist/lib/qoreid/config/qoreid.helper.js.map +1 -0
- package/dist/lib/qoreid/config/qoreid.types.d.ts +35 -0
- package/dist/lib/qoreid/config/qoreid.types.js +3 -0
- package/dist/lib/qoreid/config/qoreid.types.js.map +1 -0
- package/dist/lib/qoreid/qoreid.module.d.ts +2 -0
- package/dist/lib/qoreid/qoreid.module.js +22 -0
- package/dist/lib/qoreid/qoreid.module.js.map +1 -0
- package/dist/lib/qoreid/qoreid.service.d.ts +10 -0
- package/dist/lib/qoreid/qoreid.service.js +63 -0
- package/dist/lib/qoreid/qoreid.service.js.map +1 -0
- package/dist/lib/safehaven/config/safe.helper.d.ts +16 -0
- package/dist/lib/safehaven/config/safe.helper.js +136 -0
- package/dist/lib/safehaven/config/safe.helper.js.map +1 -0
- package/dist/lib/safehaven/config/safe.types.d.ts +50 -0
- package/dist/lib/safehaven/config/safe.types.js +3 -0
- package/dist/lib/safehaven/config/safe.types.js.map +1 -0
- package/dist/lib/safehaven/safe.module.d.ts +2 -0
- package/dist/lib/safehaven/safe.module.js +22 -0
- package/dist/lib/safehaven/safe.module.js.map +1 -0
- package/dist/lib/safehaven/safe.service.d.ts +14 -0
- package/dist/lib/safehaven/safe.service.js +77 -0
- package/dist/lib/safehaven/safe.service.js.map +1 -0
- package/dist/lib/seerbit/config/seerbit.helper.d.ts +11 -0
- package/dist/lib/seerbit/config/seerbit.helper.js +88 -0
- package/dist/lib/seerbit/config/seerbit.helper.js.map +1 -0
- package/dist/lib/seerbit/config/seerbit.types.d.ts +49 -0
- package/dist/lib/seerbit/config/seerbit.types.js +3 -0
- package/dist/lib/seerbit/config/seerbit.types.js.map +1 -0
- package/dist/lib/seerbit/seerbit.module.d.ts +2 -0
- package/dist/lib/seerbit/seerbit.module.js +22 -0
- package/dist/lib/seerbit/seerbit.module.js.map +1 -0
- package/dist/lib/seerbit/seerbit.service.d.ts +11 -0
- package/dist/lib/seerbit/seerbit.service.js +83 -0
- package/dist/lib/seerbit/seerbit.service.js.map +1 -0
- package/dist/lib/shared/index.d.ts +1 -0
- package/dist/lib/shared/index.js +18 -0
- package/dist/lib/shared/index.js.map +1 -0
- package/dist/lib/shared/response.helper.d.ts +15 -0
- package/dist/lib/shared/response.helper.js +39 -0
- package/dist/lib/shared/response.helper.js.map +1 -0
- package/llms.txt +25 -0
- package/package.json +169 -0
- package/src/lib/monnify/monnify_llm.txt +429 -0
- package/src/lib/mono/mono_llm.txt +372 -0
- package/src/lib/opay/opay_llm.txt +1022 -0
- package/src/lib/paystack/paystack_llm.txt +382 -0
- package/src/lib/qoreid/qoreid_llm.txt +68 -0
- package/src/lib/safehaven/safehaven_llm.txt +77 -0
- package/src/lib/seerbit/seerbit_llm.txt +61 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.Payba3Service = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const mono_service_1 = require("./mono/mono.service");
|
|
15
|
+
const monnify_service_1 = require("./monnify/monnify.service");
|
|
16
|
+
const opay_service_1 = require("./opay/opay.service");
|
|
17
|
+
const paystack_service_1 = require("./paystack/paystack.service");
|
|
18
|
+
const qoreid_service_1 = require("./qoreid/qoreid.service");
|
|
19
|
+
const safe_service_1 = require("./safehaven/safe.service");
|
|
20
|
+
const seerbit_service_1 = require("./seerbit/seerbit.service");
|
|
21
|
+
const payba3_types_1 = require("./payba3.types");
|
|
22
|
+
let Payba3Service = class Payba3Service {
|
|
23
|
+
channels;
|
|
24
|
+
constructor(mono, monnify, opay, paystack, qoreid, safehaven, seerbit) {
|
|
25
|
+
this.channels = {
|
|
26
|
+
mono,
|
|
27
|
+
monnify,
|
|
28
|
+
opay,
|
|
29
|
+
paystack,
|
|
30
|
+
qoreid,
|
|
31
|
+
safehaven,
|
|
32
|
+
seerbit,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
list() {
|
|
36
|
+
return [...payba3_types_1.PAYBA3_CHANNELS];
|
|
37
|
+
}
|
|
38
|
+
has(channel) {
|
|
39
|
+
return payba3_types_1.PAYBA3_CHANNELS.includes(channel);
|
|
40
|
+
}
|
|
41
|
+
use(channel) {
|
|
42
|
+
if (!this.has(channel)) {
|
|
43
|
+
throw new common_1.NotFoundException(`Unsupported payment channel: ${channel}`);
|
|
44
|
+
}
|
|
45
|
+
return this.channels[channel];
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.Payba3Service = Payba3Service;
|
|
49
|
+
exports.Payba3Service = Payba3Service = __decorate([
|
|
50
|
+
(0, common_1.Injectable)(),
|
|
51
|
+
__metadata("design:paramtypes", [mono_service_1.MonoService,
|
|
52
|
+
monnify_service_1.MonnifyService,
|
|
53
|
+
opay_service_1.OPayService,
|
|
54
|
+
paystack_service_1.PaystackService,
|
|
55
|
+
qoreid_service_1.QoreIDService,
|
|
56
|
+
safe_service_1.SafehavenService,
|
|
57
|
+
seerbit_service_1.SeerbitService])
|
|
58
|
+
], Payba3Service);
|
|
59
|
+
//# sourceMappingURL=payba3.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payba3.service.js","sourceRoot":"","sources":["../../src/lib/payba3.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA+D;AAC/D,sDAAkD;AAClD,+DAA2D;AAC3D,sDAAkD;AAClD,kEAA8D;AAC9D,4DAAwD;AACxD,2DAA4D;AAC5D,+DAA2D;AAC3D,iDAIwB;AAGjB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACP,QAAQ,CAAmB;IAE5C,YACE,IAAiB,EACjB,OAAuB,EACvB,IAAiB,EACjB,QAAyB,EACzB,MAAqB,EACrB,SAA2B,EAC3B,OAAuB;QAEvB,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,QAAQ;YACR,MAAM;YACN,SAAS;YACT,OAAO;SACR,CAAC;IACJ,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,8BAAe,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,8BAAe,CAAC,QAAQ,CAAC,OAA4B,CAAC,CAAC;IAChE,CAAC;IAID,GAAG,CAAC,OAAe;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,0BAAiB,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CACF,CAAA;AAxCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAKH,0BAAW;QACR,gCAAc;QACjB,0BAAW;QACP,kCAAe;QACjB,8BAAa;QACV,+BAAgB;QAClB,gCAAc;GAVd,aAAa,CAwCzB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { MonoService } from './mono/mono.service';
|
|
2
|
+
import type { MonnifyService } from './monnify/monnify.service';
|
|
3
|
+
import type { OPayService } from './opay/opay.service';
|
|
4
|
+
import type { PaystackService } from './paystack/paystack.service';
|
|
5
|
+
import type { QoreIDService } from './qoreid/qoreid.service';
|
|
6
|
+
import type { SafehavenService } from './safehaven/safe.service';
|
|
7
|
+
import type { SeerbitService } from './seerbit/seerbit.service';
|
|
8
|
+
export declare const PAYBA3_CHANNELS: readonly ["mono", "monnify", "opay", "paystack", "qoreid", "safehaven", "seerbit"];
|
|
9
|
+
export type Payba3ChannelName = (typeof PAYBA3_CHANNELS)[number];
|
|
10
|
+
export type Payba3ChannelMap = {
|
|
11
|
+
mono: MonoService;
|
|
12
|
+
monnify: MonnifyService;
|
|
13
|
+
opay: OPayService;
|
|
14
|
+
paystack: PaystackService;
|
|
15
|
+
qoreid: QoreIDService;
|
|
16
|
+
safehaven: SafehavenService;
|
|
17
|
+
seerbit: SeerbitService;
|
|
18
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PAYBA3_CHANNELS = void 0;
|
|
4
|
+
exports.PAYBA3_CHANNELS = [
|
|
5
|
+
'mono',
|
|
6
|
+
'monnify',
|
|
7
|
+
'opay',
|
|
8
|
+
'paystack',
|
|
9
|
+
'qoreid',
|
|
10
|
+
'safehaven',
|
|
11
|
+
'seerbit',
|
|
12
|
+
];
|
|
13
|
+
//# sourceMappingURL=payba3.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payba3.types.js","sourceRoot":"","sources":["../../src/lib/payba3.types.ts"],"names":[],"mappings":";;;AAQa,QAAA,eAAe,GAAG;IAC7B,MAAM;IACN,SAAS;IACT,MAAM;IACN,UAAU;IACV,QAAQ;IACR,WAAW;IACX,SAAS;CACD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NormalizedPaystackEnvironment, PaystackEnvironment, PaystackErrorResponse, PaystackRequestContext, PaystackRequestOptions, PaystackWebhookHeaders } from './paystack.types';
|
|
2
|
+
export declare const PAYSTACK_BASE_URL = "https://api.paystack.co";
|
|
3
|
+
export declare const normalizePaystackEnvironment: (environment?: string) => NormalizedPaystackEnvironment;
|
|
4
|
+
export declare const getPaystackSecret: (environment: PaystackEnvironment) => string | undefined;
|
|
5
|
+
export declare const getPaystackPreferredBank: (environment: PaystackEnvironment) => string;
|
|
6
|
+
export declare const buildPaystackHeaders: (secret: string) => Record<string, string>;
|
|
7
|
+
export declare const buildPaystackRequestInit: (secret: string, options: PaystackRequestOptions) => RequestInit;
|
|
8
|
+
export declare const assertPaystackSecret: (secret: string) => string;
|
|
9
|
+
export declare const parsePaystackResponse: (response: Response) => Promise<unknown>;
|
|
10
|
+
export declare const isPaystackErrorResponse: (value: unknown) => value is PaystackErrorResponse;
|
|
11
|
+
export declare const getPaystackErrorMessage: (error: unknown) => string;
|
|
12
|
+
export declare const requestPaystack: <T = unknown>({ baseUrl, secret, endpoint, options, }: PaystackRequestContext) => Promise<T>;
|
|
13
|
+
export declare const getPaystackSignature: (headers: PaystackWebhookHeaders) => string | undefined;
|
|
14
|
+
export declare const createPaystackSignatureHash: (body: unknown, secret: string) => string;
|
|
15
|
+
export declare const isTimingSafeEqual: (expectedSignature: string, receivedSignature: string) => boolean;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isTimingSafeEqual = exports.createPaystackSignatureHash = exports.getPaystackSignature = exports.requestPaystack = exports.getPaystackErrorMessage = exports.isPaystackErrorResponse = exports.parsePaystackResponse = exports.assertPaystackSecret = exports.buildPaystackRequestInit = exports.buildPaystackHeaders = exports.getPaystackPreferredBank = exports.getPaystackSecret = exports.normalizePaystackEnvironment = exports.PAYSTACK_BASE_URL = void 0;
|
|
37
|
+
const crypto = __importStar(require("crypto"));
|
|
38
|
+
const common_1 = require("@nestjs/common");
|
|
39
|
+
const response_helper_1 = require("../../shared/response.helper");
|
|
40
|
+
exports.PAYSTACK_BASE_URL = 'https://api.paystack.co';
|
|
41
|
+
const normalizePaystackEnvironment = (environment) => environment === 'live' || environment === 'production' ? 'live' : 'sandbox';
|
|
42
|
+
exports.normalizePaystackEnvironment = normalizePaystackEnvironment;
|
|
43
|
+
const getPaystackSecret = (environment) => (0, exports.normalizePaystackEnvironment)(environment) === 'sandbox'
|
|
44
|
+
? process.env.PAYSTACK_SECRET_KEY
|
|
45
|
+
: process.env.PAYSTACK_SECRET_KEY_LIVE;
|
|
46
|
+
exports.getPaystackSecret = getPaystackSecret;
|
|
47
|
+
const getPaystackPreferredBank = (environment) => (0, exports.normalizePaystackEnvironment)(environment) === 'sandbox'
|
|
48
|
+
? 'test-bank'
|
|
49
|
+
: 'titan-paystack';
|
|
50
|
+
exports.getPaystackPreferredBank = getPaystackPreferredBank;
|
|
51
|
+
const buildPaystackHeaders = (secret) => ({
|
|
52
|
+
Authorization: `Bearer ${secret}`,
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
});
|
|
55
|
+
exports.buildPaystackHeaders = buildPaystackHeaders;
|
|
56
|
+
const buildPaystackRequestInit = (secret, options) => ({
|
|
57
|
+
method: options.method ?? 'GET',
|
|
58
|
+
headers: (0, exports.buildPaystackHeaders)(secret),
|
|
59
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
60
|
+
redirect: 'error',
|
|
61
|
+
});
|
|
62
|
+
exports.buildPaystackRequestInit = buildPaystackRequestInit;
|
|
63
|
+
const assertPaystackSecret = (secret) => {
|
|
64
|
+
if (!secret) {
|
|
65
|
+
throw new common_1.InternalServerErrorException('Paystack secret key not set');
|
|
66
|
+
}
|
|
67
|
+
return secret;
|
|
68
|
+
};
|
|
69
|
+
exports.assertPaystackSecret = assertPaystackSecret;
|
|
70
|
+
const parsePaystackResponse = async (response) => {
|
|
71
|
+
const text = await response.text();
|
|
72
|
+
if (!text) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(text);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return text;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
exports.parsePaystackResponse = parsePaystackResponse;
|
|
83
|
+
const isPaystackErrorResponse = (value) => typeof value === 'object' &&
|
|
84
|
+
value !== null &&
|
|
85
|
+
('status' in value || 'message' in value);
|
|
86
|
+
exports.isPaystackErrorResponse = isPaystackErrorResponse;
|
|
87
|
+
const getPaystackErrorMessage = (error) => error instanceof Error ? error.message : 'Request failed';
|
|
88
|
+
exports.getPaystackErrorMessage = getPaystackErrorMessage;
|
|
89
|
+
const requestPaystack = async ({ baseUrl, secret, endpoint, options = {}, }) => {
|
|
90
|
+
const paystackSecret = (0, exports.assertPaystackSecret)(secret);
|
|
91
|
+
let response;
|
|
92
|
+
try {
|
|
93
|
+
response = await fetch(`${baseUrl}${endpoint}`, (0, exports.buildPaystackRequestInit)(paystackSecret, options));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new common_1.BadGatewayException({
|
|
97
|
+
message: 'Paystack request failed',
|
|
98
|
+
data: (0, exports.getPaystackErrorMessage)(error),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const responseBody = await (0, exports.parsePaystackResponse)(response);
|
|
102
|
+
if (response.status === 401) {
|
|
103
|
+
throw new common_1.UnauthorizedException('Unauthorized request to Paystack');
|
|
104
|
+
}
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
if ((0, exports.isPaystackErrorResponse)(responseBody) &&
|
|
107
|
+
responseBody.status === false) {
|
|
108
|
+
throw new response_helper_1.handleResponse(common_1.HttpStatus.BAD_REQUEST, responseBody.message ?? 'Paystack request failed', responseBody);
|
|
109
|
+
}
|
|
110
|
+
throw new response_helper_1.handleResponse(common_1.HttpStatus.INTERNAL_SERVER_ERROR, 'Request failed', responseBody);
|
|
111
|
+
}
|
|
112
|
+
return responseBody;
|
|
113
|
+
};
|
|
114
|
+
exports.requestPaystack = requestPaystack;
|
|
115
|
+
const getPaystackSignature = (headers) => {
|
|
116
|
+
const signature = headers['x-paystack-signature'];
|
|
117
|
+
return Array.isArray(signature) ? signature[0] : signature;
|
|
118
|
+
};
|
|
119
|
+
exports.getPaystackSignature = getPaystackSignature;
|
|
120
|
+
const createPaystackSignatureHash = (body, secret) => {
|
|
121
|
+
const payload = typeof body === 'string' || Buffer.isBuffer(body)
|
|
122
|
+
? body
|
|
123
|
+
: JSON.stringify(body ?? {});
|
|
124
|
+
return crypto.createHmac('sha512', secret).update(payload).digest('hex');
|
|
125
|
+
};
|
|
126
|
+
exports.createPaystackSignatureHash = createPaystackSignatureHash;
|
|
127
|
+
const isTimingSafeEqual = (expectedSignature, receivedSignature) => {
|
|
128
|
+
const expected = Buffer.from(expectedSignature, 'hex');
|
|
129
|
+
const received = Buffer.from(receivedSignature, 'hex');
|
|
130
|
+
return (expected.length === received.length &&
|
|
131
|
+
crypto.timingSafeEqual(expected, received));
|
|
132
|
+
};
|
|
133
|
+
exports.isTimingSafeEqual = isTimingSafeEqual;
|
|
134
|
+
//# sourceMappingURL=paystack.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paystack.helper.js","sourceRoot":"","sources":["../../../../src/lib/paystack/config/paystack.helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export type PaystackEnvironment = 'sandbox' | 'live' | 'development' | 'production' | 'test' | 'provision';
|
|
2
|
+
export type NormalizedPaystackEnvironment = 'sandbox' | 'live';
|
|
3
|
+
export type PaystackHttpMethod = 'GET' | 'POST' | 'DELETE';
|
|
4
|
+
export type PaystackRequestOptions = {
|
|
5
|
+
method?: PaystackHttpMethod;
|
|
6
|
+
body?: unknown;
|
|
7
|
+
};
|
|
8
|
+
export type PaystackRequestContext = {
|
|
9
|
+
baseUrl: string;
|
|
10
|
+
secret: string;
|
|
11
|
+
endpoint: string;
|
|
12
|
+
options?: PaystackRequestOptions;
|
|
13
|
+
};
|
|
14
|
+
export type PaystackResponse<T = unknown> = {
|
|
15
|
+
status: boolean;
|
|
16
|
+
message: string;
|
|
17
|
+
data: T;
|
|
18
|
+
};
|
|
19
|
+
export type PaystackErrorResponse = {
|
|
20
|
+
status?: boolean;
|
|
21
|
+
message?: string;
|
|
22
|
+
data?: unknown;
|
|
23
|
+
};
|
|
24
|
+
export type PaystackCustomer = {
|
|
25
|
+
customer_code: string;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
};
|
|
28
|
+
export type PaystackBank = {
|
|
29
|
+
id: number;
|
|
30
|
+
code: string;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
};
|
|
33
|
+
export type PaystackSubscriptionCheckoutInput = {
|
|
34
|
+
email: string;
|
|
35
|
+
plan: string;
|
|
36
|
+
callback_url?: string;
|
|
37
|
+
metadata?: Record<string, string>;
|
|
38
|
+
amountInKobo?: number;
|
|
39
|
+
currency?: string;
|
|
40
|
+
};
|
|
41
|
+
export type PaystackListSubscriptionsOptions = {
|
|
42
|
+
customerId?: number;
|
|
43
|
+
planId?: number;
|
|
44
|
+
perPage?: number;
|
|
45
|
+
};
|
|
46
|
+
export type PaystackOneTimeCheckoutInput = {
|
|
47
|
+
email: string;
|
|
48
|
+
amountInKobo: number;
|
|
49
|
+
callback_url?: string;
|
|
50
|
+
metadata?: Record<string, string>;
|
|
51
|
+
currency?: string;
|
|
52
|
+
reference?: string;
|
|
53
|
+
};
|
|
54
|
+
export type PaystackChargeAuthorizationInput = {
|
|
55
|
+
email: string;
|
|
56
|
+
amountInKobo: number;
|
|
57
|
+
authorization_code: string;
|
|
58
|
+
reference?: string;
|
|
59
|
+
metadata?: Record<string, string>;
|
|
60
|
+
currency?: string;
|
|
61
|
+
};
|
|
62
|
+
export type PaystackCreateSubscriptionInput = {
|
|
63
|
+
customer: string;
|
|
64
|
+
plan: string;
|
|
65
|
+
authorization: string;
|
|
66
|
+
start_date?: string;
|
|
67
|
+
};
|
|
68
|
+
export type PaystackCreateCustomerInput = {
|
|
69
|
+
email: string;
|
|
70
|
+
first_name?: string;
|
|
71
|
+
last_name?: string;
|
|
72
|
+
phone?: string;
|
|
73
|
+
};
|
|
74
|
+
export type PaystackCreateTransferRecipientInput = {
|
|
75
|
+
type: string;
|
|
76
|
+
name: string;
|
|
77
|
+
account_number: string;
|
|
78
|
+
bank_code: string;
|
|
79
|
+
currency: string;
|
|
80
|
+
};
|
|
81
|
+
export type PaystackInitiateTransferInput = {
|
|
82
|
+
source: string;
|
|
83
|
+
amount: number;
|
|
84
|
+
recipient: string;
|
|
85
|
+
reference: string;
|
|
86
|
+
reason: string;
|
|
87
|
+
};
|
|
88
|
+
export type PaystackWebhookHeaders = Record<string, string | string[] | undefined>;
|
|
89
|
+
export type PaystackWebhookEvent = {
|
|
90
|
+
event?: string;
|
|
91
|
+
data?: unknown;
|
|
92
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paystack.types.js","sourceRoot":"","sources":["../../../../src/lib/paystack/config/paystack.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PaystackModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const paystack_service_1 = require("./paystack.service");
|
|
12
|
+
let PaystackModule = class PaystackModule {
|
|
13
|
+
};
|
|
14
|
+
exports.PaystackModule = PaystackModule;
|
|
15
|
+
exports.PaystackModule = PaystackModule = __decorate([
|
|
16
|
+
(0, common_1.Global)(),
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
providers: [paystack_service_1.PaystackService],
|
|
19
|
+
exports: [paystack_service_1.PaystackService],
|
|
20
|
+
})
|
|
21
|
+
], PaystackModule);
|
|
22
|
+
//# sourceMappingURL=paystack.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paystack.module.js","sourceRoot":"","sources":["../../../src/lib/paystack/paystack.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,yDAAqD;AAO9C,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAL1B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,kCAAe,CAAC;QAC5B,OAAO,EAAE,CAAC,kCAAe,CAAC;KAC3B,CAAC;GACW,cAAc,CAAG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PaystackBank, PaystackChargeAuthorizationInput, PaystackCreateCustomerInput, PaystackCreateSubscriptionInput, PaystackCreateTransferRecipientInput, PaystackInitiateTransferInput, PaystackListSubscriptionsOptions, PaystackOneTimeCheckoutInput, PaystackResponse, PaystackSubscriptionCheckoutInput, PaystackWebhookEvent, PaystackWebhookHeaders } from './config/paystack.types';
|
|
2
|
+
export declare class PaystackService {
|
|
3
|
+
private readonly paystackSecret;
|
|
4
|
+
private readonly preferredBank;
|
|
5
|
+
private readonly baseUrl;
|
|
6
|
+
constructor();
|
|
7
|
+
createPaystackCustomer(email: string, firstName: string, lastName: string, phone: string): Promise<unknown>;
|
|
8
|
+
createDedicatedAccount(customerCode: string): Promise<unknown>;
|
|
9
|
+
retrieveDedicatedAccount(dedicatedAccountId: string): Promise<unknown>;
|
|
10
|
+
retrieveCustomerCode(email: string): Promise<string | undefined>;
|
|
11
|
+
initializeTransaction(email: string, amount: number, currency: string, callback_url?: string): Promise<unknown>;
|
|
12
|
+
initializeSubscriptionCheckout(data: PaystackSubscriptionCheckoutInput): Promise<unknown>;
|
|
13
|
+
listCustomerSubscriptions(opts: PaystackListSubscriptionsOptions): Promise<unknown>;
|
|
14
|
+
verifyTransaction(reference: string): Promise<unknown>;
|
|
15
|
+
initializeOneTimeCheckout(data: PaystackOneTimeCheckoutInput): Promise<unknown>;
|
|
16
|
+
chargeAuthorization(data: PaystackChargeAuthorizationInput): Promise<unknown>;
|
|
17
|
+
getBanks(): Promise<PaystackResponse<PaystackBank[]>>;
|
|
18
|
+
getBankById(bankId: number): Promise<PaystackBank | null>;
|
|
19
|
+
getBankByCode(bankCode: string): Promise<PaystackBank | null>;
|
|
20
|
+
resolveBankAccount(accountNumber: string, bankCode: string): Promise<unknown>;
|
|
21
|
+
verifyWebhookSignature(body: unknown, headers: PaystackWebhookHeaders): void;
|
|
22
|
+
handlePaystackWebhook(body: PaystackWebhookEvent, headers: PaystackWebhookHeaders): unknown;
|
|
23
|
+
fetchPlan(planCode: string): Promise<unknown>;
|
|
24
|
+
createSubscription(data: PaystackCreateSubscriptionInput): Promise<unknown>;
|
|
25
|
+
fetchSubscription(idOrCode: string): Promise<unknown>;
|
|
26
|
+
disableSubscription(code: string, token: string): Promise<unknown>;
|
|
27
|
+
createCustomer(data: PaystackCreateCustomerInput): Promise<unknown>;
|
|
28
|
+
fetchCustomerByEmail(email: string): Promise<unknown>;
|
|
29
|
+
createTransferRecipient(data: PaystackCreateTransferRecipientInput): Promise<unknown>;
|
|
30
|
+
deleteTransferRecipient(idOrCode: string): Promise<unknown>;
|
|
31
|
+
initiateTransfer(data: PaystackInitiateTransferInput): Promise<unknown>;
|
|
32
|
+
getPaystackBalance(): Promise<unknown>;
|
|
33
|
+
}
|