@chaaskit/server 0.1.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.
Files changed (189) hide show
  1. package/dist/api/admin.js +438 -0
  2. package/dist/api/admin.js.map +1 -0
  3. package/dist/api/agents.js +21 -0
  4. package/dist/api/agents.js.map +1 -0
  5. package/dist/api/api-keys.js +122 -0
  6. package/dist/api/api-keys.js.map +1 -0
  7. package/dist/api/auth.js +399 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/chat.js +900 -0
  10. package/dist/api/chat.js.map +1 -0
  11. package/dist/api/config.js +91 -0
  12. package/dist/api/config.js.map +1 -0
  13. package/dist/api/documents.js +237 -0
  14. package/dist/api/documents.js.map +1 -0
  15. package/dist/api/export.js +107 -0
  16. package/dist/api/export.js.map +1 -0
  17. package/dist/api/health.js +25 -0
  18. package/dist/api/health.js.map +1 -0
  19. package/dist/api/mcp-server.js +84 -0
  20. package/dist/api/mcp-server.js.map +1 -0
  21. package/dist/api/mcp.js +400 -0
  22. package/dist/api/mcp.js.map +1 -0
  23. package/dist/api/mentions.js +94 -0
  24. package/dist/api/mentions.js.map +1 -0
  25. package/dist/api/oauth.js +366 -0
  26. package/dist/api/oauth.js.map +1 -0
  27. package/dist/api/payments.js +473 -0
  28. package/dist/api/payments.js.map +1 -0
  29. package/dist/api/projects.js +301 -0
  30. package/dist/api/projects.js.map +1 -0
  31. package/dist/api/scheduled-prompts.js +617 -0
  32. package/dist/api/scheduled-prompts.js.map +1 -0
  33. package/dist/api/search.js +85 -0
  34. package/dist/api/search.js.map +1 -0
  35. package/dist/api/share.js +188 -0
  36. package/dist/api/share.js.map +1 -0
  37. package/dist/api/slack.js +468 -0
  38. package/dist/api/slack.js.map +1 -0
  39. package/dist/api/teams.js +693 -0
  40. package/dist/api/teams.js.map +1 -0
  41. package/dist/api/templates.js +134 -0
  42. package/dist/api/templates.js.map +1 -0
  43. package/dist/api/threads.js +323 -0
  44. package/dist/api/threads.js.map +1 -0
  45. package/dist/api/upload.js +57 -0
  46. package/dist/api/upload.js.map +1 -0
  47. package/dist/api/user.js +111 -0
  48. package/dist/api/user.js.map +1 -0
  49. package/dist/api/v1/openai.js +245 -0
  50. package/dist/api/v1/openai.js.map +1 -0
  51. package/dist/app.js +168 -0
  52. package/dist/app.js.map +1 -0
  53. package/dist/bin/cli.js +57 -0
  54. package/dist/bin/cli.js.map +1 -0
  55. package/dist/commands/db-sync.js +108 -0
  56. package/dist/commands/db-sync.js.map +1 -0
  57. package/dist/config/loader.js +374 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/documents/extractors.js +136 -0
  60. package/dist/documents/extractors.js.map +1 -0
  61. package/dist/extensions/glob.js +53 -0
  62. package/dist/extensions/glob.js.map +1 -0
  63. package/dist/extensions/loader.js +72 -0
  64. package/dist/extensions/loader.js.map +1 -0
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/loaders/index.js +75 -0
  68. package/dist/loaders/index.js.map +1 -0
  69. package/dist/mcp/client.js +551 -0
  70. package/dist/mcp/client.js.map +1 -0
  71. package/dist/mcp/server.js +335 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/middleware/apiKeyAuth.js +136 -0
  74. package/dist/middleware/apiKeyAuth.js.map +1 -0
  75. package/dist/middleware/auth.js +192 -0
  76. package/dist/middleware/auth.js.map +1 -0
  77. package/dist/middleware/errorHandler.js +41 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/mcpServerAuth.js +164 -0
  80. package/dist/middleware/mcpServerAuth.js.map +1 -0
  81. package/dist/middleware/requestLogger.js +9 -0
  82. package/dist/middleware/requestLogger.js.map +1 -0
  83. package/dist/middleware/team.js +132 -0
  84. package/dist/middleware/team.js.map +1 -0
  85. package/dist/oauth/server.js +410 -0
  86. package/dist/oauth/server.js.map +1 -0
  87. package/dist/queue/cli.js +93 -0
  88. package/dist/queue/cli.js.map +1 -0
  89. package/dist/queue/handlers/index.js +91 -0
  90. package/dist/queue/handlers/index.js.map +1 -0
  91. package/dist/queue/handlers/scheduled-prompt.js +270 -0
  92. package/dist/queue/handlers/scheduled-prompt.js.map +1 -0
  93. package/dist/queue/index.js +91 -0
  94. package/dist/queue/index.js.map +1 -0
  95. package/dist/queue/providers/memory.js +296 -0
  96. package/dist/queue/providers/memory.js.map +1 -0
  97. package/dist/queue/providers/sqs.js +275 -0
  98. package/dist/queue/providers/sqs.js.map +1 -0
  99. package/dist/queue/scheduler.js +355 -0
  100. package/dist/queue/scheduler.js.map +1 -0
  101. package/dist/queue/types.js +5 -0
  102. package/dist/queue/types.js.map +1 -0
  103. package/dist/queue/worker.js +230 -0
  104. package/dist/queue/worker.js.map +1 -0
  105. package/dist/registry/index.js +40 -0
  106. package/dist/registry/index.js.map +1 -0
  107. package/dist/server.js +207 -0
  108. package/dist/server.js.map +1 -0
  109. package/dist/services/agent.js +530 -0
  110. package/dist/services/agent.js.map +1 -0
  111. package/dist/services/agents.js +194 -0
  112. package/dist/services/agents.js.map +1 -0
  113. package/dist/services/documents.js +507 -0
  114. package/dist/services/documents.js.map +1 -0
  115. package/dist/services/email/index.js +91 -0
  116. package/dist/services/email/index.js.map +1 -0
  117. package/dist/services/email/providers/ses.js +97 -0
  118. package/dist/services/email/providers/ses.js.map +1 -0
  119. package/dist/services/email/templates.js +194 -0
  120. package/dist/services/email/templates.js.map +1 -0
  121. package/dist/services/email/types.js +5 -0
  122. package/dist/services/email/types.js.map +1 -0
  123. package/dist/services/encryption.js +69 -0
  124. package/dist/services/encryption.js.map +1 -0
  125. package/dist/services/oauth-discovery.js +226 -0
  126. package/dist/services/oauth-discovery.js.map +1 -0
  127. package/dist/services/pendingConfirmation.js +105 -0
  128. package/dist/services/pendingConfirmation.js.map +1 -0
  129. package/dist/services/scheduledPrompts.js +70 -0
  130. package/dist/services/scheduledPrompts.js.map +1 -0
  131. package/dist/services/slack/client.js +174 -0
  132. package/dist/services/slack/client.js.map +1 -0
  133. package/dist/services/slack/events.js +189 -0
  134. package/dist/services/slack/events.js.map +1 -0
  135. package/dist/services/slack/index.js +6 -0
  136. package/dist/services/slack/index.js.map +1 -0
  137. package/dist/services/slack/notifications.js +124 -0
  138. package/dist/services/slack/notifications.js.map +1 -0
  139. package/dist/services/slack/signature.js +74 -0
  140. package/dist/services/slack/signature.js.map +1 -0
  141. package/dist/services/slack/thread-context.js +191 -0
  142. package/dist/services/slack/thread-context.js.map +1 -0
  143. package/dist/services/toolConfirmation.js +55 -0
  144. package/dist/services/toolConfirmation.js.map +1 -0
  145. package/dist/services/usage.js +241 -0
  146. package/dist/services/usage.js.map +1 -0
  147. package/dist/ssr/build.js +90 -0
  148. package/dist/ssr/build.js.map +1 -0
  149. package/dist/ssr/components/SSRMessageList.js +120 -0
  150. package/dist/ssr/components/SSRMessageList.js.map +1 -0
  151. package/dist/ssr/entry.client.js +8 -0
  152. package/dist/ssr/entry.client.js.map +1 -0
  153. package/dist/ssr/entry.server.js +71 -0
  154. package/dist/ssr/entry.server.js.map +1 -0
  155. package/dist/ssr/handler.js +51 -0
  156. package/dist/ssr/handler.js.map +1 -0
  157. package/dist/ssr/root.js +184 -0
  158. package/dist/ssr/root.js.map +1 -0
  159. package/dist/ssr/routes/login.js +140 -0
  160. package/dist/ssr/routes/login.js.map +1 -0
  161. package/dist/ssr/routes/pricing.js +195 -0
  162. package/dist/ssr/routes/pricing.js.map +1 -0
  163. package/dist/ssr/routes/privacy.js +39 -0
  164. package/dist/ssr/routes/privacy.js.map +1 -0
  165. package/dist/ssr/routes/register.js +148 -0
  166. package/dist/ssr/routes/register.js.map +1 -0
  167. package/dist/ssr/routes/shared.$shareId.js +153 -0
  168. package/dist/ssr/routes/shared.$shareId.js.map +1 -0
  169. package/dist/ssr/routes/terms.js +39 -0
  170. package/dist/ssr/routes/terms.js.map +1 -0
  171. package/dist/storage/index.js +43 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/providers/database.js +38 -0
  174. package/dist/storage/providers/database.js.map +1 -0
  175. package/dist/storage/providers/filesystem.js +51 -0
  176. package/dist/storage/providers/filesystem.js.map +1 -0
  177. package/dist/storage/types.js +2 -0
  178. package/dist/storage/types.js.map +1 -0
  179. package/dist/tools/documents.js +336 -0
  180. package/dist/tools/documents.js.map +1 -0
  181. package/dist/tools/get-plan-usage.js +82 -0
  182. package/dist/tools/get-plan-usage.js.map +1 -0
  183. package/dist/tools/index.js +106 -0
  184. package/dist/tools/index.js.map +1 -0
  185. package/dist/tools/types.js +2 -0
  186. package/dist/tools/types.js.map +1 -0
  187. package/dist/tools/web-scrape.js +145 -0
  188. package/dist/tools/web-scrape.js.map +1 -0
  189. package/package.json +93 -0
