139 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
const log = require('npmlog');
 | 
						|
const fields = require('../models/fields');
 | 
						|
const settings = require('../models/settings');
 | 
						|
const {getTrustedUrl, getPublicUrl} = require('./urls');
 | 
						|
const { tUI, tMark } = require('./translate');
 | 
						|
const contextHelpers = require('./context-helpers');
 | 
						|
const {getFieldColumn, toNameTagLangauge} = require('../../shared/lists');
 | 
						|
const forms = require('../models/forms');
 | 
						|
const messageSender = require('./message-sender');
 | 
						|
const tools = require('./tools');
 | 
						|
 | 
						|
module.exports = {
 | 
						|
    sendAlreadySubscribed,
 | 
						|
    sendConfirmAddressChange,
 | 
						|
    sendConfirmSubscription,
 | 
						|
    sendConfirmUnsubscription,
 | 
						|
    sendSubscriptionConfirmed,
 | 
						|
    sendUnsubscriptionConfirmed
 | 
						|
};
 | 
						|
 | 
						|
async function sendSubscriptionConfirmed(locale, list, email, subscription) {
 | 
						|
    const relativeUrls = {
 | 
						|
        preferencesUrl: '/subscription/' + list.cid + '/manage/' + subscription.cid,
 | 
						|
        unsubscribeUrl: '/subscription/' + list.cid + '/unsubscribe/' + subscription.cid
 | 
						|
    };
 | 
						|
 | 
						|
    await _sendMail(list, email, 'subscription_confirmed', locale, tMark('subscriptionConfirmed'), relativeUrls, subscription);
 | 
						|
}
 | 
						|
 | 
						|
async function sendAlreadySubscribed(locale, list, email, subscription) {
 | 
						|
    const relativeUrls = {
 | 
						|
        preferencesUrl: '/subscription/' + list.cid + '/manage/' + subscription.cid,
 | 
						|
        unsubscribeUrl: '/subscription/' + list.cid + '/unsubscribe/' + subscription.cid
 | 
						|
    };
 | 
						|
    await _sendMail(list, email, 'already_subscribed', locale, tMark('listEmailAddressAlreadyRegistered'), relativeUrls, subscription);
 | 
						|
}
 | 
						|
 | 
						|
async function sendConfirmAddressChange(locale, list, email, cid, subscription) {
 | 
						|
    const relativeUrls = {
 | 
						|
        confirmUrl: '/subscription/confirm/change-address/' + cid
 | 
						|
    };
 | 
						|
    await _sendMail(list, email, 'confirm_address_change', locale, tMark('listPleaseConfirmEmailChangeIn'), relativeUrls, subscription);
 | 
						|
}
 | 
						|
 | 
						|
async function sendConfirmSubscription(locale, list, email, cid, subscription) {
 | 
						|
    const relativeUrls = {
 | 
						|
        confirmUrl: '/subscription/confirm/subscribe/' + cid
 | 
						|
    };
 | 
						|
    await _sendMail(list, email, 'confirm_subscription', locale, tMark('pleaseConfirmSubscription'), relativeUrls, subscription);
 | 
						|
}
 | 
						|
 | 
						|
async function sendConfirmUnsubscription(locale, list, email, cid, subscription) {
 | 
						|
    const relativeUrls = {
 | 
						|
        confirmUrl: '/subscription/confirm/unsubscribe/' + cid
 | 
						|
    };
 | 
						|
    await _sendMail(list, email, 'confirm_unsubscription', locale, tMark('listPleaseConfirmUnsubscription'), relativeUrls, subscription);
 | 
						|
}
 | 
						|
 | 
						|
async function sendUnsubscriptionConfirmed(locale, list, email, subscription) {
 | 
						|
    const relativeUrls = {
 | 
						|
        subscribeUrl: '/subscription/' + list.cid + '?cid=' + subscription.cid
 | 
						|
    };
 | 
						|
    await _sendMail(list, email, 'unsubscription_confirmed', locale, tMark('listUnsubscriptionConfirmed'), relativeUrls, subscription);
 | 
						|
}
 | 
						|
 | 
						|
async function _sendMail(list, email, template, locale, subjectKey, relativeUrls, subscription) {
 | 
						|
    subscription = {
 | 
						|
        ...subscription,
 | 
						|
        email
 | 
						|
    };
 | 
						|
 | 
						|
    const flds = await fields.listGrouped(contextHelpers.getAdminContext(), list.id);
 | 
						|
 | 
						|
    const encryptionKeys = [];
 | 
						|
    for (const fld of flds) {
 | 
						|
        if (fld.type === 'gpg' && fld.value) {
 | 
						|
            encryptionKeys.push(subscription[getFieldColumn(fld)].value.trim());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    const configItems = await settings.get(contextHelpers.getAdminContext(), ['defaultHomepage', 'adminEmail']);
 | 
						|
 | 
						|
    const data = {
 | 
						|
        title: list.name,
 | 
						|
        homepage: configItems.defaultHomepage || getTrustedUrl(),
 | 
						|
        contactAddress: list.contact_email || configItems.adminEmail,
 | 
						|
    };
 | 
						|
 | 
						|
    for (let relativeUrlKey in relativeUrls) {
 | 
						|
        data[relativeUrlKey] = getPublicUrl(relativeUrls[relativeUrlKey], {locale});
 | 
						|
    }
 | 
						|
 | 
						|
    const fsTemplate = template.replace(/_/g, '-');
 | 
						|
    const text = {
 | 
						|
        template: 'subscription/mail-' + fsTemplate + '-text.hbs'
 | 
						|
    };
 | 
						|
 | 
						|
    const html = {
 | 
						|
        template: 'subscription/mail-' + fsTemplate + '-html.mjml.hbs',
 | 
						|
        layout: 'subscription/layout.mjml.hbs',
 | 
						|
        type: 'mjml'
 | 
						|
    };
 | 
						|
 | 
						|
    if (list.default_form) {
 | 
						|
        const form = await forms.getById(contextHelpers.getAdminContext(), list.default_form, false);
 | 
						|
 | 
						|
        text.template = form['mail_' + template + '_text'] || text.template;
 | 
						|
        html.template = form['mail_' + template + '_html'] || html.template;
 | 
						|
        html.layout = form.layout || html.layout;
 | 
						|
    }
 | 
						|
 | 
						|
    try {
 | 
						|
        const mergeTags = fields.getMergeTags(flds, subscription);
 | 
						|
 | 
						|
        if (list.send_configuration) {
 | 
						|
            await messageSender.queueSubscriptionMessage(
 | 
						|
                list.send_configuration,
 | 
						|
                {
 | 
						|
                    name: list.to_name === null ? undefined : tools.formatTemplate(list.to_name, toNameTagLangauge, mergeTags, false),
 | 
						|
                    address: email
 | 
						|
                },
 | 
						|
                tUI(subjectKey, locale, { list: list.name }),
 | 
						|
                encryptionKeys,
 | 
						|
                {
 | 
						|
                    html,
 | 
						|
                    text,
 | 
						|
                    locale,
 | 
						|
                    data
 | 
						|
                }
 | 
						|
            );
 | 
						|
        } else {
 | 
						|
            log.warn('Subscription', `Not sending email for list id:${list.id} because not send configuration is set.`);
 | 
						|
        }
 | 
						|
    } catch (err) {
 | 
						|
        log.error('Subscription', err);
 | 
						|
    }
 | 
						|
}
 |