@nordsym/apiclaw 1.7.2 → 1.7.4
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/convex/_generated/api.d.ts +115 -0
- package/convex/_generated/api.js +23 -0
- package/convex/_generated/dataModel.d.ts +60 -0
- package/convex/_generated/server.d.ts +143 -0
- package/convex/_generated/server.js +93 -0
- package/convex/adminActivate.d.ts +3 -0
- package/convex/adminActivate.d.ts.map +1 -0
- package/convex/adminActivate.js +47 -0
- package/convex/adminActivate.js.map +1 -0
- package/convex/adminActivate.ts +54 -0
- package/convex/adminStats.d.ts +3 -0
- package/convex/adminStats.d.ts.map +1 -0
- package/convex/adminStats.js +42 -0
- package/convex/adminStats.js.map +1 -0
- package/convex/adminStats.ts +44 -0
- package/convex/agents.d.ts +76 -0
- package/convex/agents.d.ts.map +1 -0
- package/convex/agents.js +699 -0
- package/convex/agents.js.map +1 -0
- package/convex/agents.ts +814 -0
- package/convex/analytics.d.ts +5 -0
- package/convex/analytics.d.ts.map +1 -0
- package/convex/analytics.js +166 -0
- package/convex/analytics.js.map +1 -0
- package/convex/analytics.ts +186 -0
- package/convex/billing.d.ts +88 -0
- package/convex/billing.d.ts.map +1 -0
- package/convex/billing.js +655 -0
- package/convex/billing.js.map +1 -0
- package/convex/billing.ts +791 -0
- package/convex/capabilities.d.ts +9 -0
- package/convex/capabilities.d.ts.map +1 -0
- package/convex/capabilities.js +145 -0
- package/convex/capabilities.js.map +1 -0
- package/convex/capabilities.ts +157 -0
- package/convex/chains.d.ts +68 -0
- package/convex/chains.d.ts.map +1 -0
- package/convex/chains.js +1105 -0
- package/convex/chains.js.map +1 -0
- package/convex/chains.ts +1318 -0
- package/convex/credits.d.ts +25 -0
- package/convex/credits.d.ts.map +1 -0
- package/convex/credits.js +186 -0
- package/convex/credits.js.map +1 -0
- package/convex/credits.ts +211 -0
- package/convex/crons.d.ts +3 -0
- package/convex/crons.d.ts.map +1 -0
- package/convex/crons.js +17 -0
- package/convex/crons.js.map +1 -0
- package/convex/crons.ts +28 -0
- package/convex/directCall.d.ts +72 -0
- package/convex/directCall.d.ts.map +1 -0
- package/convex/directCall.js +627 -0
- package/convex/directCall.js.map +1 -0
- package/convex/directCall.ts +678 -0
- package/convex/earnProgress.d.ts +58 -0
- package/convex/earnProgress.d.ts.map +1 -0
- package/convex/earnProgress.js +649 -0
- package/convex/earnProgress.js.map +1 -0
- package/convex/earnProgress.ts +753 -0
- package/convex/email.d.ts +14 -0
- package/convex/email.d.ts.map +1 -0
- package/convex/email.js +300 -0
- package/convex/email.js.map +1 -0
- package/convex/email.ts +329 -0
- package/convex/feedback.d.ts +7 -0
- package/convex/feedback.d.ts.map +1 -0
- package/convex/feedback.js +227 -0
- package/convex/feedback.js.map +1 -0
- package/convex/feedback.ts +265 -0
- package/convex/http.d.ts +3 -0
- package/convex/http.d.ts.map +1 -0
- package/convex/http.js +1405 -0
- package/convex/http.js.map +1 -0
- package/convex/http.ts +1577 -0
- package/convex/inbound.d.ts +2 -0
- package/convex/inbound.d.ts.map +1 -0
- package/convex/inbound.js +32 -0
- package/convex/inbound.js.map +1 -0
- package/convex/inbound.ts +32 -0
- package/convex/logs.d.ts +38 -0
- package/convex/logs.d.ts.map +1 -0
- package/convex/logs.js +487 -0
- package/convex/logs.js.map +1 -0
- package/convex/logs.ts +550 -0
- package/convex/mou.d.ts +6 -0
- package/convex/mou.d.ts.map +1 -0
- package/convex/mou.js +82 -0
- package/convex/mou.js.map +1 -0
- package/convex/mou.ts +91 -0
- package/convex/providerKeys.d.ts +31 -0
- package/convex/providerKeys.d.ts.map +1 -0
- package/convex/providerKeys.js +257 -0
- package/convex/providerKeys.js.map +1 -0
- package/convex/providerKeys.ts +289 -0
- package/convex/providers.d.ts +32 -0
- package/convex/providers.d.ts.map +1 -0
- package/convex/providers.js +814 -0
- package/convex/providers.js.map +1 -0
- package/convex/providers.ts +909 -0
- package/convex/purchases.d.ts +7 -0
- package/convex/purchases.d.ts.map +1 -0
- package/convex/purchases.js +157 -0
- package/convex/purchases.js.map +1 -0
- package/convex/purchases.ts +183 -0
- package/convex/ratelimit.d.ts +4 -0
- package/convex/ratelimit.d.ts.map +1 -0
- package/convex/ratelimit.js +91 -0
- package/convex/ratelimit.js.map +1 -0
- package/convex/ratelimit.ts +104 -0
- package/convex/schema.ts +802 -0
- package/convex/searchLogs.d.ts +4 -0
- package/convex/searchLogs.d.ts.map +1 -0
- package/convex/searchLogs.js +129 -0
- package/convex/searchLogs.js.map +1 -0
- package/convex/searchLogs.ts +146 -0
- package/convex/seedAPILayerAPIs.d.ts +7 -0
- package/convex/seedAPILayerAPIs.d.ts.map +1 -0
- package/convex/seedAPILayerAPIs.js +177 -0
- package/convex/seedAPILayerAPIs.js.map +1 -0
- package/convex/seedAPILayerAPIs.ts +191 -0
- package/convex/seedDirectCallConfigs.d.ts +2 -0
- package/convex/seedDirectCallConfigs.d.ts.map +1 -0
- package/convex/seedDirectCallConfigs.js +324 -0
- package/convex/seedDirectCallConfigs.js.map +1 -0
- package/convex/seedDirectCallConfigs.ts +336 -0
- package/convex/seedPratham.d.ts +6 -0
- package/convex/seedPratham.d.ts.map +1 -0
- package/convex/seedPratham.js +150 -0
- package/convex/seedPratham.js.map +1 -0
- package/convex/seedPratham.ts +161 -0
- package/convex/spendAlerts.d.ts +36 -0
- package/convex/spendAlerts.d.ts.map +1 -0
- package/convex/spendAlerts.js +380 -0
- package/convex/spendAlerts.js.map +1 -0
- package/convex/spendAlerts.ts +442 -0
- package/convex/stripeActions.d.ts +19 -0
- package/convex/stripeActions.d.ts.map +1 -0
- package/convex/stripeActions.js +411 -0
- package/convex/stripeActions.js.map +1 -0
- package/convex/stripeActions.ts +512 -0
- package/convex/teams.d.ts +21 -0
- package/convex/teams.d.ts.map +1 -0
- package/convex/teams.js +215 -0
- package/convex/teams.js.map +1 -0
- package/convex/teams.ts +243 -0
- package/convex/telemetry.d.ts +4 -0
- package/convex/telemetry.d.ts.map +1 -0
- package/convex/telemetry.js +74 -0
- package/convex/telemetry.js.map +1 -0
- package/convex/telemetry.ts +81 -0
- package/convex/tsconfig.json +25 -0
- package/convex/updateAPIStatus.d.ts +6 -0
- package/convex/updateAPIStatus.d.ts.map +1 -0
- package/convex/updateAPIStatus.js +40 -0
- package/convex/updateAPIStatus.js.map +1 -0
- package/convex/updateAPIStatus.ts +45 -0
- package/convex/usage.d.ts +27 -0
- package/convex/usage.d.ts.map +1 -0
- package/convex/usage.js +229 -0
- package/convex/usage.js.map +1 -0
- package/convex/usage.ts +260 -0
- package/convex/waitlist.d.ts +4 -0
- package/convex/waitlist.d.ts.map +1 -0
- package/convex/waitlist.js +49 -0
- package/convex/waitlist.js.map +1 -0
- package/convex/waitlist.ts +55 -0
- package/convex/webhooks.d.ts +12 -0
- package/convex/webhooks.d.ts.map +1 -0
- package/convex/webhooks.js +410 -0
- package/convex/webhooks.js.map +1 -0
- package/convex/webhooks.ts +494 -0
- package/convex/workspaces.d.ts +31 -0
- package/convex/workspaces.d.ts.map +1 -0
- package/convex/workspaces.js +975 -0
- package/convex/workspaces.js.map +1 -0
- package/convex/workspaces.ts +1130 -0
- package/dist/bin.js +0 -0
- package/dist/capability-router.js +1 -1
- package/dist/capability-router.js.map +1 -1
- package/dist/execute.d.ts +2 -0
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +18 -4
- package/dist/execute.js.map +1 -1
- package/dist/http-api.js +1 -1
- package/dist/http-api.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-analytics.d.ts +32 -0
- package/dist/mcp-analytics.d.ts.map +1 -0
- package/dist/mcp-analytics.js +130 -0
- package/dist/mcp-analytics.js.map +1 -0
- package/package.json +1 -1
- package/dist/chain-types.d.ts +0 -187
- package/dist/chain-types.d.ts.map +0 -1
- package/dist/chain-types.js +0 -33
- package/dist/chain-types.js.map +0 -1
- package/dist/registry/apis.json.bak +0 -248811
- package/dist/src/bin.js +0 -17
- package/dist/src/capability-router.js +0 -240
- package/dist/src/chainExecutor.js +0 -451
- package/dist/src/chainResolver.js +0 -518
- package/dist/src/cli/commands/doctor.js +0 -324
- package/dist/src/cli/commands/mcp-install.js +0 -255
- package/dist/src/cli/commands/restore.js +0 -259
- package/dist/src/cli/commands/setup.js +0 -205
- package/dist/src/cli/commands/uninstall.js +0 -188
- package/dist/src/cli/index.js +0 -111
- package/dist/src/cli.js +0 -302
- package/dist/src/confirmation.js +0 -240
- package/dist/src/credentials.js +0 -357
- package/dist/src/credits.js +0 -260
- package/dist/src/crypto.js +0 -66
- package/dist/src/discovery.js +0 -504
- package/dist/src/enterprise/env.js +0 -123
- package/dist/src/enterprise/script-generator.js +0 -460
- package/dist/src/execute-dynamic.js +0 -473
- package/dist/src/execute.js +0 -1727
- package/dist/src/index.js +0 -2062
- package/dist/src/metered.js +0 -80
- package/dist/src/open-apis.js +0 -276
- package/dist/src/proxy.js +0 -28
- package/dist/src/session.js +0 -86
- package/dist/src/stripe.js +0 -407
- package/dist/src/telemetry.js +0 -49
- package/dist/src/types.js +0 -2
- package/dist/src/utils/backup.js +0 -181
- package/dist/src/utils/config.js +0 -220
- package/dist/src/utils/os.js +0 -105
- package/dist/src/utils/paths.js +0 -159
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import Stripe from "stripe";
|
|
2
|
+
import { httpAction } from "./_generated/server";
|
|
3
|
+
import { api } from "./_generated/api";
|
|
4
|
+
// Initialize Stripe (will use env var at runtime)
|
|
5
|
+
function getStripe() {
|
|
6
|
+
const key = process.env.STRIPE_SECRET_KEY;
|
|
7
|
+
if (!key) {
|
|
8
|
+
throw new Error("STRIPE_SECRET_KEY not configured");
|
|
9
|
+
}
|
|
10
|
+
return new Stripe(key);
|
|
11
|
+
}
|
|
12
|
+
// CORS headers
|
|
13
|
+
const corsHeaders = {
|
|
14
|
+
"Access-Control-Allow-Origin": "*",
|
|
15
|
+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
16
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization, stripe-signature",
|
|
17
|
+
};
|
|
18
|
+
function jsonResponse(data, status = 200) {
|
|
19
|
+
return new Response(JSON.stringify(data), {
|
|
20
|
+
status,
|
|
21
|
+
headers: { "Content-Type": "application/json", ...corsHeaders },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create Stripe Checkout Session
|
|
26
|
+
* POST /api/billing/checkout
|
|
27
|
+
*/
|
|
28
|
+
export const createCheckoutSession = httpAction(async (ctx, request) => {
|
|
29
|
+
try {
|
|
30
|
+
const body = await request.json();
|
|
31
|
+
const { workspaceId, returnUrl, mode = "setup" } = body;
|
|
32
|
+
if (!workspaceId) {
|
|
33
|
+
return jsonResponse({ error: "workspaceId required" }, 400);
|
|
34
|
+
}
|
|
35
|
+
const stripe = getStripe();
|
|
36
|
+
// Get workspace
|
|
37
|
+
const workspace = await ctx.runQuery(api.billing.getWorkspace, {
|
|
38
|
+
id: workspaceId,
|
|
39
|
+
});
|
|
40
|
+
if (!workspace) {
|
|
41
|
+
return jsonResponse({ error: "Workspace not found" }, 404);
|
|
42
|
+
}
|
|
43
|
+
let customerId = workspace.stripeCustomerId;
|
|
44
|
+
// Create Stripe customer if doesn't exist
|
|
45
|
+
if (!customerId) {
|
|
46
|
+
const customer = await stripe.customers.create({
|
|
47
|
+
email: workspace.email,
|
|
48
|
+
metadata: {
|
|
49
|
+
workspaceId: workspaceId,
|
|
50
|
+
source: "apiclaw",
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
customerId = customer.id;
|
|
54
|
+
// Link customer to workspace
|
|
55
|
+
await ctx.runMutation(api.billing.linkCustomer, {
|
|
56
|
+
workspaceId: workspaceId,
|
|
57
|
+
stripeCustomerId: customerId,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const baseUrl = returnUrl || "https://apiclaw.nordsym.com";
|
|
61
|
+
// Create checkout session
|
|
62
|
+
if (mode === "setup") {
|
|
63
|
+
// Setup mode - just save card for future billing
|
|
64
|
+
const session = await stripe.checkout.sessions.create({
|
|
65
|
+
customer: customerId,
|
|
66
|
+
mode: "setup",
|
|
67
|
+
payment_method_types: ["card"],
|
|
68
|
+
success_url: `${baseUrl}/billing?session_id={CHECKOUT_SESSION_ID}&success=true`,
|
|
69
|
+
cancel_url: `${baseUrl}/billing?canceled=true`,
|
|
70
|
+
metadata: {
|
|
71
|
+
workspaceId: workspaceId,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
return jsonResponse({
|
|
75
|
+
checkoutUrl: session.url,
|
|
76
|
+
sessionId: session.id,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (mode === "subscription") {
|
|
80
|
+
// Create metered subscription
|
|
81
|
+
const priceId = process.env.STRIPE_PRICE_ID_USAGE;
|
|
82
|
+
if (!priceId) {
|
|
83
|
+
return jsonResponse({ error: "Usage price not configured" }, 500);
|
|
84
|
+
}
|
|
85
|
+
const session = await stripe.checkout.sessions.create({
|
|
86
|
+
customer: customerId,
|
|
87
|
+
mode: "subscription",
|
|
88
|
+
line_items: [
|
|
89
|
+
{
|
|
90
|
+
price: priceId,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
success_url: `${baseUrl}/billing?session_id={CHECKOUT_SESSION_ID}&success=true`,
|
|
94
|
+
cancel_url: `${baseUrl}/billing?canceled=true`,
|
|
95
|
+
metadata: {
|
|
96
|
+
workspaceId: workspaceId,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
return jsonResponse({
|
|
100
|
+
checkoutUrl: session.url,
|
|
101
|
+
sessionId: session.id,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return jsonResponse({ error: "Invalid mode. Use 'setup' or 'subscription'" }, 400);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
console.error("Checkout error:", e);
|
|
110
|
+
return jsonResponse({ error: e.message || "Failed to create checkout" }, 500);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
/**
|
|
114
|
+
* Create Stripe Billing Portal Session
|
|
115
|
+
* POST /api/billing/portal
|
|
116
|
+
*/
|
|
117
|
+
export const createPortalSession = httpAction(async (ctx, request) => {
|
|
118
|
+
try {
|
|
119
|
+
const body = await request.json();
|
|
120
|
+
const { workspaceId, returnUrl } = body;
|
|
121
|
+
if (!workspaceId) {
|
|
122
|
+
return jsonResponse({ error: "workspaceId required" }, 400);
|
|
123
|
+
}
|
|
124
|
+
const stripe = getStripe();
|
|
125
|
+
// Get workspace
|
|
126
|
+
const workspace = await ctx.runQuery(api.billing.getWorkspace, {
|
|
127
|
+
id: workspaceId,
|
|
128
|
+
});
|
|
129
|
+
if (!workspace) {
|
|
130
|
+
return jsonResponse({ error: "Workspace not found" }, 404);
|
|
131
|
+
}
|
|
132
|
+
if (!workspace.stripeCustomerId) {
|
|
133
|
+
return jsonResponse({ error: "No billing account. Add a payment method first." }, 400);
|
|
134
|
+
}
|
|
135
|
+
const session = await stripe.billingPortal.sessions.create({
|
|
136
|
+
customer: workspace.stripeCustomerId,
|
|
137
|
+
return_url: returnUrl || "https://apiclaw.com/workspace?tab=settings&portal=success",
|
|
138
|
+
});
|
|
139
|
+
return jsonResponse({
|
|
140
|
+
portalUrl: session.url,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
console.error("Portal error:", e);
|
|
145
|
+
return jsonResponse({ error: e.message || "Failed to create portal session" }, 500);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
/**
|
|
149
|
+
* Stripe Webhook Handler
|
|
150
|
+
* POST /api/webhooks/stripe
|
|
151
|
+
*/
|
|
152
|
+
export const handleStripeWebhook = httpAction(async (ctx, request) => {
|
|
153
|
+
const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET;
|
|
154
|
+
if (!webhookSecret) {
|
|
155
|
+
console.error("STRIPE_WEBHOOK_SECRET not configured");
|
|
156
|
+
return jsonResponse({ error: "Webhook not configured" }, 500);
|
|
157
|
+
}
|
|
158
|
+
const stripe = getStripe();
|
|
159
|
+
const signature = request.headers.get("stripe-signature");
|
|
160
|
+
if (!signature) {
|
|
161
|
+
return jsonResponse({ error: "Missing stripe-signature header" }, 400);
|
|
162
|
+
}
|
|
163
|
+
let event;
|
|
164
|
+
try {
|
|
165
|
+
const body = await request.text();
|
|
166
|
+
event = stripe.webhooks.constructEvent(body, signature, webhookSecret);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
console.error("Webhook signature verification failed:", err.message);
|
|
170
|
+
return jsonResponse({ error: `Webhook Error: ${err.message}` }, 400);
|
|
171
|
+
}
|
|
172
|
+
// Handle the event
|
|
173
|
+
try {
|
|
174
|
+
switch (event.type) {
|
|
175
|
+
case "checkout.session.completed": {
|
|
176
|
+
const session = event.data.object;
|
|
177
|
+
await handleCheckoutComplete(ctx, session);
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case "customer.subscription.created":
|
|
181
|
+
case "customer.subscription.updated": {
|
|
182
|
+
const subscription = event.data.object;
|
|
183
|
+
await handleSubscriptionUpdate(ctx, subscription);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
case "customer.subscription.deleted": {
|
|
187
|
+
const subscription = event.data.object;
|
|
188
|
+
await handleSubscriptionCanceled(ctx, subscription);
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
case "invoice.paid": {
|
|
192
|
+
const invoice = event.data.object;
|
|
193
|
+
await handleInvoicePaid(ctx, invoice);
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case "invoice.payment_failed": {
|
|
197
|
+
const invoice = event.data.object;
|
|
198
|
+
await handlePaymentFailed(ctx, invoice);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
case "setup_intent.succeeded": {
|
|
202
|
+
const setupIntent = event.data.object;
|
|
203
|
+
await handleSetupSuccess(ctx, setupIntent);
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
case "payment_method.attached": {
|
|
207
|
+
const paymentMethod = event.data.object;
|
|
208
|
+
await handlePaymentMethodAttached(ctx, paymentMethod);
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case "payment_method.detached": {
|
|
212
|
+
const paymentMethod = event.data.object;
|
|
213
|
+
await handlePaymentMethodDetached(ctx, paymentMethod);
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
default:
|
|
217
|
+
console.log(`Unhandled event type: ${event.type}`);
|
|
218
|
+
}
|
|
219
|
+
return jsonResponse({ received: true, type: event.type });
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
console.error(`Error handling ${event.type}:`, e);
|
|
223
|
+
// Return 200 to prevent Stripe retries for business logic errors
|
|
224
|
+
return jsonResponse({ received: true, error: e.message });
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// ============================================
|
|
228
|
+
// Webhook Event Handlers
|
|
229
|
+
// ============================================
|
|
230
|
+
async function handleCheckoutComplete(ctx, session) {
|
|
231
|
+
const workspaceId = session.metadata?.workspaceId;
|
|
232
|
+
if (!workspaceId) {
|
|
233
|
+
console.log("No workspaceId in checkout session metadata");
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// If subscription mode, the subscription webhook will handle it
|
|
237
|
+
if (session.mode === "subscription" && session.subscription) {
|
|
238
|
+
console.log("Subscription checkout completed, waiting for subscription webhook");
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
// If setup mode, upgrade to usage-based billing
|
|
242
|
+
if (session.mode === "setup") {
|
|
243
|
+
await ctx.runMutation(api.billing.updateSubscription, {
|
|
244
|
+
workspaceId: workspaceId,
|
|
245
|
+
billingPlan: "usage_based",
|
|
246
|
+
});
|
|
247
|
+
console.log(`Workspace ${workspaceId} upgraded to usage-based billing`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async function handleSubscriptionUpdate(ctx, subscription) {
|
|
251
|
+
const customerId = typeof subscription.customer === "string"
|
|
252
|
+
? subscription.customer
|
|
253
|
+
: subscription.customer.id;
|
|
254
|
+
// Get workspace by customer ID
|
|
255
|
+
const workspace = await ctx.runQuery(api.billing.getByStripeCustomerId, {
|
|
256
|
+
stripeCustomerId: customerId,
|
|
257
|
+
});
|
|
258
|
+
if (!workspace) {
|
|
259
|
+
console.log(`No workspace found for customer ${customerId}`);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// Determine plan from subscription
|
|
263
|
+
const plan = subscription.status === "active" ? "usage_based" : "free";
|
|
264
|
+
await ctx.runMutation(api.billing.updateSubscription, {
|
|
265
|
+
workspaceId: workspace._id,
|
|
266
|
+
stripeSubscriptionId: subscription.id,
|
|
267
|
+
billingPlan: plan,
|
|
268
|
+
});
|
|
269
|
+
console.log(`Subscription ${subscription.id} updated for workspace ${workspace._id}`);
|
|
270
|
+
}
|
|
271
|
+
async function handleSubscriptionCanceled(ctx, subscription) {
|
|
272
|
+
const customerId = typeof subscription.customer === "string"
|
|
273
|
+
? subscription.customer
|
|
274
|
+
: subscription.customer.id;
|
|
275
|
+
const workspace = await ctx.runQuery(api.billing.getByStripeCustomerId, {
|
|
276
|
+
stripeCustomerId: customerId,
|
|
277
|
+
});
|
|
278
|
+
if (!workspace) {
|
|
279
|
+
console.log(`No workspace found for customer ${customerId}`);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
// Downgrade to free and reset usage
|
|
283
|
+
await ctx.runMutation(api.billing.updateSubscription, {
|
|
284
|
+
workspaceId: workspace._id,
|
|
285
|
+
stripeSubscriptionId: undefined,
|
|
286
|
+
billingPlan: "free",
|
|
287
|
+
});
|
|
288
|
+
// Reset usage count to 0 for clean slate on free tier
|
|
289
|
+
await ctx.runMutation(api.billing.resetUsageOnCancellation, {
|
|
290
|
+
workspaceId: workspace._id,
|
|
291
|
+
});
|
|
292
|
+
console.log(`Workspace ${workspace._id} downgraded to free (subscription canceled)`);
|
|
293
|
+
}
|
|
294
|
+
async function handleInvoicePaid(ctx, invoice) {
|
|
295
|
+
const customerId = typeof invoice.customer === "string"
|
|
296
|
+
? invoice.customer
|
|
297
|
+
: invoice.customer?.id;
|
|
298
|
+
if (!customerId)
|
|
299
|
+
return;
|
|
300
|
+
const workspace = await ctx.runQuery(api.billing.getByStripeCustomerId, {
|
|
301
|
+
stripeCustomerId: customerId,
|
|
302
|
+
});
|
|
303
|
+
if (!workspace) {
|
|
304
|
+
console.log(`No workspace found for customer ${customerId}`);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// Calculate call count from line items (for metered billing)
|
|
308
|
+
let callCount = 0;
|
|
309
|
+
if (invoice.lines?.data) {
|
|
310
|
+
for (const line of invoice.lines.data) {
|
|
311
|
+
if (line.quantity) {
|
|
312
|
+
callCount += line.quantity;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
await ctx.runMutation(api.billing.processPayment, {
|
|
317
|
+
stripeInvoiceId: invoice.id,
|
|
318
|
+
workspaceId: workspace._id,
|
|
319
|
+
amount: invoice.amount_paid,
|
|
320
|
+
periodStart: invoice.period_start * 1000,
|
|
321
|
+
periodEnd: invoice.period_end * 1000,
|
|
322
|
+
callCount,
|
|
323
|
+
pdfUrl: invoice.invoice_pdf || undefined,
|
|
324
|
+
});
|
|
325
|
+
console.log(`Invoice ${invoice.id} processed for workspace ${workspace._id}`);
|
|
326
|
+
}
|
|
327
|
+
async function handlePaymentFailed(ctx, invoice) {
|
|
328
|
+
const customerId = typeof invoice.customer === "string"
|
|
329
|
+
? invoice.customer
|
|
330
|
+
: invoice.customer?.id;
|
|
331
|
+
if (!customerId)
|
|
332
|
+
return;
|
|
333
|
+
// Update invoice status to failed
|
|
334
|
+
await ctx.runMutation(api.billing.updateInvoiceStatus, {
|
|
335
|
+
stripeInvoiceId: invoice.id,
|
|
336
|
+
status: "failed",
|
|
337
|
+
});
|
|
338
|
+
console.log(`Payment failed for invoice ${invoice.id}`);
|
|
339
|
+
// TODO: Send notification to user about failed payment
|
|
340
|
+
}
|
|
341
|
+
async function handleSetupSuccess(ctx, setupIntent) {
|
|
342
|
+
// Card saved successfully
|
|
343
|
+
const customerId = typeof setupIntent.customer === "string"
|
|
344
|
+
? setupIntent.customer
|
|
345
|
+
: setupIntent.customer?.id;
|
|
346
|
+
if (!customerId)
|
|
347
|
+
return;
|
|
348
|
+
const workspace = await ctx.runQuery(api.billing.getByStripeCustomerId, {
|
|
349
|
+
stripeCustomerId: customerId,
|
|
350
|
+
});
|
|
351
|
+
if (!workspace) {
|
|
352
|
+
console.log(`No workspace found for customer ${customerId}`);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
// Upgrade to usage-based if still on free
|
|
356
|
+
if (!workspace.billingPlan || workspace.billingPlan === "free") {
|
|
357
|
+
await ctx.runMutation(api.billing.updateSubscription, {
|
|
358
|
+
workspaceId: workspace._id,
|
|
359
|
+
billingPlan: "usage_based",
|
|
360
|
+
});
|
|
361
|
+
console.log(`Workspace ${workspace._id} upgraded after setup intent`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
async function handlePaymentMethodAttached(ctx, paymentMethod) {
|
|
365
|
+
// Payment method attached to customer
|
|
366
|
+
const customerId = typeof paymentMethod.customer === "string"
|
|
367
|
+
? paymentMethod.customer
|
|
368
|
+
: paymentMethod.customer?.id;
|
|
369
|
+
if (!customerId) {
|
|
370
|
+
console.log("Payment method attached but no customer ID");
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const workspace = await ctx.runQuery(api.billing.getByStripeCustomerId, {
|
|
374
|
+
stripeCustomerId: customerId,
|
|
375
|
+
});
|
|
376
|
+
if (!workspace) {
|
|
377
|
+
console.log(`No workspace found for customer ${customerId}`);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
// Sync payment method info
|
|
381
|
+
await ctx.runMutation(api.billing.updatePaymentMethodInfo, {
|
|
382
|
+
workspaceId: workspace._id,
|
|
383
|
+
hasPaymentMethod: true,
|
|
384
|
+
paymentMethodType: paymentMethod.type,
|
|
385
|
+
cardBrand: paymentMethod.card?.brand,
|
|
386
|
+
cardLast4: paymentMethod.card?.last4,
|
|
387
|
+
});
|
|
388
|
+
console.log(`Payment method attached for workspace ${workspace._id}`);
|
|
389
|
+
}
|
|
390
|
+
async function handlePaymentMethodDetached(ctx, paymentMethod) {
|
|
391
|
+
// When a payment method is detached, we need to check if customer still has payment methods
|
|
392
|
+
// Since customer info isn't available on detached event, we log it
|
|
393
|
+
console.log(`Payment method ${paymentMethod.id} detached`);
|
|
394
|
+
// Note: In a production system, you might want to:
|
|
395
|
+
// 1. Query Stripe for remaining payment methods
|
|
396
|
+
// 2. If no payment methods remain, downgrade the workspace
|
|
397
|
+
// For now, we rely on subscription cancellation to handle downgrades
|
|
398
|
+
}
|
|
399
|
+
// ============================================
|
|
400
|
+
// OPTIONS handlers for CORS
|
|
401
|
+
// ============================================
|
|
402
|
+
export const checkoutOptions = httpAction(async () => {
|
|
403
|
+
return new Response(null, { headers: corsHeaders });
|
|
404
|
+
});
|
|
405
|
+
export const portalOptions = httpAction(async () => {
|
|
406
|
+
return new Response(null, { headers: corsHeaders });
|
|
407
|
+
});
|
|
408
|
+
export const webhookOptions = httpAction(async () => {
|
|
409
|
+
return new Response(null, { headers: corsHeaders });
|
|
410
|
+
});
|
|
411
|
+
//# sourceMappingURL=stripeActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripeActions.js","sourceRoot":"","sources":["stripeActions.ts"],"names":[],"mappings":"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"}
|