@@ -0,0 +1,473 @@
1
+ import { Router } from 'express';
2
+ import Stripe from 'stripe';
3
+ import { db } from '@chaaskit/db';
4
+ import { HTTP_STATUS } from '@chaaskit/shared';
5
+ import { requireAuth } from '../middleware/auth.js';
6
+ import { AppError } from '../middleware/errorHandler.js';
7
+ import { getConfig } from '../config/loader.js';
8
+ import { getTeamSubscription } from '../services/usage.js';
9
+ export const paymentsRouter = Router();
10
+ const stripe = new Stripe(process.env.STRIPE_SECRET_KEY || '', {
11
+ apiVersion: '2023-10-16',
12
+ });
13
+ /**
14
+ * Helper to check if a plan can be used for the given scope
15
+ */
16
+ function canUseForScope(planScope, targetScope) {
17
+ const scope = planScope || 'personal'; // Default to personal if not specified
18
+ return scope === 'both' || scope === targetScope;
19
+ }
20
+ /**
21
+ * Helper to verify team admin/owner access
22
+ */
23
+ async function verifyTeamAdmin(userId, teamId) {
24
+ const membership = await db.teamMember.findUnique({
25
+ where: {
26
+ teamId_userId: {
27
+ teamId,
28
+ userId,
29
+ },
30
+ },
31
+ });
32
+ if (!membership) {
33
+ throw new AppError(HTTP_STATUS.FORBIDDEN, 'Not a member of this team');
34
+ }
35
+ if (membership.role !== 'owner' && membership.role !== 'admin') {
36
+ throw new AppError(HTTP_STATUS.FORBIDDEN, 'Only team owners and admins can manage billing');
37
+ }
38
+ }
39
+ // Get all plans (public endpoint for pricing page)
40
+ paymentsRouter.get('/plans', async (_req, res, next) => {
41
+ try {
42
+ const config = getConfig();
43
+ if (!config.payments.enabled) {
44
+ res.json({ plans: [] });
45
+ return;
46
+ }
47
+ // Return plans with pricing info (but not sensitive data like stripe IDs)
48
+ const plans = config.payments.plans.map((plan) => ({
49
+ id: plan.id,
50
+ name: plan.name,
51
+ description: plan.description,
52
+ type: plan.type,
53
+ scope: plan.scope || 'personal',
54
+ priceUSD: plan.type === 'monthly' ? plan.params.priceUSD :
55
+ plan.type === 'credits' ? plan.params.pricePerCredit : 0,
56
+ monthlyMessageLimit: plan.params.monthlyMessageLimit,
57
+ }));
58
+ res.json({ plans });
59
+ }
60
+ catch (error) {
61
+ next(error);
62
+ }
63
+ });
64
+ // Create checkout session (supports both personal and team)
65
+ paymentsRouter.post('/checkout', requireAuth, async (req, res, next) => {
66
+ try {
67
+ const config = getConfig();
68
+ const { planId, teamId } = req.body;
69
+ if (!config.payments.enabled) {
70
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'Payments are disabled');
71
+ }
72
+ const plan = config.payments.plans.find((p) => p.id === planId);
73
+ if (!plan) {
74
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'Invalid plan');
75
+ }
76
+ if (plan.type === 'free') {
77
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'Cannot checkout for free plan');
78
+ }
79
+ if (plan.type !== 'monthly') {
80
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'Only monthly plans support checkout');
81
+ }
82
+ // Determine if this is a team or personal checkout
83
+ const isTeamCheckout = !!teamId;
84
+ const targetScope = isTeamCheckout ? 'team' : 'personal';
85
+ // Validate plan scope
86
+ if (!canUseForScope(plan.scope, targetScope)) {
87
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, isTeamCheckout
88
+ ? 'This plan is not available for teams'
89
+ : 'This plan is only available for teams');
90
+ }
91
+ const params = plan.params;
92
+ let customerId;
93
+ let successUrl;
94
+ let cancelUrl;
95
+ if (isTeamCheckout) {
96
+ // Team checkout - verify admin access
97
+ await verifyTeamAdmin(req.user.id, teamId);
98
+ // Get or create Stripe customer for team
99
+ let team = await db.team.findUnique({
100
+ where: { id: teamId },
101
+ });
102
+ if (!team) {
103
+ throw new AppError(HTTP_STATUS.NOT_FOUND, 'Team not found');
104
+ }
105
+ customerId = team.stripeCustomerId || '';
106
+ if (!customerId) {
107
+ const customer = await stripe.customers.create({
108
+ name: team.name,
109
+ metadata: { teamId: team.id },
110
+ });
111
+ customerId = customer.id;
112
+ await db.team.update({
113
+ where: { id: teamId },
114
+ data: { stripeCustomerId: customerId },
115
+ });
116
+ }
117
+ successUrl = `${process.env.APP_URL}/team/${teamId}/settings?payment=success`;
118
+ cancelUrl = `${process.env.APP_URL}/team/${teamId}/settings?payment=cancelled`;
119
+ }
120
+ else {
121
+ // Personal checkout
122
+ let user = await db.user.findUnique({
123
+ where: { id: req.user.id },
124
+ });
125
+ customerId = user?.stripeCustomerId || '';
126
+ if (!customerId) {
127
+ const customer = await stripe.customers.create({
128
+ email: req.user.email,
129
+ metadata: { userId: req.user.id },
130
+ });
131
+ customerId = customer.id;
132
+ await db.user.update({
133
+ where: { id: req.user.id },
134
+ data: { stripeCustomerId: customerId },
135
+ });
136
+ }
137
+ successUrl = `${process.env.APP_URL}/settings?payment=success`;
138
+ cancelUrl = `${process.env.APP_URL}/settings?payment=cancelled`;
139
+ }
140
+ // Create checkout session
141
+ const session = await stripe.checkout.sessions.create({
142
+ customer: customerId,
143
+ payment_method_types: ['card'],
144
+ line_items: [
145
+ {
146
+ price: params.stripePriceId,
147
+ quantity: 1,
148
+ },
149
+ ],
150
+ mode: 'subscription',
151
+ success_url: successUrl,
152
+ cancel_url: cancelUrl,
153
+ metadata: {
154
+ userId: req.user.id,
155
+ planId: plan.id,
156
+ ...(isTeamCheckout ? { teamId } : {}),
157
+ },
158
+ });
159
+ res.json({ url: session.url });
160
+ }
161
+ catch (error) {
162
+ next(error);
163
+ }
164
+ });
165
+ // Buy credits (supports both personal and team)
166
+ paymentsRouter.post('/buy-credits', requireAuth, async (req, res, next) => {
167
+ try {
168
+ const config = getConfig();
169
+ const { amount, teamId } = req.body;
170
+ if (!config.payments.enabled) {
171
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'Payments are disabled');
172
+ }
173
+ const creditsPlan = config.payments.plans.find((p) => p.type === 'credits');
174
+ if (!creditsPlan) {
175
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'Credits plan not available');
176
+ }
177
+ const params = creditsPlan.params;
178
+ const totalPrice = Math.round(amount * params.pricePerCredit * 100); // cents
179
+ const isTeamPurchase = !!teamId;
180
+ let customerId;
181
+ let successUrl;
182
+ let cancelUrl;
183
+ if (isTeamPurchase) {
184
+ // Team purchase - verify admin access
185
+ await verifyTeamAdmin(req.user.id, teamId);
186
+ let team = await db.team.findUnique({
187
+ where: { id: teamId },
188
+ });
189
+ if (!team) {
190
+ throw new AppError(HTTP_STATUS.NOT_FOUND, 'Team not found');
191
+ }
192
+ customerId = team.stripeCustomerId || '';
193
+ if (!customerId) {
194
+ const customer = await stripe.customers.create({
195
+ name: team.name,
196
+ metadata: { teamId: team.id },
197
+ });
198
+ customerId = customer.id;
199
+ await db.team.update({
200
+ where: { id: teamId },
201
+ data: { stripeCustomerId: customerId },
202
+ });
203
+ }
204
+ successUrl = `${process.env.APP_URL}/team/${teamId}/settings?credits=success`;
205
+ cancelUrl = `${process.env.APP_URL}/team/${teamId}/settings?credits=cancelled`;
206
+ }
207
+ else {
208
+ // Personal purchase
209
+ let user = await db.user.findUnique({
210
+ where: { id: req.user.id },
211
+ });
212
+ customerId = user?.stripeCustomerId || '';
213
+ if (!customerId) {
214
+ const customer = await stripe.customers.create({
215
+ email: req.user.email,
216
+ metadata: { userId: req.user.id },
217
+ });
218
+ customerId = customer.id;
219
+ await db.user.update({
220
+ where: { id: req.user.id },
221
+ data: { stripeCustomerId: customerId },
222
+ });
223
+ }
224
+ successUrl = `${process.env.APP_URL}/settings?credits=success`;
225
+ cancelUrl = `${process.env.APP_URL}/settings?credits=cancelled`;
226
+ }
227
+ // Create checkout session for one-time payment
228
+ const session = await stripe.checkout.sessions.create({
229
+ customer: customerId,
230
+ payment_method_types: ['card'],
231
+ line_items: [
232
+ {
233
+ price_data: {
234
+ currency: 'usd',
235
+ product_data: {
236
+ name: `${amount} Credits${isTeamPurchase ? ' (Team)' : ''}`,
237
+ },
238
+ unit_amount: totalPrice,
239
+ },
240
+ quantity: 1,
241
+ },
242
+ ],
243
+ mode: 'payment',
244
+ success_url: successUrl,
245
+ cancel_url: cancelUrl,
246
+ metadata: {
247
+ userId: req.user.id,
248
+ credits: amount.toString(),
249
+ ...(isTeamPurchase ? { teamId } : {}),
250
+ },
251
+ });
252
+ res.json({ url: session.url });
253
+ }
254
+ catch (error) {
255
+ next(error);
256
+ }
257
+ });
258
+ // Billing portal (personal)
259
+ paymentsRouter.post('/billing-portal', requireAuth, async (req, res, next) => {
260
+ try {
261
+ const user = await db.user.findUnique({
262
+ where: { id: req.user.id },
263
+ });
264
+ if (!user?.stripeCustomerId) {
265
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'No billing account found');
266
+ }
267
+ const session = await stripe.billingPortal.sessions.create({
268
+ customer: user.stripeCustomerId,
269
+ return_url: `${process.env.APP_URL}/settings`,
270
+ });
271
+ res.json({ url: session.url });
272
+ }
273
+ catch (error) {
274
+ next(error);
275
+ }
276
+ });
277
+ // Team billing portal
278
+ paymentsRouter.post('/team/:teamId/billing-portal', requireAuth, async (req, res, next) => {
279
+ try {
280
+ const { teamId } = req.params;
281
+ // Verify admin access
282
+ await verifyTeamAdmin(req.user.id, teamId);
283
+ const team = await db.team.findUnique({
284
+ where: { id: teamId },
285
+ });
286
+ if (!team?.stripeCustomerId) {
287
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'No billing account found for this team');
288
+ }
289
+ const session = await stripe.billingPortal.sessions.create({
290
+ customer: team.stripeCustomerId,
291
+ return_url: `${process.env.APP_URL}/team/${teamId}/settings`,
292
+ });
293
+ res.json({ url: session.url });
294
+ }
295
+ catch (error) {
296
+ next(error);
297
+ }
298
+ });
299
+ // Get team subscription info
300
+ paymentsRouter.get('/team/:teamId/subscription', requireAuth, async (req, res, next) => {
301
+ try {
302
+ const { teamId } = req.params;
303
+ // Verify membership (any role can view)
304
+ const membership = await db.teamMember.findUnique({
305
+ where: {
306
+ teamId_userId: {
307
+ teamId,
308
+ userId: req.user.id,
309
+ },
310
+ },
311
+ });
312
+ if (!membership) {
313
+ throw new AppError(HTTP_STATUS.FORBIDDEN, 'Not a member of this team');
314
+ }
315
+ const subscription = await getTeamSubscription(teamId);
316
+ if (!subscription) {
317
+ throw new AppError(HTTP_STATUS.NOT_FOUND, 'Team not found');
318
+ }
319
+ res.json(subscription);
320
+ }
321
+ catch (error) {
322
+ next(error);
323
+ }
324
+ });
325
+ // Webhook handler
326
+ paymentsRouter.post('/webhook',
327
+ // Stripe requires raw body for webhook verification
328
+ async (req, res) => {
329
+ const sig = req.headers['stripe-signature'];
330
+ if (!sig || !process.env.STRIPE_WEBHOOK_SECRET) {
331
+ res.status(400).send('Missing signature');
332
+ return;
333
+ }
334
+ let event;
335
+ try {
336
+ // Note: In production, you'd need to use express.raw() for this route
337
+ const rawBody = typeof req.body === 'string' ? req.body : JSON.stringify(req.body);
338
+ event = stripe.webhooks.constructEvent(rawBody, sig, process.env.STRIPE_WEBHOOK_SECRET);
339
+ }
340
+ catch (err) {
341
+ console.error('Webhook signature verification failed:', err);
342
+ res.status(400).send('Webhook error');
343
+ return;
344
+ }
345
+ try {
346
+ switch (event.type) {
347
+ case 'checkout.session.completed': {
348
+ const session = event.data.object;
349
+ const teamId = session.metadata?.teamId;
350
+ const userId = session.metadata?.userId;
351
+ const planId = session.metadata?.planId;
352
+ const credits = parseInt(session.metadata?.credits || '0', 10);
353
+ if (session.mode === 'subscription') {
354
+ // Update plan on user or team
355
+ if (teamId && planId) {
356
+ await db.team.update({
357
+ where: { id: teamId },
358
+ data: {
359
+ plan: planId,
360
+ messagesThisMonth: 0, // Reset usage
361
+ },
362
+ });
363
+ console.log(`[Webhook] Updated team ${teamId} to plan ${planId}`);
364
+ }
365
+ else if (userId && planId) {
366
+ await db.user.update({
367
+ where: { id: userId },
368
+ data: {
369
+ plan: planId,
370
+ messagesThisMonth: 0, // Reset usage
371
+ },
372
+ });
373
+ console.log(`[Webhook] Updated user ${userId} to plan ${planId}`);
374
+ }
375
+ }
376
+ else if (session.mode === 'payment' && credits > 0) {
377
+ // Add credits to user or team
378
+ if (teamId) {
379
+ await db.team.update({
380
+ where: { id: teamId },
381
+ data: {
382
+ credits: { increment: credits },
383
+ },
384
+ });
385
+ console.log(`[Webhook] Added ${credits} credits to team ${teamId}`);
386
+ }
387
+ else if (userId) {
388
+ await db.user.update({
389
+ where: { id: userId },
390
+ data: {
391
+ credits: { increment: credits },
392
+ },
393
+ });
394
+ console.log(`[Webhook] Added ${credits} credits to user ${userId}`);
395
+ }
396
+ }
397
+ break;
398
+ }
399
+ case 'customer.subscription.deleted': {
400
+ const subscription = event.data.object;
401
+ const customerId = subscription.customer;
402
+ // Check if this is a team or user customer
403
+ const team = await db.team.findFirst({
404
+ where: { stripeCustomerId: customerId },
405
+ });
406
+ if (team) {
407
+ await db.team.update({
408
+ where: { id: team.id },
409
+ data: { plan: 'free' },
410
+ });
411
+ console.log(`[Webhook] Team ${team.id} subscription cancelled, reverted to free`);
412
+ }
413
+ else {
414
+ const user = await db.user.findFirst({
415
+ where: { stripeCustomerId: customerId },
416
+ });
417
+ if (user) {
418
+ await db.user.update({
419
+ where: { id: user.id },
420
+ data: { plan: 'free' },
421
+ });
422
+ console.log(`[Webhook] User ${user.id} subscription cancelled, reverted to free`);
423
+ }
424
+ }
425
+ break;
426
+ }
427
+ case 'customer.subscription.updated': {
428
+ const subscription = event.data.object;
429
+ const customerId = subscription.customer;
430
+ // Handle plan changes
431
+ if (subscription.status === 'active') {
432
+ const planId = subscription.metadata?.planId;
433
+ // Check if this is a team or user customer
434
+ const team = await db.team.findFirst({
435
+ where: { stripeCustomerId: customerId },
436
+ });
437
+ if (team && planId) {
438
+ await db.team.update({
439
+ where: { id: team.id },
440
+ data: { plan: planId },
441
+ });
442
+ console.log(`[Webhook] Team ${team.id} plan updated to ${planId}`);
443
+ }
444
+ else {
445
+ const user = await db.user.findFirst({
446
+ where: { stripeCustomerId: customerId },
447
+ });
448
+ if (user && planId) {
449
+ await db.user.update({
450
+ where: { id: user.id },
451
+ data: { plan: planId },
452
+ });
453
+ console.log(`[Webhook] User ${user.id} plan updated to ${planId}`);
454
+ }
455
+ }
456
+ }
457
+ break;
458
+ }
459
+ case 'invoice.payment_failed': {
460
+ const invoice = event.data.object;
461
+ console.error('Payment failed for customer:', invoice.customer);
462
+ // TODO: Send notification email
463
+ break;
464
+ }
465
+ }
466
+ res.json({ received: true });
467
+ }
468
+ catch (error) {
469
+ console.error('Webhook handler error:', error);
470
+ res.status(500).json({ error: 'Webhook handler failed' });
471
+ }
472
+ });
473
+ //# sourceMappingURL=payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/api/payments.ts"],"names":[],"mappings":"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"}