import * as os from 'os'; import { FormatOptions, millisTo, prettyPrintJson, removeHTML } from 'af-tools-ts'; import { TAlert, TAlertEmailDetails } from '../i-alert'; export const htmlTemplate = ` <%title%> <%body%> `; export interface TFillHtmlTemplateArgs { title?: string, body?: string } export const fillHtmlTemplate = (args: TFillHtmlTemplateArgs): string => { let text = htmlTemplate; ['title', 'body'].forEach((n) => { text = text.replace(`<%${n}%>`, args[n as keyof TFillHtmlTemplateArgs] || ''); }); return text; }; export const jsonToHtml = (json: any): string => { const prettyPrintJsonOptions: FormatOptions = { linkUrls: true, indent: 2 }; return `
${prettyPrintJson.toHtml(json, prettyPrintJsonOptions)}\n
`; }; const rSpace = (str: string, strLength: number) => { str = removeHTML(String(str || '')); if (str.length < strLength) { return ' '.repeat(Math.min(Math.max(0, strLength - str.length), 10000)); } return ''; }; export const alertEmailDetails = (options: { detailsArray: TAlertEmailDetails, wrapPre?: boolean, indent?: string, prefix?: string }): string => { const { detailsArray, wrapPre = false, indent = '', prefix = '' } = options; const padLen = Math.max(...detailsArray.map(([label]) => removeHTML(label).length)) + 2; const details = detailsArray.map(([label, text]) => indent + prefix + label + rSpace(label, padLen) + text).join('\n'); return wrapPre ? `
${details}
` : details; }; export const alertEmailHeader = (args: { alert: TAlert, wrapPre?: boolean, indent?: string, prefix?: string }): string => { const { alert, wrapPre = false, indent = '', prefix = '# ' } = args; const { eventName } = alert; const detailsArray: TAlertEmailDetails = [[millisTo.human.utc.z(alert.ts), `Event: [${eventName}]`]]; let header = alertEmailDetails({ detailsArray, indent, prefix }); header = `${header}`; return wrapPre ? `
${header}
` : header; }; const THIS_HOST_NAME = os.hostname(); const COMMON_LINK_PART = `/alerts?clue=1,100,ts,1$f:ts=null;createdAt=null;tsFrom=null;tsTo=null`; const getTypedAlertsLink = (linkBase: string, alertTypeId: number) => `${linkBase}${COMMON_LINK_PART};alertTypeId=${alertTypeId}`; const getCertainAlertsLink = (linkBase: string, alertGUID: string) => `${linkBase}${COMMON_LINK_PART};guid=${alertGUID}`; export const alertEmailFooter = (args: { alert: TAlert, wrapPre?: boolean, indent?: string, prefix?: string, linkBase?: string, }): string => { const { alert, wrapPre = false, indent = '', prefix = '# ', linkBase } = args; const { hashTags = [], guid, alertTypeId = 0 } = alert; const detailsArray: TAlertEmailDetails = []; if (linkBase) { detailsArray.push(['Signal URL', getCertainAlertsLink(linkBase, guid)]); } detailsArray.push(['Service host', THIS_HOST_NAME], ...hashTags.map((tag) => [tag, '']) as TAlertEmailDetails); if (linkBase) { detailsArray.push([`Alerts of type`, getTypedAlertsLink(linkBase, alertTypeId)]); } let footer = alertEmailDetails({ detailsArray, indent, prefix }); footer = `${footer}`; return wrapPre ? `
${footer}
` : footer; };