import { eq, and } from "drizzle-orm"; import { db } from "~/server/db"; import { reportSchedules } from "~/server/db/schema"; import { generateReport } from "~/server/services/reports.service"; interface ReportsGeneratePayload { userId: string; reportScheduleId?: string; reportType: string; } export async function handler(payload: ReportsGeneratePayload): Promise { const { userId, reportScheduleId, reportType } = payload; if (reportScheduleId) { const [schedule] = await db .select() .from(reportSchedules) .where(and(eq(reportSchedules.id, reportScheduleId), eq(reportSchedules.enabled, true))) .limit(1); if (!schedule) { console.warn(`[reports.generate] Schedule ${reportScheduleId} not found or disabled`); return; } await generateReport(userId, schedule.reportType as any, schedule.lastGeneratedAt?.toISOString()); } else { await generateReport(userId, reportType as any); } if (reportScheduleId) { await db .update(reportSchedules) .set({ lastGeneratedAt: new Date(), nextScheduledAt: calculateNextRun(reportType), updatedAt: new Date(), }) .where(eq(reportSchedules.id, reportScheduleId)); } console.log(`[reports.generate] Generated report for user ${userId}`); } function calculateNextRun(reportType: string): Date { const now = new Date(); switch (reportType) { case "WEEKLY_DIGEST": return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000); case "MONTHLY_PLUS": return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000); case "ANNUAL_PREMIUM": return new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000); default: return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000); } }