UNPKG

@flowfuse/flowfuse

Version:

An open source low-code development platform

79 lines (76 loc) 3.92 kB
const { Op } = require('sequelize') const { Roles } = require('../../../lib/roles') module.exports = { init: function (app) { if (app.postoffice.enabled) { app.config.features.register('emailAlerts', true, true) app.auditLog.alerts = {} app.auditLog.alerts.generate = async function (projectId, event, data) { if (app.postoffice.enabled) { const project = await app.db.models.Project.byId(projectId) const settings = await app.db.controllers.Project.getRuntimeSettings(project) const teamType = await app.db.models.TeamType.byId(project.Team.TeamTypeId) const emailAlerts = settings.emailAlerts let template if (emailAlerts?.crash && event === 'crashed') { const templateName = ['Crashed'] const hasLogs = data?.log?.length > 0 let uncaughtException = false let outOfMemory = false if (hasLogs) { uncaughtException = data.exitCode > 0 && data.log.some(log => { const lcMsg = log.msg?.toLowerCase() || '' return lcMsg.includes('uncaughtexception') || log.msg.includes('uncaught exception') }) outOfMemory = data.exitCode > 127 && data.log.some(log => { const lcMsg = log.msg?.toLowerCase() || '' return lcMsg.includes('heap out of memory') || lcMsg.includes('v8::internal::heap::') }) } if (outOfMemory) { templateName.push('out-of-memory') } else if (uncaughtException) { templateName.push('uncaught-exception') } template = templateName.join('-') } else if (emailAlerts?.safe && event === 'safe-mode') { template = 'SafeMode' } else if (emailAlerts?.resource?.cpu && event === 'resource.cpu') { template = 'InstanceResourceCPUExceeded' } else if (emailAlerts?.resource?.memory && event === 'resource.memory') { template = 'InstanceResourceMemoryExceeded' } if (!template || !teamType.getFeatureProperty('emailAlerts', false)) { return } const where = { TeamId: project.Team.id } switch (emailAlerts.recipients) { case 'both': where.role = { [Op.or]: [ Roles.Member, Roles.Owner ] } break case 'members': where.role = Roles.Member break case 'owners': where.role = Roles.Owner break } const users = (await app.db.models.TeamMember.findAll({ where, include: app.db.models.User })).map(tm => tm.User) const teamName = project.Team?.name || '' if (users.length > 0) { users.forEach(user => { app.postoffice.send(user, template, { ...data, name: project.name, teamName, url: `${app.config.base_url}/instance/${project.id}` }) }) } } } } } }