Files
worklenz/worklenz-backend/src/shared/email-notifications.ts

123 lines
3.6 KiB
TypeScript

import {compileTemplate} from "pug";
import db from "../config/db";
import {IDailyDigest} from "../interfaces/daily-digest";
import {IEmailTemplateType} from "../interfaces/email-template-type";
import {ITaskAssignmentsModel} from "../interfaces/task-assignments-model";
import {sendEmail} from "./email";
import FileConstants from "./file-constants";
import {log_error} from "./utils";
import {ITaskMovedToDoneRecord} from "../interfaces/task-moved-to-done";
import {IProjectDigest} from "../interfaces/project-digest";
import {ICommentEmailNotification, IProjectCommentEmailNotification} from "../interfaces/comment-email-notification";
async function updateTaskUpdatesStatus(isSent: boolean) {
try {
const q = isSent
? "DELETE FROM task_updates WHERE is_sent IS TRUE;"
: "UPDATE task_updates SET is_sent = FALSE;";
await db.query(q, []);
} catch (error) {
log_error(error);
}
}
async function addToEmailLogs(email: string, subject: string, html: string) {
try {
const q = `INSERT INTO email_logs (email, subject, html) VALUES ($1, $2, $3);`;
await db.query(q, [email, subject, html]);
} catch (error) {
log_error(error);
}
}
export async function sendAssignmentUpdate(toEmail: string, assignment: ITaskAssignmentsModel) {
try {
const template = FileConstants.getEmailTemplate(IEmailTemplateType.TaskAssigneeChange) as compileTemplate;
const isSent = assignment.teams?.length
? await sendEmail({
subject: "You have new assignments on Worklenz",
to: [toEmail],
html: template(assignment)
})
: true;
await updateTaskUpdatesStatus(!!isSent);
addToEmailLogs(toEmail, "You have new assignments on Worklenz", template(assignment));
} catch (e) {
log_error(e);
await updateTaskUpdatesStatus(false);
}
}
export async function sendDailyDigest(toEmail: string, digest: IDailyDigest) {
try {
const template = FileConstants.getEmailTemplate(IEmailTemplateType.DailyDigest) as compileTemplate;
await sendEmail({
subject: digest.note as string,
to: [toEmail],
html: template(digest)
});
} catch (e) {
log_error(e);
}
}
export async function sendTaskDone(toEmails: string[], data: ITaskMovedToDoneRecord) {
try {
const template = FileConstants.getEmailTemplate(IEmailTemplateType.TaskDone) as compileTemplate;
await sendEmail({
subject: data.summary,
to: toEmails,
html: template(data)
});
} catch (e) {
log_error(e);
}
}
export async function sendProjectDailyDigest(toEmail: string, digest: IProjectDigest) {
try {
const template = FileConstants.getEmailTemplate(IEmailTemplateType.ProjectDailyDigest) as compileTemplate;
await sendEmail({
subject: digest.summary,
to: [toEmail],
html: template(digest)
});
} catch (e) {
log_error(e);
}
}
export async function sendTaskComment(toEmail: string, data: ICommentEmailNotification) {
try {
const template = FileConstants.getEmailTemplate(IEmailTemplateType.TaskComment) as compileTemplate;
return await sendEmail({
subject: data.summary,
to: [toEmail],
html: template(data)
});
} catch (e) {
log_error(e);
}
return null;
}
export async function sendProjectComment(toEmail: string, data: IProjectCommentEmailNotification) {
try {
const template = FileConstants.getEmailTemplate(IEmailTemplateType.ProjectComment) as compileTemplate;
return await sendEmail({
subject: data.summary,
to: [toEmail],
html: template(data)
});
} catch (e) {
log_error(e);
}
return null;
}