1export const dynamic = "force-dynamic"2import type { NextRequest } from 'next/server';3import { adminDb } from '@/src/lib/firebase/admin';4import { getFirestore, QuerySnapshot } from 'firebase-admin/firestore';5 6export function GET(request: NextRequest) {7 console.log('🤖 Cron job started:', new Date().toISOString());8 9 const authHeader = request.headers.get('authorization');10// if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) {11// return new Response('Unauthorized', {12// status: 401,13// });14// } 1516 checkAndCompleteExpiredTasks();17 console.log('✅ Cron job completed:', new Date().toISOString());18 return Response.json({ success: true });19}2021async function checkAndCompleteExpiredTasks() {22 try {23 const now = new Date().toISOString();24 console.log('📅 Checking for expired tasks at:', now);25 26 const tasksRef = adminDb.collection('agent_tasks');27 console.log('📚 Collection reference created');28 let snapshot;29 try {30 snapshot = await tasksRef.where('status', '==', 'created').get();31 console.log("Query executed, snapshot size:", snapshot.size);32 } catch (error) {33 console.error('Error fetching tasks:', error);34 }35 console.log("Query executed, snapshot size:", snapshot?.size)36 37 let expiredTasks: Object[] = [];38 snapshot?.forEach(doc => {39 const data = doc.data();40 if (data.taskFinishTime <= now) {41 expiredTasks.push({42 id: doc.id,43 ...data44 });45 console.log("Found expired task:", doc.id);46 }47 })4849 console.log("🔍 Found", expiredTasks.length, "expired tasks");50 if (expiredTasks.length > 0) {51 const completionPromises = expiredTasks.map(async (task: any) => {52 const taskId = task.id;53 console.log(`⚡ Processing task ${taskId}`);54 55 try {56 const response = await fetch(57 `${process.env.NEXT_PUBLIC_APP_URL}/api/agents/tasks/${taskId}/complete`,58 {59 method: 'POST',60 headers: {61 'Content-Type': 'application/json',62 // Add any necessary authentication headers63 }64 }65 );6667 if (!response.ok) {68 console.error(`❌ Failed to complete task ${taskId}: ${response.statusText}`);69 throw new Error(`Failed to complete task ${taskId}: ${response.statusText}`);70 }7172 console.log(`✅ Successfully completed task ${taskId}`);73 } catch (error) {74 console.error(`❌ Error completing task ${taskId}:`, error);75 }76 });77 }78 console.log('🏁 Finished processing all expired tasks');79 80 } catch (error) {81 console.error('💥 Detailed error in checkAndCompleteExpiredTasks:', {82 message: (error as Error).message,83 code: (error as any).code,84 stack: (error as Error).stack85 });86 throw error;87 }88}
This code i use in nextjs and it's accessible at /api/cron
I have this code, and it works everywhere fins, but not on Vercel. There is no any error, code just stopping execution seems on query to firebase.
Last console log message i see: console.log('📚 Collection reference created');
And this code does not work because I don't see the next log.
1const snapshot = await tasksRef2 .where('status', '==', 'created')3 .get()
On all other routes, even in Vercel, Firebase works fine.