import RunCron from "../../Utils/Cron"; import { CallRequestMessage } from "Common/Types/Call/CallRequest"; import LIMIT_MAX from "Common/Types/Database/LimitMax"; import Dictionary from "Common/Types/Dictionary"; import { EmailEnvelope } from "Common/Types/Email/EmailMessage"; import EmailTemplateType from "Common/Types/Email/EmailTemplateType"; import NotificationSettingEventType from "Common/Types/NotificationSetting/NotificationSettingEventType"; import { SMSMessage } from "Common/Types/SMS/SMS"; import { EVERY_MINUTE } from "Common/Utils/CronTime"; import ProjectService from "Common/Server/Services/ProjectService"; import StatusPageService from "Common/Server/Services/StatusPageService"; import UserNotificationSettingService from "Common/Server/Services/UserNotificationSettingService"; import Markdown, { MarkdownContentType } from "Common/Server/Types/Markdown"; import StatusPage from "Common/Models/DatabaseModels/StatusPage"; import User from "Common/Models/DatabaseModels/User"; RunCron( "StatusPageOwner:SendCreatedResourceEmail", { schedule: EVERY_MINUTE, runOnStartup: false }, async () => { // get all scheduled events of all the projects. const statusPages: Array = await StatusPageService.findBy({ query: { isOwnerNotifiedOfResourceCreation: false, }, props: { isRoot: true, }, limit: LIMIT_MAX, skip: 0, select: { _id: true, name: true, description: true, projectId: true, project: { name: true, }, }, }); for (const statusPage of statusPages) { await StatusPageService.updateOneById({ id: statusPage.id!, data: { isOwnerNotifiedOfResourceCreation: true, }, props: { isRoot: true, }, }); // now find owners. let doesResourceHasOwners: boolean = true; let owners: Array = await StatusPageService.findOwners( statusPage.id!, ); if (owners.length === 0) { doesResourceHasOwners = false; // find project owners. owners = await ProjectService.getOwners(statusPage.projectId!); } if (owners.length === 0) { continue; } const vars: Dictionary = { statusPageName: statusPage.name!, projectName: statusPage.project!.name!, statusPageDescription: await Markdown.convertToHTML( statusPage.description! || "", MarkdownContentType.Email, ), statusPageViewLink: ( await StatusPageService.getStatusPageLinkInDashboard( statusPage.projectId!, statusPage.id!, ) ).toString(), }; if (doesResourceHasOwners === true) { vars["isOwner"] = "true"; } for (const user of owners) { const emailMessage: EmailEnvelope = { templateType: EmailTemplateType.StatusPageOwnerResourceCreated, vars: vars, subject: "[Status Page Created]" + statusPage.name!, }; const sms: SMSMessage = { message: `This is a message from OneUptime. New status page created - ${statusPage.name}. To unsubscribe from this notification go to User Settings in OneUptime Dashboard.`, }; const callMessage: CallRequestMessage = { data: [ { sayMessage: `This is a message from OneUptime. New status page created ${statusPage.name}. To unsubscribe from this notification go to User Settings in OneUptime Dashboard. Good bye.`, }, ], }; await UserNotificationSettingService.sendUserNotification({ userId: user.id!, projectId: statusPage.projectId!, emailEnvelope: emailMessage, smsMessage: sms, callRequestMessage: callMessage, eventType: NotificationSettingEventType.SEND_STATUS_PAGE_CREATED_OWNER_NOTIFICATION, }); } } }, );