Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions src/modules/workspace/schedulers/weekly-digest.scheduler.ts
Original file line number Diff line number Diff line change
@@ -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<string>("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 {
Expand Down
33 changes: 3 additions & 30 deletions src/modules/workspace/services/weekly-digest.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -373,23 +366,7 @@ export class WeeklyDigestService {
const marketingBaseUrl =
this.configService.get("MARKETING_BASE_URL") || "https://sparrowapp.dev";

const env = this.configService.get<string>("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(
Expand All @@ -407,12 +384,8 @@ export class WeeklyDigestService {
};

const unsubscribeLink = `${appUrl}/api/user/unsubscribe-weekly-digest?userId=${user._id}`;
const env = this.configService.get<string>("APP_ENV")?.toUpperCase();
const isDev = env === "DEV";

const recipientEmail = isDev
? WeeklyDigestService.QA_DIGEST_EMAIL
: user.email;
const recipientEmail = user.email;

const mailOptions = {
from: senderEmail,
Expand Down
Loading