convex-paystack 0.0.1
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/LICENSE +201 -0
- package/README.md +490 -0
- package/dist/client/_generated/_ignore.d.ts +1 -0
- package/dist/client/_generated/_ignore.d.ts.map +1 -0
- package/dist/client/_generated/_ignore.js +3 -0
- package/dist/client/_generated/_ignore.js.map +1 -0
- package/dist/client/index.d.ts +201 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +383 -0
- package/dist/client/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +34 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +147 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +133 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +80 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +4 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/lib.d.ts +137 -0
- package/dist/component/lib.d.ts.map +1 -0
- package/dist/component/lib.js +241 -0
- package/dist/component/lib.js.map +1 -0
- package/dist/component/schema.d.ts +77 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +45 -0
- package/dist/component/schema.js.map +1 -0
- package/package.json +106 -0
- package/src/client/_generated/_ignore.ts +1 -0
- package/src/client/index.ts +570 -0
- package/src/client/setup.test.ts +26 -0
- package/src/component/_generated/api.ts +50 -0
- package/src/component/_generated/component.ts +217 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +169 -0
- package/src/component/convex.config.ts +5 -0
- package/src/component/lib.test.ts +110 -0
- package/src/component/lib.ts +278 -0
- package/src/component/schema.ts +58 -0
- package/src/component/setup.test.ts +11 -0
- package/src/test.ts +18 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=_ignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_ignore.d.ts","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_ignore.js","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":";AAAA,kEAAkE"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { httpActionGeneric } from "convex/server";
|
|
2
|
+
import type { GenericActionCtx, GenericDataModel } from "convex/server";
|
|
3
|
+
import type { ComponentApi } from "../component/_generated/component.js";
|
|
4
|
+
export type PaystackOptions = {
|
|
5
|
+
secretKey: string;
|
|
6
|
+
};
|
|
7
|
+
export type PaystackChannel = "card" | "bank" | "apple_pay" | "ussd" | "qr" | "mobile_money" | "bank_transfer" | "eft" | "capitec_pay" | "payattitude";
|
|
8
|
+
export type InitializeTransactionArgs = {
|
|
9
|
+
email: string;
|
|
10
|
+
amount: number;
|
|
11
|
+
currency?: string;
|
|
12
|
+
callbackUrl?: string;
|
|
13
|
+
reference?: string;
|
|
14
|
+
channels?: PaystackChannel[];
|
|
15
|
+
plan?: string;
|
|
16
|
+
metadata?: Record<string, unknown>;
|
|
17
|
+
};
|
|
18
|
+
export type InitializeTransactionResult = {
|
|
19
|
+
authorizationUrl: string;
|
|
20
|
+
accessCode: string;
|
|
21
|
+
reference: string;
|
|
22
|
+
};
|
|
23
|
+
export type VerifyTransactionResult = {
|
|
24
|
+
status: string;
|
|
25
|
+
reference: string;
|
|
26
|
+
amount: number;
|
|
27
|
+
currency: string;
|
|
28
|
+
channel?: string;
|
|
29
|
+
gatewayResponse?: string;
|
|
30
|
+
paidAt?: number;
|
|
31
|
+
authorizationCode?: string;
|
|
32
|
+
customerEmail: string;
|
|
33
|
+
};
|
|
34
|
+
export type PlanInterval = "daily" | "weekly" | "monthly" | "quarterly" | "biannually" | "annually";
|
|
35
|
+
export type CreatePlanArgs = {
|
|
36
|
+
name: string;
|
|
37
|
+
amount: number;
|
|
38
|
+
interval: PlanInterval;
|
|
39
|
+
currency?: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
};
|
|
42
|
+
export type PlanResult = {
|
|
43
|
+
planCode: string;
|
|
44
|
+
name: string;
|
|
45
|
+
amount: number;
|
|
46
|
+
interval: string;
|
|
47
|
+
currency: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
};
|
|
50
|
+
export type Balance = {
|
|
51
|
+
currency: string;
|
|
52
|
+
balance: number;
|
|
53
|
+
};
|
|
54
|
+
export declare class Paystack {
|
|
55
|
+
private component;
|
|
56
|
+
private options;
|
|
57
|
+
webhookHandler: ReturnType<typeof httpActionGeneric>;
|
|
58
|
+
constructor(component: ComponentApi, options: PaystackOptions);
|
|
59
|
+
initializeTransaction(ctx: GenericActionCtx<GenericDataModel>, args: InitializeTransactionArgs): Promise<InitializeTransactionResult>;
|
|
60
|
+
verifyTransaction(ctx: GenericActionCtx<GenericDataModel>, args: {
|
|
61
|
+
reference: string;
|
|
62
|
+
}): Promise<VerifyTransactionResult>;
|
|
63
|
+
cancelSubscription(ctx: GenericActionCtx<GenericDataModel>, args: {
|
|
64
|
+
code: string;
|
|
65
|
+
token: string;
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
enableSubscription(ctx: GenericActionCtx<GenericDataModel>, args: {
|
|
68
|
+
code: string;
|
|
69
|
+
token: string;
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Create a Paystack billing plan. Plans are the foundation for
|
|
73
|
+
* subscriptions: pass the returned `planCode` as `plan` to
|
|
74
|
+
* `initializeTransaction` to start a subscription on first payment.
|
|
75
|
+
*/
|
|
76
|
+
createPlan(ctx: GenericActionCtx<GenericDataModel>, args: CreatePlanArgs): Promise<PlanResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Lists the currencies this Paystack account actually has enabled, with
|
|
79
|
+
* their current balance. Use this to build a currency picker that only
|
|
80
|
+
* ever offers currencies that will really work — `initializeTransaction`
|
|
81
|
+
* throws "Currency not supported by merchant" for anything else.
|
|
82
|
+
* Requires the secret key to have balance-read access; if it doesn't,
|
|
83
|
+
* catch the error and fall back to your account's default currency.
|
|
84
|
+
*/
|
|
85
|
+
listBalances(_ctx: GenericActionCtx<GenericDataModel>): Promise<Balance[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Fetches a customer's subscriptions directly from Paystack (via the
|
|
88
|
+
* Fetch Customer endpoint, which returns them inline) and upserts each
|
|
89
|
+
* one locally. A checkout initialized with `plan` starts a subscription
|
|
90
|
+
* on Paystack's side immediately, but this component only learns about
|
|
91
|
+
* it when the `subscription.create` webhook arrives — which, in local
|
|
92
|
+
* development, requires that webhook URL to actually be registered in
|
|
93
|
+
* the Paystack Dashboard. Call this right after a subscription checkout
|
|
94
|
+
* returns to reconcile state even if that webhook hasn't fired yet.
|
|
95
|
+
* Returns the number of subscriptions synced.
|
|
96
|
+
*/
|
|
97
|
+
syncCustomerSubscriptions(ctx: GenericActionCtx<GenericDataModel>, args: {
|
|
98
|
+
email: string;
|
|
99
|
+
}): Promise<number>;
|
|
100
|
+
/** List billing plans already created on this Paystack account. */
|
|
101
|
+
listPlans(_ctx: GenericActionCtx<GenericDataModel>): Promise<PlanResult[]>;
|
|
102
|
+
getTransaction(ctx: RunQueryCtx, args: {
|
|
103
|
+
reference: string;
|
|
104
|
+
}): Promise<{
|
|
105
|
+
_creationTime: number;
|
|
106
|
+
_id: string;
|
|
107
|
+
amount: number;
|
|
108
|
+
authorizationCode?: string;
|
|
109
|
+
channel?: string;
|
|
110
|
+
createdAt: number;
|
|
111
|
+
currency: string;
|
|
112
|
+
customerEmail: string;
|
|
113
|
+
gatewayResponse?: string;
|
|
114
|
+
metadata?: string;
|
|
115
|
+
paidAt?: number;
|
|
116
|
+
reference: string;
|
|
117
|
+
status: "pending" | "success" | "failed" | "abandoned";
|
|
118
|
+
updatedAt: number;
|
|
119
|
+
} | null>;
|
|
120
|
+
listTransactions(ctx: RunQueryCtx, args: {
|
|
121
|
+
customerEmail: string;
|
|
122
|
+
limit?: number;
|
|
123
|
+
}): Promise<{
|
|
124
|
+
_creationTime: number;
|
|
125
|
+
_id: string;
|
|
126
|
+
amount: number;
|
|
127
|
+
authorizationCode?: string;
|
|
128
|
+
channel?: string;
|
|
129
|
+
createdAt: number;
|
|
130
|
+
currency: string;
|
|
131
|
+
customerEmail: string;
|
|
132
|
+
gatewayResponse?: string;
|
|
133
|
+
metadata?: string;
|
|
134
|
+
paidAt?: number;
|
|
135
|
+
reference: string;
|
|
136
|
+
status: "pending" | "success" | "failed" | "abandoned";
|
|
137
|
+
updatedAt: number;
|
|
138
|
+
}[]>;
|
|
139
|
+
getSubscription(ctx: RunQueryCtx, args: {
|
|
140
|
+
subscriptionCode: string;
|
|
141
|
+
}): Promise<{
|
|
142
|
+
_creationTime: number;
|
|
143
|
+
_id: string;
|
|
144
|
+
amount?: number;
|
|
145
|
+
createdAt: number;
|
|
146
|
+
customerCode?: string;
|
|
147
|
+
customerEmail: string;
|
|
148
|
+
emailToken?: string;
|
|
149
|
+
nextPaymentDate?: number;
|
|
150
|
+
planCode: string;
|
|
151
|
+
status: "active" | "non-renewing" | "attention" | "completed" | "cancelled";
|
|
152
|
+
subscriptionCode: string;
|
|
153
|
+
updatedAt: number;
|
|
154
|
+
} | null>;
|
|
155
|
+
listSubscriptions(ctx: RunQueryCtx, args: {
|
|
156
|
+
customerEmail: string;
|
|
157
|
+
}): Promise<{
|
|
158
|
+
_creationTime: number;
|
|
159
|
+
_id: string;
|
|
160
|
+
amount?: number;
|
|
161
|
+
createdAt: number;
|
|
162
|
+
customerCode?: string;
|
|
163
|
+
customerEmail: string;
|
|
164
|
+
emailToken?: string;
|
|
165
|
+
nextPaymentDate?: number;
|
|
166
|
+
planCode: string;
|
|
167
|
+
status: "active" | "non-renewing" | "attention" | "completed" | "cancelled";
|
|
168
|
+
subscriptionCode: string;
|
|
169
|
+
updatedAt: number;
|
|
170
|
+
}[]>;
|
|
171
|
+
hasActiveSubscription(ctx: RunQueryCtx, args: {
|
|
172
|
+
customerEmail: string;
|
|
173
|
+
}): Promise<boolean>;
|
|
174
|
+
/**
|
|
175
|
+
* Reads the raw webhook event log, newest first — every event Paystack
|
|
176
|
+
* has sent this component, whether or not it changed local state.
|
|
177
|
+
* Handy for an audit trail or a live "what just happened" console.
|
|
178
|
+
*/
|
|
179
|
+
listRecentEvents(ctx: RunQueryCtx, args?: {
|
|
180
|
+
limit?: number;
|
|
181
|
+
}): Promise<{
|
|
182
|
+
_creationTime: number;
|
|
183
|
+
_id: string;
|
|
184
|
+
eventId: string;
|
|
185
|
+
eventType: string;
|
|
186
|
+
payload: string;
|
|
187
|
+
receivedAt: number;
|
|
188
|
+
reference?: string;
|
|
189
|
+
}[]>;
|
|
190
|
+
/** Aggregate row counts — see {@link ComponentApi}'s `lib.getStats`. */
|
|
191
|
+
getStats(ctx: RunQueryCtx): Promise<{
|
|
192
|
+
events: number;
|
|
193
|
+
subscriptions: number;
|
|
194
|
+
transactions: number;
|
|
195
|
+
}>;
|
|
196
|
+
}
|
|
197
|
+
type RunQueryCtx = {
|
|
198
|
+
runQuery: GenericActionCtx<GenericDataModel>["runQuery"];
|
|
199
|
+
};
|
|
200
|
+
export {};
|
|
201
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { httpActionGeneric } from "convex/server";
|
|
2
|
+
const PAYSTACK_API_BASE = "https://api.paystack.co";
|
|
3
|
+
function timingSafeEqual(a, b) {
|
|
4
|
+
if (a.length !== b.length)
|
|
5
|
+
return false;
|
|
6
|
+
let mismatch = 0;
|
|
7
|
+
for (let i = 0; i < a.length; i++) {
|
|
8
|
+
mismatch |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
9
|
+
}
|
|
10
|
+
return mismatch === 0;
|
|
11
|
+
}
|
|
12
|
+
async function hmacSha512Hex(secret, payload) {
|
|
13
|
+
const enc = new TextEncoder();
|
|
14
|
+
const key = await crypto.subtle.importKey("raw", enc.encode(secret), { name: "HMAC", hash: "SHA-512" }, false, ["sign"]);
|
|
15
|
+
const signature = await crypto.subtle.sign("HMAC", key, enc.encode(payload));
|
|
16
|
+
return Array.from(new Uint8Array(signature))
|
|
17
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
18
|
+
.join("");
|
|
19
|
+
}
|
|
20
|
+
function planFromPaystack(plan) {
|
|
21
|
+
return {
|
|
22
|
+
planCode: plan.plan_code,
|
|
23
|
+
name: plan.name,
|
|
24
|
+
amount: plan.amount,
|
|
25
|
+
interval: plan.interval,
|
|
26
|
+
currency: plan.currency ?? "NGN",
|
|
27
|
+
description: plan.description ?? undefined,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export class Paystack {
|
|
31
|
+
component;
|
|
32
|
+
options;
|
|
33
|
+
webhookHandler;
|
|
34
|
+
constructor(component, options) {
|
|
35
|
+
this.component = component;
|
|
36
|
+
this.options = options;
|
|
37
|
+
const component_ = component;
|
|
38
|
+
const secretKey = options.secretKey;
|
|
39
|
+
this.webhookHandler = httpActionGeneric(async (ctx, request) => {
|
|
40
|
+
const rawBody = await request.text();
|
|
41
|
+
const signature = request.headers.get("x-paystack-signature");
|
|
42
|
+
if (!signature) {
|
|
43
|
+
return new Response(JSON.stringify({ error: "Missing signature" }), {
|
|
44
|
+
status: 400,
|
|
45
|
+
headers: { "Content-Type": "application/json" },
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const expected = await hmacSha512Hex(secretKey, rawBody);
|
|
49
|
+
if (!timingSafeEqual(expected, signature)) {
|
|
50
|
+
console.error("convex-paystack: webhook signature mismatch");
|
|
51
|
+
return new Response(JSON.stringify({ error: "Invalid signature" }), {
|
|
52
|
+
status: 401,
|
|
53
|
+
headers: { "Content-Type": "application/json" },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
let event;
|
|
57
|
+
try {
|
|
58
|
+
event = JSON.parse(rawBody);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return new Response(JSON.stringify({ error: "Invalid JSON" }), {
|
|
62
|
+
status: 400,
|
|
63
|
+
headers: { "Content-Type": "application/json" },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const data = event.data ?? {};
|
|
67
|
+
const eventId = data.id !== undefined
|
|
68
|
+
? `${event.event}:${data.id}`
|
|
69
|
+
: `${event.event}:${data.reference ?? data.subscription_code ?? crypto.randomUUID()}`;
|
|
70
|
+
const { alreadyProcessed } = await ctx.runMutation(component_.lib.checkAndRecordEvent, {
|
|
71
|
+
eventId,
|
|
72
|
+
eventType: event.event,
|
|
73
|
+
reference: data.reference ?? undefined,
|
|
74
|
+
payload: rawBody,
|
|
75
|
+
});
|
|
76
|
+
if (alreadyProcessed) {
|
|
77
|
+
return new Response(JSON.stringify({ success: true, duplicate: true }), {
|
|
78
|
+
status: 200,
|
|
79
|
+
headers: { "Content-Type": "application/json" },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
switch (event.event) {
|
|
83
|
+
case "charge.success": {
|
|
84
|
+
const customer = data.customer;
|
|
85
|
+
const authorization = data.authorization;
|
|
86
|
+
await ctx.runMutation(component_.lib.recordTransaction, {
|
|
87
|
+
reference: data.reference,
|
|
88
|
+
customerEmail: customer?.email ?? "",
|
|
89
|
+
amount: data.amount,
|
|
90
|
+
currency: data.currency ?? "NGN",
|
|
91
|
+
status: "success",
|
|
92
|
+
channel: data.channel ?? undefined,
|
|
93
|
+
gatewayResponse: data.gateway_response ?? undefined,
|
|
94
|
+
authorizationCode: authorization?.authorization_code ?? undefined,
|
|
95
|
+
paidAt: data.paid_at ? new Date(data.paid_at).getTime() : undefined,
|
|
96
|
+
metadata: data.metadata ? JSON.stringify(data.metadata) : undefined,
|
|
97
|
+
});
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case "subscription.create": {
|
|
101
|
+
const customer = data.customer;
|
|
102
|
+
const plan = data.plan;
|
|
103
|
+
await ctx.runMutation(component_.lib.recordSubscriptionEvent, {
|
|
104
|
+
subscriptionCode: data.subscription_code,
|
|
105
|
+
emailToken: data.email_token ?? undefined,
|
|
106
|
+
customerEmail: customer?.email ?? "",
|
|
107
|
+
customerCode: customer?.customer_code ?? undefined,
|
|
108
|
+
planCode: plan?.plan_code ?? "",
|
|
109
|
+
status: data.status ?? "active",
|
|
110
|
+
amount: data.amount ?? undefined,
|
|
111
|
+
nextPaymentDate: data.next_payment_date
|
|
112
|
+
? new Date(data.next_payment_date).getTime()
|
|
113
|
+
: undefined,
|
|
114
|
+
});
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case "subscription.disable": {
|
|
118
|
+
await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
|
|
119
|
+
subscriptionCode: data.subscription_code,
|
|
120
|
+
status: "cancelled",
|
|
121
|
+
});
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case "subscription.not_renew": {
|
|
125
|
+
await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
|
|
126
|
+
subscriptionCode: data.subscription_code,
|
|
127
|
+
status: "non-renewing",
|
|
128
|
+
});
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case "invoice.update": {
|
|
132
|
+
const subscription = data.subscription;
|
|
133
|
+
const subscriptionCode = subscription?.subscription_code;
|
|
134
|
+
if (subscriptionCode) {
|
|
135
|
+
await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
|
|
136
|
+
subscriptionCode,
|
|
137
|
+
status: data.status === "success" ? "active" : "attention",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case "invoice.payment_failed": {
|
|
143
|
+
const subscription = data.subscription;
|
|
144
|
+
const subscriptionCode = subscription?.subscription_code;
|
|
145
|
+
if (subscriptionCode) {
|
|
146
|
+
await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
|
|
147
|
+
subscriptionCode,
|
|
148
|
+
status: "attention",
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
default:
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
return new Response(JSON.stringify({ success: true }), {
|
|
157
|
+
status: 200,
|
|
158
|
+
headers: { "Content-Type": "application/json" },
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
async initializeTransaction(ctx, args) {
|
|
163
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/transaction/initialize`, {
|
|
164
|
+
method: "POST",
|
|
165
|
+
headers: {
|
|
166
|
+
Authorization: `Bearer ${this.options.secretKey}`,
|
|
167
|
+
"Content-Type": "application/json",
|
|
168
|
+
},
|
|
169
|
+
body: JSON.stringify({
|
|
170
|
+
email: args.email,
|
|
171
|
+
amount: args.amount,
|
|
172
|
+
currency: args.currency,
|
|
173
|
+
callback_url: args.callbackUrl,
|
|
174
|
+
reference: args.reference,
|
|
175
|
+
channels: args.channels,
|
|
176
|
+
plan: args.plan,
|
|
177
|
+
metadata: args.metadata,
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
const json = (await res.json());
|
|
181
|
+
if (!json.status) {
|
|
182
|
+
throw new Error(json.message ?? "Failed to initialize Paystack transaction");
|
|
183
|
+
}
|
|
184
|
+
await ctx.runMutation(this.component.lib.recordTransaction, {
|
|
185
|
+
reference: json.data.reference,
|
|
186
|
+
customerEmail: args.email,
|
|
187
|
+
amount: args.amount,
|
|
188
|
+
currency: args.currency ?? "NGN",
|
|
189
|
+
status: "pending",
|
|
190
|
+
metadata: args.metadata ? JSON.stringify(args.metadata) : undefined,
|
|
191
|
+
});
|
|
192
|
+
return {
|
|
193
|
+
authorizationUrl: json.data.authorization_url,
|
|
194
|
+
accessCode: json.data.access_code,
|
|
195
|
+
reference: json.data.reference,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
async verifyTransaction(ctx, args) {
|
|
199
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/transaction/verify/${encodeURIComponent(args.reference)}`, { headers: { Authorization: `Bearer ${this.options.secretKey}` } });
|
|
200
|
+
const json = (await res.json());
|
|
201
|
+
if (!json.status) {
|
|
202
|
+
throw new Error(json.message ?? "Failed to verify Paystack transaction");
|
|
203
|
+
}
|
|
204
|
+
const data = json.data;
|
|
205
|
+
await ctx.runMutation(this.component.lib.recordTransaction, {
|
|
206
|
+
reference: data.reference,
|
|
207
|
+
customerEmail: data.customer?.email ?? "",
|
|
208
|
+
amount: data.amount,
|
|
209
|
+
currency: data.currency,
|
|
210
|
+
status: data.status,
|
|
211
|
+
channel: data.channel ?? undefined,
|
|
212
|
+
gatewayResponse: data.gateway_response ?? undefined,
|
|
213
|
+
authorizationCode: data.authorization?.authorization_code ?? undefined,
|
|
214
|
+
paidAt: data.paid_at ? new Date(data.paid_at).getTime() : undefined,
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
status: data.status,
|
|
218
|
+
reference: data.reference,
|
|
219
|
+
amount: data.amount,
|
|
220
|
+
currency: data.currency,
|
|
221
|
+
channel: data.channel ?? undefined,
|
|
222
|
+
gatewayResponse: data.gateway_response ?? undefined,
|
|
223
|
+
paidAt: data.paid_at ? new Date(data.paid_at).getTime() : undefined,
|
|
224
|
+
authorizationCode: data.authorization?.authorization_code ?? undefined,
|
|
225
|
+
customerEmail: data.customer?.email ?? "",
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
async cancelSubscription(ctx, args) {
|
|
229
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/subscription/disable`, {
|
|
230
|
+
method: "POST",
|
|
231
|
+
headers: {
|
|
232
|
+
Authorization: `Bearer ${this.options.secretKey}`,
|
|
233
|
+
"Content-Type": "application/json",
|
|
234
|
+
},
|
|
235
|
+
body: JSON.stringify({ code: args.code, token: args.token }),
|
|
236
|
+
});
|
|
237
|
+
const json = (await res.json());
|
|
238
|
+
if (!json.status) {
|
|
239
|
+
throw new Error(json.message ?? "Failed to cancel Paystack subscription");
|
|
240
|
+
}
|
|
241
|
+
await ctx.runMutation(this.component.lib.updateSubscriptionStatus, {
|
|
242
|
+
subscriptionCode: args.code,
|
|
243
|
+
status: "cancelled",
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async enableSubscription(ctx, args) {
|
|
247
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/subscription/enable`, {
|
|
248
|
+
method: "POST",
|
|
249
|
+
headers: {
|
|
250
|
+
Authorization: `Bearer ${this.options.secretKey}`,
|
|
251
|
+
"Content-Type": "application/json",
|
|
252
|
+
},
|
|
253
|
+
body: JSON.stringify({ code: args.code, token: args.token }),
|
|
254
|
+
});
|
|
255
|
+
const json = (await res.json());
|
|
256
|
+
if (!json.status) {
|
|
257
|
+
throw new Error(json.message ?? "Failed to enable Paystack subscription");
|
|
258
|
+
}
|
|
259
|
+
await ctx.runMutation(this.component.lib.updateSubscriptionStatus, {
|
|
260
|
+
subscriptionCode: args.code,
|
|
261
|
+
status: "active",
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Create a Paystack billing plan. Plans are the foundation for
|
|
266
|
+
* subscriptions: pass the returned `planCode` as `plan` to
|
|
267
|
+
* `initializeTransaction` to start a subscription on first payment.
|
|
268
|
+
*/
|
|
269
|
+
async createPlan(ctx, args) {
|
|
270
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/plan`, {
|
|
271
|
+
method: "POST",
|
|
272
|
+
headers: {
|
|
273
|
+
Authorization: `Bearer ${this.options.secretKey}`,
|
|
274
|
+
"Content-Type": "application/json",
|
|
275
|
+
},
|
|
276
|
+
body: JSON.stringify({
|
|
277
|
+
name: args.name,
|
|
278
|
+
amount: args.amount,
|
|
279
|
+
interval: args.interval,
|
|
280
|
+
currency: args.currency,
|
|
281
|
+
description: args.description,
|
|
282
|
+
}),
|
|
283
|
+
});
|
|
284
|
+
const json = (await res.json());
|
|
285
|
+
if (!json.status) {
|
|
286
|
+
throw new Error(json.message ?? "Failed to create Paystack plan");
|
|
287
|
+
}
|
|
288
|
+
return planFromPaystack(json.data);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Lists the currencies this Paystack account actually has enabled, with
|
|
292
|
+
* their current balance. Use this to build a currency picker that only
|
|
293
|
+
* ever offers currencies that will really work — `initializeTransaction`
|
|
294
|
+
* throws "Currency not supported by merchant" for anything else.
|
|
295
|
+
* Requires the secret key to have balance-read access; if it doesn't,
|
|
296
|
+
* catch the error and fall back to your account's default currency.
|
|
297
|
+
*/
|
|
298
|
+
async listBalances(_ctx) {
|
|
299
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/balance`, {
|
|
300
|
+
headers: { Authorization: `Bearer ${this.options.secretKey}` },
|
|
301
|
+
});
|
|
302
|
+
const json = (await res.json());
|
|
303
|
+
if (!json.status) {
|
|
304
|
+
throw new Error(json.message ?? "Failed to fetch Paystack balance");
|
|
305
|
+
}
|
|
306
|
+
return json.data;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Fetches a customer's subscriptions directly from Paystack (via the
|
|
310
|
+
* Fetch Customer endpoint, which returns them inline) and upserts each
|
|
311
|
+
* one locally. A checkout initialized with `plan` starts a subscription
|
|
312
|
+
* on Paystack's side immediately, but this component only learns about
|
|
313
|
+
* it when the `subscription.create` webhook arrives — which, in local
|
|
314
|
+
* development, requires that webhook URL to actually be registered in
|
|
315
|
+
* the Paystack Dashboard. Call this right after a subscription checkout
|
|
316
|
+
* returns to reconcile state even if that webhook hasn't fired yet.
|
|
317
|
+
* Returns the number of subscriptions synced.
|
|
318
|
+
*/
|
|
319
|
+
async syncCustomerSubscriptions(ctx, args) {
|
|
320
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/customer/${encodeURIComponent(args.email)}`, { headers: { Authorization: `Bearer ${this.options.secretKey}` } });
|
|
321
|
+
const json = (await res.json());
|
|
322
|
+
if (!json.status) {
|
|
323
|
+
throw new Error(json.message ?? "Failed to fetch Paystack customer");
|
|
324
|
+
}
|
|
325
|
+
const subscriptions = json.data?.subscriptions ?? [];
|
|
326
|
+
for (const sub of subscriptions) {
|
|
327
|
+
const plan = sub.plan;
|
|
328
|
+
const customer = sub.customer;
|
|
329
|
+
await ctx.runMutation(this.component.lib.recordSubscriptionEvent, {
|
|
330
|
+
subscriptionCode: sub.subscription_code,
|
|
331
|
+
emailToken: sub.email_token ?? undefined,
|
|
332
|
+
customerEmail: args.email,
|
|
333
|
+
customerCode: customer?.customer_code ?? undefined,
|
|
334
|
+
planCode: plan?.plan_code ?? "",
|
|
335
|
+
status: sub.status ?? "active",
|
|
336
|
+
amount: sub.amount ?? plan?.amount ?? undefined,
|
|
337
|
+
nextPaymentDate: sub.next_payment_date
|
|
338
|
+
? new Date(sub.next_payment_date).getTime()
|
|
339
|
+
: undefined,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
return subscriptions.length;
|
|
343
|
+
}
|
|
344
|
+
/** List billing plans already created on this Paystack account. */
|
|
345
|
+
async listPlans(_ctx) {
|
|
346
|
+
const res = await fetch(`${PAYSTACK_API_BASE}/plan?perPage=100`, {
|
|
347
|
+
headers: { Authorization: `Bearer ${this.options.secretKey}` },
|
|
348
|
+
});
|
|
349
|
+
const json = (await res.json());
|
|
350
|
+
if (!json.status) {
|
|
351
|
+
throw new Error(json.message ?? "Failed to list Paystack plans");
|
|
352
|
+
}
|
|
353
|
+
return json.data.map(planFromPaystack);
|
|
354
|
+
}
|
|
355
|
+
async getTransaction(ctx, args) {
|
|
356
|
+
return await ctx.runQuery(this.component.lib.getTransaction, args);
|
|
357
|
+
}
|
|
358
|
+
async listTransactions(ctx, args) {
|
|
359
|
+
return await ctx.runQuery(this.component.lib.listTransactions, args);
|
|
360
|
+
}
|
|
361
|
+
async getSubscription(ctx, args) {
|
|
362
|
+
return await ctx.runQuery(this.component.lib.getSubscription, args);
|
|
363
|
+
}
|
|
364
|
+
async listSubscriptions(ctx, args) {
|
|
365
|
+
return await ctx.runQuery(this.component.lib.listSubscriptions, args);
|
|
366
|
+
}
|
|
367
|
+
async hasActiveSubscription(ctx, args) {
|
|
368
|
+
return await ctx.runQuery(this.component.lib.hasActiveSubscription, args);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Reads the raw webhook event log, newest first — every event Paystack
|
|
372
|
+
* has sent this component, whether or not it changed local state.
|
|
373
|
+
* Handy for an audit trail or a live "what just happened" console.
|
|
374
|
+
*/
|
|
375
|
+
async listRecentEvents(ctx, args) {
|
|
376
|
+
return await ctx.runQuery(this.component.lib.listRecentEvents, args ?? {});
|
|
377
|
+
}
|
|
378
|
+
/** Aggregate row counts — see {@link ComponentApi}'s `lib.getStats`. */
|
|
379
|
+
async getStats(ctx) {
|
|
380
|
+
return await ctx.runQuery(this.component.lib.getStats, {});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated `api` utility.
|
|
3
|
+
*
|
|
4
|
+
* THIS CODE IS AUTOMATICALLY GENERATED.
|
|
5
|
+
*
|
|
6
|
+
* To regenerate, run `npx convex dev`.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type * as lib from "../lib.js";
|
|
10
|
+
import type { ApiFromModules, FilterApi, FunctionReference } from "convex/server";
|
|
11
|
+
declare const fullApi: ApiFromModules<{
|
|
12
|
+
lib: typeof lib;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* A utility for referencing Convex functions in your app's public API.
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* ```js
|
|
19
|
+
* const myFunctionReference = api.myModule.myFunction;
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare const api: FilterApi<typeof fullApi, FunctionReference<any, "public">>;
|
|
23
|
+
/**
|
|
24
|
+
* A utility for referencing Convex functions in your app's internal API.
|
|
25
|
+
*
|
|
26
|
+
* Usage:
|
|
27
|
+
* ```js
|
|
28
|
+
* const myFunctionReference = internal.myModule.myFunction;
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const internal: FilterApi<typeof fullApi, FunctionReference<any, "internal">>;
|
|
32
|
+
export declare const components: {};
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=api.d.ts.map
|