diff --git a/src/modules/workspace/schedulers/weekly-digest.scheduler.ts b/src/modules/workspace/schedulers/weekly-digest.scheduler.ts index f68f2760f..a164eaff3 100644 --- a/src/modules/workspace/schedulers/weekly-digest.scheduler.ts +++ b/src/modules/workspace/schedulers/weekly-digest.scheduler.ts @@ -1,19 +1,31 @@ import { Injectable, Logger } from "@nestjs/common"; import { Cron, CronExpression } from "@nestjs/schedule"; import { WeeklyDigestService } from "../services/weekly-digest.service"; +import { ConfigService } from "@nestjs/config"; @Injectable() export class WeeklyDigestScheduler { private readonly logger = new Logger(WeeklyDigestScheduler.name); - constructor(private readonly weeklyDigestService: WeeklyDigestService) {} + constructor( + private readonly weeklyDigestService: WeeklyDigestService, + private readonly configService: ConfigService, + ) {} - // Disabled until we are sure it works correctly and doesn't cause issues with the database load. We can enable it later once we have confidence in its stability. - @Cron(CronExpression.EVERY_10_MINUTES, { + // Runs every Monday at 8:00 AM + @Cron("0 8 * * 1", { name: "weekly-digest", + timeZone: "Asia/Kolkata", waitForCompletion: true, }) async handleWeeklyDigest() { + const env = this.configService.get("APP_ENV")?.toUpperCase(); + + if (env !== "PROD") { + this.logger.log(`Skipping Weekly Digest Job in ${env} environment`); + return; + } + this.logger.log("Starting Weekly Digest Job..."); try { diff --git a/src/modules/workspace/services/weekly-digest.service.ts b/src/modules/workspace/services/weekly-digest.service.ts index dd8942923..da4ba6a1f 100644 --- a/src/modules/workspace/services/weekly-digest.service.ts +++ b/src/modules/workspace/services/weekly-digest.service.ts @@ -82,14 +82,7 @@ export class WeeklyDigestService { const qaDigestEmail = WeeklyDigestService.QA_DIGEST_EMAIL; - // Time range for the digest (last 1 min for testing, or use getLastWeekRange() for production) - // const end = new Date(); - // const start = new Date(end.getTime() - 1 * 60 * 1000); - // const prevEnd = new Date(start); - // const prevStart = new Date(prevEnd.getTime() - 1 * 60 * 1000); - - const end = new Date(); - const start = this.userMetricsRepository.getWeekStart(end); + const { start, end } = this.getLastWeekRange(); const { start: prevStart, end: prevEnd } = this.getPreviousWeekRange(); // Note: per-user execution trends are computed per-batch below using daily metrics @@ -373,23 +366,7 @@ export class WeeklyDigestService { const marketingBaseUrl = this.configService.get("MARKETING_BASE_URL") || "https://sparrowapp.dev"; - const env = this.configService.get("APP_ENV")?.toUpperCase(); - const isDev = env === "DEV"; - - let users = Array.from(userEmailDataMap.values()); - - if (isDev) { - const qaUser = users.find( - (u) => u.user.email === WeeklyDigestService.QA_DIGEST_EMAIL, - ); - - if (!qaUser) { - this.logger.warn("QA user not found, skipping email in DEV"); - return; // stop execution - } - - users = [qaUser]; - } + const users = Array.from(userEmailDataMap.values()); // Process emails with controlled concurrency using a promise pool await this.processWithConcurrency( @@ -407,12 +384,8 @@ export class WeeklyDigestService { }; const unsubscribeLink = `${appUrl}/api/user/unsubscribe-weekly-digest?userId=${user._id}`; - const env = this.configService.get("APP_ENV")?.toUpperCase(); - const isDev = env === "DEV"; - const recipientEmail = isDev - ? WeeklyDigestService.QA_DIGEST_EMAIL - : user.email; + const recipientEmail = user.email; const mailOptions = { from: senderEmail,