Benachrichtigungen erweitert
Emails korrigiert
This commit is contained in:
@@ -7,6 +7,7 @@ import nodemailer from 'nodemailer'
|
||||
import fs from 'fs/promises'
|
||||
import path from 'path'
|
||||
import { getServerDataPath } from './paths.js'
|
||||
import { isHiddenUser, migrateUserRoles, readUsers } from './auth.js'
|
||||
|
||||
/**
|
||||
* Gets the correct data path for config files
|
||||
@@ -34,23 +35,45 @@ async function loadConfig() {
|
||||
}
|
||||
}
|
||||
|
||||
function envFlagEnabled(value) {
|
||||
return ['1', 'true', 'yes', 'on'].includes(String(value || '').trim().toLowerCase())
|
||||
}
|
||||
|
||||
function shouldUseDeveloperRecipients() {
|
||||
if (process.env.DEBUG !== undefined) return envFlagEnabled(process.env.DEBUG)
|
||||
return process.env.NODE_ENV !== 'production' || process.env.APP_ENV === 'test'
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets email recipients based on membership type and environment
|
||||
* @param {Object} data - Form data
|
||||
* @param {Object} config - Configuration
|
||||
* @returns {Array<string>} Email addresses
|
||||
*/
|
||||
function getEmailRecipients(data, config) {
|
||||
const isProduction = process.env.NODE_ENV === 'production' && process.env.APP_ENV !== 'test'
|
||||
|
||||
if (!isProduction) {
|
||||
async function collectBoardUserRecipients() {
|
||||
try {
|
||||
const users = await readUsers()
|
||||
return users
|
||||
.filter(user => user && user.active !== false && !isHiddenUser(user))
|
||||
.map(user => migrateUserRoles({ ...user }))
|
||||
.filter(user => Array.isArray(user.roles) && user.roles.includes('vorstand'))
|
||||
.map(user => String(user.email || '').trim())
|
||||
.filter(Boolean)
|
||||
} catch (error) {
|
||||
console.error('Could not load board recipients from users.json:', error.message || error)
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
async function getEmailRecipients(data, config) {
|
||||
if (shouldUseDeveloperRecipients()) {
|
||||
return ['tsschulz@tsschulz.de']
|
||||
}
|
||||
|
||||
const recipients = []
|
||||
const recipients = await collectBoardUserRecipients()
|
||||
|
||||
// Config uses a 'vorstand' object with nested roles; collect all emails
|
||||
if (config.vorstand && typeof config.vorstand === 'object') {
|
||||
// Fallback for legacy installations where Vorstand members are only configured in config.json.
|
||||
if (recipients.length === 0 && config.vorstand && typeof config.vorstand === 'object') {
|
||||
Object.values(config.vorstand).forEach((member) => {
|
||||
if (member && member.email && typeof member.email === 'string' && member.email.trim() !== '') {
|
||||
recipients.push(member.email.trim())
|
||||
@@ -59,7 +82,7 @@ function getEmailRecipients(data, config) {
|
||||
}
|
||||
|
||||
// For minors, also add first trainer email if configured (trainer is an array)
|
||||
if (!data.isVolljaehrig && Array.isArray(config.trainer) && config.trainer.length > 0 && config.trainer[0].email) {
|
||||
if (data.isVolljaehrig === false && Array.isArray(config.trainer) && config.trainer.length > 0 && config.trainer[0].email) {
|
||||
recipients.push(config.trainer[0].email)
|
||||
}
|
||||
|
||||
@@ -69,11 +92,11 @@ function getEmailRecipients(data, config) {
|
||||
if (config.website && config.website.verantwortlicher && config.website.verantwortlicher.email) {
|
||||
recipients.push(config.website.verantwortlicher.email)
|
||||
} else {
|
||||
recipients.push('tsschulz@tsschulz.de')
|
||||
throw new Error('Keine E-Mail-Empfänger in config.json konfiguriert.')
|
||||
}
|
||||
}
|
||||
|
||||
return recipients
|
||||
return [...new Set(recipients)]
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,7 +134,7 @@ function createTransporter() {
|
||||
export async function sendMembershipEmail(data, pdfPath) {
|
||||
try {
|
||||
const config = await loadConfig()
|
||||
const recipients = getEmailRecipients(data, config)
|
||||
const recipients = await getEmailRecipients(data, config)
|
||||
|
||||
// Create transporter
|
||||
const transporter = createTransporter()
|
||||
@@ -167,7 +190,7 @@ Das ausgefüllte Formular ist als Anhang verfügbar.`
|
||||
export async function sendRegistrationNotification(data) {
|
||||
try {
|
||||
const config = await loadConfig()
|
||||
const recipients = getEmailRecipients(data, config)
|
||||
const recipients = await getEmailRecipients(data, config)
|
||||
|
||||
// Create transporter
|
||||
const transporter = createTransporter()
|
||||
|
||||
Reference in New Issue
Block a user