Initial commit: Angular frontend and Expressjs backend
This commit is contained in:
70
worklenz-backend/src/cron_jobs/project-digest-job.ts
Normal file
70
worklenz-backend/src/cron_jobs/project-digest-job.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import {CronJob} from "cron";
|
||||
import db from "../config/db";
|
||||
import {log_error} from "../shared/utils";
|
||||
import {getBaseUrl} from "./helpers";
|
||||
import {IProjectDigest, IProjectDigestTask} from "../interfaces/project-digest";
|
||||
import {sendProjectDailyDigest} from "../shared/email-notifications";
|
||||
|
||||
// At 11:00+00 (4.30pm+530) on every day-of-month if it's on every day-of-week from Monday through Friday.
|
||||
const TIME = "0 11 */1 * 1-5";
|
||||
// const TIME = "* * * * *";
|
||||
|
||||
const log = (value: any) => console.log("project-digest-cron-job:", value);
|
||||
|
||||
function updateTaskUrls(projectId: string, tasks: IProjectDigestTask[]) {
|
||||
const baseUrl = getBaseUrl();
|
||||
for (const task of tasks) {
|
||||
task.url = `${baseUrl}/worklenz/projects/${projectId}?tab=tasks-list&task=${task.id}`;
|
||||
}
|
||||
}
|
||||
|
||||
function updateMetadata(project: IProjectDigest, subscriberName: string) {
|
||||
project.greeting = `Hi ${subscriberName},`;
|
||||
project.summary = `Here's the "${project.name}" summary | ${project.team_name}`;
|
||||
project.settings_url = `${getBaseUrl()}/worklenz/settings/notifications`;
|
||||
project.project_url = `${getBaseUrl()}/worklenz/projects/${project.id}?tab=tasks-list`;
|
||||
}
|
||||
|
||||
async function onProjectDigestJobTick() {
|
||||
try {
|
||||
log("(cron) Daily digest job started.");
|
||||
const q = "SELECT get_project_daily_digest() AS digest;";
|
||||
const result = await db.query(q, []);
|
||||
const [fn] = result.rows;
|
||||
|
||||
const dataset: IProjectDigest[] = fn.digest || [];
|
||||
|
||||
let sentCount = 0;
|
||||
|
||||
for (const project of dataset) {
|
||||
for (const subscriber of project.subscribers) {
|
||||
updateMetadata(project, subscriber.name);
|
||||
|
||||
updateTaskUrls(project.id, project.today_completed);
|
||||
updateTaskUrls(project.id, project.today_new);
|
||||
updateTaskUrls(project.id, project.due_tomorrow);
|
||||
|
||||
if (subscriber.email) {
|
||||
sentCount++;
|
||||
void sendProjectDailyDigest(subscriber.email, project);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log(`(cron) Project digest job ended with ${sentCount} emails.`);
|
||||
} catch (error) {
|
||||
log_error(error);
|
||||
log("(cron) Project digest job ended with errors.");
|
||||
}
|
||||
}
|
||||
|
||||
export function startProjectDigestJob() {
|
||||
log("(cron) Project digest job ready.");
|
||||
const job = new CronJob(
|
||||
TIME,
|
||||
() => void onProjectDigestJobTick(),
|
||||
() => log("(cron) Project Digest job successfully executed."),
|
||||
true
|
||||
);
|
||||
job.start();
|
||||
}
|
||||
Reference in New Issue
Block a user