fix: email resend language and password display issues
Mirror to GitHub / mirror (push) Successful in 22s
Test and Lint / backend-test (push) Successful in 1m4s
continuous-integration/drone/push Build is passing
Test and Lint / frontend-test (push) Successful in 2m9s
Version and Release / version-bump (push) Successful in 41s
Version and Release / trigger-drone (push) Successful in 3s

- Added missing translation for admin.activities.email_resent in both EN and DE
- Fixed language detection in resend email to use email processor's priority system
- Fixed password security message showing German text in English emails
- Updated email processor to handle password placeholder and format dates properly
- Dates are now formatted according to language and system settings
- Password security message now displays in the correct language based on recipient
This commit is contained in:
2025-07-16 17:30:11 +02:00
parent b20f9cc108
commit eb93223d79
4 changed files with 52 additions and 28 deletions
+22 -24
View File
@@ -578,41 +578,39 @@ router.post('/:id/resend-email', adminAuth, async (req, res) => {
return res.status(404).json({ error: 'Event not found' });
}
// Get the language preference
let language = 'en';
try {
// First check app_settings for general_default_language
const langSetting = await db('app_settings')
.where('setting_key', 'general_default_language')
.first();
if (langSetting && langSetting.setting_value) {
language = langSetting.setting_value;
}
} catch (err) {
console.warn('Could not fetch language setting:', err);
// The email processor will determine the language based on:
// 1. Event language setting
// 2. App settings general_default_language
// 3. Email config default language
// 4. Domain-based detection
// So we don't need to determine it here
// For resending creation email, we need the actual password
// First, try to get it from the request body if provided
let galleryPassword = req.body.password;
// If no password provided, we can't decrypt the existing one
// So we'll show a security message
if (!galleryPassword) {
// We'll let the email processor determine the language for the security message
galleryPassword = '{{password_security_message}}';
}
// Format dates based on language
// Format dates in a neutral format - the email processor will localize them
const eventDate = new Date(event.event_date);
const expiryDate = new Date(event.expires_at);
const dateLocale = language === 'de' ? 'de-DE' : 'en-US';
// Prepare password text based on language
const passwordText = language === 'de'
? '(Aus Sicherheitsgründen nicht angezeigt)'
: '(Not shown for security reasons)';
// Queue the email
await queueEmail(id, event.host_email, 'gallery_created', {
host_name: event.host_name || event.host_email.split('@')[0],
event_name: event.event_name,
event_date: eventDate.toLocaleDateString(dateLocale),
event_date: eventDate.toISOString().split('T')[0], // YYYY-MM-DD format
gallery_link: event.share_link,
gallery_password: passwordText,
expiry_date: expiryDate.toLocaleDateString(dateLocale),
gallery_password: galleryPassword,
expiry_date: expiryDate.toISOString().split('T')[0], // YYYY-MM-DD format
welcome_message: event.welcome_message || '',
eventId: id
eventId: id,
isResend: true // Flag to indicate this is a resend
});
// Log the activity using the proper schema
+28 -4
View File
@@ -109,6 +109,9 @@ async function getRecipientLanguage(email, eventId = null) {
// Process email template with variables
async function processTemplate(template, variables, language = 'en') {
// Import date formatter
const { formatDate } = require('../utils/dateFormatter');
// Get the appropriate language fields
const subjectField = language === 'de' ? 'subject_de' : 'subject_en';
const htmlField = language === 'de' ? 'body_html_de' : 'body_html_en';
@@ -118,6 +121,27 @@ async function processTemplate(template, variables, language = 'en') {
let subject = template[subjectField] || template.subject || '';
let htmlBody = template[htmlField] || template.body_html || '';
let textBody = template[textField] || template.body_text || '';
// Process variables before template compilation
const processedVariables = { ...variables };
// Handle password security message
if (processedVariables.gallery_password === '{{password_security_message}}') {
processedVariables.gallery_password = language === 'de'
? '(Aus Sicherheitsgründen nicht angezeigt)'
: '(Not shown for security reasons)';
}
// Format dates if they exist
if (processedVariables.event_date) {
processedVariables.event_date = await formatDate(processedVariables.event_date, language);
}
if (processedVariables.expiry_date) {
processedVariables.expiry_date = await formatDate(processedVariables.expiry_date, language);
}
if (processedVariables.archive_date) {
processedVariables.archive_date = await formatDate(processedVariables.archive_date, language);
}
// Get branding settings for logo
let logoUrl = '';
@@ -156,10 +180,10 @@ async function processTemplate(template, variables, language = 'en') {
const htmlTemplate = Handlebars.compile(htmlBody);
const textTemplate = Handlebars.compile(textBody);
// Process templates with variables
subject = subjectTemplate(variables);
htmlBody = htmlTemplate(variables);
textBody = textTemplate(variables);
// Process templates with processedVariables (includes formatted dates and security messages)
subject = subjectTemplate(processedVariables);
htmlBody = htmlTemplate(processedVariables);
textBody = textTemplate(processedVariables);
// Wrap HTML body in styled template
const styledHtmlBody = `
+1
View File
@@ -715,6 +715,7 @@
"settings_updated": "Einstellungen aktualisiert",
"event_updated": "Veranstaltung aktualisiert: {{eventName}}",
"event_deleted": "Veranstaltung gelöscht: {{eventName}}",
"email_resent": "Erstellungs-E-Mail erneut gesendet für: {{eventName}}",
"category_created": "Kategorie erstellt: {{categoryName}}",
"category_updated": "Kategorie aktualisiert: {{categoryName}}",
"category_deleted": "Kategorie gelöscht: {{categoryName}}",
+1
View File
@@ -766,6 +766,7 @@
"settings_updated": "Settings updated",
"event_updated": "Event updated: {{eventName}}",
"event_deleted": "Event deleted: {{eventName}}",
"email_resent": "Creation email resent for: {{eventName}}",
"category_created": "Category created: {{categoryName}}",
"category_updated": "Category updated: {{categoryName}}",
"category_deleted": "Category deleted: {{categoryName}}",