salix/print/core/email.js

100 lines
3.2 KiB
JavaScript
Raw Normal View History

2019-10-29 06:46:44 +00:00
const path = require('path');
2019-01-22 08:55:35 +00:00
const smtp = require('./smtp');
2019-10-29 06:46:44 +00:00
const Component = require('./component');
const Report = require('./report');
2024-06-19 12:38:56 +00:00
const UserError = require('vn-loopback/util/user-error');
2019-01-22 08:55:35 +00:00
if (!process.env.OPENSSL_CONF)
process.env.OPENSSL_CONF = '/etc/ssl/';
2019-10-29 06:46:44 +00:00
class Email extends Component {
constructor(name, args) {
super(name);
this.args = args;
}
get path() {
return `../templates/email/${this.name}`;
}
2019-10-31 11:43:04 +00:00
async getSubject() {
return (await this.getUserLocale())['subject'];
2019-10-31 11:43:04 +00:00
}
/**
* @param {Object} [options] - Additional options
* @param {Boolean} [options.overrideAttachments] - Overrides default PDF attachments
* @param {Array} [options.attachments] - Array containing attachment objects
* @return {Promise} SMTP Promise
*/
async send(options = {}) {
2019-10-29 06:46:44 +00:00
const instance = this.build();
const rendered = await this.render();
const attachments = [];
const getAttachments = async(componentPath, files) => {
2022-11-10 10:51:14 +00:00
for (const file of files) {
2019-10-29 06:46:44 +00:00
const fileCopy = Object.assign({}, file);
const fileName = fileCopy.filename;
if (options.overrideAttachments && !fileName.includes('.png')) continue;
2019-10-29 06:46:44 +00:00
if (fileCopy.cid) {
const templatePath = `${componentPath}/${file.path}`;
const fullFilePath = path.resolve(__dirname, templatePath);
fileCopy.path = path.resolve(__dirname, fullFilePath);
} else {
const reportName = fileName.replace('.pdf', '');
2019-10-29 06:46:44 +00:00
const report = new Report(reportName, this.args);
fileCopy.content = await report.toPdfStream();
fileCopy.filename = await report.getFileName();
2019-10-29 06:46:44 +00:00
}
attachments.push(fileCopy);
}
};
2022-11-10 10:51:14 +00:00
async function getSubcomponentAttachments(instance) {
if (instance.components) {
const components = instance.components;
for (let componentName in components) {
const component = components[componentName];
const componentPath = `./components/${componentName}`;
await getAttachments(componentPath, component.attachments);
if (component.components)
2023-06-20 13:06:02 +00:00
await getSubcomponentAttachments(component);
2022-11-10 10:51:14 +00:00
}
2019-10-29 06:46:44 +00:00
}
}
2023-06-20 13:06:02 +00:00
await getSubcomponentAttachments(instance);
2022-11-10 10:51:14 +00:00
2019-10-29 06:46:44 +00:00
if (this.attachments)
await getAttachments(this.path, this.attachments);
if (options.attachments) {
for (let attachment of options.attachments)
attachments.push(attachment);
}
2019-10-31 11:43:04 +00:00
const localeSubject = await this.getSubject();
const mailOptions = {
2019-10-29 06:46:44 +00:00
to: this.args.recipient,
2022-09-19 10:59:32 +00:00
replyTo: this.args.replyTo || '',
2019-10-31 11:43:04 +00:00
subject: localeSubject,
2019-10-29 06:46:44 +00:00
html: rendered,
2023-06-20 13:06:02 +00:00
attachments: attachments,
force: options.force
2019-10-29 06:46:44 +00:00
};
2024-06-19 12:38:56 +00:00
try {
return await smtp.send(mailOptions);
} catch (error) {
throw new UserError('Cannot send mail');
}
2019-10-29 06:46:44 +00:00
}
}
module.exports = Email;