core/source/logic/notification_kinds/email.ts
Christian Fraß cf9c4f009d [mod] source
2023-07-27 17:37:45 +02:00

156 lines
3 KiB
TypeScript

namespace _heimdall.notification_kinds.email
{
/**
*/
function parameters_schema(
) : _heimdall.helpers.json_schema.type_schema
{
return {
"type": "object",
"additionalProperties": false,
"properties": {
"access": {
"type": "object",
"additionalProperties": false,
"properties": {
"host": {
"type": "string"
},
"port": {
"type": "integer"
},
"username": {
"type": "string"
},
"password": {
"type": "string"
}
},
"required": [
"host",
"port",
"username",
"password"
]
},
"sender": {
"type": "string"
},
"receivers": {
"type": "array",
"items": {
"type": "string"
}
},
"tags": {
"description": "list of strings, which will be placed in the e-mail subject",
"type": "array",
"items": {
"type": "string"
},
"default": []
}
},
"required": [
"access",
"sender",
"receivers"
]
};
}
/**
*/
function normalize_order_node(
node : any
) : any
{
return Object.assign(
{
},
node
);
}
/**
*/
async function notify(
parameters : any,
name : string,
check : type_check,
state : type_item_state,
info : any
) : Promise<void>
{
const nm_nodemailer = require("nodemailer");
// datetime = _datetime.datetime.utcnow()
const now : Date = new Date(Date.now());
const transporter = nm_nodemailer.createTransport(
{
"host": parameters.access.host,
"port": parameters.access.port,
"secure": true,
"auth": {
"user": parameters.access.username,
"pass": parameters.access.password,
}
}
);
const send_result = await transporter.sendMail(
{
"from": parameters.sender,
"to": parameters.receivers.join(","),
"subject": lib_plankton.string.coin(
"{{tags}} {{title}}",
{
"tags": (
parameters.tags
.concat([_heimdall.condition_show(state.condition)])
.map(tag => lib_plankton.string.coin("[{{tag}}]", tag.toUpperCase()))
.join(" ")
),
"title": check.name,
}
),
"text": JSON.stringify(info, undefined, "\t"),
"headers": {
"Date": lib_plankton.string.coin(
"{{day_of_week}}, {{day_of_month}} {{month}} {{year}} {{hour}}:{{minute}}:{{second}} {{time_offset}}",
{
"day_of_week": now.getDay().toFixed(0),
"day_of_month": now.getDate().toFixed(0),
"month": (now.getMonth() + 1).toFixed(0),
"year": now.getFullYear().toFixed(0),
"hour": now.getHours().toFixed(0),
"minute": now.getMinutes().toFixed(0),
"second": now.getSeconds().toFixed(0),
// "time_offset": (now.getTimezoneOffset() / 60).toFixed(0),
"time_offset": "+0000",
}
),
}
}
);
return Promise.resolve<void>(undefined);
}
/**
*/
export function notification_kind_implementation(
) : type_notification_kind
{
return {
"parameters_schema": parameters_schema,
"normalize_order_node": normalize_order_node,
"notify": notify,
};
}
}