Skip to content

Commit c054430

Browse files
committed
update: handle automatic query updates better
1 parent 12cbb82 commit c054430

File tree

3 files changed

+88
-6
lines changed

3 files changed

+88
-6
lines changed

src/app/api/cron-process-query/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ async function processQueryDirectly(query: any) {
623623
// Get user's subscription and current usage
624624
const { data: subscription, error: subError } = await supabase
625625
.from('user_subscriptions')
626-
.select('query_count, status, price_id')
626+
.select('query_count, status, price_id, payg_credits')
627627
.eq('user_id', query.user_id)
628628
.single();
629629

@@ -673,7 +673,7 @@ async function processQueryDirectly(query: any) {
673673
});
674674

675675
// Check if user has enough credits
676-
if (currentUsage + creditsRequired > userConstraints.max_credits) {
676+
if (currentUsage + creditsRequired > userConstraints.max_credits && subscription.payg_credits === 0) {
677677
console.warn(`⚠️ User ${query.user_id} has insufficient credits. Pausing query ${query.id}`);
678678

679679
// Track insufficient credits event
@@ -712,7 +712,7 @@ async function processQueryDirectly(query: any) {
712712
}
713713

714714
// Check if subscription is active
715-
if (subscription.status !== 'active') {
715+
if (subscription.status !== 'active' && subscription.payg_credits === 0) {
716716
console.warn(`⚠️ User ${query.user_id} subscription is not active (${subscription.status}). Pausing query ${query.id}`);
717717

718718
// Track inactive subscription event

src/app/api/schedule-query/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ async function processQuery(
691691
// Get user's subscription and current usage
692692
const { data: subscription, error: subError } = await supabase
693693
.from('user_subscriptions')
694-
.select('query_count, status, price_id')
694+
.select('query_count, status, price_id, payg_credits')
695695
.eq('user_id', query.user_id)
696696
.single();
697697

@@ -763,7 +763,7 @@ async function processQuery(
763763
});
764764

765765
// Check if user has enough credits
766-
if (currentUsage + creditsRequired > userConstraints.max_credits) {
766+
if (currentUsage + creditsRequired > userConstraints.max_credits && subscription.payg_credits === 0) {
767767
console.warn(`⚠️ User ${query.user_id} has insufficient credits for query ${query.id}`);
768768
sentryServer.logger.warn(`User ${query.user_id} has insufficient credits for query ${query.id}`, {
769769
log_source: 'schedule_query',
@@ -789,7 +789,7 @@ async function processQuery(
789789
}
790790

791791
// Check if subscription is active
792-
if (subscription.status !== 'active') {
792+
if (subscription.status !== 'active' && subscription.payg_credits === 0) {
793793
console.warn(`⚠️ User ${query.user_id} subscription is not active (${subscription.status}) for query ${query.id}`);
794794
sentryServer.logger.warn(`User ${query.user_id} subscription is not active (${subscription.status}) for query ${query.id}`, {
795795
log_source: 'schedule_query',

src/app/api/stripe/webhook/route.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,58 @@ export async function POST(request: Request) {
5555
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
5656
);
5757

58+
// Function to reactivate paused queries when user gets more credits
59+
async function reactivatePausedQueries(userId: string, reason: string) {
60+
try {
61+
console.log(`🔄 Checking for paused queries to reactivate for user ${userId} (${reason})`);
62+
63+
// Find all paused queries for this user
64+
const { data: pausedQueries, error: fetchError } = await supabase
65+
.from('scheduled_queries')
66+
.select('id, query, user_id')
67+
.eq('user_id', userId)
68+
.eq('status', 'paused');
69+
70+
if (fetchError) {
71+
console.error('❌ Error fetching paused queries:', fetchError);
72+
return;
73+
}
74+
75+
if (!pausedQueries || pausedQueries.length === 0) {
76+
console.log(`✅ No paused queries found for user ${userId}`);
77+
return;
78+
}
79+
80+
console.log(`🔄 Found ${pausedQueries.length} paused queries to reactivate for user ${userId}`);
81+
82+
// Reactivate all paused queries
83+
const { error: reactivateError } = await supabase
84+
.from('scheduled_queries')
85+
.update({
86+
status: 'active',
87+
next_analysis_at: new Date(Date.now() + 2 * 60 * 1000).toISOString(), // Run in 2 minutes
88+
updated_at: new Date().toISOString()
89+
})
90+
.eq('user_id', userId)
91+
.eq('status', 'paused');
92+
93+
if (reactivateError) {
94+
console.error('❌ Error reactivating paused queries:', reactivateError);
95+
return;
96+
}
97+
98+
console.log(`✅ Successfully reactivated ${pausedQueries.length} queries for user ${userId} (${reason})`);
99+
100+
// Log each reactivated query for debugging
101+
pausedQueries.forEach(query => {
102+
console.log(` 📝 Reactivated query: "${query.query}" (ID: ${query.id})`);
103+
});
104+
105+
} catch (error) {
106+
console.error('❌ Exception in reactivatePausedQueries:', error);
107+
}
108+
}
109+
58110
// Handle the event
59111
switch (event.type) {
60112
case 'checkout.session.completed': {
@@ -92,6 +144,9 @@ export async function POST(request: Request) {
92144
if (transactionError) {
93145
console.error('Error updating transaction status:', transactionError);
94146
}
147+
148+
// Reactivate any paused queries since user now has credits
149+
await reactivatePausedQueries(userId, 'PAYG credits added');
95150
} else {
96151
console.error('Error adding pay-as-you-go credits:', result.error);
97152

@@ -151,6 +206,9 @@ export async function POST(request: Request) {
151206
}
152207

153208
console.log('Subscription saved to database');
209+
210+
// Reactivate any paused queries since user now has active subscription
211+
await reactivatePausedQueries(userId, 'New subscription created');
154212
}
155213
}
156214
break;
@@ -183,6 +241,18 @@ export async function POST(request: Request) {
183241
{ status: 500 }
184242
);
185243
}
244+
245+
// Get user_id to reactivate paused queries
246+
const { data: userSubscription } = await supabase
247+
.from('user_subscriptions')
248+
.select('user_id')
249+
.eq('stripe_subscription_id', subscriptionId)
250+
.single();
251+
252+
if (userSubscription?.user_id) {
253+
// Reactivate any paused queries since subscription payment succeeded
254+
await reactivatePausedQueries(userSubscription.user_id, 'Subscription payment succeeded');
255+
}
186256
} catch (error) {
187257
console.error('Error retrieving subscription:', error);
188258
return NextResponse.json(
@@ -215,6 +285,18 @@ export async function POST(request: Request) {
215285
{ status: 500 }
216286
);
217287
}
288+
289+
// Get user_id to reactivate paused queries if subscription became active
290+
const { data: userSubscription } = await supabase
291+
.from('user_subscriptions')
292+
.select('user_id')
293+
.eq('stripe_subscription_id', subscription.id)
294+
.single();
295+
296+
if (userSubscription?.user_id && subscription.status === 'active') {
297+
// Reactivate any paused queries since subscription is now active
298+
await reactivatePausedQueries(userSubscription.user_id, 'Subscription updated to active');
299+
}
218300
break;
219301
}
220302
case 'customer.subscription.deleted': {

0 commit comments

Comments
 (0)