Tonne of updates to influence, the configs, update the homepage, and generally just did more bug testing with Influence

This commit is contained in:
2025-09-21 13:36:48 -06:00
parent b6960e45e8
commit feb2e72c9a
29 changed files with 2033 additions and 77 deletions

View File

@@ -399,21 +399,17 @@ class CampaignsController {
// Send email if SMTP method
if (emailMethod === 'smtp') {
emailResult = await emailService.sendEmail({
to: recipientEmail,
from: {
email: process.env.SMTP_FROM_EMAIL,
name: process.env.SMTP_FROM_NAME
},
replyTo: userEmail,
subject: subject,
text: message,
html: `
<p>${message.replace(/\n/g, '<br>')}</p>
<hr>
<p><small>This message was sent via the BNKops Influence Campaign Tool by ${userName || 'A constituent'} (${userEmail}) from postal code ${postalCode} as part of the "${campaign['Campaign Title'] || campaign.title}" campaign.</small></p>
`
});
emailResult = await emailService.sendCampaignEmail(
recipientEmail,
userEmail,
userName || 'A constituent',
postalCode,
subject,
message,
campaign['Campaign Title'] || campaign.title,
recipientName,
recipientLevel
);
}
// Log the campaign email

View File

@@ -6,22 +6,15 @@ class EmailsController {
try {
const { recipientEmail, senderName, senderEmail, subject, message, postalCode } = req.body;
// Send the email
const emailResult = await emailService.sendEmail({
to: recipientEmail,
from: {
email: process.env.SMTP_FROM_EMAIL,
name: process.env.SMTP_FROM_NAME
},
replyTo: senderEmail,
subject: subject,
text: message,
html: `
<p>${message.replace(/\n/g, '<br>')}</p>
<hr>
<p><small>This message was sent via the Alberta Influence Campaign Tool by ${senderName} (${senderEmail}) from postal code ${postalCode}.</small></p>
`
});
// Send the email using template system
const emailResult = await emailService.sendRepresentativeEmail(
recipientEmail,
senderName,
senderEmail,
subject,
message,
postalCode
);
// Log the email send event
await nocoDB.logEmailSend({
@@ -31,7 +24,8 @@ class EmailsController {
subject,
postalCode,
status: emailResult.success ? 'sent' : 'failed',
timestamp: new Date().toISOString()
timestamp: new Date().toISOString(),
senderIP: req.ip || req.connection.remoteAddress
});
if (emailResult.success) {
@@ -56,6 +50,147 @@ class EmailsController {
});
}
}
async previewEmail(req, res, next) {
try {
const { recipientEmail, subject, message, senderName, senderEmail, postalCode } = req.body;
const templateVariables = {
MESSAGE: message,
SENDER_NAME: senderName || 'Anonymous',
SENDER_EMAIL: senderEmail || 'unknown@example.com',
POSTAL_CODE: postalCode || 'Unknown'
};
const emailOptions = {
to: recipientEmail,
from: {
email: process.env.SMTP_FROM_EMAIL,
name: process.env.SMTP_FROM_NAME
},
replyTo: senderEmail || process.env.SMTP_FROM_EMAIL,
subject: subject
};
const preview = await emailService.previewTemplatedEmail('representative-contact', templateVariables, emailOptions);
res.json({
success: true,
preview: preview,
html: emailOptions.html
});
} catch (error) {
console.error('Email preview error:', error);
res.status(500).json({
success: false,
error: 'Failed to generate email preview',
message: error.message
});
}
}
async sendTestEmail(req, res, next) {
try {
const { subject, message } = req.body;
const testRecipient = process.env.TEST_EMAIL_RECIPIENT || req.user?.email || 'admin@example.com';
const emailResult = await emailService.sendTestEmail(subject, message, testRecipient);
if (emailResult.success) {
res.json({
success: true,
message: 'Test email sent successfully',
messageId: emailResult.messageId,
sentTo: testRecipient,
testMode: emailResult.testMode
});
} else {
res.status(500).json({
success: false,
error: 'Failed to send test email',
message: emailResult.error
});
}
} catch (error) {
console.error('Send test email error:', error);
res.status(500).json({
success: false,
error: 'Failed to send test email',
message: error.message
});
}
}
async getEmailLogs(req, res, next) {
try {
const { status, senderEmail, postalCode } = req.query;
if (!process.env.NOCODB_TABLE_EMAILS) {
return res.status(500).json({
success: false,
error: 'Email logging not configured'
});
}
const filters = {};
if (status) filters.status = status;
if (senderEmail) filters.senderEmail = senderEmail;
if (postalCode) filters.postalCode = postalCode;
const logs = await nocoDB.getEmailLogs(filters);
res.json({
success: true,
logs: logs || []
});
} catch (error) {
console.error('Get email logs error:', error);
res.status(500).json({
success: false,
error: 'Failed to retrieve email logs',
message: error.message
});
}
}
async testSMTPConnection(req, res, next) {
try {
const testResult = await emailService.testConnection();
res.json({
success: testResult.success,
message: testResult.message,
error: testResult.error
});
} catch (error) {
console.error('SMTP test error:', error);
res.status(500).json({
success: false,
error: 'Failed to test SMTP connection',
message: error.message
});
}
}
async testSMTPConnection(req, res, next) {
try {
const result = await emailService.testConnection();
res.json({
success: result.success,
message: result.message,
error: result.error
});
} catch (error) {
console.error('SMTP test error:', error);
res.status(500).json({
success: false,
error: 'Failed to test SMTP connection',
message: error.message
});
}
}
}
module.exports = new EmailsController();